You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2014/10/19 17:58:23 UTC

[17/17] git commit: Initial GCE commit

Initial GCE commit


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/4203d59b
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/4203d59b
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/4203d59b

Branch: refs/heads/master
Commit: 4203d59b28c38c432c44b4973c55ef91f3f41d82
Parents: ba95cf3
Author: Suriya priya <sa...@gmail.com>
Authored: Sun Oct 12 23:52:48 2014 -0700
Committer: Nirmal Fernando <ni...@gmail.com>
Committed: Sun Oct 19 17:47:35 2014 +0200

----------------------------------------------------------------------
 .../org.apache.stratos.cloud.controller/pom.xml |    5 +
 .../cloud/controller/iaases/GCEIaas.java        |  464 +++++++
 .../validate/GCEPartitionValidator.java         |   54 +
 .../jclouds/apis/gce/1.8.0-stratos/README.txt   |   77 ++
 .../jclouds/apis/gce/1.8.0-stratos/pom.xml      |  135 ++
 .../GoogleComputeEngineApi.java                 |  185 +++
 .../GoogleComputeEngineApiMetadata.java         |  104 ++
 .../GoogleComputeEngineConstants.java           |   81 ++
 .../compute/GoogleComputeEngineService.java     |  200 +++
 .../GoogleComputeEngineServiceAdapter.java      |  439 +++++++
 ...GoogleComputeEngineServiceContextModule.java |  283 +++++
 ...ogleComputeEngineSecurityGroupExtension.java |  338 +++++
 .../functions/BuildInstanceMetadata.java        |   46 +
 .../functions/FirewallTagNamingConvention.java  |   62 +
 .../functions/FirewallToIpPermission.java       |   87 ++
 .../GoogleComputeEngineImageToImage.java        |   80 ++
 .../functions/InstanceInZoneToNodeMetadata.java |  150 +++
 .../functions/MachineTypeInZoneToHardware.java  |  100 ++
 .../functions/NetworkToSecurityGroup.java       |   82 ++
 .../functions/OrphanedGroupsFromDeadNodes.java  |   57 +
 .../compute/functions/RegionToLocation.java     |   45 +
 .../compute/functions/ZoneToLocation.java       |   45 +
 .../compute/loaders/FindNetworkOrCreate.java    |   62 +
 .../GoogleComputeEngineTemplateOptions.java     |  382 ++++++
 .../predicates/AllNodesInGroupTerminated.java   |   48 +
 ...desWithGroupEncodedIntoNameThenAddToSet.java |  183 +++
 ...DefaultLoginCredentialsForImageStrategy.java |   69 +
 ...eNodeCredentialsButOverrideFromTemplate.java |   57 +
 .../GoogleComputeEngineHttpApiModule.java       |  177 +++
 .../config/GoogleComputeEngineParserModule.java |  413 ++++++
 .../config/OAuthModuleWithoutTypeAdapters.java  |   51 +
 .../googlecomputeengine/config/UserProject.java |   33 +
 .../domain/AbstractDisk.java                    |  121 ++
 .../googlecomputeengine/domain/Address.java     |  177 +++
 .../googlecomputeengine/domain/Deprecated.java  |  195 +++
 .../googlecomputeengine/domain/Disk.java        |  123 ++
 .../googlecomputeengine/domain/Firewall.java    |  379 ++++++
 .../googlecomputeengine/domain/Image.java       |  286 +++++
 .../googlecomputeengine/domain/Instance.java    | 1187 ++++++++++++++++++
 .../domain/InstanceInZone.java                  |   52 +
 .../domain/InstanceTemplate.java                |  445 +++++++
 .../googlecomputeengine/domain/ListPage.java    |  179 +++
 .../googlecomputeengine/domain/MachineType.java |  360 ++++++
 .../domain/MachineTypeInZone.java               |   52 +
 .../googlecomputeengine/domain/Metadata.java    |  139 ++
 .../googlecomputeengine/domain/Network.java     |  133 ++
 .../googlecomputeengine/domain/Operation.java   |  556 ++++++++
 .../googlecomputeengine/domain/Project.java     |  162 +++
 .../googlecomputeengine/domain/Quota.java       |  152 +++
 .../googlecomputeengine/domain/Region.java      |  175 +++
 .../googlecomputeengine/domain/Resource.java    |  283 +++++
 .../googlecomputeengine/domain/Route.java       |  433 +++++++
 .../domain/SlashEncodedIds.java                 |   83 ++
 .../googlecomputeengine/domain/Snapshot.java    |  135 ++
 .../googlecomputeengine/domain/Zone.java        |  334 +++++
 .../domain/internal/NetworkAndAddressRange.java |   91 ++
 .../features/AddressApi.java                    |  187 +++
 .../googlecomputeengine/features/DiskApi.java   |  255 ++++
 .../features/FirewallApi.java                   |  227 ++++
 .../features/GlobalOperationApi.java            |  158 +++
 .../googlecomputeengine/features/ImageApi.java  |  167 +++
 .../features/InstanceApi.java                   |  381 ++++++
 .../features/MachineTypeApi.java                |  143 +++
 .../features/NetworkApi.java                    |  204 +++
 .../features/ProjectApi.java                    |   96 ++
 .../googlecomputeengine/features/RegionApi.java |  135 ++
 .../features/RegionOperationApi.java            |  163 +++
 .../googlecomputeengine/features/RouteApi.java  |  184 +++
 .../features/SnapshotApi.java                   |  160 +++
 .../googlecomputeengine/features/ZoneApi.java   |  135 ++
 .../features/ZoneOperationApi.java              |  163 +++
 .../functions/CreateNetworkIfNeeded.java        |  100 ++
 .../functions/internal/BaseToPagedIterable.java |   66 +
 .../internal/BaseWithRegionToPagedIterable.java |   72 ++
 .../internal/BaseWithZoneToPagedIterable.java   |   72 ++
 .../functions/internal/PATCH.java               |   35 +
 .../functions/internal/ParseAddresses.java      |   67 +
 .../functions/internal/ParseDisks.java          |   67 +
 .../functions/internal/ParseFirewalls.java      |   63 +
 .../internal/ParseGlobalOperations.java         |   63 +
 .../functions/internal/ParseImages.java         |   63 +
 .../functions/internal/ParseInstances.java      |   65 +
 .../functions/internal/ParseMachineTypes.java   |   64 +
 .../functions/internal/ParseNetworks.java       |   63 +
 .../internal/ParseRegionOperations.java         |   65 +
 .../functions/internal/ParseRegions.java        |   63 +
 .../functions/internal/ParseRoutes.java         |   63 +
 .../functions/internal/ParseSnapshots.java      |   66 +
 .../functions/internal/ParseZoneOperations.java |   65 +
 .../functions/internal/ParseZones.java          |   63 +
 .../handlers/FirewallBinder.java                |   56 +
 .../GoogleComputeEngineErrorHandler.java        |   62 +
 .../handlers/InstanceBinder.java                |   65 +
 .../handlers/MetadataBinder.java                |   60 +
 .../handlers/RouteBinder.java                   |   56 +
 .../options/AttachDiskOptions.java              |  128 ++
 .../options/DeprecateOptions.java               |  126 ++
 .../options/FirewallOptions.java                |  166 +++
 .../options/ListOptions.java                    |   91 ++
 .../options/RouteOptions.java                   |  202 +++
 .../GlobalOperationDonePredicate.java           |   59 +
 .../predicates/InstancePredicates.java          |   33 +
 .../predicates/NetworkFirewallPredicates.java   |  121 ++
 .../RegionOperationDonePredicate.java           |   69 +
 .../predicates/ZoneOperationDonePredicate.java  |   68 +
 .../java/org/jclouds/oauth/v2/OAuthApi.java     |   63 +
 .../org/jclouds/oauth/v2/OAuthApiMetadata.java  |   80 ++
 .../org/jclouds/oauth/v2/OAuthConstants.java    |   78 ++
 .../jclouds/oauth/v2/config/Authentication.java |   35 +
 .../v2/config/OAuthAuthenticationModule.java    |   52 +
 .../oauth/v2/config/OAuthHttpApiModule.java     |   45 +
 .../jclouds/oauth/v2/config/OAuthModule.java    |   86 ++
 .../oauth/v2/config/OAuthProperties.java        |   43 +
 .../jclouds/oauth/v2/config/OAuthScopes.java    |   40 +
 .../org/jclouds/oauth/v2/domain/ClaimSet.java   |  191 +++
 .../org/jclouds/oauth/v2/domain/Header.java     |  128 ++
 .../oauth/v2/domain/OAuthCredentials.java       |  129 ++
 .../java/org/jclouds/oauth/v2/domain/Token.java |  149 +++
 .../jclouds/oauth/v2/domain/TokenRequest.java   |  131 ++
 .../oauth/v2/domain/TokenRequestFormat.java     |   45 +
 .../oauth/v2/filters/OAuthAuthenticator.java    |   63 +
 .../oauth/v2/functions/BuildTokenRequest.java   |  135 ++
 .../jclouds/oauth/v2/functions/FetchToken.java  |   41 +
 .../v2/functions/OAuthCredentialsSupplier.java  |  125 ++
 .../v2/functions/SignOrProduceMacForToken.java  |  119 ++
 .../oauth/v2/handlers/OAuthErrorHandler.java    |   64 +
 .../oauth/v2/handlers/OAuthTokenBinder.java     |   45 +
 .../oauth/v2/json/ClaimSetTypeAdapter.java      |   59 +
 .../oauth/v2/json/HeaderTypeAdapter.java        |   52 +
 .../oauth/v2/json/JWTTokenRequestFormat.java    |   96 ++
 .../services/org.jclouds.apis.ApiMetadata       |   19 +
 .../GoogleComputeEngineApiMetadataTest.java     |   38 +
 ...eEngineAuthenticatedRestContextLiveTest.java |   33 +
 .../PageSystemExpectTest.java                   |  114 ++
 .../GoogleComputeEngineServiceExpectTest.java   |  574 +++++++++
 .../GoogleComputeEngineServiceLiveTest.java     |  128 ++
 ...uteEngineSecurityGroupExtensionLiveTest.java |   28 +
 .../functions/FirewallToIpPermissionTest.java   |   93 ++
 .../GoogleComputeEngineImageToImageTest.java    |   60 +
 .../InstanceInZoneToNodeMetadataTest.java       |  286 +++++
 .../functions/NetworkToSecurityGroupTest.java   |   94 ++
 .../OrphanedGroupsFromDeadNodesTest.java        |  136 ++
 .../loaders/FindNetworkOrCreateTest.java        |  141 +++
 .../features/AddressApiExpectTest.java          |  163 +++
 .../features/AddressApiLiveTest.java            |   71 ++
 .../features/DiskApiExpectTest.java             |  226 ++++
 .../features/DiskApiLiveTest.java               |   85 ++
 .../features/FirewallApiExpectTest.java         |  301 +++++
 .../features/FirewallApiLiveTest.java           |  163 +++
 .../features/GlobalOperationApiExpectTest.java  |  158 +++
 .../features/GlobalOperationApiLiveTest.java    |   91 ++
 .../features/ImageApiExpectTest.java            |  159 +++
 .../features/ImageApiLiveTest.java              |   74 ++
 .../features/InstanceApiExpectTest.java         |  410 ++++++
 .../features/InstanceApiLiveTest.java           |  240 ++++
 .../features/MachineTypeApiExpectTest.java      |  113 ++
 .../features/MachineTypeApiLiveTest.java        |   73 ++
 .../features/NetworkApiExpectTest.java          |  164 +++
 .../features/NetworkApiLiveTest.java            |   83 ++
 .../features/ProjectApiExpectTest.java          |   96 ++
 .../features/ProjectApiLiveTest.java            |  123 ++
 .../features/RegionApiExpectTest.java           |   94 ++
 .../features/RegionApiLiveTest.java             |   74 ++
 .../features/RegionOperationApiExpectTest.java  |  195 +++
 .../features/RegionOperationApiLiveTest.java    |   91 ++
 .../features/RouteApiExpectTest.java            |  175 +++
 .../features/RouteApiLiveTest.java              |   96 ++
 .../features/SnapshotApiExpectTest.java         |   94 ++
 .../features/SnapshotApiLiveTest.java           |   92 ++
 .../features/ZoneApiExpectTest.java             |   97 ++
 .../features/ZoneApiLiveTest.java               |   74 ++
 .../features/ZoneOperationApiExpectTest.java    |  193 +++
 .../features/ZoneOperationApiLiveTest.java      |   90 ++
 .../functions/CreateNetworkIfNeededTest.java    |  132 ++
 .../GoogleComputeEngineErrorHandlerTest.java    |   92 ++
 .../BaseGoogleComputeEngineApiExpectTest.java   |   31 +
 .../BaseGoogleComputeEngineApiLiveTest.java     |  160 +++
 .../BaseGoogleComputeEngineExpectTest.java      |  195 +++
 .../BaseGoogleComputeEngineParseTest.java       |   33 +
 ...leComputeEngineServiceContextExpectTest.java |   49 +
 ...aseGoogleComputeEngineServiceExpectTest.java |   28 +
 .../parse/ParseAddressListTest.java             |   61 +
 .../parse/ParseAddressTest.java                 |   51 +
 .../parse/ParseDiskListTest.java                |   61 +
 .../parse/ParseDiskTest.java                    |   50 +
 .../parse/ParseFirewallListTest.java            |   68 +
 .../parse/ParseFirewallTest.java                |   60 +
 .../parse/ParseImageListTest.java               |   71 ++
 .../parse/ParseImageTest.java                   |   55 +
 .../parse/ParseInstanceListTest.java            |   48 +
 .../parse/ParseInstanceSerialOutputTest.java    |   38 +
 .../parse/ParseInstanceTest.java                |   81 ++
 .../parse/ParseMachineTypeListTest.java         |   94 ++
 .../parse/ParseMachineTypeTest.java             |   57 +
 .../parse/ParseMetadataTest.java                |   45 +
 .../parse/ParseNetworkListTest.java             |   49 +
 .../parse/ParseNetworkTest.java                 |   48 +
 .../parse/ParseOperationListTest.java           |   46 +
 .../parse/ParseOperationTest.java               |   58 +
 .../parse/ParseProjectTest.java                 |   67 +
 .../parse/ParseQuotaTest.java                   |   39 +
 .../parse/ParseRegionListTest.java              |   72 ++
 .../parse/ParseRegionTest.java                  |   62 +
 .../parse/ParseRouteListTest.java               |   62 +
 .../parse/ParseRouteTest.java                   |   56 +
 .../parse/ParseSnapshotListTest.java            |   64 +
 .../parse/ParseSnapshotTest.java                |   52 +
 .../parse/ParseZoneListTest.java                |   70 ++
 .../parse/ParseZoneTest.java                    |   55 +
 .../NetworkFirewallPredicatesTest.java          |  162 +++
 .../jclouds/oauth/v2/OAuthApiMetadataTest.java  |   38 +
 .../org/jclouds/oauth/v2/OAuthTestUtils.java    |   75 ++
 .../oauth/v2/features/OAuthApiExpectTest.java   |   99 ++
 .../oauth/v2/features/OAuthApiLiveTest.java     |   80 ++
 .../functions/OAuthCredentialsFromPKTest.java   |   61 +
 .../functions/OAuthCredentialsSupplierTest.java |   55 +
 .../oauth/v2/functions/SignerFunctionTest.java  |   61 +
 .../v2/handlers/OAuthErrorHandlerTest.java      |   92 ++
 .../oauth/v2/internal/Base64UrlSafeTest.java    |   40 +
 .../v2/internal/BaseOAuthApiExpectTest.java     |   23 +
 .../oauth/v2/internal/BaseOAuthApiLiveTest.java |   56 +
 .../BaseOAuthAuthenticatedApiLiveTest.java      |  110 ++
 .../oauth/v2/internal/BaseOAuthExpectTest.java  |   26 +
 .../v2/json/JWTTokenRequestFormatTest.java      |   69 +
 .../jclouds/oauth/v2/parse/ParseTokenTest.java  |   40 +
 .../firewall_list.json                          |   37 +
 .../network_get.json                            |   10 +
 .../src/test/resources/address_get.json         |   12 +
 .../src/test/resources/address_insert.json      |    1 +
 .../src/test/resources/address_list.json        |   31 +
 .../test/resources/disk_create_snapshot.json    |    1 +
 .../src/test/resources/disk_get.json            |   10 +
 .../src/test/resources/disk_insert.json         |    1 +
 .../src/test/resources/disk_list.json           |   17 +
 .../src/test/resources/firewall_get.json        |   30 +
 .../src/test/resources/firewall_insert.json     |    1 +
 .../src/test/resources/firewall_list.json       |   58 +
 .../src/test/resources/global_operation.json    |   15 +
 .../test/resources/global_operation_list.json   |   22 +
 .../src/test/resources/image_get.json           |   13 +
 .../src/test/resources/image_insert.json        |    4 +
 .../src/test/resources/image_list.json          |   24 +
 .../src/test/resources/image_list_empty.json    |    6 +
 .../resources/image_list_multiple_page_1.json   |   55 +
 .../resources/image_list_multiple_page_2.json   |   47 +
 .../test/resources/image_list_single_page.json  |   50 +
 .../resources/instance_add_access_config.json   |   11 +
 .../test/resources/instance_attach_disk.json    |    6 +
 .../src/test/resources/instance_get.json        |   62 +
 .../src/test/resources/instance_insert.json     |    1 +
 .../test/resources/instance_insert_simple.json  |    1 +
 .../src/test/resources/instance_list.json       |   69 +
 .../instance_list_central1b_empty.json          |    6 +
 .../test/resources/instance_serial_port.json    |    4 +
 .../test/resources/instance_set_metadata.json   |   10 +
 .../src/test/resources/logback.xml              |   83 ++
 .../src/test/resources/machinetype.json         |   22 +
 .../src/test/resources/machinetype_list.json    |   57 +
 .../resources/machinetype_list_central1b.json   |   43 +
 .../machinetype_list_central1b_empty.json       |    6 +
 .../src/test/resources/metadata.json            |    1 +
 .../src/test/resources/network_get.json         |   10 +
 .../src/test/resources/network_insert.json      |    1 +
 .../src/test/resources/network_list.json        |   18 +
 .../src/test/resources/operation.json           |   17 +
 .../src/test/resources/operation_error.json     |   26 +
 .../src/test/resources/operation_list.json      |   24 +
 .../src/test/resources/project.json             |   69 +
 .../1.8.0-stratos/src/test/resources/quota.json |    5 +
 .../src/test/resources/region_get.json          |   60 +
 .../src/test/resources/region_list.json         |  126 ++
 .../src/test/resources/region_operation.json    |   16 +
 .../test/resources/region_operation_list.json   |   23 +
 .../src/test/resources/route_get.json           |   14 +
 .../src/test/resources/route_insert.json        |    1 +
 .../src/test/resources/route_list.json          |   34 +
 .../src/test/resources/snapshot_get.json        |   13 +
 .../src/test/resources/snapshot_list.json       |   33 +
 .../src/test/resources/tag_insert.json          |    1 +
 .../1.8.0-stratos/src/test/resources/testpk.pem |   15 +
 .../src/test/resources/tokenResponse.json       |    5 +
 .../src/test/resources/zone_get.json            |   17 +
 .../src/test/resources/zone_list.json           |   41 +
 .../src/test/resources/zone_list_short.json     |   24 +
 .../src/test/resources/zone_operation.json      |   16 +
 .../test/resources/zone_operation_error.json    |   25 +
 .../src/test/resources/zone_operation_list.json |   23 +
 dependencies/pom.xml                            |    1 +
 .../pom.xml                                     |    6 +
 tools/puppet3-agent/config-gce.sh               |  101 ++
 tools/puppet3-agent/init-gce.sh                 |  146 +++
 tools/stratos-installer/conf/setup.conf         |    4 +
 .../all/repository/conf/cloud-controller.xml    |    8 +
 tools/stratos-installer/ec2.sh                  |    2 +
 tools/stratos-installer/gce.sh                  |   67 +
 tools/stratos-installer/openstack.sh            |    2 +
 tools/stratos-installer/setup.sh                |   12 +-
 tools/stratos-installer/vcloud.sh               |    2 +
 298 files changed, 29468 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/components/org.apache.stratos.cloud.controller/pom.xml
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/pom.xml b/components/org.apache.stratos.cloud.controller/pom.xml
index 59eaa46..c66dd7d 100644
--- a/components/org.apache.stratos.cloud.controller/pom.xml
+++ b/components/org.apache.stratos.cloud.controller/pom.xml
@@ -253,6 +253,11 @@
             <artifactId>vcloud</artifactId>
             <version>1.8.0-stratos</version>
         </dependency>
