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