JCLOUDS-750 Convert GoogleComputeEngine to AutoValue + general cleanup.

Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/commit/b41b0d04
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/tree/b41b0d04
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/diff/b41b0d04

Branch: refs/heads/master
Commit: b41b0d047ce6711f14cd56abec05074a68a314cf
Parents: 521a0c0
Author: Adrian Cole <[email protected]>
Authored: Mon Nov 3 10:07:23 2014 -0800
Committer: Adrian Cole <[email protected]>
Committed: Mon Nov 3 15:20:20 2014 -0800

----------------------------------------------------------------------
 google-compute-engine/pom.xml                   |    5 +
 .../GoogleComputeEngineApi.java                 |   10 +-
 .../GoogleComputeEngineApiMetadata.java         |    3 +
 .../GoogleComputeEngineFallbacks.java           |   30 +
 .../binders/ForwardingRuleCreationBinder.java   |    4 +-
 .../binders/HttpHealthCheckCreationBinder.java  |   17 +-
 .../binders/InstanceBinder.java                 |   10 +-
 .../binders/MetadataBinder.java                 |   10 +-
 .../TargetPoolChangeHealthChecksBinder.java     |    6 +-
 .../TargetPoolChangeInstancesBinder.java        |    6 +-
 .../binders/TargetPoolCreationBinder.java       |    6 +-
 .../TargetPoolMapofListofMapGenericBinder.java  |   65 +
 .../TargetPoolMapofSetofMapGenericBinder.java   |   64 -
 .../compute/GoogleComputeEngineService.java     |   25 +-
 .../GoogleComputeEngineServiceAdapter.java      |   97 +-
 ...GoogleComputeEngineServiceContextModule.java |   14 +-
 .../compute/domain/InstanceInZone.java          |   54 +
 .../compute/domain/MachineTypeInZone.java       |   54 +
 .../compute/domain/NetworkAndAddressRange.java  |   41 +
 .../compute/domain/SlashEncodedIds.java         |   83 ++
 ...ogleComputeEngineSecurityGroupExtension.java |  122 +-
 .../functions/CreateNetworkIfNeeded.java        |   97 ++
 .../compute/functions/FindNetworkOrCreate.java  |   50 +
 .../functions/FirewallTagNamingConvention.java  |    5 +-
 .../functions/FirewallToIpPermission.java       |   66 +-
 .../GoogleComputeEngineImageToImage.java        |   32 +-
 .../functions/InstanceInZoneToNodeMetadata.java |   80 +-
 .../functions/MachineTypeInZoneToHardware.java  |   26 +-
 .../functions/NetworkToSecurityGroup.java       |   10 +-
 .../compute/functions/RegionToLocation.java     |    6 +-
 .../compute/functions/ZoneToLocation.java       |    6 +-
 .../compute/loaders/FindNetworkOrCreate.java    |   62 -
 .../GoogleComputeEngineTemplateOptions.java     |   27 +-
 ...desWithGroupEncodedIntoNameThenAddToSet.java |   53 +-
 .../GoogleComputeEngineHttpApiModule.java       |    4 +-
 .../config/GoogleComputeEngineParserModule.java |  329 ++---
 .../domain/AbstractDisk.java                    |  120 --
 .../googlecomputeengine/domain/Address.java     |  164 +--
 .../googlecomputeengine/domain/Deprecated.java  |  179 +--
 .../googlecomputeengine/domain/Disk.java        |  128 +-
 .../googlecomputeengine/domain/DiskType.java    |  150 +--
 .../googlecomputeengine/domain/Firewall.java    |  366 +-----
 .../domain/ForwardingRule.java                  |  195 +--
 .../domain/HttpHealthCheck.java                 |  237 +---
 .../googlecomputeengine/domain/Image.java       |  268 +---
 .../googlecomputeengine/domain/Instance.java    | 1176 ++----------------
 .../domain/InstanceInZone.java                  |   52 -
 .../domain/InstanceTemplate.java                |  442 -------
 .../googlecomputeengine/domain/ListPage.java    |  115 +-
 .../googlecomputeengine/domain/MachineType.java |  333 +----
 .../domain/MachineTypeInZone.java               |   52 -
 .../googlecomputeengine/domain/Metadata.java    |  118 +-
 .../googlecomputeengine/domain/Network.java     |  114 +-
 .../googlecomputeengine/domain/Operation.java   |  552 +-------
 .../googlecomputeengine/domain/Project.java     |  148 +--
 .../googlecomputeengine/domain/Quota.java       |  132 +-
 .../googlecomputeengine/domain/Region.java      |  151 +--
 .../googlecomputeengine/domain/Resource.java    |  287 -----
 .../googlecomputeengine/domain/Route.java       |  429 +------
 .../domain/SlashEncodedIds.java                 |   83 --
 .../googlecomputeengine/domain/Snapshot.java    |  125 +-
 .../googlecomputeengine/domain/Tags.java        |   43 +
 .../googlecomputeengine/domain/TargetPool.java  |  205 +--
 .../googlecomputeengine/domain/Zone.java        |  317 +----
 .../domain/internal/NetworkAndAddressRange.java |   91 --
 .../domain/templates/InstanceTemplate.java      |  269 ++++
 .../features/AddressApi.java                    |    9 +-
 .../googlecomputeengine/features/DiskApi.java   |   10 +-
 .../features/DiskTypeApi.java                   |    8 +-
 .../features/FirewallApi.java                   |   10 +-
 .../features/ForwardingRuleApi.java             |   37 +-
 .../features/GlobalOperationApi.java            |    8 +-
 .../features/HttpHealthCheckApi.java            |   42 +-
 .../googlecomputeengine/features/ImageApi.java  |    8 +-
 .../features/InstanceApi.java                   |   19 +-
 .../features/MachineTypeApi.java                |    8 +-
 .../features/NetworkApi.java                    |    8 +-
 .../features/ProjectApi.java                    |    2 +-
 .../googlecomputeengine/features/RegionApi.java |    8 +-
 .../features/RegionOperationApi.java            |    8 +-
 .../googlecomputeengine/features/RouteApi.java  |   10 +-
 .../features/SnapshotApi.java                   |    8 +-
 .../features/TargetPoolApi.java                 |   61 +-
 .../googlecomputeengine/features/ZoneApi.java   |    8 +-
 .../features/ZoneOperationApi.java              |    8 +-
 .../functions/CreateNetworkIfNeeded.java        |  100 --
 .../functions/internal/BaseToPagedIterable.java |   15 +-
 .../internal/BaseWithRegionToPagedIterable.java |   12 +-
 .../internal/BaseWithZoneToPagedIterable.java   |   12 +-
 .../functions/internal/ParseAddresses.java      |   29 +-
 .../functions/internal/ParseDiskTypes.java      |   32 +-
 .../functions/internal/ParseDisks.java          |   29 +-
 .../functions/internal/ParseFirewalls.java      |   27 +-
 .../internal/ParseForwardingRules.java          |   36 +-
 .../internal/ParseGlobalOperations.java         |   25 +-
 .../internal/ParseHttpHealthChecks.java         |   33 +-
 .../functions/internal/ParseImages.java         |   27 +-
 .../functions/internal/ParseInstances.java      |   29 +-
 .../functions/internal/ParseMachineTypes.java   |   30 +-
 .../functions/internal/ParseNetworks.java       |   27 +-
 .../internal/ParseRegionOperations.java         |   28 +-
 .../functions/internal/ParseRegions.java        |   27 +-
 .../functions/internal/ParseRoutes.java         |   24 +-
 .../functions/internal/ParseSnapshots.java      |   30 +-
 .../functions/internal/ParseTargetPools.java    |   29 +-
 .../functions/internal/ParseZoneOperations.java |   27 +-
 .../functions/internal/ParseZones.java          |   24 +-
 .../internal/NullSafeCopies.java                |   39 +
 .../options/FirewallOptions.java                |   74 +-
 .../options/ForwardingRuleCreationOptions.java  |    8 +-
 .../options/HttpHealthCheckCreationOptions.java |   35 +-
 .../options/RouteOptions.java                   |   18 +-
 .../options/TargetPoolCreationOptions.java      |   16 +-
 .../GlobalOperationDonePredicate.java           |   15 +-
 .../predicates/InstancePredicates.java          |    4 +-
 .../predicates/NetworkFirewallPredicates.java   |  110 +-
 .../RegionOperationDonePredicate.java           |   17 +-
 .../predicates/ZoneOperationDonePredicate.java  |   20 +-
 .../services/org.jclouds.apis.ApiMetadata       |   18 -
 .../GoogleComputeEngineApiMetadataTest.java     |    6 +-
 .../ForwardingRuleCreationBinderTest.java       |    4 +-
 .../TargetPoolAddInstanceBinderTest.java        |   15 +-
 .../binders/TargetPoolCreationBinderTest.java   |    8 +-
 .../GoogleComputeEngineServiceExpectTest.java   |   63 +-
 .../GoogleComputeEngineServiceLiveTest.java     |    5 +-
 .../functions/CreateNetworkIfNeededTest.java    |  148 +++
 .../functions/FindNetworkOrCreateTest.java      |  149 +++
 .../functions/FirewallToIpPermissionTest.java   |   50 +-
 .../GoogleComputeEngineImageToImageTest.java    |   38 +-
 .../InstanceInZoneToNodeMetadataTest.java       |   58 +-
 .../functions/NetworkToSecurityGroupTest.java   |   22 +-
 .../loaders/FindNetworkOrCreateTest.java        |  141 ---
 .../features/AddressApiExpectTest.java          |   26 +-
 .../features/AddressApiLiveTest.java            |    2 +-
 .../features/DiskApiExpectTest.java             |   48 +-
 .../features/DiskApiLiveTest.java               |   14 +-
 .../features/DiskTypeApiExpectTest.java         |   12 +-
 .../features/DiskTypeApiLiveTest.java           |   16 +-
 .../features/FirewallApiExpectTest.java         |   88 +-
 .../features/FirewallApiLiveTest.java           |   51 +-
 .../features/ForwardingRuleApiExpectTest.java   |   59 +-
 .../features/ForwardingRuleApiLiveTest.java     |   36 +-
 .../features/GlobalOperationApiExpectTest.java  |   17 +-
 .../features/GlobalOperationApiLiveTest.java    |    8 +-
 .../features/HttpHealthCheckApiExpectTest.java  |   90 +-
 .../features/HttpHealthCheckApiLiveTest.java    |   65 +-
 .../features/ImageApiExpectTest.java            |   33 +-
 .../features/ImageApiLiveTest.java              |   16 +-
 .../features/InstanceApiExpectTest.java         |  110 +-
 .../features/InstanceApiLiveTest.java           |   51 +-
 .../features/MachineTypeApiExpectTest.java      |   12 +-
 .../features/MachineTypeApiLiveTest.java        |    7 +-
 .../features/NetworkApiExpectTest.java          |   20 +-
 .../features/NetworkApiLiveTest.java            |    5 +-
 .../features/ProjectApiExpectTest.java          |   10 +-
 .../features/ProjectApiLiveTest.java            |   29 +-
 .../features/RegionApiExpectTest.java           |    4 +-
 .../features/RegionApiLiveTest.java             |    9 +-
 .../features/RegionOperationApiExpectTest.java  |   47 +-
 .../features/RegionOperationApiLiveTest.java    |    8 +-
 .../features/RouteApiExpectTest.java            |   31 +-
 .../features/RouteApiLiveTest.java              |    7 +-
 .../features/SnapshotApiExpectTest.java         |    4 +-
 .../features/SnapshotApiLiveTest.java           |   10 +-
 .../features/TargetPoolApiExpectTest.java       |   72 +-
 .../features/TargetPoolApiLiveTest.java         |   93 +-
 .../features/ZoneApiExpectTest.java             |    4 +-
 .../features/ZoneApiLiveTest.java               |    7 +-
 .../features/ZoneOperationApiExpectTest.java    |   52 +-
 .../features/ZoneOperationApiLiveTest.java      |    8 +-
 .../functions/CreateNetworkIfNeededTest.java    |  132 --
 .../BaseGoogleComputeEngineApiLiveTest.java     |   22 +-
 .../BaseGoogleComputeEngineExpectTest.java      |   29 +-
 .../BaseGoogleComputeEngineParseTest.java       |    8 +
 ...leComputeEngineServiceContextExpectTest.java |   12 +-
 .../parse/ParseAddressListTest.java             |   42 +-
 .../parse/ParseAddressTest.java                 |   29 +-
 .../parse/ParseDiskListTest.java                |   31 +-
 .../parse/ParseDiskTest.java                    |   29 +-
 .../parse/ParseDiskTypeListTest.java            |   51 +-
 .../parse/ParseDiskTypeTest.java                |   30 +-
 .../parse/ParseFirewallListTest.java            |   48 +-
 .../parse/ParseFirewallTest.java                |   45 +-
 .../parse/ParseForwardingRuleListTest.java      |   38 +-
 .../parse/ParseForwardingRuleTest.java          |   40 +-
 .../parse/ParseGlobalOperationListTest.java     |   46 +
 .../parse/ParseGlobalOperationTest.java         |   62 +
 .../parse/ParseHttpHealthCheckListTest.java     |   83 +-
 .../parse/ParseHttpHealthCheckTest.java         |   34 +-
 .../parse/ParseImageListTest.java               |   38 +-
 .../parse/ParseImageTest.java                   |   39 +-
 .../parse/ParseInstanceListTest.java            |   20 +-
 .../parse/ParseInstanceSerialOutputTest.java    |   17 +-
 .../parse/ParseInstanceTest.java                |   84 +-
 .../parse/ParseMachineTypeListTest.java         |  101 +-
 .../parse/ParseMachineTypeTest.java             |   42 +-
 .../parse/ParseMetadataTest.java                |   15 +-
 .../parse/ParseNetworkListTest.java             |   20 +-
 .../parse/ParseNetworkTest.java                 |   26 +-
 .../parse/ParseOperationListTest.java           |   42 -
 .../parse/ParseOperationTest.java               |   50 +-
 .../parse/ParseProjectTest.java                 |   52 +-
 .../parse/ParseQuotaTest.java                   |   10 +-
 .../parse/ParseRegionListTest.java              |   61 +-
 .../parse/ParseRegionOperationTest.java         |   54 +-
 .../parse/ParseRegionTest.java                  |   51 +-
 .../parse/ParseRouteListTest.java               |   43 +-
 .../parse/ParseRouteTest.java                   |   39 +-
 .../parse/ParseSnapshotListTest.java            |   47 +-
 .../parse/ParseSnapshotTest.java                |   30 +-
 .../parse/ParseTargetPoolListTest.java          |   33 +-
 .../parse/ParseTargetPoolTest.java              |   36 +-
 .../parse/ParseZoneListTest.java                |   55 +-
 .../parse/ParseZoneOperationTest.java           |   62 +
 .../parse/ParseZoneTest.java                    |   40 +-
 .../NetworkFirewallPredicatesTest.java          |  117 +-
 .../src/test/resources/disk_list.json           |    3 +-
 .../src/test/resources/image_get.json           |    4 +
 .../src/test/resources/instance_get.json        |    3 +-
 .../src/test/resources/instance_insert.json     |    2 +-
 .../test/resources/instance_insert_simple.json  |    2 +-
 .../src/test/resources/instance_list.json       |    3 +-
 222 files changed, 4326 insertions(+), 9540 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/pom.xml