+        <dependency>
+          <groupId>org.apache.stratos</groupId>
+          <artifactId>gce</artifactId>
+          <version>1.8.0-stratos</version>
+        </dependency>
 
         <dependency>
             <groupId>com.jamesmurty.utils.wso2</groupId>

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java
new file mode 100644
index 0000000..78588df
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java
@@ -0,0 +1,464 @@
+/*
+ * 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.apache.stratos.cloud.controller.iaases;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.exception.CloudControllerException;
+import org.apache.stratos.cloud.controller.interfaces.Iaas;
+import org.apache.stratos.cloud.controller.jcloud.ComputeServiceBuilderUtil;
+import org.apache.stratos.cloud.controller.pojo.IaasProvider;
+import org.apache.stratos.cloud.controller.pojo.NetworkInterface;
+import org.apache.stratos.cloud.controller.validate.GCEPartitionValidator;
+import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator;
+import org.apache.stratos.cloud.controller.exception.InvalidHostException;
+import org.apache.stratos.cloud.controller.exception.InvalidRegionException;
+import org.apache.stratos.cloud.controller.exception.InvalidZoneException;
+import org.jclouds.ContextBuilder;
+import org.jclouds.compute.ComputeServiceContext;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.options.TemplateOptions;
+import org.wso2.carbon.utils.CarbonUtils;
+import org.jclouds.domain.Location;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.features.DiskApi;
+import org.jclouds.googlecomputeengine.features.InstanceApi;
+import org.jclouds.googlecomputeengine.features.RegionApi;
+import org.jclouds.googlecomputeengine.features.ZoneApi;
+import org.jclouds.googlecomputeengine.domain.Disk;
+import org.jclouds.googlecomputeengine.domain.Instance;
+import org.jclouds.googlecomputeengine.domain.Region;
+import org.jclouds.googlecomputeengine.domain.Zone;
+import org.jclouds.googlecomputeengine.domain.Operation;
+import org.jclouds.googlecomputeengine.options.AttachDiskOptions;
+import org.jclouds.googlecomputeengine.options.AttachDiskOptions.DiskType;
+import com.google.inject.Key;
+import com.google.inject.Injector;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
+import static org.jclouds.util.Predicates2.retry;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import com.google.common.base.Predicate;
+import java.util.concurrent.atomic.AtomicReference;
+import com.google.common.util.concurrent.Atomics;
+
+public class GCEIaas extends Iaas {
+
+
+	private static final Log log = LogFactory.getLog(GCEIaas.class);
+	
+	private static final String PROJECTNAME = "projectName";
+	
+	public GCEIaas(IaasProvider iaasProvider) {
+		super(iaasProvider);
+	}
+
+	@Override
+	public void buildComputeServiceAndTemplate() {
+
+		IaasProvider iaasInfo = getIaasProvider();
+		
+		// builds and sets Compute Service
+		ComputeServiceBuilderUtil.buildDefaultComputeService(iaasInfo);
+
+
+		// builds and sets Template
+		buildTemplate();
+
+	}
+
+	public void buildTemplate() {
+		IaasProvider iaasInfo = getIaasProvider();
+		
+		if (iaasInfo.getComputeService() == null) {
+			String msg = "Compute service is null for IaaS provider: "
+					+ iaasInfo.getName();
+			log.fatal(msg);
+			throw new CloudControllerException(msg);
+		}
+
+		log.info("gce buildTemplate");
+
+		TemplateBuilder templateBuilder = iaasInfo.getComputeService()
+				.templateBuilder();
+
+		// set image id specified
+		templateBuilder.imageId(iaasInfo.getImage());
+
+		if(!(iaasInfo instanceof IaasProvider)) {
+			templateBuilder.locationId(iaasInfo.getType());
+		}
+
+		String zone = iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE);
+		if(zone != null) {
+			Set<? extends Location> locations = iaasInfo.getComputeService().listAssignableLocations();
+			for(Location location : locations) {
+				if(location.getScope().toString().equalsIgnoreCase(CloudControllerConstants.ZONE_ELEMENT) &&
+					location.getId().equals(zone)) {
+					templateBuilder.locationId(location.getId());
+					log.info("ZONE has been set as " + zone
+						+ " with id: " + location.getId());
+					break;
+				}
+			}
+		}
+
+		if (iaasInfo.getProperty(CloudControllerConstants.INSTANCE_TYPE) != null) {
+			// set instance type eg: m1.large
+			templateBuilder.hardwareId(iaasInfo.getProperty(CloudControllerConstants.INSTANCE_TYPE));
+		}
+
+		// build the Template
+		Template template = templateBuilder.build();
+
+		if(zone != null) {
+			if(!template.getLocation().getId().equals(zone)) {
+				log.warn("couldn't find assignable ZONE of id :" + zone +
+				" in the IaaS. Hence using the default location as " + template.getLocation().getScope().toString() +
+				" with the id " + template.getLocation().getId());
+			}
+		}
+
+		// if you wish to auto assign IPs, instance spawning call should be
+		// blocking, but if you
+		// wish to assign IPs manually, it can be non-blocking.
+		// is auto-assign-ip mode or manual-assign-ip mode? - default mode is
+		// non-blocking
+		boolean blockUntilRunning = Boolean.parseBoolean(iaasInfo
+				.getProperty("autoAssignIp"));
+		template.getOptions().as(TemplateOptions.class)
+				.blockUntilRunning(blockUntilRunning);
+
+		// this is required in order to avoid creation of additional security
+		// groups by Jclouds.
+		template.getOptions().as(TemplateOptions.class)
+                                .inboundPorts(22, 80, 8080, 443, 8243);
+
+		if (zone != null) {
+			templateBuilder.locationId(zone);
+			log.debug("setting location to " + zone);
+		}
+
+		// ability to define tags with Key-value pairs
+		Map<String, String> keyValuePairTagsMap = new HashMap<String, String>();
+
+		for (String propertyKey : iaasInfo.getProperties().keySet()){
+			if(propertyKey.startsWith(CloudControllerConstants.TAGS_AS_KEY_VALUE_PAIRS_PREFIX)) {
+				keyValuePairTagsMap.put(propertyKey.substring(CloudControllerConstants.TAGS_AS_KEY_VALUE_PAIRS_PREFIX.length()),
+					iaasInfo.getProperties().get(propertyKey));
+				template.getOptions()
+				    .userMetadata(keyValuePairTagsMap);
+			}
+			log.info("usermeta data key:"+ propertyKey + " value: " + iaasInfo.getProperties().get(propertyKey));
+		}
+
+		if (iaasInfo.getNetworkInterfaces() != null) {
+			List<String> networks = new ArrayList<String>(iaasInfo.getNetworkInterfaces().length);
+			for (NetworkInterface ni:iaasInfo.getNetworkInterfaces()) {
+				networks.add(ni.getNetworkUuid());
+				log.info("using network interface " + ni.getNetworkUuid());
+			}
+			template.getOptions().as(TemplateOptions.class).networks(networks);
+			log.info("using network interface " + networks);
+		}
+
+		// set Template
+		iaasInfo.setTemplate(template);
+	}
+
+	@Override
+	public void setDynamicPayload() {
+		// in vCloud case we need to run a script
+		IaasProvider iaasInfo = getIaasProvider();
+
+		if (iaasInfo.getTemplate() == null || iaasInfo.getPayload() == null) {
+			if (log.isDebugEnabled()) {
+				log.debug("Payload for GCE not found");
+			}
+			return;
+		}
+
+		// Payload is a String value
+		String payload = new String(iaasInfo.getPayload());
+
+		log.info("setDynamicPayload " + payload);
+
+		Map<String, String> keyValuePairTagsMap = new HashMap<String, String>();
+		keyValuePairTagsMap.put("stratos_usermetadata", payload);
+		iaasInfo.getTemplate().getOptions().userMetadata(keyValuePairTagsMap);
+	}
+
+	@Override
+	public boolean createKeyPairFromPublicKey(String region, String keyPairName, String publicKey) {
+
+		// Not applicable for GCE - Not called by stratos cloud controller as well
+		return false;
+	}
+
+	@Override
+	public String associateAddress(NodeMetadata node) {
+
+		// TODO
+		return "";
+
+	}
+
+	@Override
+	public String associatePredefinedAddress(NodeMetadata node, String ip) {
+		return "";
+	}
+
+	@Override
+	public void releaseAddress(String ip) {
+		// TODO
+	}
+
+	@Override
+	public boolean isValidRegion(String region) throws InvalidRegionException {
+		IaasProvider iaasInfo = getIaasProvider();
+
+		if (region == null || iaasInfo == null) {
+			String msg = "Region or IaaSProvider is null: region: " + region + " - IaaSProvider: " + iaasInfo;
+			log.error(msg);
+			throw new InvalidRegionException(msg);
+		}
+
+		GoogleComputeEngineApi api = getGCEApi();
+		RegionApi regionApi = api.getRegionApiForProject(iaasInfo.getProperty(PROJECTNAME));
+
+		for(IterableWithMarker<Region> page : regionApi.list()) {
+			for(Region r : page) {
+				if (region.equalsIgnoreCase(r.getName())) {
+					log.debug("Found a matching region: " + region);
+					return true;
+				}
+			}
+		}
+
+		String msg = "Invalid region: " + region +" in the iaas: "+iaasInfo.getType();
+		log.error(msg);
+		throw new InvalidRegionException(msg);
+	}
+
+	@Override
+	public boolean isValidZone(String region, String zone) throws InvalidZoneException {
+		IaasProvider iaasInfo = getIaasProvider();
+
+		if (zone == null || iaasInfo == null) {
+			String msg = "Zone or IaaSProvider is null: region: " + region + 
+				     " zone: " + zone + " - IaaSProvider: " + iaasInfo;
+			log.error(msg);
+			throw new InvalidZoneException(msg);
+		}
+
+		GoogleComputeEngineApi api = getGCEApi();
+		ZoneApi zoneApi = api.getZoneApiForProject(iaasInfo.getProperty(PROJECTNAME));
+
+		for(IterableWithMarker<Zone> page : zoneApi.list()) {
+			for(Zone z : page) {
+				if (zone.equalsIgnoreCase(z.getName())) {
+					log.debug("Found a matching zone: " + zone);
+					return true;
+				}
+			}
+		}
+
+		String msg = "Invalid zone: " + zone + " in the region: " + region + " and of the iaas: " + iaasInfo.getType();
+		log.error(msg);
+		throw new InvalidZoneException(msg);
+	}
+
+	@Override
+	public boolean isValidHost(String zone, String host) throws InvalidHostException {
+		IaasProvider iaasInfo = getIaasProvider();
+
+		// Not called by cloud controller
+		// there's no such concept in GCE
+
+		String msg = "Invalid host: " + host + " in the zone: " + zone + " and of the iaas: " + iaasInfo.getType();
+		log.error(msg);
+		throw new InvalidHostException(msg);
+	}
+
+	@Override
+	public PartitionValidator getPartitionValidator() {
+		return new GCEPartitionValidator();
+	}
+
+	@Override
+        public String createVolume(int sizeGB, String snapshotId) {
+		// generate a random diskname
+		Random rand = new Random();
+		String diskName = "stratos-disk-" + rand.nextInt(100000);
+		DiskApi diskApi = getGCEDiskApi();
+		String zone = getZone();
+
+		log.debug("Creating volume: " + diskName + " in zone: " + zone + " of size: " + sizeGB);
+
+		Operation oper = diskApi.createInZone(diskName, sizeGB, zone);
+
+		oper = waitGCEOperationDone(oper);
+		if (oper.getStatus() != Operation.Status.DONE) {
+			log.error("Failed to create volume: " + diskName + " of size: " + sizeGB +
+				  " in zone: " + zone + " operation: " + oper);
+			return null;
+		}
+
+		return diskName;
+	}
+
+	@Override
+	public String attachVolume(String instanceId, String volumeId, String deviceName) {
+		DiskApi diskApi = getGCEDiskApi();
+		InstanceApi instApi = getGCEInstanceApi();
+		String zone = getZone();
+
+		log.debug("Trying to attach volume: " + volumeId + " to instance: " + instanceId +
+			  " in zone: " + zone + " at devicename: " + deviceName);
+
+		Disk disk = diskApi.getInZone(zone, volumeId);
+		if (disk == null) {
+			log.error("Failed to get volume: " + volumeId + " in zone: " + zone);
+			return null;
+		}
+
+		log.debug("Found volumeId: " + volumeId + " volume: " + disk);
+
+		Operation oper = instApi.attachDiskInZone(zone, instanceId,
+						new AttachDiskOptions().type(DiskType.PERSISTENT)
+							.source(disk.getSelfLink())
+							.mode(AttachDiskOptions.DiskMode.READ_WRITE)
+							.deviceName(deviceName));
+		oper = waitGCEOperationDone(oper);
+		if (oper.getStatus() != Operation.Status.DONE) {
+			log.error("Failed to attach volume: " + volumeId + " to instance: " + instanceId +
+				  " in zone: " + zone + " at device: " + deviceName + " operation: " + oper);
+			return null;
+		}
+
+		return volumeId;
+	}
+
+	@Override
+	public void detachVolume(String instanceId, String volumeId) {
+		DiskApi diskApi = getGCEDiskApi();
+		InstanceApi instApi = getGCEInstanceApi();
+		String zone = getZone();
+		Instance inst = instApi.getInZone(zone, instanceId);
+
+		log.debug("Trying to detach volume: " + volumeId + " from instance: " + instanceId +
+			  " " + inst + " in zone: " + zone);
+
+		if (inst == null) {
+			log.error("Failed to find instance: " + instanceId + " in zone: " + zone);
+			return;
+		}
+
+		for(Instance.AttachedDisk disk : inst.getDisks()) {
+			Instance.PersistentAttachedDisk persistentDisk = (Instance.PersistentAttachedDisk)disk;
+
+			log.debug("Found disk - src: " + persistentDisk.getSourceDiskName() +
+				  " devicename: " + persistentDisk.getDeviceName());
+
+			if (persistentDisk.getSourceDiskName().equals(volumeId)) {
+				Operation oper = instApi.detachDiskInZone(zone, instanceId, persistentDisk.getDeviceName().get());
+				oper = waitGCEOperationDone(oper);
+				if (oper.getStatus() != Operation.Status.DONE) {
+					log.error("Failed to detach volume: " + volumeId + " to instance: " + instanceId +
+						  " in zone: " + zone + " at device: " + persistentDisk.getDeviceName() +
+						  " result operation: " + oper);
+				}
+				return;
+			}
+		}
+
+		log.error("Cannot find volume: " + volumeId + " in instance: " + instanceId);
+	}
+
+	@Override
+	public void deleteVolume(String volumeId) {
+		DiskApi diskApi = getGCEDiskApi();
+		String zone = getZone();
+
+		log.debug("Deleting volume: " + volumeId + " in zone: " + zone);
+
+		Operation oper = diskApi.deleteInZone(zone, volumeId);
+
+		oper = waitGCEOperationDone(oper);
+		if (oper.getStatus() != Operation.Status.DONE) {
+			log.error("Failed to delete volume: " + volumeId + " in zone: " + zone +
+				  " operation: " + oper);
+		}
+	}
+
+	@Override
+	public String getIaasDevice(String device) {
+		return device;
+	}
+
+	private String getZone() {
+                IaasProvider iaasInfo = getIaasProvider();
+		return iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE);
+	}
+
+	private GoogleComputeEngineApi getGCEApi() {
+		IaasProvider iaasInfo = getIaasProvider();
+		ComputeServiceContext context = iaasInfo.getComputeService().getContext();
+		GoogleComputeEngineApi api = context.unwrapApi(GoogleComputeEngineApi.class);
+
+		return api;
+	}
+
+	private DiskApi getGCEDiskApi() {
+		IaasProvider iaasInfo = getIaasProvider();
+		String projectName = iaasInfo.getProperty(PROJECTNAME);
+		return getGCEApi().getDiskApiForProject(projectName);
+	}
+
+	private InstanceApi getGCEInstanceApi() {
+		IaasProvider iaasInfo = getIaasProvider();
+		String projectName = iaasInfo.getProperty(PROJECTNAME);
+		return getGCEApi().getInstanceApiForProject(projectName);
+	}
+
+	private Operation waitGCEOperationDone(Operation operation) {
+		int maxWaitTime = 15; // 15 seconds
+                IaasProvider iaasInfo = getIaasProvider();
+		Injector injector = ContextBuilder.newBuilder(iaasInfo.getProvider())
+					  .credentials(iaasInfo.getIdentity(), iaasInfo.getCredential())
+					  .buildInjector();
+		Predicate<AtomicReference<Operation>> zoneOperationDonePredicate =
+			    injector.getInstance(Key.get(new TypeLiteral<Predicate<AtomicReference<Operation>>>() {
+				}, Names.named("zone")));
+		AtomicReference<Operation> operationReference = Atomics.newReference(operation);
+		retry(zoneOperationDonePredicate, maxWaitTime, 1, SECONDS).apply(operationReference);
+
+		return operationReference.get();
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/GCEPartitionValidator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/GCEPartitionValidator.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/GCEPartitionValidator.java
new file mode 100644
index 0000000..7d07d40
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/GCEPartitionValidator.java
@@ -0,0 +1,54 @@
+/*
+ * 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.apache.stratos.cloud.controller.validate;
+
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.exception.InvalidPartitionException;
+import org.apache.stratos.cloud.controller.interfaces.Iaas;
+import org.apache.stratos.cloud.controller.pojo.IaasProvider;
+import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator;
+
+
+/**
+ * The VCloud {@link PartitionValidator} implementation.
+ *
+ */
+public class GCEPartitionValidator implements PartitionValidator {
+    
+    private static final Log log = LogFactory.getLog(VCloudPartitionValidator.class);
+    private IaasProvider iaasProvider;
+    private Iaas iaas;
+
+    @Override
+    public IaasProvider validate(String partitionId, Properties properties) throws InvalidPartitionException {
+        //TODO: implement real validation logic 
+        return iaasProvider;
+       
+    }
+
+    @Override
+    public void setIaasProvider(IaasProvider iaas) {
+        this.iaasProvider = iaas;
+        this.iaas = iaas.getIaas();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/README.txt
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/README.txt b/dependencies/jclouds/apis/gce/1.8.0-stratos/README.txt
new file mode 100644
index 0000000..a6ca119
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/README.txt
@@ -0,0 +1,77 @@
+======
+Stratos GCE provider 1.8.0
+======
+
+This code in Stratos is copied from Jclouds GCE [1]
+The jclouds GCE code has 2 directories oauth & google-compute-engine
+In Stratos, these two directories are mered into one.
+
+[1] https://github.com/jclouds/jclouds-labs-google/tree/jclouds-labs-google-1.8.0
+
+
+
+
+======
+jclouds Google Compute Engine Provider
+======
+
+
+Authenticating into the instances:
+--------
+
+User:
+If no user is provided in GoogleComputeEngineTemplateOptions when launching an instance by default "jclouds" is used.
+
+Credential:
+
+GCE uses exclusively ssh keys to login into instances.
+In order for an instance to be sshable a public key must be installed. Public keys are installed if they are present in the project or instance's metatada.
+
+For an instance to be ssable one of the following must happen:
+1 - the project's metadata has an adequately built "sshKeys" entry and a corresponding private key is provided in GoogleComputeEngineTemplateOptions when createNodesInGroup is called.
+2 - an instance of GoogleComputeEngineTemplateOptions with an adequate public and private key is provided.
+
+NOTE: if methods 2 is chosen the global project keys will not be installed in the instance.
+
+Please refer to Google's documentation on how to form valid project wide ssh keys metadata entries.
+
+FAQ:
+--------
+
+* Q. What is the identity for GCE?
+
+A. the identity is the developer email which can be obtained from the admin GUI. Its usually something in the form: <my account id>@developer.gserviceaccount.com
+
+* Q. What is the credential for GCE
+
+A. the credential is a private key, in pem format. It can be extracted from the p12 keystore that is obtained when creating a "Service Account" (in the GUI: Google apis console > Api Access > Create another client ID > "Service Account"
+
+* Q. How to convert a p12 keystore into a pem format jclouds Google Compute Engine can handle:
+
+A.
+
+1. Convert the p12 file into pem format (it will ask for the keystore password, which is usually "notasecret"):
+ openssl pkcs12 -in <my_keystore>.p12 -out <my_keystore>.pem -nodes
+
+2. Extract only the pk and remove passphrase
+ openssl rsa -in <my_keystore>.pem -out <my_key>.pem
+
+The last file (<my_key>.pem) should contain the pk that needs to be passed to `ContextBuilder.credential()` for the provider `google-compute-engine`.
+
+
+Running the live tests:
+--------
+
+1. Place the following in your ~/.m2/settings.xml in a profile enabled when live:
+```
+    <test.google-compute-engine.identity>YOUR_ACCOUNT_NUMBER@developer.gserviceaccount.com</test.google-compute-engine.identity>
+    <test.google-compute-engine.credential>-----BEGIN RSA PRIVATE KEY-----
+MIICXgIBAAKBgQRRbRqVDtJLN1MO/xJoKqZuphDeBh5jIKueW3aNIiWs1XFcct+h
+-- this text is literally from your <my_key>.pem
+aH7xmpHSTbbXmQkuuv+z8EKijigprd/FoJpTX1f5/R+4wQ==
+-----END RSA PRIVATE KEY-----</test.google-compute-engine.credential>
+  </properties>
+```
+
+2. mvn clean install -Plive 
+

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/pom.xml
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/pom.xml b/dependencies/jclouds/apis/gce/1.8.0-stratos/pom.xml
new file mode 100644
index 0000000..7874da1
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/pom.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.jclouds.labs</groupId>
+        <artifactId>jclouds-labs-google</artifactId>
+        <version>1.8.0</version>
+    </parent>
+
+    <!-- TODO: when out of labs, switch to org.jclouds.provider -->
+    <groupId>org.apache.stratos</groupId>
+    <artifactId>gce</artifactId>
+    <version>1.8.0-stratos</version>
+    <name>jclouds Google Compute Engine provider</name>
+    <description>jclouds components to access GoogleCompute</description>
+    <packaging>bundle</packaging>
+
+    <properties>
+        <jclouds.version>1.8.0</jclouds.version>
+        <test.google-compute-engine.identity>Email associated with the Google API client_id
+        </test.google-compute-engine.identity>
+        <test.google-compute-engine.credential>Private key (PKCS12 file) associated with the Google API client_id
+        </test.google-compute-engine.credential>
+        <test.google-compute-engine.api-version>v1</test.google-compute-engine.api-version>
+        <test.google-compute-engine.build-version />
+        <test.google-compute-engine.template>imageId=debian-7-wheezy-v20131120,locationId=us-central1-a,minRam=2048</test.google-compute-engine.template>
+        <jclouds.osgi.export>org.jclouds.googlecomputeengine*;version="${project.version}"</jclouds.osgi.export>
+        <jclouds.osgi.import>
+          org.jclouds.compute.internal;version="${jclouds.version}",
+          org.jclouds.rest.internal;version="${jclouds.version}",
+          org.jclouds*;version="${jclouds.version}",
+          *
+        </jclouds.osgi.import>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-core</artifactId>
+            <version>${jclouds.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-compute</artifactId>
+            <version>${jclouds.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-compute</artifactId>
+            <version>${jclouds.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-core</artifactId>
+            <version>${jclouds.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds.driver</groupId>
+            <artifactId>jclouds-slf4j</artifactId>
+            <version>${jclouds.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds.driver</groupId>
+            <artifactId>jclouds-sshj</artifactId>
+            <version>${jclouds.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <profiles>
+        <profile>
+            <id>live</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>integration</id>
+                                <phase>integration-test</phase>
+                                <goals>
+                                    <goal>test</goal>
+                                </goals>
+                                <configuration>
+                                    <systemPropertyVariables>
+                                        <test.google-compute-engine.identity>${test.google-compute-engine.identity}
+                                        </test.google-compute-engine.identity>
+                                        <test.google-compute-engine.credential>
+                                            ${test.google-compute-engine.credential}
+                                        </test.google-compute-engine.credential>
+                                        <test.google-compute-engine.api-version>
+                                            ${test.google-compute-engine.api-version}
+                                        </test.google-compute-engine.api-version>
+                                        <test.google-compute-engine.build-version>
+                                            ${test.google-compute-engine.build-version}
+                                        </test.google-compute-engine.build-version>
+                                        <test.google-compute-engine.template>${test.google-compute-engine.template}</test.google-compute-engine.template>
+                                    </systemPropertyVariables>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java
new file mode 100644
index 0000000..6440d91
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java
@@ -0,0 +1,185 @@
+/*
+ * 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;
+
+import java.io.Closeable;
+
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+
+import org.jclouds.googlecomputeengine.features.AddressApi;
+import org.jclouds.googlecomputeengine.features.DiskApi;
+import org.jclouds.googlecomputeengine.features.FirewallApi;
+import org.jclouds.googlecomputeengine.features.GlobalOperationApi;
+import org.jclouds.googlecomputeengine.features.ImageApi;
+import org.jclouds.googlecomputeengine.features.InstanceApi;
+import org.jclouds.googlecomputeengine.features.MachineTypeApi;
+import org.jclouds.googlecomputeengine.features.NetworkApi;
+import org.jclouds.googlecomputeengine.features.ProjectApi;
+import org.jclouds.googlecomputeengine.features.RegionApi;
+import org.jclouds.googlecomputeengine.features.RegionOperationApi;
+import org.jclouds.googlecomputeengine.features.RouteApi;
+import org.jclouds.googlecomputeengine.features.SnapshotApi;
+import org.jclouds.googlecomputeengine.features.ZoneApi;
+import org.jclouds.googlecomputeengine.features.ZoneOperationApi;
+import org.jclouds.rest.annotations.Delegate;
+
+import com.google.common.annotations.Beta;
+
+
+/**
+ * Provides access to GoogleCompute.
+ * <p/>
+ *
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1">api doc</a>
+ */
+@Beta
+public interface GoogleComputeEngineApi extends Closeable {
+
+   /**
+    * Provides access to Address features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   AddressApi getAddressApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Disk features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   DiskApi getDiskApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Firewall features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   FirewallApi getFirewallApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Global Operation features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   GlobalOperationApi getGlobalOperationApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Image features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   ImageApi getImageApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Instance features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   InstanceApi getInstanceApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to MachineType features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   MachineTypeApi getMachineTypeApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Network features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   NetworkApi getNetworkApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Project features
+    */
+   @Delegate
+   ProjectApi getProjectApi();
+
+   /**
+    * Provides access to Region features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   RegionApi getRegionApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Region Operation features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   RegionOperationApi getRegionOperationApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Route features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   RouteApi getRouteApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Snapshot features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   SnapshotApi getSnapshotApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Zone features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   ZoneApi getZoneApiForProject(@PathParam("project") String projectName);
+
+   /**
+    * Provides access to Zone Operation features
+    *
+    * @param projectName the name of the project
+    */
+   @Delegate
+   @Path("/projects/{project}")
+   ZoneOperationApi getZoneOperationApiForProject(@PathParam("project") String projectName);
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java
new file mode 100644
index 0000000..1527529
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java
@@ -0,0 +1,104 @@
+/*
+ * 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;
+
+import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
+import static org.jclouds.compute.config.ComputeServiceProperties.TEMPLATE;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GCE_PROVIDER_NAME;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_INTERVAL;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_TIMEOUT;
+import static org.jclouds.oauth.v2.config.OAuthProperties.AUDIENCE;
+import static org.jclouds.oauth.v2.config.OAuthProperties.SIGNATURE_OR_MAC_ALGORITHM;
+import static org.jclouds.reflect.Reflection2.typeToken;
+
+import java.net.URI;
+import java.util.Properties;
+
+import org.jclouds.compute.ComputeServiceContext;
+import org.jclouds.googlecomputeengine.compute.config.GoogleComputeEngineServiceContextModule;
+import org.jclouds.googlecomputeengine.config.GoogleComputeEngineHttpApiModule;
+import org.jclouds.googlecomputeengine.config.GoogleComputeEngineParserModule;
+import org.jclouds.googlecomputeengine.config.OAuthModuleWithoutTypeAdapters;
+import org.jclouds.oauth.v2.config.OAuthAuthenticationModule;
+import org.jclouds.rest.internal.BaseHttpApiMetadata;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
+
+/**
+ * Implementation of {@link ApiMetadata} for GoogleCompute v1 API
+ */
+public class GoogleComputeEngineApiMetadata extends BaseHttpApiMetadata<GoogleComputeEngineApi> {
+
+   @Override
+   public Builder toBuilder() {
+      return new Builder().fromApiMetadata(this);
+   }
+
+   public GoogleComputeEngineApiMetadata() {
+      this(new Builder());
+   }
+
+   protected GoogleComputeEngineApiMetadata(Builder builder) {
+      super(builder);
+   }
+
+   public static Properties defaultProperties() {
+      Properties properties = BaseHttpApiMetadata.defaultProperties();
+      properties.put("oauth.endpoint", "https://accounts.google.com/o/oauth2/token");
+      properties.put(AUDIENCE, "https://accounts.google.com/o/oauth2/token");
+      properties.put(SIGNATURE_OR_MAC_ALGORITHM, "RS256");
+      properties.put(PROPERTY_SESSION_INTERVAL, 3600);
+      properties.setProperty(TEMPLATE, "osFamily=GCEL,osVersionMatches=1[012].[01][04],locationId=us-central1-a," +
+              "loginUser=jclouds");
+      properties.put(OPERATION_COMPLETE_INTERVAL, 500);
+      properties.put(OPERATION_COMPLETE_TIMEOUT, 600000);
+      return properties;
+   }
+
+   public static class Builder extends BaseHttpApiMetadata.Builder<GoogleComputeEngineApi, Builder> {
+
+      protected Builder() {
+         id(GCE_PROVIDER_NAME)
+                 .name("Google Compute Engine Api")
+                 .identityName("Email associated with the Google API client_id")
+                 .credentialName("Private key literal associated with the Google API client_id")
+                 .documentation(URI.create("https://developers.google.com/compute/docs"))
+                 .version("v1")
+                 .defaultEndpoint("https://www.googleapis.com/compute/v1")
+                 .defaultProperties(GoogleComputeEngineApiMetadata.defaultProperties())
+                 .view(typeToken(ComputeServiceContext.class))
+                 .defaultModules(ImmutableSet.<Class<? extends Module>>builder()
+                         .add(GoogleComputeEngineHttpApiModule.class)
+                         .add(GoogleComputeEngineParserModule.class)
+                         .add(OAuthAuthenticationModule.class)
+                         .add(OAuthModuleWithoutTypeAdapters.class)
+                         .add(GoogleComputeEngineServiceContextModule.class)
+                         .build());
+      }
+
+      @Override
+      public GoogleComputeEngineApiMetadata build() {
+         return new GoogleComputeEngineApiMetadata(this);
+      }
+
+      @Override
+      protected Builder self() {
+         return this;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java
new file mode 100644
index 0000000..d20ff98
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java
@@ -0,0 +1,81 @@
+/*
+ * 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;
+
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+
+import com.google.common.annotations.Beta;
+
+public final class GoogleComputeEngineConstants {
+
+   public static final String GCE_PROVIDER_NAME = "google-compute-engine";
+
+   /**
+    * The name of the project that keeps public resources.
+    */
+   public static final String GOOGLE_PROJECT = "google";
+
+   public static final String CENTOS_PROJECT = "centos-cloud";
+
+   public static final String DEBIAN_PROJECT = "debian-cloud";
+
+   public static final String COMPUTE_SCOPE = "https://www.googleapis.com/auth/compute";
+
+   public static final String COMPUTE_READONLY_SCOPE = "https://www.googleapis.com/auth/compute.readonly";
+
+   public static final String STORAGE_READONLY_SCOPE = "https://www.googleapis.com/auth/devstorage.read_only";
+
+   public static final String STORAGE_WRITEONLY_SCOPE = "https://www.googleapis.com/auth/devstorage.write_only";
+
+
+   /**
+    * The total time, in msecs, to wait for an operation to complete.
+    */
+   @Beta
+   public static final String OPERATION_COMPLETE_TIMEOUT = "jclouds.google-compute-engine.operation-complete-timeout";
+
+   /**
+    * The interval, in msecs, between calls to check whether an operation has completed.
+    */
+   @Beta
+   public static final String OPERATION_COMPLETE_INTERVAL = "jclouds.google-compute-engine.operation-complete-interval";
+
+   public static final Location GOOGLE_PROVIDER_LOCATION = new LocationBuilder().scope(LocationScope.PROVIDER).id
+           (GCE_PROVIDER_NAME).description(GCE_PROVIDER_NAME).build();
+
+
+   /**
+    * The key we look for in instance metadata for the URI for the image the instance was created from.
+    */
+   public static final String GCE_IMAGE_METADATA_KEY = "jclouds-image";
+
+   /**
+    * Metadata key to check for whether we should delete an instance's boot disk when we delete the instance.
+    */
+   public static final String GCE_DELETE_BOOT_DISK_METADATA_KEY = "jclouds-delete-boot-disk";
+
+   /**
+    * The suffix we append to auto-created boot disk names.
+    */
+   public static final String GCE_BOOT_DISK_SUFFIX = "boot-disk";
+
+   private GoogleComputeEngineConstants() {
+      throw new AssertionError("intentionally unimplemented");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java
new file mode 100644
index 0000000..3c140eb
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java
@@ -0,0 +1,200 @@
+/*
+ * 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.base.Preconditions.checkNotNull;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_INTERVAL;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_TIMEOUT;
+import static org.jclouds.util.Predicates2.retry;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Provider;
+
+import org.jclouds.Constants;
+import org.jclouds.collect.Memoized;
+import org.jclouds.compute.ComputeServiceContext;
+import org.jclouds.compute.callables.RunScriptOnNode;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.extensions.ImageExtension;
+import org.jclouds.compute.extensions.SecurityGroupExtension;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.compute.internal.BaseComputeService;
+import org.jclouds.compute.internal.PersistNodeCredentials;
+import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.reference.ComputeServiceConstants;
+import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet;
+import org.jclouds.compute.strategy.DestroyNodeStrategy;
+import org.jclouds.compute.strategy.GetImageStrategy;
+import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
+import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap;
+import org.jclouds.compute.strategy.ListNodesStrategy;
+import org.jclouds.compute.strategy.RebootNodeStrategy;
+import org.jclouds.compute.strategy.ResumeNodeStrategy;
+import org.jclouds.compute.strategy.SuspendNodeStrategy;
+import org.jclouds.domain.Credentials;
+import org.jclouds.domain.Location;
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions;
+import org.jclouds.googlecomputeengine.config.UserProject;
+import org.jclouds.googlecomputeengine.domain.Firewall;
+import org.jclouds.googlecomputeengine.domain.Network;
+import org.jclouds.googlecomputeengine.domain.Operation;
+import org.jclouds.googlecomputeengine.features.FirewallApi;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.scriptbuilder.functions.InitAdminAccess;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.Atomics;
+import com.google.common.util.concurrent.ListeningExecutorService;
+
+public class GoogleComputeEngineService extends BaseComputeService {
+
+   private final Function<Set<? extends NodeMetadata>, Set<String>> findOrphanedGroups;
+   private final GroupNamingConvention.Factory namingConvention;
+   private final GoogleComputeEngineApi api;
+   private final Supplier<String> project;
+   private final Predicate<AtomicReference<Operation>> operationDonePredicate;
+   private final long operationCompleteCheckInterval;
+   private final long operationCompleteCheckTimeout;
+
+   @Inject
+   protected GoogleComputeEngineService(ComputeServiceContext context,
+                                        Map<String, Credentials> credentialStore,
+                                        @Memoized Supplier<Set<? extends Image>> images,
+                                        @Memoized Supplier<Set<? extends Hardware>> hardwareProfiles,
+                                        @Memoized Supplier<Set<? extends Location>> locations,
+                                        ListNodesStrategy listNodesStrategy,
+                                        GetImageStrategy getImageStrategy,
+                                        GetNodeMetadataStrategy getNodeMetadataStrategy,
+                                        CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy,
+                                        RebootNodeStrategy rebootNodeStrategy,
+                                        DestroyNodeStrategy destroyNodeStrategy,
+                                        ResumeNodeStrategy resumeNodeStrategy,
+                                        SuspendNodeStrategy suspendNodeStrategy,
+                                        Provider<TemplateBuilder> templateBuilderProvider,
+                                        @Named("DEFAULT") Provider<TemplateOptions> templateOptionsProvider,
+                                        @Named(TIMEOUT_NODE_RUNNING) Predicate<AtomicReference<NodeMetadata>>
+                                                nodeRunning,
+                                        @Named(TIMEOUT_NODE_TERMINATED) Predicate<AtomicReference<NodeMetadata>>
+                                                nodeTerminated,
+                                        @Named(TIMEOUT_NODE_SUSPENDED)
+                                        Predicate<AtomicReference<NodeMetadata>> nodeSuspended,
+                                        InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory,
+                                        InitAdminAccess initAdminAccess,
+                                        RunScriptOnNode.Factory runScriptOnNodeFactory,
+                                        PersistNodeCredentials persistNodeCredentials,
+                                        ComputeServiceConstants.Timeouts timeouts,
+                                        @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor,
+                                        Optional<ImageExtension> imageExtension,
+                                        Optional<SecurityGroupExtension> securityGroupExtension,
+                                        Function<Set<? extends NodeMetadata>, Set<String>> findOrphanedGroups,
+                                        GroupNamingConvention.Factory namingConvention,
+                                        GoogleComputeEngineApi api,
+                                        @UserProject Supplier<String> project,
+                                        @Named("global") Predicate<AtomicReference<Operation>> operationDonePredicate,
+                                        @Named(OPERATION_COMPLETE_INTERVAL) Long operationCompleteCheckInterval,
+                                        @Named(OPERATION_COMPLETE_TIMEOUT) Long operationCompleteCheckTimeout) {
+
+      super(context, credentialStore, images, hardwareProfiles, locations, listNodesStrategy, getImageStrategy,
+              getNodeMetadataStrategy, runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy,
+              resumeNodeStrategy, suspendNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning,
+              nodeTerminated, nodeSuspended, initScriptRunnerFactory, initAdminAccess, runScriptOnNodeFactory,
+              persistNodeCredentials, timeouts, userExecutor, imageExtension, securityGroupExtension);
+      this.findOrphanedGroups = checkNotNull(findOrphanedGroups, "find orphaned groups function");
+      this.namingConvention = checkNotNull(namingConvention, "naming convention factory");
+      this.api = checkNotNull(api, "google compute api");
+      this.project = checkNotNull(project, "user project name");
+      this.operationDonePredicate = checkNotNull(operationDonePredicate, "operation completed predicate");
+      this.operationCompleteCheckInterval = checkNotNull(operationCompleteCheckInterval,
+              "operation completed check interval");
+      this.operationCompleteCheckTimeout = checkNotNull(operationCompleteCheckTimeout,
+              "operation completed check timeout");
+   }
+
+   @Override
+   protected synchronized void cleanUpIncidentalResourcesOfDeadNodes(Set<? extends NodeMetadata> deadNodes) {
+      Set<String> orphanedGroups = findOrphanedGroups.apply(deadNodes);
+      for (String orphanedGroup : orphanedGroups) {
+         cleanUpNetworksAndFirewallsForGroup(orphanedGroup);
+      }
+   }
+
+
+   protected void cleanUpNetworksAndFirewallsForGroup(final String groupName) {
+      String resourceName = namingConvention.create().sharedNameForGroup(groupName);
+      final Network network = api.getNetworkApiForProject(project.get()).get(resourceName);
+      FirewallApi firewallApi = api.getFirewallApiForProject(project.get());
+      Predicate<Firewall> firewallBelongsToNetwork = new Predicate<Firewall>() {
+         @Override
+         public boolean apply(Firewall input) {
+            return input != null && input.getNetwork().equals(network.getSelfLink());
+         }
+      };
+
+      Set<AtomicReference<Operation>> operations = Sets.newHashSet();
+      for (Firewall firewall : firewallApi.list().concat().filter(firewallBelongsToNetwork)) {
+         operations.add(new AtomicReference<Operation>(firewallApi.delete(firewall.getName())));
+      }
+
+      for (AtomicReference<Operation> operation : operations) {
+         retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval,
+                 MILLISECONDS).apply(operation);
+
+         if (operation.get().getHttpError().isPresent()) {
+            HttpResponse response = operation.get().getHttpError().get();
+            logger.warn("delete orphaned firewall %s failed. Http Error Code: %d HttpError: %s",
+                    operation.get().getTargetId(), response.getStatusCode(), response.getMessage());
+         }
+      }
+
+      AtomicReference<Operation> operation = Atomics.newReference(api.getNetworkApiForProject(project.get()).delete(resourceName));
+
+      retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval,
+              MILLISECONDS).apply(operation);
+
+      if (operation.get().getHttpError().isPresent()) {
+         HttpResponse response = operation.get().getHttpError().get();
+         logger.warn("delete orphaned network failed. Http Error Code: " + response.getStatusCode() +
+                 " HttpError: " + response.getMessage());
+      }
+   }
+
+
+   /**
+    * returns template options, except of type {@link org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions}.
+    */
+   @Override
+   public GoogleComputeEngineTemplateOptions templateOptions() {
+      return GoogleComputeEngineTemplateOptions.class.cast(super.templateOptions());
+   }
+}