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/31 09:13:52 UTC

[39/52] [partial] Moving jclouds dependencies to accurate parent directories

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/19c8cdaf/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AdminActionsApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AdminActionsApiExpectTest.java b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AdminActionsApiExpectTest.java
new file mode 100644
index 0000000..32c4617
--- /dev/null
+++ b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AdminActionsApiExpectTest.java
@@ -0,0 +1,350 @@
+/*
+ * 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.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.domain.BackupType;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.jclouds.openstack.nova.v2_0.options.CreateBackupOfServerOptions;
+import org.jclouds.rest.AuthorizationException;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Tests parsing and guice wiring of AdminActionsApi
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "unit", testName = "AdminActionsApiExpectTest")
+public class AdminActionsApiExpectTest extends BaseNovaApiExpectTest {
+
+   public void testSuspend() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "suspend").build(),
+            HttpResponse.builder().statusCode(202).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.suspend("1"));
+   }
+
+   public void testSuspendFailsNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "suspend").build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.suspend("1"));
+   }
+
+   @Test(expectedExceptions = AuthorizationException.class)
+   public void testSuspendFailsNotAuthorized() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "suspend").build(),
+            HttpResponse.builder().statusCode(403).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      api.suspend("1");
+   }
+   
+   public void testResume() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "resume").build(),
+            HttpResponse.builder().statusCode(202).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.resume("1"));
+   }
+
+   public void testResumeFailsNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "resume").build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.resume("1"));
+   }
+
+   @Test(expectedExceptions = AuthorizationException.class)
+   public void testResumeFailsNotAuthorized() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "resume").build(),
+            HttpResponse.builder().statusCode(403).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      api.resume("1");
+   }
+
+   public void testLock() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "lock").build(),
+            HttpResponse.builder().statusCode(202).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.lock("1"));
+   }
+
+   public void testLockFailsNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "lock").build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.lock("1"));
+   }
+
+   public void testUnlock() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "unlock").build(),
+            HttpResponse.builder().statusCode(202).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.unlock("1"));
+   }
+
+   public void testUnlockFailsNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "unlock").build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.unlock("1"));
+   }
+
+   public void testPause() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "pause").build(),
+            HttpResponse.builder().statusCode(202).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.pause("1"));
+   }
+
+   public void testPauseFailsNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "pause").build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.pause("1"));
+   }
+   
+   public void testUnpause() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "unpause").build(),
+            HttpResponse.builder().statusCode(202).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.unpause("1"));
+   }
+
+   public void testUnpauseFailsNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "unpause").build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.unpause("1"));
+   }
+   
+   public void testMigrateServer() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "migrate").build(),
+            HttpResponse.builder().statusCode(202).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.migrate("1"));
+   }
+
+
+   public void testMigrateServerFailsNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "migrate").build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.migrate("1"));
+   }
+
+   public void testResetNetworkOfServer() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "resetNetwork").build(),
+            HttpResponse.builder().statusCode(202).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.resetNetwork("1"));
+   }
+
+   public void testResetNetworkOfServerFailsNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "resetNetwork").build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.resetNetwork("1"));
+   }
+   
+   public void testInjectNetworkInfoIntoServer() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "injectNetworkInfo").build(),
+            HttpResponse.builder().statusCode(202).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.injectNetworkInfo("1"));
+   }
+
+   public void testInjectNetworkInfoIntoServerFailsNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "injectNetworkInfo").build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.injectNetworkInfo("1"));
+   }
+   
+   public void testBackupServer() {
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            authenticatedGET().endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action").method("POST")
+                  .payload(payloadFromStringWithContentType("{\"createBackup\":{\"backup_type\":\"weekly\",\"rotation\":3,\"name\":\"mybackup\",\"metadata\":{\"some\":\"data or other\"}}}", MediaType.APPLICATION_JSON)).build(),
+            HttpResponse.builder().statusCode(202).addHeader("Location", "http://172.16.89.149:8774/v2/images/1976b3b3-409a-468d-b16c-a9172c341b46").build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      String imageId = api.createBackup("1", "mybackup", BackupType.WEEKLY, 3, CreateBackupOfServerOptions.Builder.metadata(ImmutableMap.of("some", "data or other")));
+      assertEquals(imageId, "1976b3b3-409a-468d-b16c-a9172c341b46");
+   }
+
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testBackupServerFailNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            authenticatedGET().endpoint(endpoint).method("POST")
+                  .payload(payloadFromStringWithContentType("{\"createBackup\":{\"backup_type\":\"weekly\",\"rotation\":3,\"name\":\"mybackup\",\"metadata\":{\"some\":\"data or other\"}}}", MediaType.APPLICATION_JSON)).build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      api.createBackup("1", "mybackup", BackupType.WEEKLY, 3, CreateBackupOfServerOptions.Builder.metadata(ImmutableMap.of("some", "data or other")));
+   }
+
+   public void testLiveMigrateServer() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "GONNAOVERWRITE")
+                  .payload(payloadFromStringWithContentType("{\"os-migrateLive\":{\"host\":\"bighost\",\"block_migration\":true,\"disk_over_commit\":false}}", MediaType.APPLICATION_JSON)).build(),
+            HttpResponse.builder().statusCode(202).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.liveMigrate("1", "bighost", true, false));
+   }
+
+   public void testLiveMigrateServerFailsNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/action");
+      ServerAdminApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            standardActionRequestBuilderVoidResponse(endpoint, "GONNAOVERWRITE")
+                  .payload(payloadFromStringWithContentType("{\"os-migrateLive\":{\"host\":\"bighost\",\"block_migration\":true,\"disk_over_commit\":false}}", MediaType.APPLICATION_JSON)).build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getServerAdminExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.liveMigrate("1", "bighost", true, false));
+   }
+   
+   protected HttpRequest.Builder<?> standardActionRequestBuilderVoidResponse(URI endpoint, String actionName) {
+      return HttpRequest.builder()
+                        .method("POST")
+                        .addHeader("X-Auth-Token", authToken)
+                        .payload(payloadFromStringWithContentType("{\"" + actionName + "\":null}", MediaType.APPLICATION_JSON))
+                        .endpoint(endpoint);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/19c8cdaf/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AdminActionsApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AdminActionsApiLiveTest.java b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AdminActionsApiLiveTest.java
new file mode 100644
index 0000000..1d15058
--- /dev/null
+++ b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AdminActionsApiLiveTest.java
@@ -0,0 +1,195 @@
+/*
+ * 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.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+import org.jclouds.http.HttpResponseException;
+import org.jclouds.openstack.nova.v2_0.domain.BackupType;
+import org.jclouds.openstack.nova.v2_0.domain.Image;
+import org.jclouds.openstack.nova.v2_0.domain.Server.Status;
+import org.jclouds.openstack.nova.v2_0.features.ImageApi;
+import org.jclouds.openstack.nova.v2_0.features.ServerApi;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.jclouds.openstack.nova.v2_0.options.CreateBackupOfServerOptions;
+import org.jclouds.openstack.v2_0.features.ExtensionApi;
+import org.testng.SkipException;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests behavior of HostAdministrationApi
+ * 
+ * TODO test migration methods
+ * 
+ * @author Adam Lowe
+ */
+@Test(groups = "live", testName = "AdminActionsApiLiveTest", singleThreaded = true)
+public class AdminActionsApiLiveTest extends BaseNovaApiLiveTest {
+   private ImageApi imageApi;
+   private ServerApi serverApi;
+   private ExtensionApi extensionApi;
+   private Optional<? extends ServerAdminApi> apiOption;
+   private String zone;
+
+   private String testServerId;
+   private String backupImageId;
+
+   @BeforeClass(groups = {"integration", "live"})
+   @Override
+   public void setup() {
+      super.setup();
+      zone = Iterables.getLast(api.getConfiguredZones(), "nova");
+      serverApi = api.getServerApiForZone(zone);
+      extensionApi = api.getExtensionApiForZone(zone);
+      imageApi = api.getImageApiForZone(zone);
+      apiOption = api.getServerAdminExtensionForZone(zone);
+      if (apiOption.isPresent()) {
+         testServerId = createServerInZone(zone).getId();
+      }
+   }
+
+   @AfterClass(groups = { "integration", "live" })
+   @Override
+   protected void tearDown() {
+      if (apiOption.isPresent()) {
+         if (testServerId != null) {
+            assertTrue(api.getServerApiForZone(zone).delete(testServerId));
+         }
+         if (backupImageId != null) {
+            imageApi.delete(backupImageId);
+         }
+      }
+      super.tearDown();
+   }
+
+   protected void skipOnAdminExtensionAbsent() {
+      if (!apiOption.isPresent()) {
+         throw new SkipException("Test depends on ServerAdminApi extension");
+      }
+   }
+
+   @AfterMethod(alwaysRun = true)
+   public void ensureServerIsActiveAgain() {
+      if (apiOption.isPresent())
+         blockUntilServerInState(testServerId, serverApi, Status.ACTIVE);
+   }
+
+   public void testSuspendAndResume() {
+      skipOnAdminExtensionAbsent();
+      ServerAdminApi api = apiOption.get();
+
+      // Suspend-resume
+      try {
+         api.resume(testServerId);
+         fail("Resumed an active server!");
+      } catch (HttpResponseException e) {
+      }
+      assertTrue(api.suspend(testServerId));
+      blockUntilServerInState(testServerId, serverApi, Status.SUSPENDED);
+      try {
+         api.suspend(testServerId);
+         fail("Suspended an already suspended server!");
+      } catch (HttpResponseException e) {
+      }
+      assertTrue(api.resume(testServerId));
+      blockUntilServerInState(testServerId, serverApi, Status.ACTIVE);
+      try {
+         api.resume(testServerId);
+         fail("Resumed an already resumed server!");
+      } catch (HttpResponseException e) {
+      }
+
+   }
+
+   public void testLockAndUnlock() {
+      skipOnAdminExtensionAbsent();
+      ServerAdminApi api = apiOption.get();
+
+      // TODO should we be able to double-lock (as it were)
+      assertTrue(api.unlock(testServerId));
+      assertTrue(api.unlock(testServerId));
+      assertTrue(api.lock(testServerId));
+      assertTrue(api.lock(testServerId));
+      assertTrue(api.unlock(testServerId));
+      assertTrue(api.unlock(testServerId));
+
+   }
+
+   public void testResetNetworkAndInjectNetworkInfo() {
+      skipOnAdminExtensionAbsent();
+      ServerAdminApi api = apiOption.get();
+      assertTrue(api.resetNetwork(testServerId));
+      assertTrue(api.injectNetworkInfo(testServerId));
+   }
+
+   @Test
+   public void testPauseAndUnpause() {
+      skipOnAdminExtensionAbsent();
+      ServerAdminApi api = apiOption.get();
+
+      // Unlock and lock (double-checking error contitions too)
+      try {
+         api.unpause(testServerId);
+         fail("Unpaused active server!");
+      } catch (HttpResponseException e) {
+      }
+      assertTrue(api.pause(testServerId));
+      blockUntilServerInState(testServerId, serverApi, Status.PAUSED);
+      try {
+         api.pause(testServerId);
+         fail("paused a paused server!");
+      } catch (HttpResponseException e) {
+      }
+      assertTrue(api.unpause(testServerId));
+      blockUntilServerInState(testServerId, serverApi, Status.ACTIVE);
+      try {
+         api.unpause(testServerId);
+         fail("Unpaused a server we just unpaused!");
+      } catch (HttpResponseException e) {
+      }
+
+   }
+
+   @Test
+   public void testCreateBackupOfServer() throws InterruptedException {
+      skipOnAdminExtensionAbsent();
+      backupImageId = apiOption.get().createBackup(testServerId, "jclouds-test-backup", BackupType.DAILY, 0,
+               CreateBackupOfServerOptions.Builder.metadata(ImmutableMap.of("test", "metadata")));
+
+      assertNotNull(backupImageId);
+
+      // If we don't have extended task status, we'll have to wait here!
+      if (extensionApi.get("OS-EXT-STS") == null) {
+         Thread.sleep(30000);
+      }
+
+      blockUntilServerInState(testServerId, serverApi, Status.ACTIVE);
+
+      Image backupImage = imageApi.get(backupImageId);
+      assertEquals(backupImage.getId(), backupImageId);
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/19c8cdaf/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApiExpectTest.java b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApiExpectTest.java
new file mode 100644
index 0000000..f033a1b
--- /dev/null
+++ b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApiExpectTest.java
@@ -0,0 +1,64 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.extensions;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableSet;
+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.AvailabilityZone;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * @author Inbar Stolberg
+ */
+@Test(groups = "unit", testName = "AvailabilityZoneApiExpectTest")
+public class AvailabilityZoneApiExpectTest extends BaseNovaApiExpectTest {
+
+   public void testLAvailabilityZonesList() throws Exception {
+      HttpRequest list = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-availability-zone")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse listResponse = HttpResponse.builder().statusCode(200)
+            .payload(payloadFromResource("/listAvailabilityZones.json")).build();
+
+      NovaApi availabilityZonesApi = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, list, listResponse);
+
+      assertEquals(availabilityZonesApi.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1", "az-2.region-a.geo-1", "az-3.region-a.geo-1"));
+
+      FluentIterable<? extends AvailabilityZone> zones = availabilityZonesApi.getAvailabilityZoneApi("az-1.region-a.geo-1").list();
+
+      Optional<? extends AvailabilityZone> zone = zones.first();
+
+      assertTrue(zone.isPresent(), "Couldn't find zone");
+      assertTrue(zone.get().getName().equals("nova"), "Expected zone name to be nova but it was: " + zone.get().getName());
+      assertTrue(zone.get().getState().available(), "Zone: "+ zone.get().getName() + " is not available.");
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/19c8cdaf/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZonesApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZonesApiLiveTest.java b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZonesApiLiveTest.java
new file mode 100644
index 0000000..a7ad44f
--- /dev/null
+++ b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZonesApiLiveTest.java
@@ -0,0 +1,45 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.extensions;
+
+import com.google.common.collect.FluentIterable;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.AvailabilityZone;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.testng.annotations.Test;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * @author inbar stolberg
+ */
+@Test(groups = "live", testName = "AvailabilityZonesApiLiveTest")
+public class AvailabilityZonesApiLiveTest extends BaseNovaApiLiveTest {
+
+   @Test
+   public void testListAvailabilityZones() throws Exception {
+
+      AvailabilityZoneAPI availabilityZoneApi = api.getAvailabilityZoneApi("RegionOne");
+      FluentIterable<? extends AvailabilityZone> zones = availabilityZoneApi.list();
+
+      for (AvailabilityZone zone : zones) {
+         assertNotNull(zone.getName());
+         assertTrue(zone.getState().available(), "zone: " + zone.getName() + " is not available.");
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/19c8cdaf/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApiExpectTest.java b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApiExpectTest.java
new file mode 100644
index 0000000..b04b5f2
--- /dev/null
+++ b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApiExpectTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Tests guice wiring and parsing of FlavorExtraSpecsApi
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "unit", testName = "FlavorExtraSpecsApiExpectTest")
+public class FlavorExtraSpecsApiExpectTest extends BaseNovaApiExpectTest {
+
+   public void testGetAllExtraSpecs() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/flavors/9/os-extra_specs");
+      FlavorExtraSpecsApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            authenticatedGET().endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_type_extra_specs.json")).build()
+      ).getFlavorExtraSpecsExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertEquals(api.getMetadata("9"), ImmutableMap.of("test", "value1"));
+   }
+
+   public void testGetAllExtraSpecsFailNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/flavors/9/os-extra_specs");
+      FlavorExtraSpecsApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            authenticatedGET().endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getFlavorExtraSpecsExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.getMetadata("9").isEmpty());
+   }
+
+   public void testSetAllExtraSpecs() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/flavors/9/os-extra_specs");
+      FlavorExtraSpecsApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            authenticatedGET().endpoint(endpoint)
+                  .method("POST")
+                  .payload(payloadFromStringWithContentType("{\"extra_specs\":{\"test1\":\"somevalue\"}}", MediaType.APPLICATION_JSON)).build(),
+            HttpResponse.builder().statusCode(200).build()
+      ).getFlavorExtraSpecsExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.updateMetadata("9", ImmutableMap.of("test1", "somevalue")));
+   }
+
+   public void testSetExtraSpec() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/flavors/5/os-extra_specs/test1");
+      FlavorExtraSpecsApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            authenticatedGET().endpoint(endpoint)
+                  .method("PUT")
+                  .payload(payloadFromStringWithContentType("{\"test1\":\"somevalue\"}", MediaType.APPLICATION_JSON)).build(),
+            HttpResponse.builder().statusCode(200).build()
+      ).getFlavorExtraSpecsExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.updateMetadataEntry("5", "test1", "somevalue"));
+   }
+
+   public void testGetExtraSpec() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/flavors/5/os-extra_specs/test1");
+      FlavorExtraSpecsApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            authenticatedGET().endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(200).payload(payloadFromStringWithContentType("{\"test1\":\"another value\"}", MediaType.APPLICATION_JSON)).build()
+      ).getFlavorExtraSpecsExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertEquals(api.getMetadataKey("5", "test1"), "another value");
+   }
+
+   public void testGetExtraSpecFailNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/flavors/5/os-extra_specs/test1");
+      FlavorExtraSpecsApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            authenticatedGET().endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getFlavorExtraSpecsExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertNull(api.getMetadataKey("5", "test1"));
+   }
+
+   public void testDeleteExtraSpec() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/flavors/5/os-extra_specs/test1");
+      FlavorExtraSpecsApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            authenticatedGET().endpoint(endpoint).method("DELETE").build(),
+            HttpResponse.builder().statusCode(200).build()
+      ).getFlavorExtraSpecsExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertTrue(api.deleteMetadataKey("5", "test1"));
+   }
+
+   public void testDeleteExtraSpecFailNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/flavors/5/os-extra_specs/test1");
+      FlavorExtraSpecsApi api = requestsSendResponses(
+            keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            authenticatedGET().endpoint(endpoint).method("DELETE").build(),
+            HttpResponse.builder().statusCode(404).build()
+      ).getFlavorExtraSpecsExtensionForZone("az-1.region-a.geo-1").get();
+
+      assertFalse(api.deleteMetadataKey("5", "test1"));
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/19c8cdaf/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApiLiveTest.java b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApiLiveTest.java
new file mode 100644
index 0000000..d958324
--- /dev/null
+++ b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApiLiveTest.java
@@ -0,0 +1,123 @@
+/*
+ * 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.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Map;
+
+import org.jclouds.openstack.nova.v2_0.features.FlavorApi;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.jclouds.openstack.v2_0.domain.Resource;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+
+/**
+ * Tests behavior of FlavorExtraSpecsApi
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "live", testName = "FlavorExtraSpecsApiLiveTest", singleThreaded = true)
+public class FlavorExtraSpecsApiLiveTest extends BaseNovaApiLiveTest {
+   private FlavorApi flavorApi;
+   private Optional<? extends FlavorExtraSpecsApi> apiOption;
+   private String zone;
+
+   private Resource testFlavor;
+   private Map<String, String> testSpecs = ImmutableMap.of("jclouds-test", "some data", "jclouds-test2", "more data!");
+
+   @BeforeClass(groups = {"integration", "live"})
+   @Override
+   public void setup() {
+      super.setup();
+      zone = Iterables.getLast(api.getConfiguredZones(), "nova");
+      flavorApi = api.getFlavorApiForZone(zone);
+      apiOption = api.getFlavorExtraSpecsExtensionForZone(zone);
+   }
+
+   @AfterClass(groups = { "integration", "live" })
+   @Override
+   protected void tearDown() {
+      if (apiOption.isPresent() && testFlavor != null) {
+         for (String key : testSpecs.keySet()) {
+            assertTrue(apiOption.get().deleteMetadataKey(testFlavor.getId(), key));
+         }
+      }
+      super.tearDown();
+   }
+
+   public void testCreateExtraSpecs() {
+      if (apiOption.isPresent()) {
+         FlavorExtraSpecsApi api = apiOption.get();
+         testFlavor = Iterables.getLast(flavorApi.list().concat());
+         Map<String, String> before = api.getMetadata(testFlavor.getId());
+         assertNotNull(before);
+         Map<String, String> specs = Maps.newHashMap(before);
+         specs.putAll(testSpecs);
+         assertTrue(api.updateMetadata(testFlavor.getId(), specs));
+         assertEquals(api.getMetadata(testFlavor.getId()), specs);
+         for (Map.Entry<String, String> entry : specs.entrySet()) {
+            assertEquals(api.getMetadataKey(testFlavor.getId(), entry.getKey()), entry.getValue());
+         }
+      }
+   }
+
+   @Test(dependsOnMethods = "testCreateExtraSpecs")
+   public void testListExtraSpecs() {
+      if (apiOption.isPresent()) {
+         FlavorExtraSpecsApi api = apiOption.get();
+         for (String key : testSpecs.keySet()) {
+            assertTrue(api.getMetadata(testFlavor.getId()).containsKey(key));
+         }
+         for (Resource flavor : flavorApi.list().concat()) {
+            Map<String, String> specs = api.getMetadata(flavor.getId());
+            assertNotNull(specs);
+            for (Map.Entry<String, String> entry : specs.entrySet()) {
+               assertEquals(api.getMetadataKey(flavor.getId(), entry.getKey()), entry.getValue());
+            }
+         }
+      }
+   }
+
+   @Test(dependsOnMethods = "testCreateExtraSpecs")
+   public void testTwiddleIndividualSpecs() {
+      if (apiOption.isPresent()) {
+         FlavorExtraSpecsApi api = apiOption.get();
+         for (String key : testSpecs.keySet()) {
+            assertTrue(api.updateMetadataEntry(testFlavor.getId(), key, "new value"));
+         }
+         for (String key : testSpecs.keySet()) {
+            assertEquals(api.getMetadataKey(testFlavor.getId(), key), "new value");
+         }
+         for (Resource flavor : flavorApi.list().concat()) {
+            Map<String, String> specs = api.getMetadata(flavor.getId());
+            assertNotNull(specs);
+            for (Map.Entry<String, String> entry : specs.entrySet()) {
+               assertEquals(api.getMetadataKey(flavor.getId(), entry.getKey()), entry.getValue());
+            }
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/19c8cdaf/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApiExpectTest.java b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApiExpectTest.java
new file mode 100644
index 0000000..65cf1d4
--- /dev/null
+++ b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApiExpectTest.java
@@ -0,0 +1,191 @@
+/*
+ * 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.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+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.ParseFloatingIPListTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseFloatingIPTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Tests annotation parsing of {@code FloatingIPAsyncApi}
+ * 
+ * @author Michael Arnold
+ */
+@Test(groups = "unit", testName = "FloatingIPApiExpectTest")
+public class FloatingIPApiExpectTest extends BaseNovaApiExpectTest {
+   public void testWhenNamespaceInExtensionsListFloatingIpPresent() throws Exception {
+
+      NovaApi apiWhenExtensionNotInList = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse);
+
+      assertEquals(apiWhenExtensionNotInList.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1", "az-2.region-a.geo-1", "az-3.region-a.geo-1"));
+
+      assertTrue(apiWhenExtensionNotInList.getFloatingIPExtensionForZone("az-1.region-a.geo-1").isPresent());
+
+   }
+
+   public void testWhenNamespaceNotInExtensionsListFloatingIpNotPresent() throws Exception {
+
+      NovaApi apiWhenExtensionNotInList = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, unmatchedExtensionsOfNovaResponse);
+
+      assertEquals(apiWhenExtensionNotInList.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1", "az-2.region-a.geo-1", "az-3.region-a.geo-1"));
+
+      assertFalse(apiWhenExtensionNotInList.getFloatingIPExtensionForZone("az-1.region-a.geo-1").isPresent());
+
+   }
+
+   public void testListFloatingIPsWhenResponseIs2xx() throws Exception {
+      HttpRequest list = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse listResponse = HttpResponse.builder().statusCode(200)
+            .payload(payloadFromResource("/floatingip_list.json")).build();
+
+      NovaApi apiWhenFloatingIPsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, list, listResponse);
+
+      assertEquals(apiWhenFloatingIPsExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1", "az-2.region-a.geo-1", "az-3.region-a.geo-1"));
+
+      assertEquals(apiWhenFloatingIPsExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().list()
+            .toString(), new ParseFloatingIPListTest().expected().toString());
+   }
+
+   public void testListFloatingIPsWhenResponseIs404() throws Exception {
+      HttpRequest list = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse listResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenNoServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, list, listResponse);
+
+      assertTrue(apiWhenNoServersExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().list().isEmpty());
+   }
+
+   public void testGetFloatingIPWhenResponseIs2xx() throws Exception {
+      HttpRequest get = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips/1")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse getResponse = HttpResponse.builder().statusCode(200)
+            .payload(payloadFromResource("/floatingip_details.json")).build();
+
+      NovaApi apiWhenFloatingIPsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, get, getResponse);
+
+      assertEquals(apiWhenFloatingIPsExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().get("1")
+            .toString(), new ParseFloatingIPTest().expected().toString());
+   }
+
+   public void testGetFloatingIPWhenResponseIs404() throws Exception {
+      HttpRequest get = HttpRequest
+            .builder()
+            .method("GET")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips/1")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse getResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenNoServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, get, getResponse);
+
+      assertNull(apiWhenNoServersExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().get("1"));
+   }
+
+   public void testAllocateWhenResponseIs2xx() throws Exception {
+      HttpRequest createFloatingIP = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{}", "application/json")).build();
+
+      HttpResponse createFloatingIPResponse = HttpResponse.builder().statusCode(200)
+            .payload(payloadFromResource("/floatingip_details.json")).build();
+
+      NovaApi apiWhenFloatingIPsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, createFloatingIP,
+            createFloatingIPResponse);
+
+      assertEquals(apiWhenFloatingIPsExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().create().toString(),
+            new ParseFloatingIPTest().expected().toString());
+
+   }
+
+   public void testAllocateWhenResponseIs404() throws Exception {
+      HttpRequest createFloatingIP = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{}", "application/json")).build();
+
+      HttpResponse createFloatingIPResponse = HttpResponse.builder().statusCode(404).build();
+
+      NovaApi apiWhenNoServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, createFloatingIP,
+            createFloatingIPResponse);
+
+      assertNull(apiWhenNoServersExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().create());
+   }
+
+   public void testAllocateWithPoolNameWhenResponseIs2xx() throws Exception {
+      HttpRequest createFloatingIP = HttpRequest
+            .builder()
+            .method("POST")
+            .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips")
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken)
+            .payload(payloadFromStringWithContentType("{\"pool\":\"myPool\"}", "application/json")).build();
+
+      HttpResponse createFloatingIPResponse = HttpResponse.builder().statusCode(200)
+            .payload(payloadFromResource("/floatingip_details.json")).build();
+
+      NovaApi apiWhenFloatingIPsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, createFloatingIP,
+            createFloatingIPResponse);
+
+      assertEquals(apiWhenFloatingIPsExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().allocateFromPool("myPool").toString(),
+            new ParseFloatingIPTest().expected().toString());
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/19c8cdaf/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApiLiveTest.java b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApiLiveTest.java
new file mode 100644
index 0000000..d85604c
--- /dev/null
+++ b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApiLiveTest.java
@@ -0,0 +1,171 @@
+/*
+ * 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.extensions;
+
+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.Address;
+import org.jclouds.openstack.nova.v2_0.domain.FloatingIP;
+import org.jclouds.openstack.nova.v2_0.domain.Server;
+import org.jclouds.openstack.nova.v2_0.features.ServerApi;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Multimap;
+
+/**
+ * Tests behavior of {@code ServerApi}
+ * 
+ * @author Adrian Cole
+ */
+@Test(groups = "live", testName = "FloatingIPApiLiveTest")
+public class FloatingIPApiLiveTest extends BaseNovaApiLiveTest {
+
+   private static final int INCONSISTENCY_WINDOW = 5000;
+
+   @Test
+   public void testListFloatingIPs() throws Exception {
+      for (String zoneId : api.getConfiguredZones()) {
+         Optional<? extends FloatingIPApi> apiOption = api.getFloatingIPExtensionForZone(zoneId);
+         if (!apiOption.isPresent())
+            continue;
+         FloatingIPApi api = apiOption.get();
+         Set<? extends FloatingIP> response = api.list().toSet();
+         assert null != response;
+         assertTrue(response.size() >= 0);
+         for (FloatingIP ip : response) {
+            FloatingIP newDetails = api.get(ip.getId());
+
+            assertEquals(newDetails.getId(), ip.getId());
+            assertEquals(newDetails.getIp(), ip.getIp());
+            assertEquals(newDetails.getFixedIp(), ip.getFixedIp());
+            assertEquals(newDetails.getInstanceId(), ip.getInstanceId());
+
+         }
+      }
+   }
+
+   @Test
+   public void testAllocateAndDecreateFloatingIPs() throws Exception {
+      for (String zoneId : api.getConfiguredZones()) {
+         Optional<? extends FloatingIPApi> apiOption = api.getFloatingIPExtensionForZone(zoneId);
+         if (!apiOption.isPresent())
+            continue;
+         FloatingIPApi api = apiOption.get();
+         FloatingIP floatingIP = api.create();
+         assertNotNull(floatingIP);
+
+         Set<? extends FloatingIP> response = api.list().toSet();
+         boolean ipInSet = false;
+         for (FloatingIP ip : response) {
+            if (ip.getId().equals(floatingIP.getId()))
+               ipInSet = true;
+         }
+         assertTrue(ipInSet);
+
+         api.delete(floatingIP.getId());
+
+         response = api.list().toSet();
+         ipInSet = false;
+         for (FloatingIP ip : response) {
+            if (ip.getId().equals(floatingIP.getId())) {
+               ipInSet = true;
+            }
+         }
+         assertFalse(ipInSet);
+      }
+   }
+
+   @Test
+   public void testAddAndRemoveFloatingIp() throws Exception {
+      for (String zoneId : api.getConfiguredZones()) {
+         Optional<? extends FloatingIPApi> apiOption = api.getFloatingIPExtensionForZone(zoneId);
+         if (!apiOption.isPresent())
+            continue;
+         FloatingIPApi api = apiOption.get();
+         ServerApi serverApi = this.api.getServerApiForZone(zoneId);
+         Server server = createServerInZone(zoneId);
+         FloatingIP floatingIP = api.create();
+         assertNotNull(floatingIP);
+         try {
+            api.addToServer(floatingIP.getIp(), server.getId());
+            assertEventually(new ServerHasFloatingIP(serverApi, server.getId(), floatingIP.getIp()));
+         } finally {
+            api.removeFromServer(floatingIP.getIp(), server.getId());
+            serverApi.delete(server.getId());
+         }
+      }
+   }
+
+   protected static void assertEventually(Runnable assertion) {
+      long start = System.currentTimeMillis();
+      AssertionError error = null;
+      for (int i = 0; i < 30; i++) {
+         try {
+            assertion.run();
+            if (i > 0)
+               System.err.printf("%d attempts and %dms asserting %s%n", i + 1, System.currentTimeMillis() - start,
+                     assertion.getClass().getSimpleName());
+            return;
+         } catch (AssertionError e) {
+            error = e;
+         }
+         try {
+            Thread.sleep(INCONSISTENCY_WINDOW / 30);
+         } catch (InterruptedException e) {
+         }
+      }
+      if (error != null)
+         throw error;
+
+   }
+
+   public static final class ServerHasFloatingIP implements Runnable {
+      private final ServerApi api;
+      private final String serverId;
+      private final String floatingIP;
+
+      public ServerHasFloatingIP(ServerApi serverApi, String serverId, String floatingIP) {
+         this.api = serverApi;
+         this.serverId = serverId;
+         this.floatingIP = floatingIP;
+      }
+
+      public void run() {
+         try {
+            Server server = api.get(serverId);
+            boolean ipInServerAddresses = false;
+            Multimap<String, Address> addresses = server.getAddresses();
+            for (Address address : addresses.values()) {
+               if (address.getAddr().equals(floatingIP)) {
+                  ipInServerAddresses = true;
+               }
+            }
+            assertTrue(ipInServerAddresses);
+         } catch (Exception e) {
+            throw new AssertionError(e);
+         }
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/19c8cdaf/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApiExpectTest.java b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApiExpectTest.java
new file mode 100644
index 0000000..97861e3
--- /dev/null
+++ b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApiExpectTest.java
@@ -0,0 +1,241 @@
+/*
+ * 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.extensions;
+
+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.Set;
+
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.domain.Host;
+import org.jclouds.openstack.nova.v2_0.domain.HostResourceUsage;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests HostAdministrationApi guice wiring and parsing (including the Response parsers in FieldValueResponseParsers)
+ * 
+ * @author Adam Lowe
+ */
+@Test(groups = "unit", testName = "HostAdministrationApiExpectTest")
+public class HostAdministrationApiExpectTest extends BaseNovaApiExpectTest {
+   
+   
+   public void testList() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts");
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("GET")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken)
+                  .endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(200).payload(payloadFromResource("/hosts_list.json")).build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      
+      Host expected = Host.builder().name("ubuntu").service("compute").build();
+
+      Set<? extends Host> result = api.list().toSet();
+      Host host = Iterables.getOnlyElement(result);
+      assertEquals(host.getName(), "ubuntu");
+      assertEquals(host.getService(), "compute");
+
+      assertEquals(host, expected);
+   }
+
+   public void testGet() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/xyz");
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("GET")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken)
+                  .endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(200).payload(payloadFromResource("/host.json")).build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+
+      Set<HostResourceUsage> expected = ImmutableSet.of(
+            HostResourceUsage.builder().memoryMb(16083).project("(total)").cpu(4).diskGb(181).host("ubuntu").build(),
+            HostResourceUsage.builder().memoryMb(3396).project("(used_now)").cpu(3).diskGb(5).host("ubuntu").build(),
+            HostResourceUsage.builder().memoryMb(6144).project("(used_max)").cpu(3).diskGb(80).host("ubuntu").build(),
+            HostResourceUsage.builder().memoryMb(6144).project("f8535069c3fb404cb61c873b1a0b4921").cpu(3).diskGb(80).host("ubuntu").build()
+      );
+
+      assertEquals(api.listResourceUsage("xyz").toSet(), expected);
+   }
+   
+   public void testEnableHost() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu");
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("PUT")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken)
+                  .payload(payloadFromStringWithContentType("{\"status\":\"enable\"}", MediaType.APPLICATION_JSON))
+                  .endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(200)
+                  .payload(payloadFromStringWithContentType("{\"host\":\"ubuntu\",\"status\":\"enabled\"}", MediaType.APPLICATION_JSON))
+                  .build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      assertTrue(api.enable("ubuntu"));
+   }
+
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testEnableHostFailNotFound() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu");
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("PUT")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken)
+                  .payload(payloadFromStringWithContentType("{\"status\":\"enable\"}", MediaType.APPLICATION_JSON))
+                  .endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(404)
+                  .build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      api.enable("ubuntu");
+   }
+
+   public void testEnableHostFailNotEnabled() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu");
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("PUT")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken)
+                  .payload(payloadFromStringWithContentType("{\"status\":\"enable\"}", MediaType.APPLICATION_JSON))
+                  .endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(200)
+                  .payload(payloadFromStringWithContentType("{\"host\":\"ubuntu\",\"status\":\"disabled\"}", MediaType.APPLICATION_JSON))
+                  .build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      assertFalse(api.enable("ubuntu"));
+   }
+
+   public void testDisableHost() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu");
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("PUT")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken)
+                  .payload(payloadFromStringWithContentType("{\"status\":\"disable\"}", MediaType.APPLICATION_JSON))
+                  .endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(200)
+                  .payload(payloadFromStringWithContentType("{\"host\":\"ubuntu\",\"status\":\"disabled\"}", MediaType.APPLICATION_JSON))
+                  .build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      assertTrue(api.disable("ubuntu"));
+   }
+
+   public void testStartMaintenance() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu");
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("PUT")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken)
+                  .payload(payloadFromStringWithContentType("{\"maintenance_mode\":\"enable\"}", MediaType.APPLICATION_JSON))
+                  .endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(200)
+                  .payload(payloadFromStringWithContentType("{\"host\":\"ubuntu\",\"maintenance_mode\":\"on_maintenance\"}", MediaType.APPLICATION_JSON))
+                  .build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      assertTrue(api.startMaintenance("ubuntu"));
+   }
+
+   public void testStopMaintenance() {
+      URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu");
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("PUT")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken)
+                  .payload(payloadFromStringWithContentType("{\"maintenance_mode\":\"disable\"}", MediaType.APPLICATION_JSON))
+                  .endpoint(endpoint).build(),
+            HttpResponse.builder().statusCode(200)
+                  .payload(payloadFromStringWithContentType("{\"host\":\"ubuntu\",\"maintenance_mode\":\"off_maintenance\"}", MediaType.APPLICATION_JSON))
+                  .build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      assertTrue(api.stopMaintenance("ubuntu"));
+   }
+   
+   public void testStartupHost() {
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("GET")
+                        .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu/startup")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken).build(),
+            HttpResponse.builder().statusCode(200)
+                  .payload(payloadFromStringWithContentType("{\"host\":\"ubuntu\",\"power_action\":\"startup\"}", MediaType.APPLICATION_JSON))
+                  .build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      assertTrue(api.startup("ubuntu"));
+   }
+
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testStartupHostFailNotFound() {
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("GET")
+                       .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu/startup")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken).build(),
+            HttpResponse.builder().statusCode(404).build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      assertTrue(api.startup("ubuntu"));
+   }
+
+   public void testStartupHostFailWrongActionInProgress() {
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("GET")
+                       .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu/startup")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken).build(),
+            HttpResponse.builder().statusCode(200)
+                  .payload(payloadFromStringWithContentType("{\"host\":\"ubuntu\",\"power_action\":\"shutdown\"}", MediaType.APPLICATION_JSON))
+                  .build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      assertFalse(api.startup("ubuntu"));
+   }
+   
+   public void testShutdownHost() {
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("GET")
+                       .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu/shutdown")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken).build(),
+            HttpResponse.builder().statusCode(200)
+                  .payload(payloadFromStringWithContentType("{\"host\":\"ubuntu\",\"power_action\":\"shutdown\"}", MediaType.APPLICATION_JSON))
+                  .build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      assertTrue(api.shutdown("ubuntu"));
+   }
+   
+   public void testRebootHost() {
+      HostAdministrationApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+            HttpRequest.builder().method("GET")
+                       .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-hosts/ubuntu/reboot")
+                       .addHeader("Accept", "application/json")
+                       .addHeader("X-Auth-Token", authToken).build(),
+            HttpResponse.builder().statusCode(200)
+                  .payload(payloadFromStringWithContentType("{\"host\":\"ubuntu\",\"power_action\":\"reboot\"}", MediaType.APPLICATION_JSON))
+                  .build()).getHostAdministrationExtensionForZone("az-1.region-a.geo-1").get();
+      assertTrue(api.reboot("ubuntu"));
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/19c8cdaf/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApiLiveTest.java b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApiLiveTest.java
new file mode 100644
index 0000000..814cd7d
--- /dev/null
+++ b/dependencies/jclouds/apis/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApiLiveTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import org.jclouds.openstack.nova.v2_0.domain.Host;
+import org.jclouds.openstack.nova.v2_0.domain.HostResourceUsage;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.testng.annotations.BeforeGroups;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests behavior of HostAdministrationApi
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "live", testName = "HostAdministrationApiLiveTest", singleThreaded = true)
+public class HostAdministrationApiLiveTest extends BaseNovaApiLiveTest {
+   private Optional<? extends HostAdministrationApi> optApi = Optional.absent();
+
+   Predicate<Host> isComputeHost = new Predicate<Host>() {
+      @Override
+      public boolean apply(Host input) {
+         return Objects.equal("compute", input.getService());
+      }
+   };
+
+   @BeforeGroups(groups = {"integration", "live"})
+   @Override
+   public void setup() {
+      super.setup();
+
+      if (identity.endsWith(":admin")) {
+         String zone = Iterables.getLast(api.getConfiguredZones(), "nova");
+         optApi = api.getHostAdministrationExtensionForZone(zone);
+      }
+   }
+
+   public void testListAndGet() throws Exception {
+      if (optApi.isPresent()) {
+         HostAdministrationApi api = optApi.get();
+         Set<? extends Host> hosts = api.list().toSet();
+         assertNotNull(hosts);
+         for (Host host : hosts) {
+            for (HostResourceUsage usage : api.listResourceUsage(host.getName())) {
+               assertEquals(usage.getHost(), host.getName());
+               assertNotNull(usage);
+            }
+         }
+      }
+   }
+
+   @Test(enabled = false)
+   public void testEnableDisable() throws Exception {
+      if (optApi.isPresent()) {
+         HostAdministrationApi api = optApi.get();
+         Host host = Iterables.find(api.list(), isComputeHost);
+
+         assertTrue(api.disable(host.getName()));
+         assertTrue(api.enable(host.getName()));
+      }
+   }
+
+   @Test(enabled = false)
+   public void testMaintenanceMode() throws Exception {
+      if (optApi.isPresent()) {
+         HostAdministrationApi api = optApi.get();
+         Host host = Iterables.find(api.list(), isComputeHost);
+         assertTrue(api.startMaintenance(host.getName()));
+         assertTrue(api.stopMaintenance(host.getName()));
+      }
+   }
+
+   @Test(enabled = false)
+   public void testReboot() throws Exception {
+      if (optApi.isPresent()) {
+         HostAdministrationApi api = optApi.get();
+         Host host = Iterables.find(api.list(), isComputeHost);
+         assertTrue(api.reboot(host.getName()));
+      }
+   }
+
+   @Test(enabled = false)
+   public void testShutdownAndStartup() throws Exception {
+      if (optApi.isPresent()) {
+         HostAdministrationApi api = optApi.get();
+         Host host = Iterables.find(api.list(), isComputeHost);
+         assertTrue(api.shutdown(host.getName()));
+         assertTrue(api.startup(host.getName()));
+      }
+   }
+}