----------------------------------------------------------------------
diff --git a/google-compute-engine/pom.xml b/google-compute-engine/pom.xml
index a41f5e7..31c7de3 100644
--- a/google-compute-engine/pom.xml
+++ b/google-compute-engine/pom.xml
@@ -67,6 +67,11 @@
             <version>${jclouds.version}</version>
         </dependency>
         <dependency>
+            <groupId>com.google.auto.value</groupId>
+            <artifactId>auto-value</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.jclouds</groupId>
             <artifactId>jclouds-compute</artifactId>
             <version>${jclouds.version}</version>

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java
index 5ba978b..56b7c04 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java
@@ -16,7 +16,11 @@
  */
 package org.jclouds.googlecomputeengine;
 
-import com.google.common.annotations.Beta;
+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.DiskTypeApi;
@@ -38,9 +42,7 @@ import org.jclouds.googlecomputeengine.features.ZoneApi;
 import org.jclouds.googlecomputeengine.features.ZoneOperationApi;
 import org.jclouds.rest.annotations.Delegate;
 
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import java.io.Closeable;
+import com.google.common.annotations.Beta;
 
 
 /**

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java
index b63a69f..0b7bed7 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java
@@ -28,6 +28,7 @@ import static org.jclouds.reflect.Reflection2.typeToken;
 import java.net.URI;
 import java.util.Properties;
 
+import org.jclouds.apis.ApiMetadata;
 import org.jclouds.compute.ComputeServiceContext;
 import 
org.jclouds.googlecomputeengine.compute.config.GoogleComputeEngineServiceContextModule;
 import org.jclouds.googlecomputeengine.config.GoogleComputeEngineHttpApiModule;
@@ -36,9 +37,11 @@ import org.jclouds.oauth.v2.config.OAuthAuthenticationModule;
 import org.jclouds.oauth.v2.config.OAuthModule;
 import org.jclouds.rest.internal.BaseHttpApiMetadata;
 
+import com.google.auto.service.AutoService;
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Module;
 
+@AutoService(ApiMetadata.class)
 public class GoogleComputeEngineApiMetadata extends 
BaseHttpApiMetadata<GoogleComputeEngineApi> {
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineFallbacks.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineFallbacks.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineFallbacks.java
new file mode 100644
index 0000000..8024bd6
--- /dev/null
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineFallbacks.java
@@ -0,0 +1,30 @@
+/*
+ * 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.Fallbacks.valOnNotFoundOr404;
+
+import org.jclouds.Fallback;
+import org.jclouds.googlecomputeengine.domain.ListPage;
+
+public final class GoogleComputeEngineFallbacks {
+   public static final class EmptyListPageOnNotFoundOr404 implements 
Fallback<Object> {
+      public ListPage<Object> createOrPropagate(Throwable t) throws Exception {
+         return valOnNotFoundOr404(ListPage.create(null, null, null), t);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/ForwardingRuleCreationBinder.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/ForwardingRuleCreationBinder.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/ForwardingRuleCreationBinder.java
index f8d2daa..0b1f006 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/ForwardingRuleCreationBinder.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/ForwardingRuleCreationBinder.java
@@ -21,7 +21,7 @@ import java.util.Map;
 
 import javax.inject.Inject;
 
-import org.jclouds.googlecomputeengine.domain.ForwardingRule.IPProtocolOption;
+import org.jclouds.googlecomputeengine.domain.ForwardingRule;
 import org.jclouds.googlecomputeengine.options.ForwardingRuleCreationOptions;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.json.Json;
@@ -55,7 +55,7 @@ public class ForwardingRuleCreationBinder extends 
BindToJsonPayload {
       @SuppressWarnings("unused")
       private String IPAddress;
       @SuppressWarnings("unused")
-      private IPProtocolOption IPProtocol;
+      private ForwardingRule.IPProtocol IPProtocol;
       @SuppressWarnings("unused")
       private String portRange;
       @SuppressWarnings("unused")

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/HttpHealthCheckCreationBinder.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/HttpHealthCheckCreationBinder.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/HttpHealthCheckCreationBinder.java
index 3da57cd..7b23a33 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/HttpHealthCheckCreationBinder.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/HttpHealthCheckCreationBinder.java
@@ -65,15 +65,14 @@ public class HttpHealthCheckCreationBinder extends 
BindToJsonPayload {
       
       private HttpHealthCheckBinderHelper(String name, 
HttpHealthCheckCreationOptions httpHealthCheckCreationOptions){
          this.name = name;
-         this.host = httpHealthCheckCreationOptions.getHost();
-         this.requestPath = httpHealthCheckCreationOptions.getHost();
-         this.port = httpHealthCheckCreationOptions.getPort();
-         this.checkIntervalSec = 
httpHealthCheckCreationOptions.getCheckIntervalSec();
-         this.timeoutSec = httpHealthCheckCreationOptions.getTimeoutSec();
-         this.unhealthyThreshold = 
httpHealthCheckCreationOptions.getUnhealthyThreshold();
-         this.healthyThreshold = 
httpHealthCheckCreationOptions.getHealthyThreshold();
-         this.description = httpHealthCheckCreationOptions.getDescription();
+         this.host = httpHealthCheckCreationOptions.host();
+         this.requestPath = httpHealthCheckCreationOptions.requestPath();
+         this.port = httpHealthCheckCreationOptions.port();
+         this.checkIntervalSec = 
httpHealthCheckCreationOptions.checkIntervalSec();
+         this.timeoutSec = httpHealthCheckCreationOptions.timeoutSec();
+         this.unhealthyThreshold = 
httpHealthCheckCreationOptions.unhealthyThreshold();
+         this.healthyThreshold = 
httpHealthCheckCreationOptions.healthyThreshold();
+         this.description = httpHealthCheckCreationOptions.description();
       }
    }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/InstanceBinder.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/InstanceBinder.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/InstanceBinder.java
index 91c9021..aae9d38 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/InstanceBinder.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/InstanceBinder.java
@@ -22,14 +22,14 @@ import java.util.Map;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.jclouds.googlecomputeengine.domain.InstanceTemplate;
+import org.jclouds.googlecomputeengine.domain.templates.InstanceTemplate;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.rest.MapBinder;
 import org.jclouds.rest.binders.BindToJsonPayload;
 
 import com.google.common.base.Function;
 
-public class InstanceBinder implements MapBinder {
+public final class InstanceBinder implements MapBinder {
 
    private final BindToJsonPayload jsonBinder;
    private final Function<String, URI> machineTypesToURI;
@@ -44,10 +44,10 @@ public class InstanceBinder implements MapBinder {
       InstanceTemplate template = (InstanceTemplate) 
postParams.get("template");
       template.name(postParams.get("name").toString());
 
-      if (template.getMachineTypeName() != null) {
-         
template.machineType(machineTypesToURI.apply(template.getMachineTypeName()));
+      if (template.machineTypeName() != null) {
+         
template.machineType(machineTypesToURI.apply(template.machineTypeName()));
+         template.machineTypeName(null);
       }
-      template.machineType((String) null);
       return bindToRequest(request, template);
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/MetadataBinder.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/MetadataBinder.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/MetadataBinder.java
index 33886a6..7a3ca5a 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/MetadataBinder.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/MetadataBinder.java
@@ -25,19 +25,17 @@ import org.jclouds.http.HttpRequest;
 import org.jclouds.rest.MapBinder;
 import org.jclouds.rest.binders.BindToJsonPayload;
 
-public class MetadataBinder implements MapBinder {
+public final class MetadataBinder implements MapBinder {
 
    private final BindToJsonPayload jsonBinder;
 
-   @Inject MetadataBinder(BindToJsonPayload jsonBinder){
+   @Inject MetadataBinder(BindToJsonPayload jsonBinder) {
       this.jsonBinder = jsonBinder;
    }
 
    @Override public <R extends HttpRequest> R bindToRequest(R request, 
Map<String, Object> postParams) {
-      Metadata metadata = Metadata.builder()
-              .fingerprint(postParams.get("fingerprint").toString())
-              .items((Map<String, String>) postParams.get("items"))
-              .build();
+      Metadata metadata = Metadata
+            .create(postParams.get("fingerprint").toString(), (Map<String, 
String>) postParams.get("items"));
       return bindToRequest(request, metadata);
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeHealthChecksBinder.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeHealthChecksBinder.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeHealthChecksBinder.java
index 0eee860..7834803 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeHealthChecksBinder.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeHealthChecksBinder.java
@@ -23,11 +23,11 @@ import org.jclouds.json.Json;
 /**
  * Binder used for adding and deleting healthChecks from a target pool.
  */
