You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2014/03/18 03:59:57 UTC

[05/21] fixing https://issues.apache.org/jira/browse/STRATOS-520 - adding Openstack-nova module to dependencies

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d4243b7e/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ImageApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ImageApiExpectTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ImageApiExpectTest.java
new file mode 100644
index 0000000..85407d1
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ImageApiExpectTest.java
@@ -0,0 +1,377 @@
+/*
+ * 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.openstack.nova.v2_0.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseImageListTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseImageTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseMetadataListTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseMetadataUpdateTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Tests annotation parsing of {@code ImageAsyncApi}
+ * 
+ * @author Michael Arnold
+ */
+@Test(groups = "unit", testName = "ImageAsyncApiTest")
+public class ImageApiExpectTest extends BaseNovaApiExpectTest {
+   public void testListImagesWhenResponseIs2xx() throws Exception {
+      HttpRequest list = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse listResponse = HttpResponse.builder().statusCode(200)
+            .payload(payloadFromResource("/image_list.json")).build();
+
+      NovaApi apiWhenImagesExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, list, listResponse);
+
+      assertEquals(apiWhenImagesExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1", "az-2.region-a.geo-1", "az-3.region-a.geo-1"));
+
+      assertEquals(apiWhenImagesExist.getImageApiForZone("az-1.region-a.geo-1").list().concat().toString(),
+            new ParseImageListTest().expected().toString());
+   }
+
+   public void testListImagesWhenReponseIs404IsEmpty() throws Exception {
+      HttpRequest list = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse listResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenNoServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, list, listResponse);
+
+      assertTrue(apiWhenNoServersExist.getImageApiForZone("az-1.region-a.geo-1").list().concat().isEmpty());
+   }
+
+   public void testGetImageWhenResponseIs2xx() throws Exception {
+
+      HttpRequest getImage = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/52415800-8b69-11e0-9b19-734f5736d2a2")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse getImageResponse = HttpResponse.builder().statusCode(200)
+            .payload(payloadFromResource("/image_details.json")).build();
+
+      NovaApi apiWhenImagesExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, getImage, getImageResponse);
+
+      assertEquals(
+            apiWhenImagesExist.getImageApiForZone("az-1.region-a.geo-1").get("52415800-8b69-11e0-9b19-734f5736d2a2")
+                  .toString(), new ParseImageTest().expected().toString());
+   }
+
+   public void testGetImageWhenResponseIs404() throws Exception {
+      HttpRequest getImage = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/52415800-8b69-11e0-9b19-734f5736d2a2")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse getImageResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenNoImagesExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, getImage, getImageResponse);
+
+      assertNull(apiWhenNoImagesExist.getImageApiForZone("az-1.region-a.geo-1").get(
+            "52415800-8b69-11e0-9b19-734f5736d2a2"));
+
+   }
+
+   public void testListMetadataWhenResponseIs2xx() throws Exception {
+	      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      HttpRequest getMetadata = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" + imageId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+        
+      HttpResponse getMetadataResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/metadata_list.json")).build();
+      
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, getMetadata, getMetadataResponse);
+
+      assertEquals(apiWhenServerExists.getImageApiForZone("az-1.region-a.geo-1").getMetadata(imageId).toString(),  
+             new ParseMetadataListTest().expected().toString());
+   }
+   
+   public void testListMetadataWhenResponseIs404() throws Exception {
+      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      HttpRequest getMetadata = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" + imageId + "/metadata")
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+      HttpResponse getMetadataResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, getMetadata, getMetadataResponse);
+
+      try {
+         apiWhenServerExists.getImageApiForZone("az-1.region-a.geo-1").getMetadata(imageId);
+         fail("Expected an exception.");
+         } catch (Exception e) {
+            // expected
+         }
+   }
+
+   public void testSetMetadataWhenResponseIs2xx() throws Exception {
+      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 1")
+              .put("Image Version", "2.1")
+              .build();
+
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("PUT")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" + imageId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 1\",\"Image Version\":\"2.1\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/metadata_list.json")).build();
+      
+      NovaApi apiWhenImageExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      assertEquals(apiWhenImageExists.getImageApiForZone("az-1.region-a.geo-1").setMetadata(imageId, metadata).toString(),  
+             new ParseMetadataListTest().expected().toString());
+   }
+
+   public void testSetMetadataWhenResponseIs404() throws Exception {
+      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 1")
+              .put("Image Version", "2.1")
+              .build();
+      
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("PUT")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" +imageId + "/metadata")
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 1\",\"Image Version\":\"2.1\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      try {
+    	 apiWhenServerExists.getImageApiForZone("az-1.region-a.geo-1").setMetadata(imageId, metadata);
+         fail("Expected an exception.");
+      } catch (Exception e) {
+         // expected
+      }
+   }
+
+   public void testUpdateMetadataWhenResponseIs2xx() throws Exception {
+      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 2")
+              .put("Server Description", "Simple Server")
+              .build();
+
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" + imageId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 2\",\"Server Description\":\"Simple Server\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/metadata_updated.json")).build();
+      
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      assertEquals(apiWhenServerExists.getImageApiForZone("az-1.region-a.geo-1").updateMetadata(imageId, metadata).toString(),  
+             new ParseMetadataUpdateTest().expected().toString());
+   }
+
+   public void testUpdateMetadataWhenResponseIs404() throws Exception {
+      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 2")
+              .put("Server Description", "Simple Server")
+              .build();
+
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + imageId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 2\",\"Server Description\":\"Simple Server\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(404)
+              .payload(payloadFromResource("/metadata_updated.json")).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      try {
+    	 apiWhenServerExists.getImageApiForZone("az-1.region-a.geo-1").setMetadata(imageId, metadata);
+         fail("Expected an exception.");
+      } catch (Exception e) {
+         // expected
+      }
+   }
+
+   public void testGetMetadataItemWhenResponseIs2xx() throws Exception {
+      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      String key = "Image%20Version";
+
+      HttpRequest getMetadata = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" + imageId + "/metadata/" + key)
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+      HttpResponse getMetadataResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromString("{\"metadata\":{\"Image Version\":\"2.5\"}}")).build();
+      
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, getMetadata, getMetadataResponse);
+
+      assertEquals(apiWhenServerExists.getImageApiForZone("az-1.region-a.geo-1").getMetadata(imageId, "Image Version").toString(),  
+             "2.5");
+   }
+
+   public void testGetMetadataItemWhenResponseIs404() throws Exception {
+      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      String key = "Image%20Version";
+
+      HttpRequest getMetadata = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" + imageId + "/metadata/" + key)
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+      HttpResponse getMetadataResponse = HttpResponse.builder().statusCode(404)
+              .payload(payloadFromStringWithContentType("{\"metadata\":{\"Image Version\":\"2.5\"}}", "application/json")).build();
+
+      NovaApi apiWhenImageExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, getMetadata, getMetadataResponse);
+
+      assertNull(apiWhenImageExists.getImageApiForZone("az-1.region-a.geo-1").getMetadata(imageId, key));
+   }
+
+   public void testSetMetadataItemWhenResponseIs2xx() throws Exception {
+      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      String key = "Image Version";
+
+      HttpRequest updateMetadata = HttpRequest
+            .builder()
+            .method("PUT")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" + imageId + "/metadata/" + "Image%20Version")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Image Version\":\"2.5\"}}", "application/json"))
+            .build();
+
+      HttpResponse updateMetadataResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromStringWithContentType("{\"metadata\":{\"Image Version\":\"2.5\"}}", "application/json")).build();
+      
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, updateMetadata, updateMetadataResponse);
+      
+      assertEquals(apiWhenServerExists.getImageApiForZone("az-1.region-a.geo-1").updateMetadata(imageId, key, "2.5").toString(),  
+             "2.5");
+   }
+
+   public void testDeleteMetadataItemWhenResponseIs2xx() throws Exception {
+      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      String key = "Image%20Version";
+      
+      HttpRequest deleteMetadata = HttpRequest
+            .builder()
+            .method("DELETE")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" + imageId + "/metadata/" + key)
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+      HttpResponse deleteMetadataResponse = HttpResponse.builder().statusCode(204).build();
+      
+      NovaApi apiWhenImageExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, deleteMetadata, deleteMetadataResponse);
+
+      apiWhenImageExists.getImageApiForZone("az-1.region-a.geo-1").deleteMetadata(imageId, key);
+   }
+
+   public void testDeleteMetadataItemWhenResponseIs404() throws Exception {
+      String imageId = "52415800-8b69-11e0-9b19-734f5736d2a2";
+      String key = "Image%20Version";
+
+      HttpRequest deleteMetadata = HttpRequest
+            .builder()
+            .method("DELETE")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" + imageId + "/metadata/" + key)
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+      HttpResponse deleteMetadataResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenImageExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, deleteMetadata, deleteMetadataResponse);
+
+      apiWhenImageExists.getImageApiForZone("az-1.region-a.geo-1").deleteMetadata(imageId, key);
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d4243b7e/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ImageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ImageApiLiveTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ImageApiLiveTest.java
new file mode 100644
index 0000000..83d0b62
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ImageApiLiveTest.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.nova.v2_0.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import org.jclouds.openstack.nova.v2_0.domain.Image;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.jclouds.openstack.v2_0.domain.Resource;
+import org.testng.annotations.Test;
+
+/**
+ * Tests behavior of {@link ImageApi}
+ * 
+ * @author Michael Arnold
+ */
+@Test(groups = "live", testName = "ImageApiLiveTest")
+public class ImageApiLiveTest extends BaseNovaApiLiveTest {
+
+   @Test(description = "GET /v${apiVersion}/{tenantId}/images")
+   public void testListImages() throws Exception {
+      for (String zoneId : zones) {
+         ImageApi imageApi = api.getImageApiForZone(zoneId);
+         Set<? extends Resource> response = imageApi.list().concat().toSet();
+         assertNotNull(response);
+         assertFalse(response.isEmpty());
+         for (Resource image : response) {
+            assertNotNull(image.getId());
+            assertNotNull(image.getName());
+            assertNotNull(image.getLinks());
+         }
+      }
+   }
+
+   @Test(description = "GET /v${apiVersion}/{tenantId}/images/detail")
+   public void testListImagesInDetail() throws Exception {
+      for (String zoneId : api.getConfiguredZones()) {
+         ImageApi imageApi = api.getImageApiForZone(zoneId);
+         Set<? extends Image> response = imageApi.listInDetail().concat().toSet();
+         assertNotNull(response);
+         assertFalse(response.isEmpty());
+         for (Image image : response) {
+            assertNotNull(image.getId());
+            assertNotNull(image.getName());
+            assertNotNull(image.getLinks());
+            assertNotNull(image.getCreated());
+            // image.getMinDisk() can be zero
+            // image.getMinRam() can be zero
+            assertTrue(image.getProgress() >= 0 && image.getProgress() <= 100);
+            assertNotNull(image.getStatus());
+            // image.getServer() can be null
+            // image.getTenantId() can be null
+            // image.getUpdated() can be null
+            // image.getUserId() can be null
+         }
+      }
+   }
+
+   @Test(description = "GET /v${apiVersion}/{tenantId}/images/{id}", dependsOnMethods = { "testListImagesInDetail" })
+   public void testGetImageById() throws Exception {
+      for (String zoneId : api.getConfiguredZones()) {
+         ImageApi imageApi = api.getImageApiForZone(zoneId);
+         Set<? extends Image> response = imageApi.listInDetail().concat().toSet();
+         for (Image image : response) {
+            Image details = imageApi.get(image.getId());
+            assertNotNull(details);
+            assertEquals(details.getId(), image.getId());
+            assertEquals(details.getName(), image.getName());
+            assertEquals(details.getLinks(), image.getLinks());
+            assertEquals(details.getCreated(), image.getCreated());
+            assertEquals(details.getMinDisk(), image.getMinDisk());
+            assertEquals(details.getMinRam(), image.getMinRam());
+            assertEquals(details.getProgress(), image.getProgress());
+            assertEquals(details.getStatus(), image.getStatus());
+            assertEquals(details.getServer(), image.getServer());
+            assertEquals(details.getTenantId(), image.getTenantId());
+            assertEquals(details.getUpdated(), image.getUpdated());
+            assertEquals(details.getUserId(), image.getUserId());
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d4243b7e/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ServerApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ServerApiExpectTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ServerApiExpectTest.java
new file mode 100644
index 0000000..070dcf6
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ServerApiExpectTest.java
@@ -0,0 +1,746 @@
+/*
+ * 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.openstack.nova.v2_0.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.domain.Server;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.jclouds.openstack.nova.v2_0.options.CreateServerOptions;
+import org.jclouds.openstack.nova.v2_0.options.RebuildServerOptions;
+import org.jclouds.openstack.nova.v2_0.parse.ParseCreatedServerTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseMetadataListTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseMetadataUpdateTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseServerListTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import org.jclouds.openstack.nova.v2_0.parse.ParseServerDiagnostics;
+
+/**
+ * Tests annotation parsing of {@code ServerAsyncApi}
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "ServerAsyncApiTest")
+public class ServerApiExpectTest extends BaseNovaApiExpectTest {
+
+   public void testListServersWhenResponseIs2xx() throws Exception {
+      HttpRequest listServers = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse listServersResponse = HttpResponse.builder().statusCode(200)
+            .payload(payloadFromResource("/server_list.json")).build();
+
+      NovaApi apiWhenServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, listServers, listServersResponse);
+
+      assertEquals(apiWhenServersExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1", "az-2.region-a.geo-1", "az-3.region-a.geo-1"));
+
+      assertEquals(apiWhenServersExist.getServerApiForZone("az-1.region-a.geo-1").list().concat().toString(),
+            new ParseServerListTest().expected().toString());
+   }
+
+   public void testListServersWhenReponseIs404IsEmpty() throws Exception {
+      HttpRequest listServers = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse listServersResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenNoServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, listServers, listServersResponse);
+
+      assertTrue(apiWhenNoServersExist.getServerApiForZone("az-1.region-a.geo-1").list().concat().isEmpty());
+   }
+
+   public void testCreateServerWhenResponseIs202() throws Exception {
+      HttpRequest createServer = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType(
+                     "{\"server\":{\"name\":\"test-e92\",\"imageRef\":\"1241\",\"flavorRef\":\"100\"}}","application/json"))
+            .build();
+
+
+      HttpResponse createServerResponse = HttpResponse.builder().statusCode(202).message("HTTP/1.1 202 Accepted")
+            .payload(payloadFromResourceWithContentType("/new_server.json","application/json; charset=UTF-8")).build();
+
+      NovaApi apiWithNewServer = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, createServer, createServerResponse);
+
+      assertEquals(apiWithNewServer.getServerApiForZone("az-1.region-a.geo-1").create("test-e92", "1241", "100").toString(),
+              new ParseCreatedServerTest().expected().toString());
+   }
+
+   public void testCreateServerInAvailabilityZoneWhenResponseIs202() throws Exception {
+      HttpRequest createServer = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType(
+                  "{\"server\":{\"name\":\"test-e92\",\"imageRef\":\"1241\",\"flavorRef\":\"100\",\"availability_zone\":\"nova\"}}","application/json"))
+            .build();
+
+
+      HttpResponse createServerResponse = HttpResponse.builder().statusCode(202).message("HTTP/1.1 202 Accepted")
+            .payload(payloadFromResourceWithContentType("/new_server_in_zone.json","application/json; charset=UTF-8")).build();
+
+      NovaApi apiWithNewServer = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, createServer, createServerResponse);
+
+      CreateServerOptions options = new CreateServerOptions().availabilityZone("nova");
+
+      assertEquals(apiWithNewServer.getServerApiForZone("az-1.region-a.geo-1").create("test-e92", "1241", "100", options).toString(),
+            new ParseCreatedServerTest().expected().toString());
+   }
+
+   public void testCreateServerWithSecurityGroupsWhenResponseIs202() throws Exception {
+
+      HttpRequest createServer = HttpRequest
+         .builder()
+         .method("POST")
+         .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers")
+         .addHeader("Accept", "application/json")
+         .addHeader("X-Auth-Token", authToken)
+         .payload(payloadFromStringWithContentType(
+                  "{\"server\":{\"name\":\"test-e92\",\"imageRef\":\"1241\",\"flavorRef\":\"100\",\"security_groups\":[{\"name\":\"group1\"},{\"name\":\"group2\"}]}}","application/json"))
+         .build();
+
+
+      HttpResponse createServerResponse = HttpResponse.builder().statusCode(202).message("HTTP/1.1 202 Accepted")
+         .payload(payloadFromResourceWithContentType("/new_server.json","application/json; charset=UTF-8")).build();
+
+
+      NovaApi apiWithNewServer = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, createServer, createServerResponse);
+
+      assertEquals(apiWithNewServer.getServerApiForZone("az-1.region-a.geo-1").create("test-e92", "1241",
+               "100", new CreateServerOptions().securityGroupNames("group1", "group2")).toString(),
+              new ParseCreatedServerTest().expected().toString());
+   }
+
+   public void testCreateServerWithNetworksWhenResponseIs202() throws Exception {
+
+      HttpRequest createServer = HttpRequest
+         .builder()
+         .method("POST")
+         .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers")
+         .addHeader("Accept", "application/json")
+         .addHeader("X-Auth-Token", authToken)
+         .payload(payloadFromStringWithContentType(
+                  "{\"server\":{\"name\":\"test-e92\",\"imageRef\":\"1241\",\"flavorRef\":\"100\",\"networks\":[{\"uuid\":\"b3856ac0-f481-11e2-b778-0800200c9a66\"},{\"uuid\":\"bf0f0f90-f481-11e2-b778-0800200c9a66\"}]}}","application/json"))
+         .build();
+
+
+      HttpResponse createServerResponse = HttpResponse.builder().statusCode(202).message("HTTP/1.1 202 Accepted")
+         .payload(payloadFromResourceWithContentType("/new_server.json","application/json; charset=UTF-8")).build();
+
+
+      NovaApi apiWithNewServer = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, createServer, createServerResponse);
+
+      assertEquals(apiWithNewServer.getServerApiForZone("az-1.region-a.geo-1").create("test-e92", "1241",
+               "100", new CreateServerOptions().networks("b3856ac0-f481-11e2-b778-0800200c9a66", "bf0f0f90-f481-11e2-b778-0800200c9a66")).toString(),
+              new ParseCreatedServerTest().expected().toString());
+   }
+
+   public void testCreateServerWithDiskConfigAuto() throws Exception {
+
+      HttpRequest createServer = HttpRequest
+         .builder()
+         .method("POST")
+         .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers")
+         .addHeader("Accept", "application/json")
+         .addHeader("X-Auth-Token", authToken)
+         .payload(payloadFromStringWithContentType(
+                  "{\"server\":{\"name\":\"test-e92\",\"imageRef\":\"1241\",\"flavorRef\":\"100\",\"OS-DCF:diskConfig\":\"AUTO\"}}","application/json"))
+         .build();
+
+
+      HttpResponse createServerResponse = HttpResponse.builder().statusCode(202).message("HTTP/1.1 202 Accepted")
+         .payload(payloadFromResourceWithContentType("/new_server_disk_config_auto.json","application/json; charset=UTF-8")).build();
+
+
+      NovaApi apiWithNewServer = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess, 
+            createServer, createServerResponse);
+
+      assertEquals(apiWithNewServer.getServerApiForZone("az-1.region-a.geo-1").create("test-e92", "1241",
+               "100", new CreateServerOptions().diskConfig(Server.DISK_CONFIG_AUTO)).toString(),
+              new ParseCreatedServerTest().expectedWithDiskConfig(Server.DISK_CONFIG_AUTO).toString());
+   }
+
+   public void testCreateServerWithDiskConfigManual() throws Exception {
+
+      HttpRequest createServer = HttpRequest
+         .builder()
+         .method("POST")
+         .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers")
+         .addHeader("Accept", "application/json")
+         .addHeader("X-Auth-Token", authToken)
+         .payload(payloadFromStringWithContentType(
+                  "{\"server\":{\"name\":\"test-e92\",\"imageRef\":\"1241\",\"flavorRef\":\"100\",\"OS-DCF:diskConfig\":\"MANUAL\"}}","application/json"))
+         .build();
+
+
+      HttpResponse createServerResponse = HttpResponse.builder().statusCode(202).message("HTTP/1.1 202 Accepted")
+         .payload(payloadFromResourceWithContentType("/new_server_disk_config_manual.json","application/json; charset=UTF-8")).build();
+
+
+      NovaApi apiWithNewServer = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess, 
+            createServer, createServerResponse);
+
+      assertEquals(apiWithNewServer.getServerApiForZone("az-1.region-a.geo-1").create("test-e92", "1241",
+               "100", new CreateServerOptions().diskConfig(Server.DISK_CONFIG_MANUAL)).toString(),
+              new ParseCreatedServerTest().expectedWithDiskConfig(Server.DISK_CONFIG_MANUAL).toString());
+   }
+
+   public void testRebuildServerWhenResponseIs202() throws Exception {
+      String serverId = "52415800-8b69-11e0-9b19-734f565bc83b";
+      HttpRequest rebuildServer = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId +"/action")
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType(
+                  "{\"rebuild\":{\"adminPass\":\"password\",\"imageRef\":\"1234\",\"name\":\"newName\",\"accessIPv4\":\"1.1.1.1\",\"accessIPv6\":\"fe80::100\"}}","application/json"))
+            .build();
+
+      HttpResponse rebuildServerResponse = HttpResponse.builder().statusCode(202).build();
+
+      NovaApi apiRebuildServer = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, rebuildServer, rebuildServerResponse);
+
+      RebuildServerOptions options = new RebuildServerOptions().withImage("1234").name("newName").adminPass("password").ipv4Address("1.1.1.1").ipv6Address("fe80::100");
+
+      apiRebuildServer.getServerApiForZone("az-1.region-a.geo-1").rebuild(serverId, options);
+   }
+
+   public void testCreateImageWhenResponseIs2xx() throws Exception {
+      String serverId = "123";
+      String imageId = "456";
+      String imageName = "foo";
+
+      HttpRequest createImage = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/action")
+                     .addHeader("Accept", "application/json")
+                     .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType(
+                  "{\"createImage\":{\"name\":\"" + imageName + "\", \"metadata\": {}}}", "application/json"))
+               .build();
+
+      HttpResponse createImageResponse = HttpResponse.builder()
+            .statusCode(200)
+            .headers(
+                  ImmutableMultimap.<String, String> builder()
+                  .put("Location", "https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/images/" + imageId).build()).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, createImage, createImageResponse);
+
+      assertEquals(apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").createImageFromServer(imageName, serverId),
+            imageId);
+   }
+
+   public void testCreateImageWhenResponseIs404IsEmpty() throws Exception {
+      String serverId = "123";
+      String imageName = "foo";
+
+      HttpRequest createImage = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/action")
+                     .addHeader("Accept", "application/json")
+                     .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType(
+                  "{\"createImage\":{\"name\":\"" + imageName + "\", \"metadata\": {}}}", "application/json"))
+               .build();
+
+      HttpResponse createImageResponse = HttpResponse.builder().statusCode(404).build();
+      NovaApi apiWhenServerDoesNotExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, createImage, createImageResponse);
+
+      try {
+         apiWhenServerDoesNotExist.getServerApiForZone("az-1.region-a.geo-1").createImageFromServer(imageName, serverId);
+         fail("Expected an exception.");
+      } catch (Exception e) {
+         // expected
+      }
+   }
+   
+   public void testStopServerWhenResponseIs2xx() throws Exception {
+      String serverId = "123";
+      HttpRequest stopServer = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/action")
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType(
+                  "{\"os-stop\":null}", "application/json"))
+               .build();
+
+      HttpResponse stopServerResponse = HttpResponse.builder().statusCode(202).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, stopServer, stopServerResponse);
+
+      apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").stop(serverId);
+   }
+   
+   public void testStopServerWhenResponseIs404() throws Exception {
+      String serverId = "123";
+      HttpRequest stopServer = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/action")
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+
+            .payload(payloadFromStringWithContentType(
+                  "{\"os-stop\":null}", "application/json"))
+               .build();
+
+      HttpResponse stopServerResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, stopServer, stopServerResponse);
+
+      try {
+         apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").stop(serverId);
+         fail("Expected an exception.");
+      } catch (Exception e) {
+         // expected
+      }
+   }
+   
+   public void testStartServerWhenResponseIs2xx() throws Exception {
+      String serverId = "123";
+      HttpRequest startServer = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/action")
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+
+            .payload(payloadFromStringWithContentType(
+                  "{\"os-start\":null}", "application/json"))
+               .build();
+
+      HttpResponse startServerResponse = HttpResponse.builder().statusCode(202).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, startServer, startServerResponse);
+
+      apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").start(serverId);
+   }
+   
+   public void testStartServerWhenResponseIs404() throws Exception {
+      String serverId = "123";
+      HttpRequest startServer = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/action")
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType(
+                  "{\"os-startp\":null}", "application/json"))
+               .build();
+
+      HttpResponse startServerResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, startServer, startServerResponse);
+
+      try {
+         apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").start(serverId);
+         fail("Expected an exception.");
+      } catch (Exception e) {
+         // expected
+      }
+   }
+
+   public void testListMetadataWhenResponseIs2xx() throws Exception {
+      String serverId = "123";
+      
+      HttpRequest getMetadata = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+        
+      HttpResponse getMetadataResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/metadata_list.json")).build();
+      
+      
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, getMetadata, getMetadataResponse);
+
+      assertEquals(apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").getMetadata(serverId).toString(),  
+             new ParseMetadataListTest().expected().toString());
+   }
+   
+   public void testListMetadataWhenResponseIs404() throws Exception {
+      String serverId = "123";
+      HttpRequest getMetadata = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata")
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+      HttpResponse getMetadataResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, getMetadata, getMetadataResponse);
+
+      try {
+    	 apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").getMetadata(serverId);
+         fail("Expected an exception.");
+      } catch (Exception e) {
+         // expected
+      }
+   }
+
+   public void testSetMetadataWhenResponseIs2xx() throws Exception {
+      String serverId = "123";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 1")
+              .put("Image Version", "2.1")
+              .build();
+
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("PUT")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 1\",\"Image Version\":\"2.1\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/metadata_list.json")).build();
+      
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      assertEquals(apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").setMetadata(serverId, metadata).toString(),  
+             new ParseMetadataListTest().expected().toString());
+   }
+
+   public void testSetMetadataWhenResponseIs404() throws Exception {
+      String serverId = "123";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 1")
+              .put("Image Version", "2.1")
+              .build();
+      
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("PUT")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata")
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 1\",\"Image Version\":\"2.1\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      try {
+    	 apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").setMetadata(serverId, metadata);
+         fail("Expected an exception.");
+      } catch (Exception e) {
+         // expected
+      }
+   }
+
+   public void testUpdateMetadataWhenResponseIs2xx() throws Exception {
+      String serverId = "123";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 2")
+              .put("Server Description", "Simple Server")
+              .build();
+
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 2\",\"Server Description\":\"Simple Server\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/metadata_updated.json")).build();
+      
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      assertEquals(apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").updateMetadata(serverId, metadata).toString(),  
+             new ParseMetadataUpdateTest().expected().toString());
+   }
+
+   public void testUpdateMetadataWhenResponseIs404() throws Exception {
+      String serverId = "123";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 2")
+              .put("Server Description", "Simple Server")
+              .build();
+
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 2\",\"Server Description\":\"Simple Server\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(404)
+              .payload(payloadFromResource("/metadata_updated.json")).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      try {
+    	 apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").setMetadata(serverId, metadata);
+         fail("Expected an exception.");
+      } catch (Exception e) {
+         // expected
+      }
+   }
+
+   public void testGetMetadataItemWhenResponseIs2xx() throws Exception {
+      String serverId = "123";
+      String key = "Server Label";
+
+      HttpRequest getMetadata = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata/" + "Server%20Label")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+      HttpResponse getMetadataResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/metadata_item.json")).build();
+      
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, getMetadata, getMetadataResponse);
+
+      assertEquals(apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").getMetadata(serverId, key).toString(),  
+             "Web Head 1");
+   }
+
+   public void testGetMetadataItemWhenResponseIs404() throws Exception {
+      String serverId = "123";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 1")
+              .build();
+
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 2\",\"Server Description\":\"Simple Server\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(404)
+              .payload(payloadFromResource("/metadata_updated.json")).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      try {
+    	 apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").setMetadata(serverId, metadata);
+         fail("Expected an exception.");
+      } catch (Exception e) {
+         // expected
+      }
+   }
+
+   public void testSetMetadataItemWhenResponseIs2xx() throws Exception {
+      String serverId = "123";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 2")
+              .put("Server Description", "Simple Server")
+              .build();
+
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 2\",\"Server Description\":\"Simple Server\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/metadata_updated.json")).build();
+      
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      assertEquals(apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").updateMetadata(serverId, metadata).toString(),  
+             new ParseMetadataUpdateTest().expected().toString());
+   }
+
+   public void testSetMetadataItemWhenResponseIs404() throws Exception {
+      String serverId = "123";
+      ImmutableMap<String, String> metadata = new ImmutableMap.Builder<String, String>()
+              .put("Server Label", "Web Head 2")
+              .put("Server Description", "Simple Server")
+              .build();
+
+      HttpRequest setMetadata = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"metadata\":{\"Server Label\":\"Web Head 2\",\"Server Description\":\"Simple Server\"}}","application/json"))
+            .build();
+
+      HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(404)
+              .payload(payloadFromResource("/metadata_updated.json")).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, setMetadata, setMetadataResponse);
+
+      try {
+    	 apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").setMetadata(serverId, metadata);
+         fail("Expected an exception.");
+      } catch (Exception e) {
+         // expected
+      }
+   }
+
+   public void testDeleteMetadataItemWhenResponseIs2xx() throws Exception {
+      String serverId = "123";
+      String key = "Server%20Label";
+
+      HttpRequest updateMetadata = HttpRequest
+            .builder()
+            .method("DELETE")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata/" + key)
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+      HttpResponse updateMetadataResponse = HttpResponse.builder().statusCode(204).build();
+      
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, updateMetadata, updateMetadataResponse);
+
+      apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").deleteMetadata(serverId, key);
+
+   }
+
+   public void testDeleteMetadataItemWhenResponseIs404() throws Exception {
+      String serverId = "123";
+      String key = "Server%20Label";
+
+      HttpRequest deleteMetadata = HttpRequest
+            .builder()
+            .method("DELETE")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/" + serverId + "/metadata/" + key)
+            .addHeader("Accept", "*/*")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+      HttpResponse deleteMetadataResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenServerExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, deleteMetadata, deleteMetadataResponse);
+
+      apiWhenServerExists.getServerApiForZone("az-1.region-a.geo-1").deleteMetadata(serverId, key);
+
+   }
+   
+   public void testGetDiagnosticsWhenResponseIs200() throws Exception {
+       
+       String serverId = "123";
+       HttpRequest getDiagnostics = HttpRequest
+            .builder()
+            .method("GET")
+            .addHeader("Accept", "application/json")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/"+ serverId + "/diagnostics")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+
+      HttpResponse serverDiagnosticsResponse = HttpResponse.builder().statusCode(202).message("HTTP/1.1 202 Accepted")
+            .payload(payloadFromResourceWithContentType("/server_diagnostics.json","application/json; charset=UTF-8")).build();
+
+      NovaApi apiWithNewServer = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, getDiagnostics, serverDiagnosticsResponse);
+      assertEquals(apiWithNewServer.getServerApiForZone("az-1.region-a.geo-1").getDiagnostics(serverId),
+             new ParseServerDiagnostics().expected());
+   }
+   
+   
+   public void testGetDiagnosticsWhenResponseIs403Or404Or500() throws Exception {
+       
+       String serverId = "123";
+       HttpRequest getDiagnostics = HttpRequest
+            .builder()
+            .method("GET")
+            .addHeader("Accept", "application/json")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/"+ serverId + "/diagnostics")
+            .addHeader("X-Auth-Token", authToken)
+            .build();
+
+      for (int statusCode : ImmutableSet.of(403, 404, 500)) {
+        assertTrue(!requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess, getDiagnostics,
+            HttpResponse.builder().statusCode(statusCode).build()).getServerApiForZone("az-1.region-a.geo-1").getDiagnostics(serverId).isPresent());
+      }
+   }
+   
+   
+   
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d4243b7e/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ServerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ServerApiLiveTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ServerApiLiveTest.java
new file mode 100644
index 0000000..3553d18
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/features/ServerApiLiveTest.java
@@ -0,0 +1,206 @@
+/*
+ * 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.openstack.nova.v2_0.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import org.jclouds.openstack.nova.v2_0.domain.Network;
+import org.jclouds.openstack.nova.v2_0.domain.Server;
+import org.jclouds.openstack.nova.v2_0.domain.ServerCreated;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.jclouds.openstack.nova.v2_0.options.CreateServerOptions;
+import org.jclouds.openstack.nova.v2_0.options.RebuildServerOptions;
+import org.jclouds.openstack.v2_0.domain.Link.Relation;
+import org.jclouds.openstack.v2_0.domain.Resource;
+import org.jclouds.openstack.v2_0.predicates.LinkPredicates;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests behavior of {@link ServerApi}
+ * 
+ * @author Adrian Cole
+ * @author Inbar Stolberg
+ */
+@Test(groups = "live", testName = "ServerApiLiveTest")
+public class ServerApiLiveTest extends BaseNovaApiLiveTest {
+
+   @Test(description = "GET /v${apiVersion}/{tenantId}/servers")
+   public void testListServers() throws Exception {
+      for (String zoneId : zones) {
+         ServerApi serverApi = api.getServerApiForZone(zoneId);
+         for (Resource server : serverApi.list().concat()) {
+            checkResource(server);
+         }
+      }
+   }
+
+   @Test(description = "GET /v${apiVersion}/{tenantId}/servers/detail")
+   public void testListServersInDetail() throws Exception {
+      for (String zoneId : zones) {
+         ServerApi serverApi = api.getServerApiForZone(zoneId);
+         for (Server server : serverApi.listInDetail().concat()) {
+            checkServer(server);
+         }
+      }
+   }
+
+   @Test(description = "GET /v${apiVersion}/{tenantId}/servers/{id}", dependsOnMethods = { "testListServersInDetail" })
+   public void testGetServerById() throws Exception {
+      for (String zoneId : zones) {
+         ServerApi serverApi = api.getServerApiForZone(zoneId);
+         for (Resource server : serverApi.list().concat()) {
+            Server details = serverApi.get(server.getId());
+            assertEquals(details.getId(), server.getId());
+            assertEquals(details.getName(), server.getName());
+            assertEquals(details.getLinks(), server.getLinks());
+            checkServer(details);
+         }
+      }
+   }
+
+   @Test
+   public void testCreateInAvailabilityZone() {
+      String serverId = null;
+      for (String zoneId : zones) {
+         ServerApi serverApi = api.getServerApiForZone(zoneId);
+         try {
+            serverId = createServer(zoneId, "nova", Server.Status.ACTIVE).getId();
+            Server server = serverApi.get(serverId);
+            assertEquals(server.getStatus(), Server.Status.ACTIVE);
+         } finally {
+            serverApi.delete(serverId);
+         }
+      }
+   }
+
+   /**
+    * This needs to be supported by the provider, and is usually not supported.
+    * However this can be tested on devstack:
+    * In apis/openstack-nova:
+    * mvn -Plive clean install "-Dtest.openstack-nova.endpoint=http://localhost:5000/v2.0" "-Dtest.openstack-nova.identity=demo:demo" "-Dtest.openstack-nova.credential=devstack" "-Dtest=org.jclouds.openstack.nova.v2_0.features.ServerApiLiveTest#testCreateWithNetworkOptions"
+    */
+   @Test(enabled = false)
+   public void testCreateWithNetworkOptions() {
+      String serverId = null;
+      for (String zoneId : zones) {
+         ServerApi serverApi = api.getServerApiForZone(zoneId);
+         try {
+            CreateServerOptions options = CreateServerOptions.Builder.novaNetworks(
+                  // This network UUID must match an existing network.
+                  ImmutableSet.of(Network.builder().networkUuid("bc4cfa2b-2b27-4671-8e8f-73009623def0").fixedIp("192.168.55.56").build())
+                  );
+            ServerCreated server = serverApi.create(hostName, imageIdForZone(zoneId), "1", options);
+            serverId = server.getId();
+
+            blockUntilServerInState(server.getId(), serverApi, Server.Status.ACTIVE);
+            Server serverCheck = serverApi.get(serverId);
+            assertEquals(serverCheck.getStatus(), Server.Status.ACTIVE);
+         } finally {
+            if (serverId != null) {
+               serverApi.delete(serverId);
+            }
+         }
+      }
+   }
+
+   @Test
+   public void testCreateInWrongAvailabilityZone() {
+      String serverId = null;
+      for (String zoneId : zones) {
+         ServerApi serverApi = api.getServerApiForZone(zoneId);
+         try {
+            serverId = createServer(zoneId, "err", Server.Status.ERROR).getId();
+            Server server = serverApi.get(serverId);
+            assertEquals(server.getStatus(), Server.Status.ERROR);
+         } finally {
+            serverApi.delete(serverId);
+         }
+      }
+   }
+
+   @Test
+   public void testRebuildServer() {
+
+      String serverId = null;
+
+      for (String zoneId : zones) {
+         ServerApi serverApi = api.getServerApiForZone(zoneId);
+         try {
+            serverId = createServer(zoneId, Server.Status.ACTIVE).getId();
+
+            Server server = serverApi.get(serverId);
+
+            assertEquals(server.getStatus(), Server.Status.ACTIVE);
+
+            RebuildServerOptions options = new RebuildServerOptions().
+                  withImage(server.getImage().getId()).
+                  name("newName").
+                  adminPass("password").
+                  ipv4Address("1.1.1.1").
+                  ipv6Address("fe80::100");
+
+            serverApi.rebuild(serverId, options);
+
+            Server rebuiltServer = serverApi.get(serverId);
+
+            assertEquals("newName", rebuiltServer.getName());
+            assertEquals("1.1.1.1", rebuiltServer.getAccessIPv4());
+            assertEquals("fe80::100", rebuiltServer.getAccessIPv6());
+
+         } finally {
+            serverApi.delete(serverId);
+         }
+      }
+   }
+
+   private Server createServer(String regionId, Server.Status serverStatus) {
+      ServerApi serverApi = api.getServerApiForZone(regionId);
+      CreateServerOptions options = new CreateServerOptions();
+      ServerCreated server = serverApi.create(hostName, imageIdForZone(regionId), flavorRefForZone(regionId), options);
+
+      blockUntilServerInState(server.getId(), serverApi, serverStatus);
+
+      return serverApi.get(server.getId());
+   }
+
+   private Server createServer(String regionId, String availabilityZoneId, Server.Status serverStatus) {
+      ServerApi serverApi = api.getServerApiForZone(regionId);
+      CreateServerOptions options = new CreateServerOptions();
+      options = options.availabilityZone(availabilityZoneId);
+      ServerCreated server = serverApi.create(hostName, imageIdForZone(regionId), flavorRefForZone(regionId), options);
+      blockUntilServerInState(server.getId(), serverApi, serverStatus);
+      return serverApi.get(server.getId());
+   }
+
+   private void checkResource(Resource resource) {
+      assertNotNull(resource.getId());
+      assertNotNull(resource.getName());
+      assertNotNull(resource.getLinks());
+      assertTrue(Iterables.any(resource.getLinks(), LinkPredicates.relationEquals(Relation.SELF)));
+   }
+
+   private void checkServer(Server server) {
+      checkResource(server);
+      assertFalse(server.getAddresses().isEmpty());
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d4243b7e/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/functions/CreateSecurityGroupIfNeededTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/functions/CreateSecurityGroupIfNeededTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/functions/CreateSecurityGroupIfNeededTest.java
new file mode 100644
index 0000000..ba4be4d
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/functions/CreateSecurityGroupIfNeededTest.java
@@ -0,0 +1,168 @@
+/*
+ * 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.openstack.nova.v2_0.functions;
+
+import static org.testng.Assert.assertEquals;
+
+import java.net.URI;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.compute.functions.CreateSecurityGroupIfNeeded;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.SecurityGroupInZone;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.ZoneSecurityGroupNameAndPorts;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseComputeServiceTypicalSecurityGroupTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+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;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "CreateSecurityGroupIfNeededTest")
+public class CreateSecurityGroupIfNeededTest extends BaseNovaApiExpectTest {
+   HttpRequest create = HttpRequest.builder().method("POST").endpoint(
+            URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups")).headers(
+            ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+                     authToken).build())
+            .payload(
+                     payloadFromStringWithContentType(
+                              "{\"security_group\":{\"name\":\"jclouds_mygroup\",\"description\":\"jclouds_mygroup\"}}",
+                              "application/json")).build();
+
+   public void testCreateNewGroup() throws Exception {
+
+      Builder<HttpRequest, HttpResponse> builder = ImmutableMap.builder();
+      
+      builder.put(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess);
+      builder.put(extensionsOfNovaRequest, extensionsOfNovaResponse);
+      int groupId = 2769;
+
+      HttpResponse createResponse = HttpResponse.builder().statusCode(200)
+               .payload(
+                        payloadFromStringWithContentType(
+                                 String.format("{\"security_group\": {\"rules\": [], \"tenant_id\": \"37936628937291\", \"id\": %s, \"name\": \"jclouds_mygroup\", \"description\": \"jclouds_mygroup\"}}", groupId),
+                                 "application/json; charset=UTF-8")).build();
+
+      builder.put(create, createResponse);
+      
+      int ruleId = 10331;
+      
+      for (int port : ImmutableList.of(22,8080)) {
+         
+         HttpRequest createCidrRule = HttpRequest.builder().method("POST").endpoint(
+                  URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-group-rules")).headers(
+                  ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+                           authToken).build())
+                  .payload(
+                           payloadFromStringWithContentType(
+                                    String.format("{\"security_group_rule\":{\"parent_group_id\":\"%s\",\"cidr\":\"0.0.0.0/0\",\"ip_protocol\":\"tcp\",\"from_port\":\"%d\",\"to_port\":\"%d\"}}",
+                                                      groupId, port, port), "application/json")).build();
+         
+         HttpResponse createCidrRuleResponse = HttpResponse.builder().statusCode(200)
+                  .payload(
+                           payloadFromStringWithContentType(
+                                    String.format("{\"security_group_rule\": {\"from_port\": %d, \"group\": {}, \"ip_protocol\": \"tcp\", \"to_port\": %d, \"parent_group_id\": %d, \"ip_range\": {\"cidr\": \"0.0.0.0/0\"}, \"id\": %d}}",
+                                             port, port, groupId, ruleId++), "application/json; charset=UTF-8")).build();
+         
+         builder.put(createCidrRule, createCidrRuleResponse);
+
+         HttpRequest createSelfRule = HttpRequest.builder().method("POST").endpoint(
+                  URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-group-rules")).headers(
+                  ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+                           authToken).build())
+                  .payload(
+                           payloadFromStringWithContentType(
+                                    String.format("{\"security_group_rule\":{\"group_id\":\"%d\",\"parent_group_id\":\"%d\",\"ip_protocol\":\"tcp\",\"from_port\":\"%d\",\"to_port\":\"%d\"}}",
+                                                      groupId, groupId, port, port), "application/json")).build();
+
+         // note server responds with group name in the rule!!
+         HttpResponse createSelfRuleResponse = HttpResponse.builder().statusCode(200)
+                  .payload(
+                           payloadFromStringWithContentType(
+                                    String.format("{\"security_group_rule\": {\"from_port\": %d, \"group\": {\"tenant_id\": \"37936628937291\", \"name\": \"jclouds_mygroup\"}, \"ip_protocol\": \"tcp\", \"to_port\": %d, \"parent_group_id\": %d, \"ip_range\": {}, \"id\": %d}}",
+                                             port, port, groupId, ruleId++), "application/json; charset=UTF-8")).build();
+         
+         builder.put(createSelfRule, createSelfRuleResponse);
+      }
+      
+      HttpRequest getSecurityGroup = HttpRequest.builder().method("GET").endpoint(
+               URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups/" + groupId)).headers(
+               ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+                        authToken).build()).build();
+
+      HttpResponse getSecurityGroupResponse = HttpResponse.builder().statusCode(200).payload(
+               payloadFromResource("/securitygroup_details_computeservice_typical.json")).build();
+      
+      builder.put(getSecurityGroup, getSecurityGroupResponse);
+
+      NovaApi apiCanCreateSecurityGroup = requestsSendResponses(builder.build());
+
+      CreateSecurityGroupIfNeeded fn = new CreateSecurityGroupIfNeeded(apiCanCreateSecurityGroup);
+
+      // we can find it
+      assertEquals(fn.apply(
+               new ZoneSecurityGroupNameAndPorts("az-1.region-a.geo-1", "jclouds_mygroup", ImmutableSet.of(22, 8080)))
+               .toString(), new SecurityGroupInZone(new ParseComputeServiceTypicalSecurityGroupTest().expected(),
+               "az-1.region-a.geo-1").toString());
+
+   }
+
+   public void testReturnExistingGroupOnAlreadyExists() throws Exception {
+
+      Builder<HttpRequest, HttpResponse> builder = ImmutableMap.builder();
+      
+      builder.put(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess);
+      builder.put(extensionsOfNovaRequest, extensionsOfNovaResponse);
+
+      HttpResponse createResponse = HttpResponse.builder().statusCode(400)
+               .payload(
+                        payloadFromStringWithContentType(
+                                 "{\"badRequest\": {\"message\": \"Security group test already exists\", \"code\": 400}}",
+                                 "application/json; charset=UTF-8")).build();
+
+      builder.put(create, createResponse);
+          
+      HttpRequest list = HttpRequest.builder().method("GET").endpoint(
+               URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups")).headers(
+               ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+                        authToken).build()).build();
+
+      HttpResponse listResponse = HttpResponse.builder().statusCode(200).payload(
+               payloadFromResource("/securitygroup_list_details_computeservice_typical.json")).build();
+
+      builder.put(list, listResponse);
+
+      NovaApi apiWhenSecurityGroupsExist = requestsSendResponses(builder.build());
+
+      CreateSecurityGroupIfNeeded fn = new CreateSecurityGroupIfNeeded(apiWhenSecurityGroupsExist);
+
+      // we can find it
+      assertEquals(fn.apply(
+               new ZoneSecurityGroupNameAndPorts("az-1.region-a.geo-1", "jclouds_mygroup", ImmutableSet.of(22, 8080)))
+               .toString(), new SecurityGroupInZone(new ParseComputeServiceTypicalSecurityGroupTest().expected(),
+               "az-1.region-a.geo-1").toString());
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d4243b7e/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/functions/FindSecurityGroupWithNameAndReturnTrueExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/functions/FindSecurityGroupWithNameAndReturnTrueExpectTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/functions/FindSecurityGroupWithNameAndReturnTrueExpectTest.java
new file mode 100644
index 0000000..c8e2639
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/functions/FindSecurityGroupWithNameAndReturnTrueExpectTest.java
@@ -0,0 +1,102 @@
+/*
+ * 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.openstack.nova.v2_0.functions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.SecurityGroupInZone;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.ZoneAndName;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseSecurityGroupListTest;
+import org.jclouds.openstack.nova.v2_0.predicates.FindSecurityGroupWithNameAndReturnTrue;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.Iterables;
+import com.google.common.util.concurrent.Atomics;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "FindSecurityGroupWithNameAndReturnTrueExpectTest")
+public class FindSecurityGroupWithNameAndReturnTrueExpectTest extends BaseNovaApiExpectTest {
+
+   public void testUpdateReferenceWhenSecurityGroupListContainsGroupName() throws Exception {
+      HttpRequest list = HttpRequest.builder().method("GET").endpoint(
+               URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups")).headers(
+               ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+                        authToken).build()).build();
+
+      HttpResponse listResponse = HttpResponse.builder().statusCode(200).payload(
+               payloadFromResource("/securitygroup_list.json")).build();
+
+      NovaApi apiWhenSecurityGroupsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, list,
+               listResponse);
+
+      FindSecurityGroupWithNameAndReturnTrue predicate = new FindSecurityGroupWithNameAndReturnTrue(
+               apiWhenSecurityGroupsExist);
+
+      AtomicReference<ZoneAndName> securityGroupInZoneRef = Atomics.newReference(ZoneAndName
+               .fromZoneAndName("az-1.region-a.geo-1", "name1"));
+
+      // we can find it
+      assertTrue(predicate.apply(securityGroupInZoneRef));
+
+      // the reference is now up to date, and includes the actual group found.
+      assertEquals(securityGroupInZoneRef.get().toString(), new SecurityGroupInZone(Iterables
+               .getOnlyElement(new ParseSecurityGroupListTest().expected()), "az-1.region-a.geo-1").toString());
+
+   }
+
+   public void testDoesNotUpdateReferenceWhenSecurityGroupListMissingGroupName() throws Exception {
+      HttpRequest list = HttpRequest.builder().method("GET").endpoint(
+               URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups")).headers(
+               ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+                        authToken).build()).build();
+
+      HttpResponse listResponse = HttpResponse.builder().statusCode(200).payload(
+               payloadFromResource("/securitygroup_list.json")).build();
+
+      NovaApi apiWhenSecurityGroupsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+               responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, list,
+               listResponse);
+
+      FindSecurityGroupWithNameAndReturnTrue predicate = new FindSecurityGroupWithNameAndReturnTrue(
+               apiWhenSecurityGroupsExist);
+
+      ZoneAndName zoneAndGroup = ZoneAndName.fromZoneAndName("az-1.region-a.geo-1", "name2");
+
+      AtomicReference<ZoneAndName> securityGroupInZoneRef = Atomics.newReference(zoneAndGroup);
+
+      // we cannot find it
+      assertFalse(predicate.apply(securityGroupInZoneRef));
+
+      // the reference is the same
+      assertEquals(securityGroupInZoneRef.get(), zoneAndGroup);
+
+   }
+}