You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2015/08/20 11:36:26 UTC

[40/51] [abbrv] [partial] stratos git commit: Revert "Upgrading to jclouds 1.9.1"

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java
new file mode 100644
index 0000000..885289f
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java
@@ -0,0 +1,574 @@
+/*
+ * 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.googlecomputeengine.compute;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GCE_BOOT_DISK_SUFFIX;
+import static org.jclouds.googlecomputeengine.features.GlobalOperationApiExpectTest.GET_GLOBAL_OPERATION_REQUEST;
+import static org.jclouds.googlecomputeengine.features.GlobalOperationApiExpectTest.GET_GLOBAL_OPERATION_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.ImageApiExpectTest.LIST_DEBIAN_IMAGES_REQUEST;
+import static org.jclouds.googlecomputeengine.features.ImageApiExpectTest.LIST_DEBIAN_IMAGES_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.ImageApiExpectTest.LIST_CENTOS_IMAGES_REQUEST;
+import static org.jclouds.googlecomputeengine.features.ImageApiExpectTest.LIST_CENTOS_IMAGES_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.ImageApiExpectTest.LIST_PROJECT_IMAGES_REQUEST;
+import static org.jclouds.googlecomputeengine.features.ImageApiExpectTest.LIST_PROJECT_IMAGES_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.InstanceApiExpectTest.LIST_CENTRAL1B_INSTANCES_REQUEST;
+import static org.jclouds.googlecomputeengine.features.InstanceApiExpectTest.LIST_CENTRAL1B_INSTANCES_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.InstanceApiExpectTest.LIST_INSTANCES_REQUEST;
+import static org.jclouds.googlecomputeengine.features.InstanceApiExpectTest.LIST_INSTANCES_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.MachineTypeApiExpectTest.LIST_CENTRAL1B_MACHINE_TYPES_REQUEST;
+import static org.jclouds.googlecomputeengine.features.MachineTypeApiExpectTest.LIST_CENTRAL1B_MACHINE_TYPES_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.MachineTypeApiExpectTest.LIST_MACHINE_TYPES_REQUEST;
+import static org.jclouds.googlecomputeengine.features.MachineTypeApiExpectTest.LIST_MACHINE_TYPES_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.NetworkApiExpectTest.GET_NETWORK_REQUEST;
+import static org.jclouds.googlecomputeengine.features.ProjectApiExpectTest.GET_PROJECT_REQUEST;
+import static org.jclouds.googlecomputeengine.features.ProjectApiExpectTest.GET_PROJECT_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.ZoneApiExpectTest.LIST_ZONES_REQ;
+import static org.jclouds.googlecomputeengine.features.ZoneApiExpectTest.LIST_ZONES_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.ZoneApiExpectTest.LIST_ZONES_SHORT_RESPONSE;
+import static org.jclouds.googlecomputeengine.features.ZoneOperationApiExpectTest.GET_ZONE_OPERATION_REQUEST;
+import static org.jclouds.googlecomputeengine.features.ZoneOperationApiExpectTest.GET_ZONE_OPERATION_RESPONSE;
+import static org.jclouds.util.Strings2.toStringAndClose;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.compute.ComputeService;
+import org.jclouds.compute.RunNodesException;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.domain.Location;
+import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions;
+import org.jclouds.googlecomputeengine.domain.Instance;
+import org.jclouds.googlecomputeengine.features.InstanceApiExpectTest;
+import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineServiceExpectTest;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.util.Strings2;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
+
+@Test(groups = "unit")
+public class GoogleComputeEngineServiceExpectTest extends BaseGoogleComputeEngineServiceExpectTest {
+
+
+   private HttpRequest INSERT_NETWORK_REQUEST = HttpRequest
+           .builder()
+           .method("POST")
+           .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/global/networks")
+           .addHeader("Accept", "application/json")
+           .addHeader("Authorization", "Bearer " + TOKEN)
+           .payload(payloadFromStringWithContentType("{\"name\":\"jclouds-test\",\"IPv4Range\":\"10.0.0.0/8\"}",
+                   MediaType.APPLICATION_JSON))
+           .build();
+
+   private HttpRequest INSERT_FIREWALL_REQUEST = HttpRequest
+           .builder()
+           .method("POST")
+           .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/global/firewalls")
+           .addHeader("Accept", "application/json")
+           .addHeader("Authorization", "Bearer " + TOKEN)
+           .payload(payloadFromStringWithContentType("{\"name\":\"jclouds-test\",\"network\":\"https://www.googleapis" +
+                   ".com/compute/v1/projects/myproject/global/networks/jclouds-test\"," +
+                   "\"sourceRanges\":[\"10.0.0.0/8\",\"0.0.0.0/0\"],\"sourceTags\":[\"aTag\"],\"allowed\":[{\"IPProtocol\":\"tcp\"," +
+                   "\"ports\":[\"22\"]}," +
+                   "{\"IPProtocol\":\"udp\",\"ports\":[\"22\"]}]}",
+                   MediaType.APPLICATION_JSON))
+           .build();
+
+   private HttpResponse GET_NETWORK_RESPONSE = HttpResponse.builder().statusCode(200)
+           .payload(payloadFromStringWithContentType("{\n" +
+                   " \"kind\": \"compute#network\",\n" +
+                   " \"id\": \"13024414170909937976\",\n" +
+                   " \"creationTimestamp\": \"2012-10-24T20:13:19.967\",\n" +
+                   " \"selfLink\": \"https://www.googleapis" +
+                   ".com/compute/v1/projects/myproject/global/networks/jclouds-test\",\n" +
+                   " \"name\": \"jclouds-test\",\n" +
+                   " \"description\": \"test network\",\n" +
+                   " \"IPv4Range\": \"10.0.0.0/8\",\n" +
+                   " \"gatewayIPv4\": \"10.0.0.1\"\n" +
+                   "}", MediaType.APPLICATION_JSON)).build();
+
+   private HttpResponse SUCESSFULL_OPERATION_RESPONSE = HttpResponse.builder().statusCode(200)
+           .payload(payloadFromResource("/operation.json")).build();
+
+   private HttpRequest SET_TAGS_REQUEST = HttpRequest.builder()
+           .method("POST")
+           .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/setTags")
+           .addHeader("Accept", "application/json")
+           .addHeader("Authorization", "Bearer " + TOKEN)
+           .payload(payloadFromStringWithContentType("{\"items\":[\"aTag\"],\"fingerprint\":\"abcd\"}",
+                   MediaType.APPLICATION_JSON))
+           .build();
+
+   private HttpResponse SET_TAGS_RESPONSE = HttpResponse.builder().statusCode(200)
+           .payload(payloadFromResource("/operation.json")).build();
+
+   private HttpResponse getInstanceResponseForInstanceAndNetworkAndStatus(String instanceName, String networkName,
+                                                                          String status) throws
+           IOException {
+      return HttpResponse.builder().statusCode(200)
+              .payload(payloadFromStringWithContentType(
+                      replaceInstanceNameNetworkAndStatusOnResource("/instance_get.json",
+                              instanceName, networkName, status),
+                      "application/json")).build();
+   }
+
+   private HttpResponse getListInstancesResponseForSingleInstanceAndNetworkAndStatus(String instanceName,
+                                                                                     String networkName,
+                                                                                     String status) {
+      return HttpResponse.builder().statusCode(200)
+              .payload(payloadFromStringWithContentType(
+                      replaceInstanceNameNetworkAndStatusOnResource("/instance_list.json",
+                              instanceName, networkName, status),
+                      "application/json")).build();
+   }
+
+   private HttpResponse getDiskResponseForInstance(String instanceName) {
+      return HttpResponse.builder().statusCode(200)
+                         .payload(payloadFromStringWithContentType(
+                         replaceDiskNameOnResource("/disk_get.json", instanceName + "-" + GCE_BOOT_DISK_SUFFIX),
+                         "application/json")).build();
+   }
+
+   private String replaceDiskNameOnResource(String resourceName, String diskName) {
+      try {
+         return Strings2.toStringAndClose(this.getClass().getResourceAsStream(resourceName))
+                        .replace("testimage1", diskName);
+      } catch (IOException e) {
+         throw Throwables.propagate(e);
+      }
+   }
+
+   private String replaceInstanceNameNetworkAndStatusOnResource(String resourceName, String instanceName,
+                                                                String networkName, String status) {
+      try {
+         return Strings2.toStringAndClose(this.getClass().getResourceAsStream(resourceName)).replace("test-0",
+                                                                                                     instanceName).replace("default", networkName).replace("RUNNING", status);
+      } catch (IOException e) {
+         throw Throwables.propagate(e);
+      }
+   }
+
+   private HttpRequest createDiskRequestForInstance(String instanceName) {
+      return HttpRequest
+              .builder()
+              .method("POST")
+              .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks"
+                                + "?sourceImage=https%3A//www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140718")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN)
+              .payload(payloadFromStringWithContentType("{\"name\":\"" + instanceName + "-" + GCE_BOOT_DISK_SUFFIX + "\","
+                                                        + "\"sizeGb\":10}",
+                                                        MediaType.APPLICATION_JSON)).build();
+   }
+
+   private HttpRequest getDiskRequestForInstance(String instanceName) {
+      return HttpRequest
+              .builder()
+              .method("GET")
+              .endpoint("https://www.googleapis" +
+                        ".com/compute/v1/projects/myproject/zones/us-central1-a/disks/"
+                        + instanceName + "-" + GCE_BOOT_DISK_SUFFIX)
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+   }
+
+
+
+   private HttpRequest createInstanceRequestForInstance(String instanceName, String groupName,
+                                                        String networkName, String publicKey) {
+      return HttpRequest
+              .builder()
+              .method("POST")
+              .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN)
+              .payload(payloadFromStringWithContentType("{\"name\":\"" + instanceName + "\"," +
+                                                        "\"machineType\":\"https://www.googleapis" +
+                                                        ".com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/f1-micro\"," +
+                                                        "\"serviceAccounts\":[]," +
+                                                        "\"networkInterfaces\":[{\"network\":\"https://www.googleapis" +
+                                                        ".com/compute/v1/projects/myproject/global/networks/" + networkName + "\"," +
+                                                        "\"accessConfigs\":[{\"type\":\"ONE_TO_ONE_NAT\"}]}]," +
+                                                        "\"disks\":[{\"mode\":\"READ_WRITE\",\"source\":\"https://www.googleapis.com/" +
+                                                        "compute/v1/projects/myproject/zones/us-central1-a/disks/" + instanceName +
+                                                        "-" + GCE_BOOT_DISK_SUFFIX + "\",\"deleteOnTerminate\":true,\"boot\":true,\"type\":\"PERSISTENT\"}]," +
+                                                        "\"metadata\":{\"kind\":\"compute#metadata\",\"items\":[{\"key\":\"sshKeys\"," +
+                                                        "\"value\":\"jclouds:" +
+                                                        publicKey + " jclouds@localhost\"},{\"key\":\"jclouds-group\"," +
+                                                        "\"value\":\"" + groupName + "\"},{\"key\":\"jclouds-image\",\"value\":\"https://www.googleapis" +
+                                                        ".com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140718\"}," +
+                                                        "{\"key\":\"jclouds-delete-boot-disk\",\"value\":\"true\"}]}}",
+                                                        MediaType.APPLICATION_JSON)).build();
+   }
+
+   private HttpRequest getInstanceRequestForInstance(String instanceName) {
+      return HttpRequest
+              .builder()
+              .method("GET")
+              .endpoint("https://www.googleapis" +
+                      ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/" + instanceName)
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+   }
+
+
+   @Override
+   protected Properties setupProperties() {
+      Properties overrides = super.setupProperties();
+      overrides.put("google-compute-engine.identity", "myproject");
+      try {
+         overrides.put("google-compute-engine.credential", toStringAndClose(getClass().getResourceAsStream("/testpk.pem")));
+      } catch (IOException e) {
+         Throwables.propagate(e);
+      }
+      return overrides;
+   }
+
+   @Test(enabled = false)
+   public void testThrowsAuthorizationException() throws Exception {
+
+      Properties properties = new Properties();
+      properties.setProperty("oauth.identity", "MOMMA");
+      properties.setProperty("oauth.credential", "MiA");
+
+      ComputeService client = requestsSendResponses(ImmutableMap.<HttpRequest, HttpResponse>of(), createModule(),
+              properties);
+      Template template = client.templateBuilder().build();
+      Template toMatch = client.templateBuilder().imageId(template.getImage().getId()).build();
+      assertEquals(toMatch.getImage(), template.getImage());
+   }
+
+   @Test
+   public void testTemplateMatch() throws Exception {
+      ImmutableMap<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.
+              <HttpRequest, HttpResponse>builder()
+              .put(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE)
+              .put(GET_PROJECT_REQUEST, GET_PROJECT_RESPONSE)
+              .put(LIST_ZONES_REQ, LIST_ZONES_RESPONSE)
+              .put(LIST_PROJECT_IMAGES_REQUEST, LIST_PROJECT_IMAGES_RESPONSE)
+              .put(LIST_DEBIAN_IMAGES_REQUEST, LIST_DEBIAN_IMAGES_RESPONSE)
+              .put(LIST_CENTOS_IMAGES_REQUEST, LIST_CENTOS_IMAGES_RESPONSE)
+              .put(LIST_MACHINE_TYPES_REQUEST, LIST_MACHINE_TYPES_RESPONSE)
+              .put(LIST_CENTRAL1B_MACHINE_TYPES_REQUEST, LIST_CENTRAL1B_MACHINE_TYPES_RESPONSE)
+              .build();
+
+      ComputeService client = requestsSendResponses(requestResponseMap);
+      Template template = client.templateBuilder().build();
+      Hardware defaultSize = client.templateBuilder().build().getHardware();
+
+      Hardware smallest = client.templateBuilder().smallest().build().getHardware();
+      assertEquals(defaultSize, smallest);
+
+      Hardware fastest = client.templateBuilder().fastest().build().getHardware();
+      assertNotNull(fastest);
+
+      assertEquals(client.listHardwareProfiles().size(), 5);
+
+      Template toMatch = client.templateBuilder()
+              .imageId(template.getImage().getId())
+              .build();
+      assertEquals(toMatch.getImage(), template.getImage());
+   }
+
+   @Test
+   public void testNetworksAndFirewallDeletedWhenAllGroupNodesAreTerminated() throws IOException {
+
+      HttpRequest deleteNodeRequest = HttpRequest.builder()
+              .method("DELETE")
+              .endpoint("https://www.googleapis" +
+                      ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-delete-networks")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpRequest deleteFirewallRequest = HttpRequest.builder()
+              .method("DELETE")
+              .endpoint("https://www.googleapis" +
+                      ".com/compute/v1/projects/myproject/global/firewalls/jclouds-test-delete")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpRequest getNetworkRequest = HttpRequest.builder()
+              .method("GET")
+              .endpoint("https://www.googleapis" +
+                      ".com/compute/v1/projects/myproject/global/networks/jclouds-test-delete")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpResponse getNetworkResponse = HttpResponse.builder().statusCode(200)
+              .payload(staticPayloadFromResource("/GoogleComputeEngineServiceExpectTest/network_get.json")).build();
+
+      HttpRequest listFirewallsRequest = HttpRequest.builder()
+              .method("GET")
+              .endpoint("https://www.googleapis" +
+                        ".com/compute/v1/projects/myproject/global/firewalls")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpResponse listFirewallsResponse = HttpResponse.builder().statusCode(200)
+              .payload(staticPayloadFromResource("/GoogleComputeEngineServiceExpectTest/firewall_list.json")).build();
+
+      HttpRequest deleteNetworkReqquest = HttpRequest.builder()
+              .method("DELETE")
+              .endpoint("https://www.googleapis" +
+                        ".com/compute/v1/projects/myproject/global/networks/jclouds-test-delete")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpRequest deleteDiskRequest = HttpRequest.builder()
+            .method("DELETE")
+            .endpoint("https://www.googleapis" +
+                  ".com/compute/v1/projects/myproject/zones/us-central1-a/disks/test")
+            .addHeader("Accept", "application/json")
+            .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      List<HttpRequest> orderedRequests = ImmutableList.<HttpRequest>builder()
+              .add(requestForScopes(COMPUTE_READONLY_SCOPE))
+              .add(GET_PROJECT_REQUEST)
+              .add(getInstanceRequestForInstance("test-delete-networks"))
+              .add(LIST_ZONES_REQ)
+              .add(LIST_MACHINE_TYPES_REQUEST)
+              .add(LIST_PROJECT_IMAGES_REQUEST)
+              .add(LIST_DEBIAN_IMAGES_REQUEST)
+              .add(LIST_CENTOS_IMAGES_REQUEST)
+              .add(getInstanceRequestForInstance("test-delete-networks"))
+              .add(requestForScopes(COMPUTE_SCOPE))
+              .add(deleteNodeRequest)
+              .add(GET_ZONE_OPERATION_REQUEST)
+              .add(deleteDiskRequest)
+              .add(GET_ZONE_OPERATION_REQUEST)
+              .add(getInstanceRequestForInstance("test-delete-networks"))
+              .add(LIST_INSTANCES_REQUEST)
+              .add(getNetworkRequest)
+              .add(listFirewallsRequest)
+              .add(deleteFirewallRequest)
+              .add(GET_GLOBAL_OPERATION_REQUEST)
+              .add(deleteNetworkReqquest)
+              .add(GET_GLOBAL_OPERATION_REQUEST)
+              .build();
+
+
+      List<HttpResponse> orderedResponses = ImmutableList.<HttpResponse>builder()
+              .add(TOKEN_RESPONSE)
+              .add(GET_PROJECT_RESPONSE)
+              .add(getInstanceResponseForInstanceAndNetworkAndStatus("test-delete-networks", "test-network", Instance
+                      .Status.RUNNING.name()))
+              .add(LIST_ZONES_SHORT_RESPONSE)
+              .add(LIST_MACHINE_TYPES_RESPONSE)
+              .add(LIST_PROJECT_IMAGES_RESPONSE)
+              .add(LIST_DEBIAN_IMAGES_RESPONSE)
+              .add(LIST_CENTOS_IMAGES_RESPONSE)
+              .add(getInstanceResponseForInstanceAndNetworkAndStatus("test-delete-networks", "test-network", Instance
+                                                                                                             .Status.RUNNING.name()))
+              .add(TOKEN_RESPONSE)
+              .add(SUCESSFULL_OPERATION_RESPONSE)
+              .add(GET_ZONE_OPERATION_RESPONSE)
+              .add(SUCESSFULL_OPERATION_RESPONSE)
+              .add(GET_ZONE_OPERATION_RESPONSE)
+              .add(getInstanceResponseForInstanceAndNetworkAndStatus("test-delete-networks", "test-network", Instance
+                      .Status.TERMINATED.name()))
+              .add(getListInstancesResponseForSingleInstanceAndNetworkAndStatus("test-delete-networks",
+                      "test-network", Instance
+                      .Status.TERMINATED.name()))
+              .add(getNetworkResponse)
+              .add(listFirewallsResponse)
+              .add(SUCESSFULL_OPERATION_RESPONSE)
+              .add(GET_GLOBAL_OPERATION_RESPONSE)
+              .add(SUCESSFULL_OPERATION_RESPONSE)
+              .add(GET_GLOBAL_OPERATION_RESPONSE)
+              .build();
+
+      ComputeService client = orderedRequestsSendResponses(orderedRequests, orderedResponses);
+      client.destroyNode("us-central1-a/test-delete-networks");
+
+   }
+
+   public void testListLocationsWhenResponseIs2xx() throws Exception {
+
+      ImmutableMap<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.
+              <HttpRequest, HttpResponse>builder()
+              .put(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE)
+              .put(GET_PROJECT_REQUEST, GET_PROJECT_RESPONSE)
+              .put(LIST_ZONES_REQ, LIST_ZONES_RESPONSE)
+              .put(LIST_INSTANCES_REQUEST, LIST_INSTANCES_RESPONSE)
+              .put(LIST_CENTRAL1B_INSTANCES_REQUEST, LIST_CENTRAL1B_INSTANCES_RESPONSE)
+              .put(LIST_PROJECT_IMAGES_REQUEST, LIST_PROJECT_IMAGES_RESPONSE)
+              .put(LIST_DEBIAN_IMAGES_REQUEST, LIST_DEBIAN_IMAGES_RESPONSE)
+              .put(LIST_CENTOS_IMAGES_REQUEST, LIST_CENTOS_IMAGES_RESPONSE)
+              .put(LIST_MACHINE_TYPES_REQUEST, LIST_MACHINE_TYPES_RESPONSE)
+              .put(LIST_CENTRAL1B_MACHINE_TYPES_REQUEST, LIST_CENTRAL1B_MACHINE_TYPES_RESPONSE)
+              .build();
+
+      ComputeService apiWhenServersExist = requestsSendResponses(requestResponseMap);
+
+      Set<? extends Location> locations = apiWhenServersExist.listAssignableLocations();
+
+      assertNotNull(locations);
+      assertEquals(locations.size(), 2);
+      assertEquals(locations.iterator().next().getId(), "us-central1-a");
+
+      assertNotNull(apiWhenServersExist.listNodes());
+      assertEquals(apiWhenServersExist.listNodes().size(), 1);
+      assertEquals(apiWhenServersExist.listNodes().iterator().next().getId(), "us-central1-a/test-0");
+      assertEquals(apiWhenServersExist.listNodes().iterator().next().getName(), "test-0");
+   }
+
+   @Test(dependsOnMethods = "testListLocationsWhenResponseIs2xx")
+   public void testCreateNodeWhenNetworkNorFirewallExistDoesNotExist() throws RunNodesException, IOException {
+
+
+      String payload = Strings2.toStringAndClose(InstanceApiExpectTest.class.getResourceAsStream("/instance_get.json"));
+      payload = payload.replace("test-0", "test-1");
+
+      HttpResponse getInstanceResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromStringWithContentType(payload, "application/json")).build();
+
+      HttpRequest getFirewallRequest = HttpRequest
+                 .builder()
+                 .method("GET")
+                 .endpoint("https://www.googleapis" +
+                         ".com/compute/v1/projects/myproject/global/firewalls/jclouds-test-port-22")
+                 .addHeader("Accept", "application/json")
+                 .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpRequest insertFirewallRequest = HttpRequest
+                 .builder()
+                 .method("POST")
+                 .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/global/firewalls")
+                 .addHeader("Accept", "application/json")
+                 .addHeader("Authorization", "Bearer " + TOKEN)
+                 .payload(payloadFromStringWithContentType("{\"name\":\"jclouds-test-port-22\",\"network\":\"https://www.googleapis" +
+                         ".com/compute/v1/projects/myproject/global/networks/jclouds-test\"," +
+                         "\"sourceRanges\":[\"10.0.0.0/8\",\"0.0.0.0/0\"],\"sourceTags\":[\"aTag\"],\"targetTags\":[\"jclouds-test-port-22\"],\"allowed\":[{\"IPProtocol\":\"tcp\"," +
+                         "\"ports\":[\"22\"]}," +
+                         "{\"IPProtocol\":\"udp\",\"ports\":[\"22\"]}]}",
+                         MediaType.APPLICATION_JSON))
+                 .build();
+
+      HttpRequest setTagsRequest = HttpRequest
+                 .builder()
+                 .method("POST")
+                 .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/setTags")
+                 .addHeader("Accept", "application/json")
+                 .addHeader("Authorization", "Bearer " + TOKEN)
+                 .payload(payloadFromStringWithContentType("{\"items\":[\"jclouds-test-port-22\"],\"fingerprint\":\"abcd\"}",
+                         MediaType.APPLICATION_JSON))
+                 .build();
+
+      List<HttpRequest> orderedRequests = ImmutableList.<HttpRequest>builder()
+              .add(requestForScopes(COMPUTE_READONLY_SCOPE))
+              .add(GET_PROJECT_REQUEST)
+              .add(LIST_ZONES_REQ)
+              .add(LIST_PROJECT_IMAGES_REQUEST)
+              .add(LIST_DEBIAN_IMAGES_REQUEST)
+              .add(LIST_CENTOS_IMAGES_REQUEST)
+              .add(LIST_ZONES_REQ)
+              .add(LIST_MACHINE_TYPES_REQUEST)
+              .add(GET_NETWORK_REQUEST)
+              .add(GET_NETWORK_REQUEST)
+              .add(requestForScopes(COMPUTE_SCOPE))
+              .add(INSERT_NETWORK_REQUEST)
+              .add(GET_GLOBAL_OPERATION_REQUEST)
+              .add(GET_NETWORK_REQUEST)
+              .add(getFirewallRequest)
+              .add(insertFirewallRequest)
+              .add(GET_GLOBAL_OPERATION_REQUEST)
+              .add(LIST_INSTANCES_REQUEST)
+              .add(LIST_MACHINE_TYPES_REQUEST)
+              .add(LIST_PROJECT_IMAGES_REQUEST)
+              .add(LIST_DEBIAN_IMAGES_REQUEST)
+              .add(LIST_CENTOS_IMAGES_REQUEST)
+              .add(createDiskRequestForInstance("test-1"))
+              .add(GET_ZONE_OPERATION_REQUEST)
+              .add(getDiskRequestForInstance("test-1"))
+              .add(createInstanceRequestForInstance("test-1", "test", "jclouds-test", openSshKey))
+              .add(GET_ZONE_OPERATION_REQUEST)
+              .add(getInstanceRequestForInstance("test-1"))
+              .add(SET_TAGS_REQUEST)
+              .add(GET_ZONE_OPERATION_REQUEST)
+              .add(getInstanceRequestForInstance("test-1"))
+              .add(setTagsRequest)
+              .add(LIST_PROJECT_IMAGES_REQUEST)
+              .add(LIST_DEBIAN_IMAGES_REQUEST)
+              .add(LIST_CENTOS_IMAGES_REQUEST)
+              .add(setTagsRequest)
+              .build();
+
+      List<HttpResponse> orderedResponses = ImmutableList.<HttpResponse>builder()
+              .add(TOKEN_RESPONSE)
+              .add(GET_PROJECT_RESPONSE)
+              .add(LIST_ZONES_SHORT_RESPONSE)
+              .add(LIST_PROJECT_IMAGES_RESPONSE)
+              .add(LIST_DEBIAN_IMAGES_RESPONSE)
+              .add(LIST_CENTOS_IMAGES_RESPONSE)
+              .add(LIST_ZONES_SHORT_RESPONSE)
+              .add(LIST_MACHINE_TYPES_RESPONSE)
+              .add(HttpResponse.builder().statusCode(404).build())
+              .add(HttpResponse.builder().statusCode(404).build())
+              .add(TOKEN_RESPONSE)
+              .add(SUCESSFULL_OPERATION_RESPONSE)
+              .add(GET_GLOBAL_OPERATION_RESPONSE)
+              .add(GET_NETWORK_RESPONSE)
+              .add(HttpResponse.builder().statusCode(404).build())
+              .add(SUCESSFULL_OPERATION_RESPONSE)
+              .add(GET_GLOBAL_OPERATION_RESPONSE)
+              .add(LIST_INSTANCES_RESPONSE)
+              .add(LIST_MACHINE_TYPES_RESPONSE)
+              .add(LIST_PROJECT_IMAGES_RESPONSE)
+              .add(LIST_DEBIAN_IMAGES_RESPONSE)
+              .add(LIST_CENTOS_IMAGES_RESPONSE)
+              .add(SUCESSFULL_OPERATION_RESPONSE)
+              .add(GET_ZONE_OPERATION_RESPONSE)
+              .add(getDiskResponseForInstance("test-1"))
+              .add(SUCESSFULL_OPERATION_RESPONSE)
+              .add(GET_ZONE_OPERATION_RESPONSE)
+              .add(getInstanceResponse)
+              .add(SET_TAGS_RESPONSE)
+              .add(GET_ZONE_OPERATION_RESPONSE)
+              .add(getInstanceResponse)
+              .add(SUCESSFULL_OPERATION_RESPONSE)
+              .add(LIST_PROJECT_IMAGES_RESPONSE)
+              .add(LIST_DEBIAN_IMAGES_RESPONSE)
+              .add(LIST_CENTOS_IMAGES_RESPONSE)
+              .add(SUCESSFULL_OPERATION_RESPONSE)
+              .build();
+
+
+      ComputeService computeService = orderedRequestsSendResponses(orderedRequests, orderedResponses);
+
+      GoogleComputeEngineTemplateOptions options = computeService.templateOptions().as(GoogleComputeEngineTemplateOptions.class);
+      options.tags(ImmutableSet.of("aTag"));
+      NodeMetadata node = getOnlyElement(computeService.createNodesInGroup("test", 1, options));
+      assertEquals(node.getImageId(), "debian-7-wheezy-v20140718");
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
new file mode 100644
index 0000000..2011d2d
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
@@ -0,0 +1,133 @@
+/*
+ * 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.googlecomputeengine.compute;
+
+import static com.google.common.collect.Iterables.contains;
+import static org.jclouds.oauth.v2.OAuthTestUtils.setCredential;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import java.util.Properties;
+import java.util.Set;
+
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.config.UserProject;
+import org.jclouds.googlecomputeengine.domain.MachineType;
+import org.jclouds.oauth.v2.config.CredentialType;
+import org.jclouds.oauth.v2.config.OAuthProperties;
+import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
+
+@Test(groups = "live", singleThreaded = true)
+public class GoogleComputeEngineServiceLiveTest extends BaseComputeServiceLiveTest {
+
+   protected static final String DEFAULT_ZONE_NAME = "us-central1-a";
+
+   public GoogleComputeEngineServiceLiveTest() {
+      provider = "google-compute-engine";
+   }
+
+   @Override
+   protected Properties setupProperties() {
+      Properties props = super.setupProperties();
+      if (!System.getProperty(OAuthProperties.CREDENTIAL_TYPE, "")
+            .equalsIgnoreCase(CredentialType.BEARER_TOKEN_CREDENTIALS.toString())) {
+      setCredential(props, provider + ".credential");
+      }
+      return props;
+   }
+
+   public void testListHardwareProfiles() throws Exception {
+      GoogleComputeEngineApi api = client.getContext().unwrapApi(GoogleComputeEngineApi.class);
+      Supplier<String> userProject = context.utils().injector().getInstance(Key.get(new TypeLiteral<Supplier<String>>() {
+      }, UserProject.class));
+      ImmutableSet.Builder<String> deprecatedMachineTypes = ImmutableSet.builder();
+      for (MachineType machine : api.getMachineTypeApiForProject(userProject.get())
+              .listInZone(DEFAULT_ZONE_NAME).concat()) {
+         if (machine.getDeprecated().isPresent()) {
+            deprecatedMachineTypes.add(machine.getId());
+         }
+      }
+      ImmutableSet<String> deprecatedMachineTypeIds = deprecatedMachineTypes.build();
+      Set<? extends Hardware> hardwareProfiles = client.listHardwareProfiles();
+      System.out.println(hardwareProfiles.size());
+      for (Hardware hardwareProfile : hardwareProfiles) {
+         System.out.println(hardwareProfile);
+         assertFalse(contains(deprecatedMachineTypeIds, hardwareProfile.getId()));
+      }
+   }
+
+   /**
+    * Nodes may have additional metadata entries (particularly they may have an "sshKeys" entry)
+    */
+   protected void checkUserMetadataInNodeEquals(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
+      assertTrue(node.getUserMetadata().keySet().containsAll(userMetadata.keySet()));
+   }
+
+   // do not run until the auth exception problem is figured out.
+   @Test(enabled = false)
+   @Override
+   public void testCorrectAuthException() throws Exception {
+   }
+
+   // reboot is not supported by GCE
+   @Test(enabled = true, dependsOnMethods = "testGet")
+   public void testReboot() throws Exception {
+   }
+
+   // suspend/Resume is not supported by GCE
+   @Test(enabled = true, dependsOnMethods = "testReboot")
+   public void testSuspendResume() throws Exception {
+   }
+
+   @Test(enabled = true, dependsOnMethods = "testSuspendResume")
+   public void testListNodesByIds() throws Exception {
+      super.testGetNodesWithDetails();
+   }
+
+   @Test(enabled = true, dependsOnMethods = "testSuspendResume")
+   @Override
+   public void testGetNodesWithDetails() throws Exception {
+      super.testGetNodesWithDetails();
+   }
+
+   @Test(enabled = true, dependsOnMethods = "testSuspendResume")
+   @Override
+   public void testListNodes() throws Exception {
+      super.testListNodes();
+   }
+
+   @Test(enabled = true, dependsOnMethods = {"testListNodes", "testGetNodesWithDetails", "testListNodesByIds"})
+   @Override
+   public void testDestroyNodes() {
+      super.testDestroyNodes();
+   }
+
+   @Override
+   protected Module getSshModule() {
+      return new SshjSshClientModule();
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtensionLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtensionLiveTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtensionLiveTest.java
new file mode 100644
index 0000000..588ef51
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtensionLiveTest.java
@@ -0,0 +1,28 @@
+/*
+ * 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.googlecomputeengine.compute.extensions;
+
+import org.jclouds.compute.extensions.internal.BaseSecurityGroupExtensionLiveTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "live", singleThreaded = true, testName = "GoogleComputeEngineSecurityGroupExtensionLiveTest")
+public class GoogleComputeEngineSecurityGroupExtensionLiveTest extends BaseSecurityGroupExtensionLiveTest {
+
+   public GoogleComputeEngineSecurityGroupExtensionLiveTest() {
+      provider = "google-compute-engine";
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/FirewallToIpPermissionTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/FirewallToIpPermissionTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/FirewallToIpPermissionTest.java
new file mode 100644
index 0000000..62f9260
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/FirewallToIpPermissionTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.googlecomputeengine.compute.functions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.Date;
+
+import org.jclouds.googlecomputeengine.domain.Firewall;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.Iterables;
+
+public class FirewallToIpPermissionTest {
+
+   @Test
+   public void testApply() {
+
+      Firewall fw = fwForTest();
+
+      FirewallToIpPermission converter = new FirewallToIpPermission();
+
+      Iterable<IpPermission> perms = converter.apply(fw);
+
+      assertEquals(Iterables.size(perms), 3, "There should be three IpPermissions but there is only " + Iterables.size(perms));
+
+      assertTrue(Iterables.any(perms, Predicates.and(hasProtocol(IpProtocol.TCP),
+              hasStartAndEndPort(1, 10))), "No permission found for TCP, ports 1-10");
+      assertTrue(Iterables.any(perms, Predicates.and(hasProtocol(IpProtocol.TCP),
+              hasStartAndEndPort(33, 33))), "No permission found for TCP, port 33");
+      assertTrue(Iterables.any(perms, hasProtocol(IpProtocol.ICMP)),
+              "No permission found for ICMP");
+   }
+
+   public static Firewall fwForTest() {
+      Firewall.Builder builder = Firewall.builder();
+
+      builder.addSourceRange("0.0.0.0/0");
+      builder.addAllowed(Firewall.Rule.builder().IpProtocol(IpProtocol.TCP)
+              .addPortRange(1, 10).build());
+      builder.addAllowed(Firewall.Rule.builder().IpProtocol(IpProtocol.TCP)
+              .addPort(33).build());
+      builder.addAllowed(Firewall.Rule.builder().IpProtocol(IpProtocol.ICMP).build());
+      builder.id("abcd");
+      builder.selfLink(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/global/firewalls/jclouds-test"));
+      builder.network(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/global/networks/jclouds-test"));
+      builder.creationTimestamp(new Date());
+      builder.name("jclouds-test");
+
+      return builder.build();
+   }
+
+   public static Predicate<IpPermission> hasProtocol(final IpProtocol protocol) {
+      return new Predicate<IpPermission>() {
+
+         @Override
+         public boolean apply(IpPermission perm) {
+            return protocol.equals(perm.getIpProtocol());
+         }
+      };
+   }
+
+   public static Predicate<IpPermission> hasStartAndEndPort(final int startPort, final int endPort) {
+      return new Predicate<IpPermission>() {
+
+         @Override
+         public boolean apply(IpPermission perm) {
+            return startPort == perm.getFromPort() && endPort == perm.getToPort();
+         }
+      };
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImageTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImageTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImageTest.java
new file mode 100644
index 0000000..3bdd87e
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImageTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.googlecomputeengine.compute.functions;
+
+import org.jclouds.compute.domain.OsFamily;
+import org.jclouds.googlecomputeengine.domain.Image;
+import org.testng.annotations.Test;
+
+import java.net.URI;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertSame;
+
+@Test(groups = "unit")
+public class GoogleComputeEngineImageToImageTest {
+
+   Image.Builder imageBuilder = Image.builder()
+           .id("1234")
+           .selfLink(URI.create("http://test.com"))
+           .sourceType("RAW")
+           .description("")
+           .rawDisk(Image.RawDisk.builder().source("").containerType("TAR").build());
+
+    // This unit tests is failing randomly with the following error:
+    // java.lang.AssertionError: expected [linux] but found [ubuntu]
+    // Therefore commented to avoid the build failure
+
+//   public void testArbitratyImageName() {
+//      GoogleComputeEngineImageToImage imageToImage = new GoogleComputeEngineImageToImage();
+//      Image image = imageBuilder.name("arbitratyname").build();
+//      org.jclouds.compute.domain.Image transformed = imageToImage.apply(image);
+//      assertEquals(transformed.getName(), image.getName());
+//      assertEquals(transformed.getId(), image.getName());
+//      assertEquals(transformed.getProviderId(), image.getId());
+//      assertSame(transformed.getOperatingSystem().getFamily(), OsFamily.LINUX);
+//   }
+
+   public void testWellFormedImageName() {
+      GoogleComputeEngineImageToImage imageToImage = new GoogleComputeEngineImageToImage();
+      Image image = imageBuilder.name("ubuntu-12-04-v123123").build();
+      org.jclouds.compute.domain.Image transformed = imageToImage.apply(image);
+      assertEquals(transformed.getName(), image.getName());
+      assertEquals(transformed.getId(), image.getName());
+      assertEquals(transformed.getProviderId(), image.getId());
+      assertSame(transformed.getOperatingSystem().getFamily(), OsFamily.UBUNTU);
+      assertEquals(transformed.getOperatingSystem().getVersion(), "12.04");
+   }
+
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadataTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadataTest.java
new file mode 100644
index 0000000..040f118
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadataTest.java
@@ -0,0 +1,285 @@
+/*
+ * 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.googlecomputeengine.compute.functions;
+
+import static org.easymock.EasyMock.createMock;
+import static org.testng.Assert.assertEquals;
+import static org.jclouds.compute.domain.Image.Status.AVAILABLE;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.Set;
+
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.ImageBuilder;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.OperatingSystem;
+import org.jclouds.compute.domain.OsFamily;
+import org.jclouds.compute.domain.Processor;
+import org.jclouds.compute.domain.Volume.Type;
+import org.jclouds.compute.domain.VolumeBuilder;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.domain.Instance;
+import org.jclouds.googlecomputeengine.domain.InstanceInZone;
+import org.jclouds.googlecomputeengine.domain.Metadata;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+
+@Test(groups = "unit", testName = "InstanceInZoneToNodeMetadataTest")
+public class InstanceInZoneToNodeMetadataTest {
+
+   /**
+    * GroupNamingConvention that always returns the same name provided in the constructor.
+    * The predicates returned always evaluate to true.
+    *
+    */
+   class FixedGroupNamingConvention implements GroupNamingConvention {
+      private final String name;
+
+      public FixedGroupNamingConvention(final String name) {
+         this.name = name;
+      }
+
+      @Override
+      public String sharedNameForGroup(final String group) {
+         return name;
+      }
+
+      @Override
+      public String uniqueNameForGroup(final String group) {
+         return name;
+      }
+
+      @Override
+      public String groupInUniqueNameOrNull(final String encoded) {
+         return name;
+      }
+
+      @Override
+      public String groupInSharedNameOrNull(final String encoded) {
+         return name;
+      }
+
+      @Override
+      public Predicate<String> containsGroup(final String group) {
+         return new Predicate<String>() {
+            @Override
+            public boolean apply(final String input) {
+               return true;
+            }
+         };
+      }
+
+      @Override
+      public Predicate<String> containsAnyGroup() {
+         return new Predicate<String>() {
+            @Override
+            public boolean apply(final String input) {
+               return true;
+            }
+         };
+      }
+
+      @Override
+      public String extractGroup(final String encoded) {
+         return name;
+      }
+   }
+
+   private Instance instance;
+
+   private Set<Hardware> hardwares;
+
+   private Set<Image> images;
+
+   private Set<Location> locations;
+
+   private InstanceInZoneToNodeMetadata groupGroupNodeParser;
+   private InstanceInZoneToNodeMetadata groupNullNodeParser;
+
+   @BeforeMethod
+   public final void setup() {
+      instance = Instance.builder()
+         .id("13051190678907570425")
+         .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-11-25T23:48:20.758"))
+         .selfLink(URI.create("https://www.googleapis"
+            + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-0"))
+         .description("desc")
+         .name("test-0")
+         .machineType(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/"
+               + "machineTypes/n1-standard-1"))
+         .status(Instance.Status.RUNNING)
+         .zone(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a"))
+         .addNetworkInterface(
+               Instance.NetworkInterface.builder()
+                  .name("nic0")
+                  .networkIP("10.240.121.115")
+                  .network(URI.create("https://www.googleapis"
+                        + ".com/compute/v1/projects/myproject/global/networks/default"))
+                  .build())
+         .addDisk(
+               Instance.PersistentAttachedDisk.builder()
+               .index(0)
+               .mode(Instance.PersistentAttachedDisk.Mode.READ_WRITE)
+               .deviceName("test")
+               .source(URI.create("https://www.googleapis"
+                  + ".com/compute/v1/projects/myproject/zones/us-central1-a/disks/test"))
+               .boot(true)
+               .build())
+         .tags(Instance.Tags.builder().fingerprint("abcd").addItem("aTag").addItem("Group-port-42").build())
+         .metadata(Metadata.builder()
+               .items(ImmutableMap.of("aKey", "aValue",
+                  "jclouds-image",
+                  "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140718",
+                  "jclouds-delete-boot-disk", "true"))
+               .fingerprint("efgh")
+               .build())
+               .addServiceAccount(Instance.ServiceAccount.builder().email("default").addScopes("myscope").build())
+               .build();
+
+      images = ImmutableSet.of(new ImageBuilder()
+         .id("1")
+         .uri(URI.create("https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140718"))
+         .providerId("1")
+         .name("mock image")
+         .status(AVAILABLE)
+         .operatingSystem(
+            OperatingSystem.builder().name("Ubuntu 14.04 x86_64").description("Ubuntu").family(OsFamily.UBUNTU)
+            .version("10.04").arch("x86_64").is64Bit(true).build()).build());
+
+      hardwares = ImmutableSet.of(new HardwareBuilder().id("my_id")
+         .uri(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/"
+               + "n1-standard-1"))
+         .providerId("1")
+         .name("mock hardware").processor(new Processor(1.0, 1.0)).ram(2048)
+         .volume(new VolumeBuilder().size(20f).type(Type.LOCAL).build()).build());
+
+      locations = ImmutableSet.of(new LocationBuilder()
+         .id("id")
+         .description("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a")
+         .scope(LocationScope.REGION)
+         .parent(
+               new LocationBuilder().id("0").description("mock parent location").scope(LocationScope.PROVIDER)
+               .build()).build());
+
+      groupGroupNodeParser = createNodeParser(hardwares, images, locations, "Group");
+      groupNullNodeParser = createNodeParser(hardwares, images, locations, null);
+   }
+
+   private InstanceInZoneToNodeMetadata createNodeParser(final Set<Hardware> hardware, final Set<Image> images,
+         final Set<Location> locations, final String groupName) {
+      Supplier<Map<URI, ? extends Location>> locationSupplier = new Supplier<Map<URI, ? extends Location>>() {
+         @Override
+         public Map<URI, ? extends Location> get() {
+            return Maps.uniqueIndex(locations, new Function<Location, URI>() {
+               @Override
+               public URI apply(final Location input) {
+                  return URI.create(input.getDescription());
+               }
+            });
+         }
+      };
+
+      Supplier<Map<URI, ? extends Hardware>> hardwareSupplier = new Supplier<Map<URI, ? extends Hardware>>() {
+         @Override
+         public Map<URI, ? extends Hardware> get() {
+            return Maps.uniqueIndex(hardware, new Function<Hardware, URI>() {
+               @Override
+               public URI apply(final Hardware input) {
+                  return input.getUri();
+               }
+            });
+         }
+      };
+
+      Supplier<Map<URI, ? extends Image>> imageSupplier = new Supplier<Map<URI, ? extends Image>>() {
+         @Override
+         public Map<URI, ? extends Image> get() {
+            return Maps.uniqueIndex(images, new Function<Image, URI>() {
+               @Override
+               public URI apply(final Image input) {
+                  return input.getUri();
+               }
+            });
+         }
+      };
+
+      Supplier<String> userProjectSupplier = new Supplier<String>() {
+         @Override
+         public String get() {
+            return "userProject";
+         }
+      };
+
+      GroupNamingConvention.Factory namingConventionFactory =
+         new GroupNamingConvention.Factory() {
+            @Override
+            public GroupNamingConvention createWithoutPrefix() {
+               return new FixedGroupNamingConvention(groupName);
+            }
+
+            @Override
+            public GroupNamingConvention create() {
+               return new FixedGroupNamingConvention(groupName);
+            }
+         };
+
+      return new InstanceInZoneToNodeMetadata(
+         ImmutableMap.<Instance.Status, NodeMetadata.Status>builder()
+            .put(Instance.Status.RUNNING, NodeMetadata.Status.PENDING).build(),
+            namingConventionFactory,
+            imageSupplier,
+            hardwareSupplier,
+            locationSupplier,
+            new FirewallTagNamingConvention.Factory(namingConventionFactory),
+            createMock(GoogleComputeEngineApi.class),
+            userProjectSupplier);
+   }
+
+   @Test
+   public final void testTagFilteringWorks() {
+      InstanceInZone instanceInZone = new InstanceInZone(instance, "zoneId");
+      NodeMetadata nodeMetadata = groupGroupNodeParser.apply(instanceInZone);
+      assertEquals(nodeMetadata.getId(), "id/test-0");
+      assertEquals(nodeMetadata.getTags(), ImmutableSet.<String>of(
+            "aTag"  // "aTag" kept as a non firewall tag.
+            // "Group-port-42" filtered out as a firewall tag.
+      ));
+   }
+
+   @Test
+   public final void testInstanceWithGroupNull() {
+      InstanceInZone instanceInZone = new InstanceInZone(instance, "zoneId");
+      NodeMetadata nodeMetadata = groupNullNodeParser.apply(instanceInZone);
+      assertEquals(nodeMetadata.getId(), "id/test-0");
+      assertEquals(nodeMetadata.getTags(), ImmutableSet.<String>of("aTag", "Group-port-42"));
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroupTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroupTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroupTest.java
new file mode 100644
index 0000000..795c989
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroupTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.googlecomputeengine.compute.functions;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.jclouds.googlecomputeengine.compute.functions.FirewallToIpPermissionTest.hasProtocol;
+import static org.jclouds.googlecomputeengine.compute.functions.FirewallToIpPermissionTest.hasStartAndEndPort;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.Date;
+
+import org.jclouds.collect.IterableWithMarkers;
+import org.jclouds.collect.PagedIterables;
+import org.jclouds.compute.domain.SecurityGroup;
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.domain.Network;
+import org.jclouds.googlecomputeengine.features.FirewallApi;
+import org.jclouds.googlecomputeengine.options.ListOptions;
+import org.jclouds.googlecomputeengine.options.ListOptions.Builder;
+import org.jclouds.net.domain.IpProtocol;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicates;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+public class NetworkToSecurityGroupTest {
+
+   @Test
+   public void testApply() {
+      Supplier<String> projectSupplier = new Supplier<String>() {
+         @Override
+         public String get() {
+            return "myproject";
+         }
+      };
+
+      FirewallToIpPermission fwToPerm = new FirewallToIpPermission();
+
+      GoogleComputeEngineApi api = createMock(GoogleComputeEngineApi.class);
+      FirewallApi fwApi = createMock(FirewallApi.class);
+
+      ListOptions options = new Builder().filter("network eq .*/jclouds-test");
+      expect(api.getFirewallApiForProject(projectSupplier.get()))
+              .andReturn(fwApi);
+      expect(fwApi.list(options)).andReturn(PagedIterables.of(IterableWithMarkers.from(ImmutableSet.of(FirewallToIpPermissionTest.fwForTest()))));
+
+      replay(api, fwApi);
+      Network.Builder builder = Network.builder();
+
+      builder.id("abcd");
+      builder.selfLink(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/global/networks/jclouds-test"));
+      builder.creationTimestamp(new Date());
+      builder.description("some description");
+      builder.gatewayIPv4("1.2.3.4");
+      builder.IPv4Range("0.0.0.0/0");
+      builder.name("jclouds-test");
+
+      Network network = builder.build();
+
+      NetworkToSecurityGroup netToSg = new NetworkToSecurityGroup(fwToPerm, api, projectSupplier);
+
+      SecurityGroup group = netToSg.apply(network);
+
+      assertEquals(group.getId(), "jclouds-test");
+      assertEquals(group.getUri(), URI.create("https://www.googleapis.com/compute/v1/projects/myproject/global/networks/jclouds-test"));
+      assertEquals(group.getIpPermissions().size(), 3);
+      assertTrue(Iterables.any(group.getIpPermissions(), Predicates.and(hasProtocol(IpProtocol.TCP),
+              hasStartAndEndPort(1, 10))), "No permission found for TCP, ports 1-10");
+      assertTrue(Iterables.any(group.getIpPermissions(), Predicates.and(hasProtocol(IpProtocol.TCP),
+              hasStartAndEndPort(33, 33))), "No permission found for TCP, port 33");
+      assertTrue(Iterables.any(group.getIpPermissions(), hasProtocol(IpProtocol.ICMP)),
+              "No permission found for ICMP");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodesTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodesTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodesTest.java
new file mode 100644
index 0000000..cae3432
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodesTest.java
@@ -0,0 +1,136 @@
+/*
+ * 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.googlecomputeengine.compute.functions;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.testng.Assert.assertSame;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import org.easymock.EasyMock;
+import org.jclouds.compute.ComputeService;
+import org.jclouds.compute.domain.ComputeMetadata;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.internal.NodeMetadataImpl;
+import org.jclouds.googlecomputeengine.compute.predicates.AllNodesInGroupTerminated;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+public class OrphanedGroupsFromDeadNodesTest {
+
+   private static class IdAndGroupOnlyNodeMetadata extends NodeMetadataImpl {
+
+      public IdAndGroupOnlyNodeMetadata(String id, String group, Status status) {
+         super(null, null, id, null, null, ImmutableMap.<String, String>of(), ImmutableSet.<String>of(), group, null,
+                 null, null, status, null, 0, ImmutableSet.<String>of(), ImmutableSet.<String>of(), null, null);
+      }
+   }
+
+
+   @Test
+   public void testDetectsAllOrphanedGroupsWhenAllNodesTerminated() {
+
+      Set<? extends NodeMetadata> deadNodesGroup1 = (Set) ImmutableSet.builder()
+              .add(new IdAndGroupOnlyNodeMetadata("a", "1", NodeMetadata.Status.TERMINATED)).build();
+
+      Set<? extends NodeMetadata> deadNodesGroup2 = (Set) ImmutableSet.builder()
+              .add(new IdAndGroupOnlyNodeMetadata("b", "2", NodeMetadata.Status.TERMINATED)).build();
+
+      Set<? extends NodeMetadata> allDeadNodes = Sets.union(deadNodesGroup1, deadNodesGroup2);
+
+      ComputeService mock = createMock(ComputeService.class);
+      expect(mock.listNodesDetailsMatching(EasyMock.<Predicate<ComputeMetadata>>anyObject()))
+              .andReturn((Set) deadNodesGroup1).once();
+      expect(mock.listNodesDetailsMatching(EasyMock.<Predicate<ComputeMetadata>>anyObject()))
+              .andReturn((Set) deadNodesGroup2).once();
+
+      replay(mock);
+
+      OrphanedGroupsFromDeadNodes orphanedGroupsFromDeadNodes = new OrphanedGroupsFromDeadNodes(new
+              AllNodesInGroupTerminated(mock));
+
+      Set<String> orphanedGroups = orphanedGroupsFromDeadNodes.apply(allDeadNodes);
+
+      assertSame(orphanedGroups.size(), 2);
+      assertTrue(orphanedGroups.contains("1"));
+      assertTrue(orphanedGroups.contains("2"));
+   }
+
+   @Test
+   public void testDetectsAllOrphanedGroupsWhenSomeNodesTerminatedAndOtherMissing() {
+
+      Set<? extends NodeMetadata> deadNodesGroup1 = (Set) ImmutableSet.builder()
+              .add(new IdAndGroupOnlyNodeMetadata("a", "1", NodeMetadata.Status.TERMINATED)).build();
+
+      Set<? extends NodeMetadata> deadNodesGroup2 = (Set) ImmutableSet.builder()
+              .add(new IdAndGroupOnlyNodeMetadata("b", "2", NodeMetadata.Status.TERMINATED)).build();
+
+      Set<? extends NodeMetadata> allDeadNodes = Sets.union(deadNodesGroup1, deadNodesGroup2);
+
+      ComputeService mock = createMock(ComputeService.class);
+      expect(mock.listNodesDetailsMatching(EasyMock.<Predicate<ComputeMetadata>>anyObject()))
+              .andReturn((Set) deadNodesGroup1).once();
+      expect(mock.listNodesDetailsMatching(EasyMock.<Predicate<ComputeMetadata>>anyObject()))
+              .andReturn((Set) ImmutableSet.of()).once();
+
+      replay(mock);
+
+      OrphanedGroupsFromDeadNodes orphanedGroupsFromDeadNodes = new OrphanedGroupsFromDeadNodes(new
+              AllNodesInGroupTerminated(mock));
+
+      Set<String> orphanedGroups = orphanedGroupsFromDeadNodes.apply(allDeadNodes);
+
+      assertSame(orphanedGroups.size(), 2);
+      assertTrue(orphanedGroups.contains("1"));
+      assertTrue(orphanedGroups.contains("2"));
+   }
+
+   @Test
+   public void testDetectsAllOrphanedGroupsWhenSomeNodesAreAlive() {
+
+      Set<? extends NodeMetadata> deadNodesGroup1 = (Set) ImmutableSet.builder()
+              .add(new IdAndGroupOnlyNodeMetadata("a", "1", NodeMetadata.Status.TERMINATED)).build();
+
+      Set<? extends NodeMetadata> deadNodesGroup2 = (Set) ImmutableSet.builder()
+              .add(new IdAndGroupOnlyNodeMetadata("b", "2", NodeMetadata.Status.RUNNING)).build();
+
+      Set<? extends NodeMetadata> allDeadNodes = Sets.union(deadNodesGroup1, deadNodesGroup2);
+
+      ComputeService mock = createMock(ComputeService.class);
+      expect(mock.listNodesDetailsMatching(EasyMock.<Predicate<ComputeMetadata>>anyObject()))
+              .andReturn((Set) deadNodesGroup1).once();
+      expect(mock.listNodesDetailsMatching(EasyMock.<Predicate<ComputeMetadata>>anyObject()))
+              .andReturn((Set) deadNodesGroup2).once();
+
+      replay(mock);
+
+      OrphanedGroupsFromDeadNodes orphanedGroupsFromDeadNodes = new OrphanedGroupsFromDeadNodes(new
+              AllNodesInGroupTerminated(mock));
+
+      Set<String> orphanedGroups = orphanedGroupsFromDeadNodes.apply(allDeadNodes);
+
+      assertSame(orphanedGroups.size(), 1);
+      assertTrue(orphanedGroups.contains("1"));
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/loaders/FindNetworkOrCreateTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/loaders/FindNetworkOrCreateTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/loaders/FindNetworkOrCreateTest.java
new file mode 100644
index 0000000..467995f
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/compute/loaders/FindNetworkOrCreateTest.java
@@ -0,0 +1,141 @@
+/*
+ * 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.googlecomputeengine.compute.loaders;
+
+import static com.google.common.base.Optional.fromNullable;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.testng.Assert.assertEquals;
+
+import java.net.URI;
+
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.domain.Network;
+import org.jclouds.googlecomputeengine.domain.Operation;
+import org.jclouds.googlecomputeengine.domain.internal.NetworkAndAddressRange;
+import org.jclouds.googlecomputeengine.features.GlobalOperationApi;
+import org.jclouds.googlecomputeengine.features.NetworkApi;
+import org.jclouds.googlecomputeengine.functions.CreateNetworkIfNeeded;
+import org.jclouds.googlecomputeengine.predicates.GlobalOperationDonePredicate;
+import org.jclouds.http.HttpResponse;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Supplier;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.LoadingCache;
+
+public class FindNetworkOrCreateTest {
+
+   @Test
+   public void testLoadExisting() {
+      final GoogleComputeEngineApi api = createMock(GoogleComputeEngineApi.class);
+      final NetworkApi nwApi = createMock(NetworkApi.class);
+
+      Network network = Network.builder().IPv4Range("0.0.0.0/0")
+              .id("abcd").name("this-network")
+              .selfLink(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/global/networks/this-network"))
+              .build();
+
+      final Supplier<String> userProject = new Supplier<String>() {
+         @Override
+         public String get() {
+            return "myproject";
+         }
+      };
+
+      expect(api.getNetworkApiForProject(userProject.get())).andReturn(nwApi).atLeastOnce();
+
+      expect(nwApi.get("this-network")).andReturn(network);
+
+      replay(api, nwApi);
+
+      NetworkAndAddressRange input = new NetworkAndAddressRange("this-network", "0.0.0.0/0", null);
+
+      GlobalOperationDonePredicate pred = new GlobalOperationDonePredicate(api, userProject);
+
+      CreateNetworkIfNeeded creator = new CreateNetworkIfNeeded(api, userProject, pred, 100l, 100l);
+
+      FindNetworkOrCreate loader = new FindNetworkOrCreate(api, creator, userProject);
+
+      LoadingCache<NetworkAndAddressRange, Network> cache = CacheBuilder.newBuilder().build(loader);
+
+      assertEquals(cache.getUnchecked(input), network);
+
+      // Second call is to ensure we only need to make the API calls once.
+      assertEquals(cache.getUnchecked(input), network);
+
+      verify(api, nwApi);
+   }
+
+   @Test
+   public void testLoadNew() {
+      final GoogleComputeEngineApi api = createMock(GoogleComputeEngineApi.class);
+      final NetworkApi nwApi = createMock(NetworkApi.class);
+      final GlobalOperationApi globalApi = createMock(GlobalOperationApi.class);
+
+      Network network = Network.builder().IPv4Range("0.0.0.0/0")
+              .id("abcd").name("this-network")
+              .selfLink(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/global/networks/this-network"))
+              .build();
+
+      Operation createOp = createMock(Operation.class);
+
+      final Supplier<String> userProject = new Supplier<String>() {
+         @Override
+         public String get() {
+            return "myproject";
+         }
+      };
+
+      expect(api.getNetworkApiForProject(userProject.get())).andReturn(nwApi).atLeastOnce();
+      expect(api.getGlobalOperationApiForProject(userProject.get())).andReturn(globalApi).atLeastOnce();
+
+      expect(nwApi.createInIPv4Range("this-network", "0.0.0.0/0"))
+              .andReturn(createOp);
+      expect(globalApi.get("create-op")).andReturn(createOp);
+      // pre-creation
+      expect(nwApi.get("this-network")).andReturn(null).times(2);
+      // post-creation
+      expect(nwApi.get("this-network")).andReturn(network);
+
+      expect(createOp.getName()).andReturn("create-op");
+      expect(createOp.getStatus()).andReturn(Operation.Status.DONE);
+      expect(createOp.getHttpError()).andReturn(fromNullable((HttpResponse)null));
+      replay(api, nwApi, createOp, globalApi);
+
+      NetworkAndAddressRange input = new NetworkAndAddressRange("this-network", "0.0.0.0/0", null);
+
+      GlobalOperationDonePredicate pred = new GlobalOperationDonePredicate(api, userProject);
+
+      CreateNetworkIfNeeded creator = new CreateNetworkIfNeeded(api, userProject, pred, 100l, 100l);
+
+      FindNetworkOrCreate loader = new FindNetworkOrCreate(api, creator, userProject);
+
+      LoadingCache<NetworkAndAddressRange, Network> cache = CacheBuilder.newBuilder().build(loader);
+
+      assertEquals(cache.getUnchecked(input), network);
+
+      // Second call is to ensure we only need to make the API calls once.
+      assertEquals(cache.getUnchecked(input), network);
+
+      verify(api, nwApi, globalApi, createOp);
+
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiExpectTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiExpectTest.java
new file mode 100644
index 0000000..1816b78
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiExpectTest.java
@@ -0,0 +1,163 @@
+/*
+ * 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.googlecomputeengine.features;
+
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.AssertJUnit.assertNull;
+
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest;
+import org.jclouds.googlecomputeengine.parse.ParseAddressListTest;
+import org.jclouds.googlecomputeengine.parse.ParseAddressTest;
+import org.jclouds.googlecomputeengine.parse.ParseOperationTest;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit")
+public class AddressApiExpectTest extends BaseGoogleComputeEngineApiExpectTest {
+
+   public void testGetAddressResponseIs2xx() throws Exception {
+      HttpRequest get = HttpRequest
+              .builder()
+              .method("GET")
+              .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/addresses/test-ip1")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpResponse operationResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/address_get.json")).build();
+
+      AddressApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
+              TOKEN_RESPONSE, get, operationResponse).getAddressApiForProject("myproject");
+
+      assertEquals(api.getInRegion("us-central1", "test-ip1"),
+              new ParseAddressTest().expected());
+   }
+
+   public void testGetAddressResponseIs4xx() throws Exception {
+      HttpRequest get = HttpRequest
+              .builder()
+              .method("GET")
+              .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/addresses/test-ip1")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build();
+
+      AddressApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
+              TOKEN_RESPONSE, get, operationResponse).getAddressApiForProject("myproject");
+
+      assertNull(api.getInRegion("us-central1", "test-ip1"));
+   }
+
+   public void testInsertAddressResponseIs2xx() {
+      HttpRequest insert = HttpRequest
+              .builder()
+              .method("POST")
+              .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/addresses")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN)
+              .payload(payloadFromResourceWithContentType("/address_insert.json", MediaType.APPLICATION_JSON))
+              .build();
+
+      HttpResponse insertAddressResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/region_operation.json")).build();
+
+      AddressApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE),
+              TOKEN_RESPONSE, insert,
+              insertAddressResponse).getAddressApiForProject("myproject");
+
+      assertEquals(api.createInRegion("us-central1", "test-ip1"), new ParseOperationTest().expected());
+   }
+
+   public void testDeleteAddressResponseIs2xx() {
+      HttpRequest delete = HttpRequest
+              .builder()
+              .method("DELETE")
+              .endpoint("https://www.googleapis" +
+                      ".com/compute/v1/projects/myproject/regions/us-central1/addresses/test-ip1")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpResponse deleteResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/region_operation.json")).build();
+
+      AddressApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE),
+              TOKEN_RESPONSE, delete, deleteResponse).getAddressApiForProject("myproject");
+
+      assertEquals(api.deleteInRegion("us-central1", "test-ip1"),
+              new ParseOperationTest().expected());
+   }
+
+   public void testDeleteAddressResponseIs4xx() {
+      HttpRequest delete = HttpRequest
+              .builder()
+              .method("DELETE")
+              .endpoint("https://www.googleapis" +
+                      ".com/compute/v1/projects/myproject/regions/us-central1/addresses/test-ip1")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpResponse deleteResponse = HttpResponse.builder().statusCode(404).build();
+
+      AddressApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE),
+              TOKEN_RESPONSE, delete, deleteResponse).getAddressApiForProject("myproject");
+
+      assertNull(api.deleteInRegion("us-central1", "test-ip1"));
+   }
+
+   public void testListAddresssResponseIs2xx() {
+      HttpRequest list = HttpRequest
+              .builder()
+              .method("GET")
+              .endpoint("https://www.googleapis" +
+                      ".com/compute/v1/projects/myproject/regions/us-central1/addresses")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpResponse operationResponse = HttpResponse.builder().statusCode(200)
+              .payload(payloadFromResource("/address_list.json")).build();
+
+      AddressApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
+              TOKEN_RESPONSE, list, operationResponse).getAddressApiForProject("myproject");
+
+      assertEquals(api.listFirstPageInRegion("us-central1").toString(),
+              new ParseAddressListTest().expected().toString());
+   }
+
+   public void testListAddresssResponseIs4xx() {
+      HttpRequest list = HttpRequest
+              .builder()
+              .method("GET")
+              .endpoint("https://www.googleapis" +
+                      ".com/compute/v1/projects/myproject/regions/us-central1/addresses")
+              .addHeader("Accept", "application/json")
+              .addHeader("Authorization", "Bearer " + TOKEN).build();
+
+      HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build();
+
+      AddressApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
+              TOKEN_RESPONSE, list, operationResponse).getAddressApiForProject("myproject");
+
+      assertTrue(api.listInRegion("us-central1").concat().isEmpty());
+   }
+}