-public class TargetPoolChangeHealthChecksBinder extends 
TargetPoolMapofSetofMapGenericBinder {
+public final class TargetPoolChangeHealthChecksBinder extends 
TargetPoolMapofListofMapGenericBinder {
 
    @Inject TargetPoolChangeHealthChecksBinder(Json jsonBinder) {
       super(jsonBinder);
-      super.SetOuterString("healthChecks");
-      super.SetInnerString("healthCheck");
+      super.outerString("healthChecks");
+      super.innerString("healthCheck");
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeInstancesBinder.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeInstancesBinder.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeInstancesBinder.java
index 5551172..603654a 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeInstancesBinder.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeInstancesBinder.java
@@ -23,11 +23,11 @@ import org.jclouds.json.Json;
 /**
  * Binder used for adding and deleting instances from a target pool.
  */
-public class TargetPoolChangeInstancesBinder extends 
TargetPoolMapofSetofMapGenericBinder {
+public final class TargetPoolChangeInstancesBinder extends 
TargetPoolMapofListofMapGenericBinder {
 
    @Inject TargetPoolChangeInstancesBinder(Json jsonBinder) {
       super(jsonBinder);
-      super.SetOuterString("instances");
-      super.SetInnerString("instance");
+      super.outerString("instances");
+      super.innerString("instance");
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolCreationBinder.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolCreationBinder.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolCreationBinder.java
index 67c4832..1d52859 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolCreationBinder.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolCreationBinder.java
@@ -17,8 +17,8 @@
 package org.jclouds.googlecomputeengine.binders;
 
 import java.net.URI;
+import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.inject.Inject;
 
@@ -50,9 +50,9 @@ public class TargetPoolCreationBinder extends 
BindToJsonPayload {
       @SuppressWarnings("unused")
       private String name;
       @SuppressWarnings("unused")
-      private Set<URI> healthChecks;
+      private List<URI> healthChecks;
       @SuppressWarnings("unused")
-      private Set<URI> instances;
+      private List<URI> instances;
       @SuppressWarnings("unused")
       private SessionAffinityValue sessionAffinity;
       @SuppressWarnings("unused")

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofListofMapGenericBinder.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofListofMapGenericBinder.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofListofMapGenericBinder.java
new file mode 100644
index 0000000..007b06f
--- /dev/null
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofListofMapGenericBinder.java
@@ -0,0 +1,65 @@
+/*
+ * 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.binders;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.json.Json;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+class TargetPoolMapofListofMapGenericBinder extends BindToJsonPayload {
+
+   @Inject TargetPoolMapofListofMapGenericBinder(Json jsonBinder) {
+      super(jsonBinder);
+   }
+
+   private String outterString;
+   private String innerString;
+
+   public void outerString(String outterString) {
+      this.outterString = outterString;
+   }
+
+   public void innerString(String innerString) {
+      this.innerString = innerString;
+   }
+
+   /**
+    * For the addInstance request the request body is in an atypical form.
+    *
+    * @see <a 
href="https://cloud.google.com/compute/docs/reference/latest/targetPools/addInstance"/>
+    */
+   @Override public <R extends HttpRequest> R bindToRequest(R request, 
Map<String, Object> postParams) {
+      List<URI> instances = (List<URI>) postParams.get(outterString);
+      Map<String, List<Map<String, URI>>> finalInstances = 
Maps.newLinkedHashMap();
+      List<Map<String, URI>> innerInstances = Lists.newArrayList();
+      for (URI instance : instances) {
+         innerInstances.add(ImmutableMap.of(innerString, instance));
+      }
+      finalInstances.put(outterString, innerInstances);
+      return super.bindToRequest(request, finalInstances);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofSetofMapGenericBinder.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofSetofMapGenericBinder.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofSetofMapGenericBinder.java
deleted file mode 100644
index a87891e..0000000
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofSetofMapGenericBinder.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.binders;
-
-import java.net.URI;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import javax.inject.Inject;
-
-import org.jclouds.http.HttpRequest;
-import org.jclouds.json.Json;
-import org.jclouds.rest.binders.BindToJsonPayload;
-
-import com.google.common.collect.ImmutableMap;
-
-
-public class TargetPoolMapofSetofMapGenericBinder extends BindToJsonPayload {
-
-   @Inject TargetPoolMapofSetofMapGenericBinder(Json jsonBinder) {
-      super(jsonBinder);
-   }
-   private String outterString;
-   private String innerString;
-   
-   public void SetOuterString(String outterString){
-      this.outterString = outterString;
-   }
-   
-   public void SetInnerString(String innerString){
-      this.innerString = innerString;
-   }   
-   
-   /**
-    * For the addInstance request the request body is in an atypical form. 
-    * @see <a 
href="https://cloud.google.com/compute/docs/reference/latest/targetPools/addInstance"/>
-    */
-   @Override public <R extends HttpRequest> R bindToRequest(R request, 
Map<String, Object> postParams) {
-      Set<URI> instances = (Set<URI>) postParams.get(outterString);
-      Map<String, Set<Map<String, URI>>> finalInstances = new HashMap<String, 
Set<Map<String, URI>>>();
-      Set<Map<String, URI>> innerInstances = new HashSet<Map<String, URI>>();
-      for (URI instance : instances){
-         innerInstances.add(ImmutableMap.of(innerString, instance));
-      }
-      finalInstances.put(outterString, innerInstances);
-      return super.bindToRequest(request, finalInstances);
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java
index da9bbb1..d6418ea 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java
@@ -66,7 +66,6 @@ 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;
@@ -157,35 +156,35 @@ public class GoogleComputeEngineService extends 
BaseComputeService {
       Predicate<Firewall> firewallBelongsToNetwork = new Predicate<Firewall>() 
{
          @Override
          public boolean apply(Firewall input) {
-            return input != null && 
input.getNetwork().equals(network.getSelfLink());
+            return input != null && input.network().equals(network.selfLink());
          }
       };
 
       Set<AtomicReference<Operation>> operations = Sets.newLinkedHashSet();
       for (Firewall firewall : 
firewallApi.list().concat().filter(firewallBelongsToNetwork)) {
-         operations.add(new 
AtomicReference<Operation>(firewallApi.delete(firewall.getName())));
+         operations.add(new 
AtomicReference<Operation>(firewallApi.delete(firewall.name())));
       }
 
       for (AtomicReference<Operation> operation : operations) {
          retry(operationDonePredicate, operationCompleteCheckTimeout, 
operationCompleteCheckInterval,
                  MILLISECONDS).apply(operation);
 
-         if (operation.get().getHttpError().isPresent()) {
-            HttpResponse response = operation.get().getHttpError().get();
+         if (operation.get().httpErrorStatusCode() != null) {
             logger.warn("delete orphaned firewall %s failed. Http Error Code: 
%d HttpError: %s",
-                    operation.get().getTargetId(), response.getStatusCode(), 
response.getMessage());
+                  operation.get().targetId(), 
operation.get().httpErrorStatusCode(),
+                  operation.get().httpErrorMessage());
          }
       }
 
-      AtomicReference<Operation> operation = 
Atomics.newReference(api.getNetworkApi(project.get()).delete(resourceName));
+      AtomicReference<Operation> operation = Atomics
+            
.newReference(api.getNetworkApi(project.get()).delete(resourceName));
 
-      retry(operationDonePredicate, operationCompleteCheckTimeout, 
operationCompleteCheckInterval,
-              MILLISECONDS).apply(operation);
+      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());
+      if (operation.get().httpErrorStatusCode() != null) {
+         logger.warn("delete orphaned network failed. Http Error Code: " + 
operation.get().httpErrorStatusCode() +
+               " HttpError: " + operation.get().httpErrorMessage());
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
index 58aa2f4..f306d2d 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
@@ -40,7 +40,6 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
-import javax.annotation.Resource;
 import javax.inject.Named;
 
 import org.jclouds.collect.Memoized;
@@ -48,10 +47,12 @@ import org.jclouds.compute.ComputeServiceAdapter;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.options.TemplateOptions;
-import org.jclouds.compute.reference.ComputeServiceConstants;
 import org.jclouds.domain.Location;
 import org.jclouds.domain.LoginCredentials;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.compute.domain.InstanceInZone;
+import org.jclouds.googlecomputeengine.compute.domain.MachineTypeInZone;
+import org.jclouds.googlecomputeengine.compute.domain.SlashEncodedIds;
 import 
org.jclouds.googlecomputeengine.compute.functions.FirewallTagNamingConvention;
 import 
org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions;
 import org.jclouds.googlecomputeengine.config.UserProject;
@@ -59,24 +60,17 @@ import org.jclouds.googlecomputeengine.domain.Disk;
 import org.jclouds.googlecomputeengine.domain.Image;
 import org.jclouds.googlecomputeengine.domain.Instance;
 import org.jclouds.googlecomputeengine.domain.Instance.AttachedDisk;
-import org.jclouds.googlecomputeengine.domain.Instance.PersistentAttachedDisk;
-import org.jclouds.googlecomputeengine.domain.InstanceInZone;
-import org.jclouds.googlecomputeengine.domain.InstanceTemplate;
-import org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk;
-import 
org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk.Mode;
+import org.jclouds.googlecomputeengine.domain.Instance.AttachedDisk.Mode;
 import org.jclouds.googlecomputeengine.domain.MachineType;
-import org.jclouds.googlecomputeengine.domain.MachineTypeInZone;
 import org.jclouds.googlecomputeengine.domain.Operation;
-import org.jclouds.googlecomputeengine.domain.SlashEncodedIds;
 import org.jclouds.googlecomputeengine.domain.Zone;
+import org.jclouds.googlecomputeengine.domain.templates.InstanceTemplate;
+import 
org.jclouds.googlecomputeengine.domain.templates.InstanceTemplate.PersistentDisk;
 import org.jclouds.googlecomputeengine.features.InstanceApi;
 import org.jclouds.googlecomputeengine.options.DiskCreationOptions;
-import org.jclouds.http.HttpResponse;
-import org.jclouds.logging.Logger;
 
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
-import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.common.base.Supplier;
 import com.google.common.collect.FluentIterable;
@@ -88,11 +82,7 @@ import com.google.common.util.concurrent.Atomics;
 import com.google.common.util.concurrent.UncheckedTimeoutException;
 import com.google.inject.Inject;
 
-public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<InstanceInZone, MachineTypeInZone, Image, Zone> {
-
-   @Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
+public final class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<InstanceInZone, MachineTypeInZone, Image, Zone> {
 
    private final GoogleComputeEngineApi api;
    private final Supplier<String> userProject;
@@ -103,8 +93,7 @@ public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<
    private final long operationCompleteCheckTimeout;
    private final FirewallTagNamingConvention.Factory 
firewallTagNamingConvention;
 
-   @Inject
-   public GoogleComputeEngineServiceAdapter(GoogleComputeEngineApi api,
+   @Inject GoogleComputeEngineServiceAdapter(GoogleComputeEngineApi api,
                                             @UserProject Supplier<String> 
userProject,
                                             Function<TemplateOptions,
                                                     
ImmutableMap.Builder<String, String>> metatadaFromTemplateOptions,
@@ -113,18 +102,15 @@ public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<
                                             @Named(OPERATION_COMPLETE_TIMEOUT) 
Long operationCompleteCheckTimeout,
                                             @Memoized Supplier<Map<URI, ? 
extends Location>> zones,
                                             
FirewallTagNamingConvention.Factory firewallTagNamingConvention) {
-      this.api = checkNotNull(api, "google compute api");
-      this.userProject = checkNotNull(userProject, "user project name");
-      this.metatadaFromTemplateOptions = 
checkNotNull(metatadaFromTemplateOptions,
-              "metadata from template options function");
-      this.operationCompleteCheckInterval = 
checkNotNull(operationCompleteCheckInterval,
-              "operation completed check interval");
-      this.operationCompleteCheckTimeout = 
checkNotNull(operationCompleteCheckTimeout,
-                                                        "operation completed 
check timeout");
+      this.api = api;
+      this.userProject = userProject;
+      this.metatadaFromTemplateOptions = metatadaFromTemplateOptions;
+      this.operationCompleteCheckInterval = operationCompleteCheckInterval;
+      this.operationCompleteCheckTimeout = operationCompleteCheckTimeout;
       this.retryOperationDonePredicate = retry(operationDonePredicate, 
operationCompleteCheckTimeout,
                                                operationCompleteCheckInterval, 
TimeUnit.MILLISECONDS);
-      this.zones = checkNotNull(zones, "zones");
-      this.firewallTagNamingConvention = 
checkNotNull(firewallTagNamingConvention, "firewallTagNamingConvention");
+      this.zones = zones;
+      this.firewallTagNamingConvention = firewallTagNamingConvention;
    }
 
    @Override
@@ -147,7 +133,7 @@ public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<
          Disk bootDisk = createBootDisk(template, name);
 
          disks.add(new PersistentDisk(Mode.READ_WRITE,
-                                      bootDisk.getSelfLink(),
+                                      bootDisk.selfLink(),
                                       null,
                                       true,
                                       true));
@@ -155,8 +141,7 @@ public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<
 
       disks.addAll(options.getDisks());
 
-      InstanceTemplate instanceTemplate = InstanceTemplate.builder()
-              .forMachineType(hardware.getUri());
+      InstanceTemplate instanceTemplate = new 
InstanceTemplate().machineType(hardware.getUri());
 
       if (options.isEnableNat()) {
          instanceTemplate.addNetworkInterface(options.getNetwork().get(), 
Type.ONE_TO_ONE_NAT);
@@ -199,8 +184,8 @@ public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<
       }, operationCompleteCheckTimeout, operationCompleteCheckInterval, 
MILLISECONDS).apply(instance);
 
       if (!options.getTags().isEmpty()) {
-         Operation tagsOperation = instanceApi.setTagsInZone(zone,
-                 name, options.getTags(), 
instance.get().getTags().getFingerprint());
+         Operation tagsOperation = instanceApi
+               .setTagsInZone(zone, name, options.getTags(), 
instance.get().tags().fingerprint());
 
          waitOperationDone(tagsOperation);
 
@@ -225,7 +210,7 @@ public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<
                        }
                     })
               .toSet();
-      instanceApi.setTagsInZone(zone, instance.get().getName(), tags, 
instance.get().getTags().getFingerprint());
+      instanceApi.setTagsInZone(zone, instance.get().name(), tags, 
instance.get().tags().fingerprint());
 
       InstanceInZone instanceInZone = new InstanceInZone(instance.get(), zone);
 
@@ -265,14 +250,14 @@ public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<
                  .filter(new Predicate<MachineType>() {
                     @Override
                     public boolean apply(MachineType input) {
-                       return !input.getDeprecated().isPresent();
+                       return input.deprecated() == null;
                     }
                  })
                  .transform(new Function<MachineType, MachineTypeInZone>() {
 
                     @Override
                     public MachineTypeInZone apply(MachineType arg0) {
-                       return new MachineTypeInZone(arg0, arg0.getZone());
+                       return new MachineTypeInZone(arg0, arg0.zone());
                     }
                  }));
       }
@@ -336,7 +321,7 @@ public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<
 
          @Override
          public boolean apply(InstanceInZone instanceInZone) {
-            return contains(ids, instanceInZone.getInstance().getName());
+            return contains(ids, instanceInZone.getInstance().name());
          }
       });
    }
@@ -345,32 +330,23 @@ public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<
    public void destroyNode(final String name) {
       SlashEncodedIds slashEncodedIds = SlashEncodedIds.fromSlashEncoded(name);
       String diskName = null;
-      try {
-         Instance instance = 
api.getInstanceApi(userProject.get()).getInZone(slashEncodedIds.getFirstId(),
-                                                                              
slashEncodedIds.getSecondId());
-         if 
(instance.getMetadata().getItems().get(GCE_DELETE_BOOT_DISK_METADATA_KEY).equals("true"))
 {
-            Optional<AttachedDisk> disk = tryFind(instance.getDisks(), new 
Predicate<AttachedDisk>() {
-               @Override
-               public boolean apply(AttachedDisk input) {
-                  return PersistentAttachedDisk.class.isInstance(input) &&
-                         PersistentAttachedDisk.class.cast(input).isBoot();
-               }
-            });
-            if (disk.isPresent()) {
-               diskName = 
PersistentAttachedDisk.class.cast(disk.get()).getSourceDiskName();
+      Instance instance = 
api.getInstanceApi(userProject.get()).getInZone(slashEncodedIds.getFirstId(),
+                                                                           
slashEncodedIds.getSecondId());
+      if (instance != null &&
+            
"true".equals(instance.metadata().items().get(GCE_DELETE_BOOT_DISK_METADATA_KEY)))
 {
+         for (AttachedDisk input : instance.disks()) {
+            if (input.type() == AttachedDisk.Type.PERSISTENT && input.boot()){
+               String source = input.source().toASCIIString();
+               diskName = source.substring(source.lastIndexOf('/') + 1);
             }
          }
-      } catch (Exception e) {
-         // TODO: what exception actually gets thrown here if the instance 
doesn't really exist?
       }
       
waitOperationDone(api.getInstanceApi(userProject.get()).deleteInZone(slashEncodedIds.getFirstId(),
               slashEncodedIds.getSecondId()));
 
       if (diskName != null) {
-         
waitOperationDone(api.getDiskApi(userProject.get()).deleteInZone(slashEncodedIds.getFirstId(),
-                                                                               
     diskName));
+         
waitOperationDone(api.getDiskApi(userProject.get()).deleteInZone(slashEncodedIds.getFirstId(),
 diskName));
       }
-
    }
 
    @Override
@@ -433,11 +409,10 @@ public class GoogleComputeEngineServiceAdapter implements 
ComputeServiceAdapter<
       }
 
       // check if the operation failed
-      if (operationRef.get().getHttpError().isPresent()) {
-         HttpResponse response = operationRef.get().getHttpError().get();
-         throw new IllegalStateException("operation failed. Http Error Code: " 
+ response.getStatusCode() +
-                 " HttpError: " + response.getMessage());
+      if (operationRef.get().httpErrorStatusCode() != null) {
+         throw new IllegalStateException(
+               "operation failed. Http Error Code: " + 
operationRef.get().httpErrorStatusCode() +
+                     " HttpError: " + operationRef.get().httpErrorMessage());
       }
    }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
index c542b9a..99f27e1 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
@@ -29,7 +29,6 @@ import java.util.concurrent.atomic.AtomicReference;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import com.google.inject.Scopes;
 import org.jclouds.collect.Memoized;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.ComputeServiceAdapter;
@@ -45,8 +44,13 @@ import org.jclouds.domain.Location;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
 import org.jclouds.googlecomputeengine.compute.GoogleComputeEngineService;
 import 
org.jclouds.googlecomputeengine.compute.GoogleComputeEngineServiceAdapter;
+import org.jclouds.googlecomputeengine.compute.domain.InstanceInZone;
+import org.jclouds.googlecomputeengine.compute.domain.MachineTypeInZone;
+import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange;
 import 
org.jclouds.googlecomputeengine.compute.extensions.GoogleComputeEngineSecurityGroupExtension;
 import org.jclouds.googlecomputeengine.compute.functions.BuildInstanceMetadata;
+import org.jclouds.googlecomputeengine.compute.functions.CreateNetworkIfNeeded;
+import org.jclouds.googlecomputeengine.compute.functions.FindNetworkOrCreate;
 import 
org.jclouds.googlecomputeengine.compute.functions.FirewallTagNamingConvention;
 import 
org.jclouds.googlecomputeengine.compute.functions.FirewallToIpPermission;
 import 
org.jclouds.googlecomputeengine.compute.functions.GoogleComputeEngineImageToImage;
@@ -56,7 +60,6 @@ import 
org.jclouds.googlecomputeengine.compute.functions.NetworkToSecurityGroup;
 import 
org.jclouds.googlecomputeengine.compute.functions.OrphanedGroupsFromDeadNodes;
 import org.jclouds.googlecomputeengine.compute.functions.RegionToLocation;
 import org.jclouds.googlecomputeengine.compute.functions.ZoneToLocation;
-import org.jclouds.googlecomputeengine.compute.loaders.FindNetworkOrCreate;
 import 
org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions;
 import 
org.jclouds.googlecomputeengine.compute.predicates.AllNodesInGroupTerminated;
 import 
org.jclouds.googlecomputeengine.compute.strategy.CreateNodesWithGroupEncodedIntoNameThenAddToSet;
@@ -66,13 +69,9 @@ import org.jclouds.googlecomputeengine.config.UserProject;
 import org.jclouds.googlecomputeengine.domain.Firewall;
 import org.jclouds.googlecomputeengine.domain.Image;
 import org.jclouds.googlecomputeengine.domain.Instance;
-import org.jclouds.googlecomputeengine.domain.InstanceInZone;
-import org.jclouds.googlecomputeengine.domain.MachineTypeInZone;
 import org.jclouds.googlecomputeengine.domain.Network;
 import org.jclouds.googlecomputeengine.domain.Region;
 import org.jclouds.googlecomputeengine.domain.Zone;
-import org.jclouds.googlecomputeengine.domain.internal.NetworkAndAddressRange;
-import org.jclouds.googlecomputeengine.functions.CreateNetworkIfNeeded;
 import org.jclouds.net.domain.IpPermission;
 import org.jclouds.rest.AuthorizationException;
 import 
org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier;
@@ -88,6 +87,7 @@ import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableMap;
 import com.google.inject.Injector;
 import com.google.inject.Provides;
+import com.google.inject.Scopes;
 import com.google.inject.TypeLiteral;
 
 public class GoogleComputeEngineServiceContextModule
@@ -240,7 +240,7 @@ public class GoogleComputeEngineServiceContextModule
                             new Function<Region, URI>() {
                                @Override
                                public URI apply(Region input) {
-                                  return input.getSelfLink();
+                                  return input.selfLink();
                                }
                             });
                  }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/InstanceInZone.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/InstanceInZone.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/InstanceInZone.java
new file mode 100644
index 0000000..b9cdb8f
--- /dev/null
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/InstanceInZone.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.jclouds.googlecomputeengine.compute.domain;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.googlecomputeengine.domain.Instance;
+
+public class InstanceInZone extends SlashEncodedIds {
+   protected final Instance instance;
+
+   public InstanceInZone(Instance instance, String zoneId) {
+      super(zoneId, checkNotNull(instance, "instance").name());
+      this.instance = instance;
+   }
+
+   public Instance getInstance() {
+      return instance;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj) return true;
+      if (obj == null || getClass() != obj.getClass()) return false;
+      InstanceInZone that = InstanceInZone.class.cast(obj);
+      return equal(this.instance, that.instance)
+              && equal(this.firstId, that.firstId)
+              && equal(this.secondId, that.secondId);
+   }
+
+   @Override
+   public String toString() {
+      return "[instance=" + instance + ", zoneId=" + firstId + "]";
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/MachineTypeInZone.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/MachineTypeInZone.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/MachineTypeInZone.java
new file mode 100644
index 0000000..25d491a
--- /dev/null
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/MachineTypeInZone.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.jclouds.googlecomputeengine.compute.domain;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.googlecomputeengine.domain.MachineType;
+
+public class MachineTypeInZone extends SlashEncodedIds {
+   protected final MachineType machineType;
+
+   public MachineTypeInZone(MachineType machineType, String zoneId) {
+      super(zoneId, checkNotNull(machineType, "machineType").name());
+      this.machineType = machineType;
+   }
+
+   public MachineType machineType() {
+      return machineType;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj) return true;
+      if (obj == null || getClass() != obj.getClass()) return false;
+      MachineTypeInZone that = MachineTypeInZone.class.cast(obj);
+      return equal(this.machineType, that.machineType)
+              && equal(this.firstId, that.firstId)
+              && equal(this.secondId, that.secondId);
+   }
+
+   @Override
+   public String toString() {
+      return "[machineType=" + machineType + ", zoneId=" + firstId + "]";
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/NetworkAndAddressRange.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/NetworkAndAddressRange.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/NetworkAndAddressRange.java
new file mode 100644
index 0000000..d70cc98
--- /dev/null
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/NetworkAndAddressRange.java
@@ -0,0 +1,41 @@
+/*
+ * 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.domain;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+/** Container for network, IPv4 range and optional gateway, for creation 
caching */
+@AutoValue
+public abstract class NetworkAndAddressRange {
+
+   public abstract String name();
+
+   public abstract String rangeIPv4();
+
+   @Nullable public abstract String gateway();
+
+   @SerializedNames({ "name", "ipV4Range", "gateway" })
+   public static NetworkAndAddressRange create(String name, String rangeIPv4, 
@Nullable String gateway) {
+      return new AutoValue_NetworkAndAddressRange(name, rangeIPv4, gateway);
+   }
+
+   NetworkAndAddressRange() {
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/SlashEncodedIds.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/SlashEncodedIds.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/SlashEncodedIds.java
new file mode 100644
index 0000000..ceb5fa4
--- /dev/null
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/SlashEncodedIds.java
@@ -0,0 +1,83 @@
+/*
+ * 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.domain;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+
+public class SlashEncodedIds {
+   public static SlashEncodedIds fromSlashEncoded(String id) {
+      Iterable<String> parts = Splitter.on('/').split(checkNotNull(id, "id"));
+      checkArgument(Iterables.size(parts) == 2, "id must be in format 
firstId/secondId");
+      return new SlashEncodedIds(Iterables.get(parts, 0), Iterables.get(parts, 
1));
+   }
+
+   public static SlashEncodedIds fromTwoIds(String firstId, String secondId) {
+      return new SlashEncodedIds(firstId, secondId);
+   }
+
+   private static String slashEncodeTwoIds(String firstId, String secondId) {
+      return checkNotNull(firstId, "firstId") + "/" + checkNotNull(secondId, 
"secondId");
+   }
+
+   public String slashEncode() {
+      return slashEncodeTwoIds(firstId, secondId);
+   }
+
+   protected final String firstId;
+   protected final String secondId;
+
+   protected SlashEncodedIds(String firstId, String secondId) {
+      this.firstId = checkNotNull(firstId, "firstId");
+      this.secondId = checkNotNull(secondId, "secondId");
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(firstId, secondId);
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      SlashEncodedIds other = (SlashEncodedIds) obj;
+      return Objects.equal(firstId, other.firstId) && Objects.equal(secondId, 
other.secondId);
+   }
+
+   public String getFirstId() {
+      return firstId;
+   }
+
+   public String getSecondId() {
+      return secondId;
+   }
+
+   @Override
+   public String toString() {
+      return "[firstId=" + firstId + ", secondId=" + secondId + "]";
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtension.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtension.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtension.java
index 2adb7c7..3d46764 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtension.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtension.java
@@ -26,6 +26,8 @@ import static 
org.jclouds.googlecomputeengine.predicates.NetworkFirewallPredicat
 import static 
org.jclouds.googlecomputeengine.predicates.NetworkFirewallPredicates.providesIpPermission;
 import static org.jclouds.util.Predicates2.retry;
 
+import java.util.Collection;
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -37,14 +39,14 @@ import 
org.jclouds.compute.extensions.SecurityGroupExtension;
 import org.jclouds.compute.functions.GroupNamingConvention;
 import org.jclouds.domain.Location;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange;
+import org.jclouds.googlecomputeengine.compute.domain.SlashEncodedIds;
 import org.jclouds.googlecomputeengine.config.UserProject;
 import org.jclouds.googlecomputeengine.domain.Firewall;
 import org.jclouds.googlecomputeengine.domain.Instance;
 import org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface;
 import org.jclouds.googlecomputeengine.domain.Network;
 import org.jclouds.googlecomputeengine.domain.Operation;
-import org.jclouds.googlecomputeengine.domain.SlashEncodedIds;
-import org.jclouds.googlecomputeengine.domain.internal.NetworkAndAddressRange;
 import org.jclouds.googlecomputeengine.options.FirewallOptions;
 import org.jclouds.googlecomputeengine.options.ListOptions;
 import org.jclouds.googlecomputeengine.options.ListOptions.Builder;
@@ -59,11 +61,13 @@ import com.google.common.cache.LoadingCache;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
 import com.google.common.util.concurrent.Atomics;
 
 /**
- * An extension to compute service to allow for the manipulation of {@link 
org.jclouds.compute.domain.SecurityGroup}s. Implementation
+ * An extension to compute service to allow for the manipulation of {@link 
org.jclouds.compute.domain.SecurityGroup}s.
+ * Implementation
  * is optional by providers.
  */
 public class GoogleComputeEngineSecurityGroupExtension implements 
SecurityGroupExtension {
@@ -79,22 +83,20 @@ public class GoogleComputeEngineSecurityGroupExtension 
implements SecurityGroupE
 
    @Inject
    public GoogleComputeEngineSecurityGroupExtension(GoogleComputeEngineApi api,
-                                                    @UserProject 
Supplier<String> userProject,
-                                                    
GroupNamingConvention.Factory namingConvention,
-                                                    
LoadingCache<NetworkAndAddressRange, Network> networkCreator,
-                                                    Function<Network, 
SecurityGroup> groupConverter,
-                                                    @Named("global") 
Predicate<AtomicReference<Operation>> operationDonePredicate,
-                                                    
@Named(OPERATION_COMPLETE_INTERVAL) Long operationCompleteCheckInterval,
-                                                    
@Named(OPERATION_COMPLETE_TIMEOUT) Long operationCompleteCheckTimeout) {
+         @UserProject Supplier<String> userProject, 
GroupNamingConvention.Factory namingConvention,
+         LoadingCache<NetworkAndAddressRange, Network> networkCreator, 
Function<Network, SecurityGroup> groupConverter,
+         @Named("global") Predicate<AtomicReference<Operation>> 
operationDonePredicate,
+         @Named(OPERATION_COMPLETE_INTERVAL) Long 
operationCompleteCheckInterval,
+         @Named(OPERATION_COMPLETE_TIMEOUT) Long 
operationCompleteCheckTimeout) {
       this.api = checkNotNull(api, "api");
       this.userProject = checkNotNull(userProject, "userProject");
       this.namingConvention = checkNotNull(namingConvention, 
"namingConvention");
       this.networkCreator = checkNotNull(networkCreator, "networkCreator");
       this.groupConverter = checkNotNull(groupConverter, "groupConverter");
       this.operationCompleteCheckInterval = 
checkNotNull(operationCompleteCheckInterval,
-              "operation completed check interval");
+            "operation completed check interval");
       this.operationCompleteCheckTimeout = 
checkNotNull(operationCompleteCheckTimeout,
-              "operation completed check timeout");
+            "operation completed check timeout");
       this.operationDonePredicate = checkNotNull(operationDonePredicate, 
"operationDonePredicate");
    }
 
@@ -112,8 +114,8 @@ public class GoogleComputeEngineSecurityGroupExtension 
implements SecurityGroupE
    public Set<SecurityGroup> listSecurityGroupsForNode(String id) {
       SlashEncodedIds slashEncodedIds = SlashEncodedIds.fromSlashEncoded(id);
 
-      Instance instance = 
api.getInstanceApi(userProject.get()).getInZone(slashEncodedIds.getFirstId(),
-              slashEncodedIds.getSecondId());
+      Instance instance = api.getInstanceApi(userProject.get())
+            .getInZone(slashEncodedIds.getFirstId(), 
slashEncodedIds.getSecondId());
 
       if (instance == null) {
          return ImmutableSet.of();
@@ -121,12 +123,11 @@ public class GoogleComputeEngineSecurityGroupExtension 
implements SecurityGroupE
 
       ImmutableSet.Builder builder = ImmutableSet.builder();
 
-
-      for (NetworkInterface nwInterface : instance.getNetworkInterfaces()) {
-         String networkUrl = nwInterface.getNetwork().getPath();
+      for (NetworkInterface nwInterface : instance.networkInterfaces()) {
+         String networkUrl = nwInterface.network().getPath();
          Network nw = 
api.getNetworkApi(userProject.get()).get(networkUrl.substring(networkUrl.lastIndexOf('/')
 + 1));
 
-         SecurityGroup grp = groupForTagsInNetwork(nw, 
instance.getTags().getItems());
+         SecurityGroup grp = groupForTagsInNetwork(nw, 
instance.tags().items());
          if (grp != null) {
             builder.add(grp);
          }
@@ -155,7 +156,7 @@ public class GoogleComputeEngineSecurityGroupExtension 
implements SecurityGroupE
    public SecurityGroup createSecurityGroup(String name) {
       checkNotNull(name, "name");
 
-      NetworkAndAddressRange nAr = new NetworkAndAddressRange(name, 
DEFAULT_INTERNAL_NETWORK_RANGE, null);
+      NetworkAndAddressRange nAr = NetworkAndAddressRange.create(name, 
DEFAULT_INTERNAL_NETWORK_RANGE, null);
 
       Network nw = networkCreator.apply(nAr);
 
@@ -174,22 +175,23 @@ public class GoogleComputeEngineSecurityGroupExtension 
implements SecurityGroupE
       FluentIterable<Firewall> fws = 
api.getFirewallApi(userProject.get()).list(options).concat();
 
       for (Firewall fw : fws) {
-         AtomicReference<Operation> operation = 
Atomics.newReference(api.getFirewallApi(userProject.get())
-                 .delete(fw.getName()));
+         AtomicReference<Operation> operation = Atomics
+               
.newReference(api.getFirewallApi(userProject.get()).delete(fw.name()));
 
-         retry(operationDonePredicate, operationCompleteCheckTimeout, 
operationCompleteCheckInterval,
-                 MILLISECONDS).apply(operation);
+         retry(operationDonePredicate, operationCompleteCheckTimeout, 
operationCompleteCheckInterval, MILLISECONDS)
+               .apply(operation);
 
-         checkState(!operation.get().getHttpError().isPresent(), "Could not 
delete firewall, operation failed" + operation);
+         checkState(operation.get().httpErrorStatusCode() == null,
+               "Could not delete firewall, operation failed" + operation);
       }
 
-      AtomicReference<Operation> operation = Atomics.newReference(
-              api.getNetworkApi(userProject.get()).delete(id));
+      AtomicReference<Operation> operation = 
Atomics.newReference(api.getNetworkApi(userProject.get()).delete(id));
 
-      retry(operationDonePredicate, operationCompleteCheckTimeout, 
operationCompleteCheckInterval,
-                 MILLISECONDS).apply(operation);
+      retry(operationDonePredicate, operationCompleteCheckTimeout, 
operationCompleteCheckInterval, MILLISECONDS)
+            .apply(operation);
 
-      checkState(!operation.get().getHttpError().isPresent(), "Could not 
insert network, operation failed" + operation);
+      checkState(operation.get().httpErrorStatusCode() == null,
+            "Could not insert network, operation failed" + operation);
 
       return true;
    }
@@ -218,35 +220,32 @@ public class GoogleComputeEngineSecurityGroupExtension 
implements SecurityGroupE
       if (!ipPermission.getCidrBlocks().isEmpty()) {
          fwOptions.sourceRanges(ipPermission.getCidrBlocks());
       }
-      Firewall.Rule.Builder ruleBuilder = Firewall.Rule.builder();
-      ruleBuilder.IpProtocol(ipPermission.getIpProtocol());
+      List<String> ports = Lists.newArrayList();
       if (ipPermission.getFromPort() > 0) {
          if (ipPermission.getFromPort() == ipPermission.getToPort()) {
-            ruleBuilder.addPort(ipPermission.getToPort());
+            ports.add(String.valueOf(ipPermission.getToPort()));
          } else {
-            ruleBuilder.addPortRange(ipPermission.getFromPort(), 
ipPermission.getToPort());
+            ports.add(ipPermission.getFromPort() + "-" + 
ipPermission.getToPort());
          }
       }
-      fwOptions.addAllowedRule(ruleBuilder.build());
+      
fwOptions.addAllowedRule(Firewall.Rule.create(ipPermission.getIpProtocol().value().toLowerCase(),
 ports));
 
-      AtomicReference<Operation> operation = 
Atomics.newReference(api.getFirewallApi(userProject
-              .get()).createInNetwork(
-              uniqueFwName,
-              group.getUri(),
-              fwOptions));
+      AtomicReference<Operation> operation = Atomics.newReference(
+            
api.getFirewallApi(userProject.get()).createInNetwork(uniqueFwName, 
group.getUri(), fwOptions));
 
-      retry(operationDonePredicate, operationCompleteCheckTimeout, 
operationCompleteCheckInterval,
-              MILLISECONDS).apply(operation);
+      retry(operationDonePredicate, operationCompleteCheckTimeout, 
operationCompleteCheckInterval, MILLISECONDS)
+            .apply(operation);
 
-      checkState(!operation.get().getHttpError().isPresent(), "Could not 
insert firewall, operation failed" + operation);
+      checkState(operation.get().httpErrorStatusCode() == null,
+            "Could not insert firewall, operation failed" + operation);
 
       return getSecurityGroupById(group.getId());
    }
 
    @Override
    public SecurityGroup addIpPermission(IpProtocol protocol, int fromPort, int 
toPort,
-           Multimap<String, String> tenantIdGroupNamePairs, Iterable<String> 
cidrBlocks,
-           Iterable<String> groupIds, SecurityGroup group) {
+         Multimap<String, String> tenantIdGroupNamePairs, Iterable<String> 
cidrBlocks, Iterable<String> groupIds,
+         SecurityGroup group) {
 
       IpPermission.Builder permBuilder = IpPermission.builder();
       permBuilder.ipProtocol(protocol);
@@ -272,13 +271,14 @@ public class GoogleComputeEngineSecurityGroupExtension 
implements SecurityGroupE
 
       for (Firewall fw : fws) {
          if (equalsIpPermission(ipPermission).apply(fw)) {
-            AtomicReference<Operation> operation = 
Atomics.newReference(api.getFirewallApi(userProject.get())
-                    .delete(fw.getName()));
+            AtomicReference<Operation> operation = Atomics
+                  
.newReference(api.getFirewallApi(userProject.get()).delete(fw.name()));
 
-            retry(operationDonePredicate, operationCompleteCheckTimeout, 
operationCompleteCheckInterval,
-                    MILLISECONDS).apply(operation);
+            retry(operationDonePredicate, operationCompleteCheckTimeout, 
operationCompleteCheckInterval, MILLISECONDS)
+                  .apply(operation);
 
-            checkState(!operation.get().getHttpError().isPresent(), "Could not 
delete firewall, operation failed" + operation);
+            checkState(operation.get().httpErrorStatusCode() == null,
+                  "Could not delete firewall, operation failed" + operation);
          }
       }
 
@@ -287,8 +287,8 @@ public class GoogleComputeEngineSecurityGroupExtension 
implements SecurityGroupE
 
    @Override
    public SecurityGroup removeIpPermission(IpProtocol protocol, int fromPort, 
int toPort,
-                                        Multimap<String, String> 
tenantIdGroupNamePairs, Iterable<String> cidrBlocks,
-                                        Iterable<String> groupIds, 
SecurityGroup group) {
+         Multimap<String, String> tenantIdGroupNamePairs, Iterable<String> 
cidrBlocks, Iterable<String> groupIds,
+         SecurityGroup group) {
 
       IpPermission.Builder permBuilder = IpPermission.builder();
       permBuilder.ipProtocol(protocol);
@@ -326,17 +326,15 @@ public class GoogleComputeEngineSecurityGroupExtension 
implements SecurityGroupE
       return false;
    }
 
-   private SecurityGroup groupForTagsInNetwork(Network nw, final Set <String> 
tags) {
-      ListOptions opts = new Builder().filter("network eq .*/" + nw.getName());
-      Set<Firewall> fws = 
api.getFirewallApi(userProject.get()).list(opts).concat()
-              .filter(new Predicate<Firewall>() {
-                 @Override
-                 public boolean apply(final Firewall input) {
-                    // If any of the targetTags on the firewall apply or the 
firewall has no target tags...
-                    return Iterables.any(input.getTargetTags(), 
Predicates.in(tags))
-                            || 
Predicates.equalTo(0).apply(input.getTargetTags().size());
-                 }
-              }).toSet();
+   private SecurityGroup groupForTagsInNetwork(Network nw, final 
Collection<String> tags) {
+      ListOptions opts = new Builder().filter("network eq .*/" + nw.name());
+      List<Firewall> fws = 
api.getFirewallApi(userProject.get()).list(opts).concat().filter(new 
Predicate<Firewall>() {
+         @Override public boolean apply(final Firewall input) {
+            // If any of the targetTags on the firewall apply or the firewall 
has no target tags...
+            return Iterables.any(input.targetTags(), Predicates.in(tags)) || 
Predicates.equalTo(0)
+                  .apply(input.targetTags().size());
+         }
+      }).toList();
 
       if (fws.isEmpty()) {
          return null;

Reply via email to