You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ab...@apache.org on 2013/12/13 19:43:17 UTC

[5/5] git commit: JCLOUDS-393. Move to GCE API v1.

JCLOUDS-393. Move to GCE API v1.


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/2aa7340a
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/tree/2aa7340a
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/diff/2aa7340a

Branch: refs/heads/master
Commit: 2aa7340a92f91e43386d373484fd7b03a4c719a2
Parents: 91ff9a9
Author: Andrew Bayer <an...@gmail.com>
Authored: Tue Dec 3 08:57:15 2013 -0800
Committer: Andrew Bayer <an...@gmail.com>
Committed: Thu Dec 12 17:07:05 2013 -0800

----------------------------------------------------------------------
 google-compute-engine/pom.xml                   |   4 +-
 .../GoogleComputeEngineApi.java                 |  12 +-
 .../GoogleComputeEngineApiMetadata.java         |   6 +-
 .../GoogleComputeEngineConstants.java           |  19 ++
 .../GoogleComputeEngineServiceAdapter.java      | 104 +++++++++--
 .../functions/InstanceInZoneToNodeMetadata.java |  52 ++++--
 .../GoogleComputeEngineTemplateOptions.java     |  61 +++++++
 .../config/GoogleComputeEngineParserModule.java |   8 +-
 .../domain/AbstractDisk.java                    |   2 +-
 .../googlecomputeengine/domain/Address.java     |   2 +-
 .../googlecomputeengine/domain/Disk.java        |   2 +-
 .../googlecomputeengine/domain/Firewall.java    |   4 +-
 .../googlecomputeengine/domain/Image.java       |  30 +---
 .../googlecomputeengine/domain/Instance.java    |  79 +++++----
 .../domain/InstanceTemplate.java                |  45 ++++-
 .../googlecomputeengine/domain/Kernel.java      |  91 ----------
 .../googlecomputeengine/domain/MachineType.java |   2 +-
 .../googlecomputeengine/domain/Network.java     |   2 +-
 .../googlecomputeengine/domain/Operation.java   |   2 +-
 .../googlecomputeengine/domain/Quota.java       |   2 +-
 .../googlecomputeengine/domain/Region.java      |   2 +-
 .../googlecomputeengine/domain/Resource.java    |   2 -
 .../googlecomputeengine/domain/Route.java       |   2 +-
 .../googlecomputeengine/domain/Snapshot.java    |   2 +-
 .../googlecomputeengine/domain/Zone.java        |   4 +-
 .../features/AddressApi.java                    |   2 +-
 .../googlecomputeengine/features/DiskApi.java   |  46 ++++-
 .../features/FirewallApi.java                   |   2 +-
 .../features/GlobalOperationApi.java            |   2 +-
 .../googlecomputeengine/features/ImageApi.java  |   2 +-
 .../features/InstanceApi.java                   |   2 +-
 .../googlecomputeengine/features/KernelApi.java | 140 ---------------
 .../features/MachineTypeApi.java                |   2 +-
 .../features/NetworkApi.java                    |   2 +-
 .../features/ProjectApi.java                    |   2 +-
 .../googlecomputeengine/features/RegionApi.java |   2 +-
 .../features/RegionOperationApi.java            |   2 +-
 .../googlecomputeengine/features/RouteApi.java  |   2 +-
 .../features/SnapshotApi.java                   |   2 +-
 .../googlecomputeengine/features/ZoneApi.java   |   2 +-
 .../features/ZoneOperationApi.java              |   2 +-
 .../functions/internal/ParseKernels.java        |  66 -------
 .../options/ListOptions.java                    |   2 +-
 .../predicates/InstancePredicates.java          |  33 ++++
 .../PageSystemExpectTest.java                   |   8 +-
 .../GoogleComputeEngineServiceExpectTest.java   | 174 ++++++++++++++-----
 .../functions/FirewallToIpPermissionTest.java   |   4 +-
 .../functions/NetworkToSecurityGroupTest.java   |   4 +-
 .../loaders/FindNetworkOrCreateTest.java        |   4 +-
 .../features/AddressApiExpectTest.java          |  14 +-
 .../features/DiskApiExpectTest.java             |  40 ++++-
 .../features/FirewallApiExpectTest.java         |  24 +--
 .../features/GlobalOperationApiExpectTest.java  |   2 +-
 .../features/ImageApiExpectTest.java            |  30 ++--
 .../features/ImageApiLiveTest.java              |   2 +-
 .../features/InstanceApiExpectTest.java         |  48 +++--
 .../features/InstanceApiLiveTest.java           |  65 +++++--
 .../features/KernelApiExpectTest.java           | 109 ------------
 .../features/KernelApiLiveTest.java             |  77 --------
 .../features/MachineTypeApiExpectTest.java      |   8 +-
 .../features/NetworkApiExpectTest.java          |  14 +-
 .../features/ProjectApiExpectTest.java          |   2 +-
 .../features/RegionApiExpectTest.java           |   2 +-
 .../features/RegionOperationApiExpectTest.java  |  12 +-
 .../features/RouteApiExpectTest.java            |  18 +-
 .../features/SnapshotApiExpectTest.java         |   2 +-
 .../features/ZoneApiExpectTest.java             |   2 +-
 .../features/ZoneOperationApiExpectTest.java    |  10 +-
 .../functions/CreateNetworkIfNeededTest.java    |   4 +-
 .../GoogleComputeEngineErrorHandlerTest.java    |   2 +-
 .../BaseGoogleComputeEngineApiLiveTest.java     |   2 +-
 .../parse/ParseAddressListTest.java             |   6 +-
 .../parse/ParseAddressTest.java                 |   4 +-
 .../parse/ParseDiskListTest.java                |   6 +-
 .../parse/ParseDiskTest.java                    |   4 +-
 .../parse/ParseFirewallListTest.java            |   6 +-
 .../parse/ParseFirewallTest.java                |   4 +-
 .../parse/ParseImageListTest.java               |  10 +-
 .../parse/ParseImageTest.java                   |   4 +-
 .../parse/ParseInstanceListTest.java            |   2 +-
 .../parse/ParseInstanceTest.java                |  18 +-
 .../parse/ParseKernelListTest.java              |  75 --------
 .../parse/ParseKernelTest.java                  |  51 ------
 .../parse/ParseMachineTypeListTest.java         |   8 +-
 .../parse/ParseMachineTypeTest.java             |   2 +-
 .../parse/ParseNetworkListTest.java             |   2 +-
 .../parse/ParseNetworkTest.java                 |   2 +-
 .../parse/ParseOperationListTest.java           |   2 +-
 .../parse/ParseOperationTest.java               |   4 +-
 .../parse/ParseProjectTest.java                 |   2 +-
 .../parse/ParseRegionListTest.java              |   6 +-
 .../parse/ParseRegionTest.java                  |   6 +-
 .../parse/ParseRouteListTest.java               |   8 +-
 .../parse/ParseRouteTest.java                   |   6 +-
 .../parse/ParseSnapshotListTest.java            |   6 +-
 .../parse/ParseSnapshotTest.java                |   4 +-
 .../parse/ParseZoneListTest.java                |   4 +-
 .../parse/ParseZoneTest.java                    |   2 +-
 .../NetworkFirewallPredicatesTest.java          |   8 +-
 .../firewall_list.json                          |   6 +-
 .../network_get.json                            |   2 +-
 .../src/test/resources/address_get.json         |   4 +-
 .../src/test/resources/address_list.json        |  10 +-
 .../src/test/resources/disk_get.json            |   4 +-
 .../src/test/resources/disk_list.json           |   6 +-
 .../src/test/resources/firewall_get.json        |   4 +-
 .../src/test/resources/firewall_insert.json     |   2 +-
 .../src/test/resources/firewall_list.json       |  10 +-
 .../src/test/resources/global_operation.json    |   4 +-
 .../test/resources/global_operation_list.json   |   6 +-
 .../src/test/resources/image_get.json           |   3 +-
 .../src/test/resources/image_list.json          |   9 +-
 .../src/test/resources/image_list_empty.json    |   6 +
 .../resources/image_list_multiple_page_1.json   |  17 +-
 .../resources/image_list_multiple_page_2.json   |  13 +-
 .../test/resources/image_list_single_page.json  |  15 +-
 .../resources/instance_add_access_config.json   |   2 +-
 .../test/resources/instance_attach_disk.json    |   2 +-
 .../src/test/resources/instance_get.json        |  22 ++-
 .../src/test/resources/instance_insert.json     |   2 +-
 .../test/resources/instance_insert_simple.json  |   2 +-
 .../src/test/resources/instance_list.json       |  24 ++-
 .../instance_list_central1b_empty.json          |   2 +-
 .../src/test/resources/kernel.json              |   8 -
 .../src/test/resources/kernel_list.json         |  27 ---
 .../src/test/resources/machinetype.json         |   2 +-
 .../src/test/resources/machinetype_list.json    |   8 +-
 .../resources/machinetype_list_central1b.json   |   6 +-
 .../machinetype_list_central1b_empty.json       |   2 +-
 .../src/test/resources/network_get.json         |   2 +-
 .../src/test/resources/network_list.json        |   4 +-
 .../src/test/resources/operation.json           |   8 +-
 .../src/test/resources/operation_error.json     |   8 +-
 .../src/test/resources/operation_list.json      |  10 +-
 .../src/test/resources/project.json             |   2 +-
 .../src/test/resources/region_get.json          |   6 +-
 .../src/test/resources/region_list.json         |  12 +-
 .../src/test/resources/region_operation.json    |   6 +-
 .../test/resources/region_operation_list.json   |   8 +-
 .../src/test/resources/route_get.json           |   6 +-
 .../src/test/resources/route_insert.json        |   2 +-
 .../src/test/resources/route_list.json          |  14 +-
 .../src/test/resources/snapshot_get.json        |   4 +-
 .../src/test/resources/snapshot_list.json       |  10 +-
 .../src/test/resources/zone_get.json            |   2 +-
 .../src/test/resources/zone_list.json           |   6 +-
 .../src/test/resources/zone_list_short.json     |   4 +-
 .../src/test/resources/zone_operation.json      |   6 +-
 .../test/resources/zone_operation_error.json    |   6 +-
 .../src/test/resources/zone_operation_list.json |   8 +-
 150 files changed, 973 insertions(+), 1192 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/pom.xml
----------------------------------------------------------------------
diff --git a/google-compute-engine/pom.xml b/google-compute-engine/pom.xml
index f440a0f..9edc75e 100644
--- a/google-compute-engine/pom.xml
+++ b/google-compute-engine/pom.xml
@@ -37,9 +37,9 @@
         </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>v1beta16</test.google-compute-engine.api-version>
+        <test.google-compute-engine.api-version>v1</test.google-compute-engine.api-version>
         <test.google-compute-engine.build-version/>
-        <test.google-compute-engine.template>osFamily=GCEL,osVersionMatches=1[012].[01][04],locationId=us-central1-a,minRam=2048</test.google-compute-engine.template>
+        <test.google-compute-engine.template>imageId=debian-7-wheezy-v20131120,locationId=us-central1-a,minRam=2048</test.google-compute-engine.template>
     </properties>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/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 6589c4d..6918d27 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
@@ -27,7 +27,6 @@ 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.KernelApi;
 import org.jclouds.googlecomputeengine.features.MachineTypeApi;
 import org.jclouds.googlecomputeengine.features.NetworkApi;
 import org.jclouds.googlecomputeengine.features.ProjectApi;
@@ -47,7 +46,7 @@ import com.google.common.annotations.Beta;
  * <p/>
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16">api doc</a>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1">api doc</a>
  */
 @Beta
 public interface GoogleComputeEngineApi extends Closeable {
@@ -107,15 +106,6 @@ public interface GoogleComputeEngineApi extends Closeable {
    InstanceApi getInstanceApiForProject(@PathParam("project") String projectName);
 
    /**
-    * Provides access to Kernel features
-    *
-    * @param projectName the name of the project
-    */
-   @Delegate
-   @Path("/projects/{project}")
-   KernelApi getKernelApiForProject(@PathParam("project") String projectName);
-
-   /**
     * Provides access to MachineType features
     *
     * @param projectName the name of the project

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/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 564f869..d6bb755 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
@@ -40,7 +40,7 @@ import com.google.common.collect.ImmutableSet;
 import com.google.inject.Module;
 
 /**
- * Implementation of {@link ApiMetadata} for GoogleCompute v1beta16 API
+ * Implementation of {@link ApiMetadata} for GoogleCompute v1 API
  *
  * @author David Alves
  */
@@ -80,8 +80,8 @@ public class GoogleComputeEngineApiMetadata extends BaseHttpApiMetadata<GoogleCo
                  .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("v1beta16")
-                 .defaultEndpoint("https://www.googleapis.com/compute/v1beta16")
+                 .version("v1")
+                 .defaultEndpoint("https://www.googleapis.com/compute/v1")
                  .defaultProperties(GoogleComputeEngineApiMetadata.defaultProperties())
                  .view(typeToken(ComputeServiceContext.class))
                  .defaultModules(ImmutableSet.<Class<? extends Module>>builder()

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java
index 1334a32..0bf6b6f 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java
@@ -34,6 +34,10 @@ public interface GoogleComputeEngineConstants {
     */
    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";
@@ -58,4 +62,19 @@ public interface GoogleComputeEngineConstants {
    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";
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/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 f4495c0..62d3914 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
@@ -20,14 +20,21 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.Iterables.contains;
 import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.tryFind;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GOOGLE_PROJECT;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.CENTOS_PROJECT;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.DEBIAN_PROJECT;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GCE_BOOT_DISK_SUFFIX;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GCE_DELETE_BOOT_DISK_METADATA_KEY;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GCE_IMAGE_METADATA_KEY;
 import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_INTERVAL;
 import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_TIMEOUT;
 import static org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface.AccessConfig.Type;
+import static org.jclouds.googlecomputeengine.predicates.InstancePredicates.isBootDisk;
 import static org.jclouds.util.Predicates2.retry;
 
 import java.net.URI;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
@@ -36,7 +43,6 @@ import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Resource;
 import javax.inject.Named;
 
-import com.google.common.primitives.Ints;
 import org.jclouds.collect.Memoized;
 import org.jclouds.compute.ComputeServiceAdapter;
 import org.jclouds.compute.domain.Hardware;
@@ -49,10 +55,15 @@ import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
 import org.jclouds.googlecomputeengine.compute.functions.FirewallTagNamingConvention;
 import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions;
 import org.jclouds.googlecomputeengine.config.UserProject;
+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.MachineType;
 import org.jclouds.googlecomputeengine.domain.MachineTypeInZone;
 import org.jclouds.googlecomputeengine.domain.Operation;
@@ -64,11 +75,14 @@ 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;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Ints;
 import com.google.common.util.concurrent.Atomics;
 import com.google.common.util.concurrent.UncheckedTimeoutException;
 import com.google.inject.Inject;
@@ -85,7 +99,6 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter<
    private final GoogleComputeEngineApi api;
    private final Supplier<String> userProject;
    private final Supplier<Map<URI, ? extends Location>> zones;
-   private final Supplier<Map<URI, ? extends Hardware>> hardwareMap;
    private final Function<TemplateOptions, ImmutableMap.Builder<String, String>> metatadaFromTemplateOptions;
    private final Predicate<AtomicReference<Operation>> retryOperationDonePredicate;
    private final long operationCompleteCheckInterval;
@@ -101,7 +114,6 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter<
                                             @Named(OPERATION_COMPLETE_INTERVAL) Long operationCompleteCheckInterval,
                                             @Named(OPERATION_COMPLETE_TIMEOUT) Long operationCompleteCheckTimeout,
                                             @Memoized Supplier<Map<URI, ? extends Location>> zones,
-                                            @Memoized Supplier<Map<URI, ? extends Hardware>> hardwareMap,
                                             FirewallTagNamingConvention.Factory firewallTagNamingConvention) {
       this.api = checkNotNull(api, "google compute api");
       this.userProject = checkNotNull(userProject, "user project name");
@@ -110,11 +122,10 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter<
       this.operationCompleteCheckInterval = checkNotNull(operationCompleteCheckInterval,
               "operation completed check interval");
       this.operationCompleteCheckTimeout = checkNotNull(operationCompleteCheckTimeout,
-              "operation completed check timeout");
+                                                        "operation completed check timeout");
       this.retryOperationDonePredicate = retry(operationDonePredicate, operationCompleteCheckTimeout,
-              operationCompleteCheckInterval, TimeUnit.MILLISECONDS);
+                                               operationCompleteCheckInterval, TimeUnit.MILLISECONDS);
       this.zones = checkNotNull(zones, "zones");
-      this.hardwareMap = checkNotNull(hardwareMap, "hardwareMap");
       this.firewallTagNamingConvention = checkNotNull(firewallTagNamingConvention, "firewallTagNamingConvention");
    }
 
@@ -129,6 +140,22 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter<
       Hardware hardware = checkNotNull(template.getHardware(), "hardware must be set");
 
       checkNotNull(hardware.getUri(), "hardware must have a URI");
+      checkNotNull(template.getImage().getUri(), "image URI is null");
+
+      // Note that the ordering is significant here - the first disk must be the boot disk.
+      List<PersistentDisk> disks = Lists.newArrayList();
+
+      if (!tryFind(options.getDisks(), isBootDisk()).isPresent()) {
+         Disk bootDisk = createBootDisk(template, name);
+
+         disks.add(new PersistentDisk(Mode.READ_WRITE,
+                                      bootDisk.getSelfLink(),
+                                      null,
+                                      true,
+                                      true));
+      }
+
+      disks.addAll(options.getDisks());
 
       InstanceTemplate instanceTemplate = InstanceTemplate.builder()
               .forMachineType(hardware.getUri());
@@ -139,12 +166,20 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter<
          instanceTemplate.addNetworkInterface(options.getNetwork().get());
       }
 
+      instanceTemplate.disks(disks);
+
       LoginCredentials credentials = getFromImageAndOverrideIfRequired(template.getImage(), options);
 
       ImmutableMap.Builder<String, String> metadataBuilder = metatadaFromTemplateOptions.apply(options);
+
+      metadataBuilder.put(GCE_IMAGE_METADATA_KEY, template.getImage().getUri().toString());
+
+      if (!options.shouldKeepBootDisk()) {
+         metadataBuilder.put(GCE_DELETE_BOOT_DISK_METADATA_KEY, Boolean.TRUE.toString());
+      }
+
       instanceTemplate.metadata(metadataBuilder.build());
       instanceTemplate.serviceAccounts(options.getServiceAccounts());
-      instanceTemplate.image(checkNotNull(template.getImage().getUri(), "image URI is null"));
 
       final InstanceApi instanceApi = api.getInstanceApiForProject(userProject.get());
       final String zone = template.getLocation().getId();
@@ -199,6 +234,26 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter<
       return new NodeAndInitialCredentials<InstanceInZone>(instanceInZone, instanceInZone.slashEncode(), credentials);
    }
 
+   private Disk createBootDisk(Template template, String instanceName) {
+      URI imageUri = template.getImage().getUri();
+
+      GoogleComputeEngineTemplateOptions options = GoogleComputeEngineTemplateOptions.class.cast(template.getOptions()).clone();
+
+      int diskSize = options.getBootDiskSize().or(10l).intValue();
+
+      String diskName = instanceName + "-" + GCE_BOOT_DISK_SUFFIX;
+
+      Operation diskOperation = api.getDiskApiForProject(userProject.get())
+                                   .createFromImageWithSizeInZone(imageUri.toString(),
+                                                                  diskName,
+                                                                  diskSize,
+                                                                  template.getLocation().getId());
+
+      waitOperationDone(diskOperation);
+
+      return api.getDiskApiForProject(userProject.get()).getInZone(template.getLocation().getId(),
+                                                                   diskName);
+   }
 
    @Override
    public Iterable<MachineTypeInZone> listHardwareProfiles() {
@@ -224,14 +279,17 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter<
    public Iterable<Image> listImages() {
       return ImmutableSet.<Image>builder()
               .addAll(api.getImageApiForProject(userProject.get()).list().concat())
-              .addAll(api.getImageApiForProject(GOOGLE_PROJECT).list().concat())
+              .addAll(api.getImageApiForProject(DEBIAN_PROJECT).list().concat())
+              .addAll(api.getImageApiForProject(CENTOS_PROJECT).list().concat())
               .build();
    }
 
    @Override
    public Image getImage(String id) {
       return Objects.firstNonNull(api.getImageApiForProject(userProject.get()).get(id),
-              api.getImageApiForProject(GOOGLE_PROJECT).get(id));
+                                  Objects.firstNonNull(api.getImageApiForProject(DEBIAN_PROJECT).get(id),
+                                                       api.getImageApiForProject(CENTOS_PROJECT).get(id)));
+
    }
 
    @Override
@@ -280,9 +338,33 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter<
    @Override
    public void destroyNode(final String name) {
       SlashEncodedIds slashEncodedIds = SlashEncodedIds.fromSlashEncoded(name);
-
+      String diskName = null;
+      try {
+         Instance instance = api.getInstanceApiForProject(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();
+            }
+         }
+      } catch (Exception e) {
+         // TODO: what exception actually gets thrown here if the instance doesn't really exist?
+      }
       waitOperationDone(api.getInstanceApiForProject(userProject.get()).deleteInZone(slashEncodedIds.getFirstId(),
               slashEncodedIds.getSecondId()));
+
+      if (diskName != null) {
+         waitOperationDone(api.getDiskApiForProject(userProject.get()).deleteInZone(slashEncodedIds.getFirstId(),
+                                                                                    diskName));
+      }
+
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java
index 98b9a14..4c4c600 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java
@@ -18,6 +18,7 @@ package org.jclouds.googlecomputeengine.compute.functions;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.jclouds.compute.util.ComputeServiceUtils.groupFromMapOrName;
+import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GCE_IMAGE_METADATA_KEY;
 
 import java.net.URI;
 import java.util.Map;
@@ -32,6 +33,8 @@ import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.NodeMetadataBuilder;
 import org.jclouds.compute.functions.GroupNamingConvention;
 import org.jclouds.domain.Location;
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.config.UserProject;
 import org.jclouds.googlecomputeengine.domain.Instance;
 import org.jclouds.googlecomputeengine.domain.InstanceInZone;
 import org.jclouds.googlecomputeengine.domain.SlashEncodedIds;
@@ -55,6 +58,8 @@ public class InstanceInZoneToNodeMetadata implements Function<InstanceInZone, No
    private final Supplier<Map<URI, ? extends Hardware>> hardwares;
    private final Supplier<Map<URI, ? extends Location>> locations;
    private final FirewallTagNamingConvention.Factory firewallTagNamingConvention;
+   private final GoogleComputeEngineApi api;
+   private final Supplier<String> userProject;
 
    @Inject
    public InstanceInZoneToNodeMetadata(Map<Instance.Status, NodeMetadata.Status> toPortableNodeStatus,
@@ -62,47 +67,64 @@ public class InstanceInZoneToNodeMetadata implements Function<InstanceInZone, No
                                  @Memoized Supplier<Map<URI, ? extends Image>> images,
                                  @Memoized Supplier<Map<URI, ? extends Hardware>> hardwares,
                                  @Memoized Supplier<Map<URI, ? extends Location>> locations,
-                                 FirewallTagNamingConvention.Factory firewallTagNamingConvention) {
+                                 FirewallTagNamingConvention.Factory firewallTagNamingConvention,
+                                 GoogleComputeEngineApi api,
+                                 @UserProject Supplier<String> userProject) {
       this.toPortableNodeStatus = toPortableNodeStatus;
       this.nodeNamingConvention = namingConvention.createWithoutPrefix();
       this.images = images;
       this.hardwares = hardwares;
       this.locations = locations;
       this.firewallTagNamingConvention = checkNotNull(firewallTagNamingConvention, "firewallTagNamingConvention");
+      this.api = checkNotNull(api, "api");
+      this.userProject = checkNotNull(userProject, "userProject");
    }
 
    @Override
    public NodeMetadata apply(InstanceInZone instanceInZone) {
       Instance input = instanceInZone.getInstance();
-      Map<URI, ? extends Image> imagesMap = images.get();
-      Image image = checkNotNull(imagesMap.get(checkNotNull(input.getImage(), "image")),
-              "no image for %s. images: %s", input.getImage(), imagesMap.values());
 
       String group = groupFromMapOrName(input.getMetadata().getItems(),
-              input.getName(), nodeNamingConvention);
-
+                                               input.getName(), nodeNamingConvention);
       FluentIterable<String> tags = FluentIterable.from(input.getTags().getItems())
-              .filter(Predicates.not(firewallTagNamingConvention.get(group).isFirewallTag()));
+                                            .filter(Predicates.not(firewallTagNamingConvention.get(group).isFirewallTag()));
+
+      NodeMetadataBuilder builder = new NodeMetadataBuilder();
 
-      return new NodeMetadataBuilder()
-              .id(SlashEncodedIds.fromTwoIds(checkNotNull(locations.get().get(input.getZone()), "location for %s", input.getZone()).getId(),
-                      input.getName()).slashEncode())
+      builder.id(SlashEncodedIds.fromTwoIds(checkNotNull(locations.get().get(input.getZone()),
+                                                                "location for %s", input.getZone())
+                                                    .getId(), input.getName()).slashEncode())
               .name(input.getName())
               .providerId(input.getId())
               .hostname(input.getName())
-              .imageId(image.getId())
               .location(checkNotNull(locations.get().get(input.getZone()), "location for %s", input.getZone()))
               .hardware(checkNotNull(hardwares.get().get(input.getMachineType()), "hardware type for %s",
-                      input.getMachineType().toString()))
-              .operatingSystem(image.getOperatingSystem())
+                                            input.getMachineType().toString()))
               .status(toPortableNodeStatus.get(input.getStatus()))
               .tags(tags)
               .uri(input.getSelfLink())
               .userMetadata(input.getMetadata().getItems())
               .group(group)
               .privateAddresses(collectPrivateAddresses(input))
-              .publicAddresses(collectPublicAddresses(input))
-              .build();
+              .publicAddresses(collectPublicAddresses(input));
+
+      if (input.getMetadata().getItems().containsKey(GCE_IMAGE_METADATA_KEY)) {
+         try {
+            URI imageUri = URI.create(input.getMetadata().getItems()
+                                              .get(GCE_IMAGE_METADATA_KEY));
+
+            Map<URI, ? extends Image> imagesMap = images.get();
+
+            Image image = checkNotNull(imagesMap.get(imageUri),
+                                       "no image for %s. images: %s", imageUri,
+                                       imagesMap.values());
+            builder.imageId(image.getId());
+         } catch (IllegalArgumentException e) {
+            // Swallow any exception here - it just means we don't actually have a valid image URI, so we skip it.
+         }
+      }
+
+      return builder.build();
    }
 
    private Set<String> collectPrivateAddresses(Instance input) {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java
index 04ebaf4..63e3685 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java
@@ -26,6 +26,7 @@ import java.util.Set;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.domain.LoginCredentials;
 import org.jclouds.googlecomputeengine.domain.Instance;
+import org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk;
 import org.jclouds.scriptbuilder.domain.Statement;
 
 import com.google.common.base.Optional;
@@ -42,6 +43,9 @@ public class GoogleComputeEngineTemplateOptions extends TemplateOptions {
    private Optional<String> networkName = Optional.absent();
    private Set<Instance.ServiceAccount> serviceAccounts = Sets.newLinkedHashSet();
    private boolean enableNat = true;
+   private Set<PersistentDisk> disks = Sets.newLinkedHashSet();
+   private Optional<Long> bootDiskSize = Optional.absent();
+   private boolean keepBootDisk = false;
 
    @Override
    public GoogleComputeEngineTemplateOptions clone() {
@@ -59,6 +63,8 @@ public class GoogleComputeEngineTemplateOptions extends TemplateOptions {
          eTo.network(getNetworkName().orNull());
          eTo.serviceAccounts(getServiceAccounts());
          eTo.enableNat(isEnableNat());
+         eTo.disks(getDisks());
+         eTo.keepBootDisk(shouldKeepBootDisk());
       }
    }
 
@@ -97,6 +103,24 @@ public class GoogleComputeEngineTemplateOptions extends TemplateOptions {
    }
 
    /**
+    * @see #getDisks()
+    * @see org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk
+    */
+   public GoogleComputeEngineTemplateOptions addDisk(PersistentDisk disk) {
+      this.disks.add(disk);
+      return this;
+   }
+
+   /**
+    * @see #getDisks()
+    * @see org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk
+    */
+   public GoogleComputeEngineTemplateOptions disks(Set<PersistentDisk> disks) {
+      this.disks = Sets.newLinkedHashSet(disks);
+      return this;
+   }
+
+   /**
     * @see #isEnableNat()
     */
    public GoogleComputeEngineTemplateOptions enableNat(boolean enableNat) {
@@ -105,6 +129,22 @@ public class GoogleComputeEngineTemplateOptions extends TemplateOptions {
    }
 
    /**
+    * @see #getBootDiskSize()
+    */
+   public GoogleComputeEngineTemplateOptions bootDiskSize(Long bootDiskSize) {
+      this.bootDiskSize = fromNullable(bootDiskSize);
+      return this;
+   }
+
+   /**
+    * @see #shouldKeepBootDisk()
+    */
+   public GoogleComputeEngineTemplateOptions keepBootDisk(boolean keepBootDisk) {
+      this.keepBootDisk = keepBootDisk;
+      return this;
+   }
+
+   /**
     * {@inheritDoc}
     */
    @Override
@@ -280,6 +320,13 @@ public class GoogleComputeEngineTemplateOptions extends TemplateOptions {
    }
 
    /**
+    * @return the PersistentDisks for this instance.
+    */
+   public Set<PersistentDisk> getDisks() {
+      return disks;
+   }
+
+   /**
     * @return the URI of an existing network the instances will be attached to. If no network URI or network name are
     *         provided a new network will be created for the project.
     */
@@ -302,4 +349,18 @@ public class GoogleComputeEngineTemplateOptions extends TemplateOptions {
    public boolean isEnableNat() {
       return enableNat;
    }
+
+   /**
+    * @return the boot disk size, if specified. Defaults to 10gb.
+    */
+   public Optional<Long> getBootDiskSize() {
+      return bootDiskSize;
+   }
+
+   /**
+    * @return whether we should keep the boot disk around when deleting the instance. Defaults to false.
+    */
+   public boolean shouldKeepBootDisk() {
+      return keepBootDisk;
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineParserModule.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineParserModule.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineParserModule.java
index 6dc0160..2f5f644 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineParserModule.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineParserModule.java
@@ -87,7 +87,7 @@ public class GoogleComputeEngineParserModule extends AbstractModule {
    /**
     * Parser for operations that unwraps errors avoiding an extra intermediate object.
     *
-    * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/operations"/>
+    * @see <a href="https://developers.google.com/compute/docs/reference/v1/operations"/>
     */
    @Singleton
    private static class OperationTypeAdapter implements JsonDeserializer<Operation> {
@@ -208,14 +208,14 @@ public class GoogleComputeEngineParserModule extends AbstractModule {
 
       private static class InstanceInternal extends Instance {
          @ConstructorProperties({
-                 "id", "creationTimestamp", "selfLink", "name", "description", "tags", "image", "machineType",
+                 "id", "creationTimestamp", "selfLink", "name", "description", "tags", "machineType",
                  "status", "statusMessage", "zone", "networkInterfaces", "metadata", "serviceAccounts"
          })
          private InstanceInternal(String id, Date creationTimestamp, URI selfLink, String name, String description,
-                                  Tags tags, URI image, URI machineType, Status status, String statusMessage,
+                                  Tags tags, URI machineType, Status status, String statusMessage,
                                   URI zone, Set<NetworkInterface> networkInterfaces, Metadata metadata,
                                   Set<ServiceAccount> serviceAccounts) {
-            super(id, creationTimestamp, selfLink, name, description, tags, image, machineType,
+            super(id, creationTimestamp, selfLink, name, description, tags, machineType,
                     status, statusMessage, zone, networkInterfaces, null, metadata, serviceAccounts);
          }
       }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java
index 44e13a2..045846b 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java
@@ -28,7 +28,7 @@ import com.google.common.base.Objects;
  * A persistent disk resource
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/disks"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/disks"/>
  */
 @Beta
 public abstract class AbstractDisk extends Resource {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Address.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Address.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Address.java
index 03e6fab..86dde18 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Address.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Address.java
@@ -32,7 +32,7 @@ import com.google.common.base.Optional;
  * Represents an Address resource.
  *
  * @author Andrew Bayer
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/addresses"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/addresses"/>
  */
 @Beta
 public final class Address extends Resource {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Disk.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Disk.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Disk.java
index a986eba..15ecf69 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Disk.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Disk.java
@@ -30,7 +30,7 @@ import com.google.common.base.Objects;
  * A persistent disk resource
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/disks"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/disks"/>
  */
 @Beta
 public final class Disk extends AbstractDisk {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Firewall.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Firewall.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Firewall.java
index 42d66cf..64c9221 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Firewall.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Firewall.java
@@ -40,7 +40,7 @@ import com.google.common.collect.TreeRangeSet;
  * Represents a network firewall
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/firewalls"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/firewalls"/>
  * @see <a href="https://developers.google.com/compute/docs/networking#firewalls"/>
  */
 @Beta
@@ -243,7 +243,7 @@ public final class Firewall extends Resource {
     * permitted connection.
     *
     * @author David Alves
-    * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/firewalls"/>
+    * @see <a href="https://developers.google.com/compute/docs/reference/v1/firewalls"/>
     */
    public static final class Rule {
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Image.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Image.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Image.java
index b48afee..0c05cc6 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Image.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Image.java
@@ -33,25 +33,23 @@ import com.google.common.base.Optional;
  * Represents a disk image to use on an instance.
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/images"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/images"/>
  */
 @Beta
 public final class Image extends Resource {
 
    private final String sourceType;
-   private final Optional<URI> preferredKernel;
    private final RawDisk rawDisk;
    private final Optional<Deprecated> deprecated;
 
    @ConstructorProperties({
-           "id", "creationTimestamp", "selfLink", "name", "description", "sourceType", "preferredKernel",
+           "id", "creationTimestamp", "selfLink", "name", "description", "sourceType",
            "rawDisk", "deprecated"
    })
    protected Image(String id, Date creationTimestamp, URI selfLink, String name, String description,
-                   String sourceType, URI preferredKernel, RawDisk rawDisk, Deprecated deprecated) {
+                   String sourceType, RawDisk rawDisk, Deprecated deprecated) {
       super(Kind.IMAGE, id, creationTimestamp, selfLink, name, description);
       this.sourceType = checkNotNull(sourceType, "sourceType of %s", name);
-      this.preferredKernel = fromNullable(preferredKernel);
       this.rawDisk = checkNotNull(rawDisk, "rawDisk of %s", name);
       this.deprecated = fromNullable(deprecated);
    }
@@ -64,13 +62,6 @@ public final class Image extends Resource {
    }
 
    /**
-    * @return An optional URL of the preferred kernel for use with this disk image.
-    */
-   public Optional<URI> getPreferredKernel() {
-      return preferredKernel;
-   }
-
-   /**
     * @return the raw disk image parameters.
     */
    public RawDisk getRawDisk() {
@@ -91,7 +82,6 @@ public final class Image extends Resource {
       return super.string()
               .omitNullValues()
               .add("sourceType", sourceType)
-              .add("preferredKernel", preferredKernel.orNull())
               .add("rawDisk", rawDisk)
               .add("deprecated", deprecated.orNull());
    }
@@ -115,7 +105,6 @@ public final class Image extends Resource {
    public static final class Builder extends Resource.Builder<Builder> {
 
       private String sourceType;
-      private URI preferredKernel;
       private RawDisk rawDisk;
       private Deprecated deprecated;
 
@@ -128,14 +117,6 @@ public final class Image extends Resource {
       }
 
       /**
-       * @see Image#getPreferredKernel()
-       */
-      public Builder preferredKernel(URI preferredKernel) {
-         this.preferredKernel = preferredKernel;
-         return this;
-      }
-
-      /**
        * @see Image#getDeprecated()
        */
       public Builder deprecated(Deprecated deprecated) {
@@ -158,13 +139,12 @@ public final class Image extends Resource {
 
       public Image build() {
          return new Image(super.id, super.creationTimestamp, super.selfLink, super.name,
-                 super.description, sourceType, preferredKernel, rawDisk, deprecated);
+                 super.description, sourceType, rawDisk, deprecated);
       }
 
       public Builder fromImage(Image in) {
          return super.fromResource(in)
                  .sourceType(in.getSourceType())
-                 .preferredKernel(in.getPreferredKernel().orNull())
                  .rawDisk(in.getRawDisk())
                  .deprecated(in.getDeprecated().orNull());
       }
@@ -175,7 +155,7 @@ public final class Image extends Resource {
     * A raw disk image, usually the base for an image.
     *
     * @author David Alves
-    * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/images"/>
+    * @see <a href="https://developers.google.com/compute/docs/reference/v1/images"/>
     */
    public static class RawDisk {
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Instance.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Instance.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Instance.java
index 19c9e52..ee8f356 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Instance.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Instance.java
@@ -20,6 +20,7 @@ import static com.google.common.base.Objects.equal;
 import static com.google.common.base.Objects.toStringHelper;
 import static com.google.common.base.Optional.fromNullable;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.getLast;
 
 import java.beans.ConstructorProperties;
 import java.net.URI;
@@ -31,13 +32,14 @@ import org.jclouds.javax.annotation.Nullable;
 import com.google.common.annotations.Beta;
 import com.google.common.base.Objects;
 import com.google.common.base.Optional;
+import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableSet;
 
 /**
  * Represents a virtual machine.
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/instances"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/instances"/>
  */
 @Beta
 public class Instance extends Resource {
@@ -52,7 +54,6 @@ public class Instance extends Resource {
    }
 
    protected final Tags tags;
-   protected final URI image;
    protected final URI machineType;
    protected final Status status;
    protected final Optional<String> statusMessage;
@@ -63,12 +64,11 @@ public class Instance extends Resource {
    protected final Set<ServiceAccount> serviceAccounts;
 
    protected Instance(String id, Date creationTimestamp, URI selfLink, String name, String description,
-                      Tags tags, URI image, URI machineType, Status status, String statusMessage,
+                      Tags tags, URI machineType, Status status, String statusMessage,
                       URI zone, Set<NetworkInterface> networkInterfaces, Set<AttachedDisk> disks,
                       Metadata metadata, Set<ServiceAccount> serviceAccounts) {
       super(Kind.INSTANCE, id, creationTimestamp, selfLink, name, description);
       this.tags = checkNotNull(tags, "tags");
-      this.image = checkNotNull(image, "image");
       this.machineType = checkNotNull(machineType, "machineType of %s", name);
       this.status = checkNotNull(status, "status");
       this.statusMessage = fromNullable(statusMessage);
@@ -90,13 +90,6 @@ public class Instance extends Resource {
    }
 
    /**
-    * @return the URL of the disk image resource to be to be installed on this instance.
-    */
-   public URI getImage() {
-      return image;
-   }
-
-   /**
     * @return URL of the machine type resource describing which machine type to use to host the instance.
     */
    public URI getMachineType() {
@@ -178,7 +171,6 @@ public class Instance extends Resource {
       return super.string()
               .omitNullValues()
               .add("items", tags)
-              .add("image", image)
               .add("machineType", machineType)
               .add("status", status)
               .add("statusMessage", statusMessage.orNull())
@@ -208,7 +200,6 @@ public class Instance extends Resource {
    public static final class Builder extends Resource.Builder<Builder> {
 
       private Tags tags;
-      private URI image;
       private URI machineType;
       private Status status;
       private String statusMessage;
@@ -228,14 +219,6 @@ public class Instance extends Resource {
       }
 
       /**
-       * @see Instance#getImage()
-       */
-      public Builder image(URI image) {
-         this.image = image;
-         return this;
-      }
-
-      /**
        * @see Instance#getMachineType()
        */
       public Builder machineType(URI machineType) {
@@ -331,14 +314,13 @@ public class Instance extends Resource {
 
       public Instance build() {
          return new Instance(super.id, super.creationTimestamp, super.selfLink, super.name,
-                 super.description, tags, image, machineType, status, statusMessage, zone,
+                 super.description, tags, machineType, status, statusMessage, zone,
                  networkInterfaces.build(), disks.build(), metadata, serviceAccounts.build());
       }
 
       public Builder fromInstance(Instance in) {
          return super.fromResource(in)
                  .tags(in.getTags())
-                 .image(in.getImage())
                  .machineType(in.getMachineType())
                  .status(in.getStatus())
                  .statusMessage(in.getStatusMessage().orNull())
@@ -469,7 +451,7 @@ public class Instance extends Resource {
    /**
     * A disk attached to an Instance.
     *
-    * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/instances"/>
+    * @see <a href="https://developers.google.com/compute/docs/reference/v1/instances"/>
     */
    public static class AttachedDisk {
 
@@ -537,20 +519,23 @@ public class Instance extends Resource {
          READ_ONLY;
       }
 
-      @ConstructorProperties({"mode", "source", "deviceName", "index", "deleteOnTerminate"})
+      @ConstructorProperties({"mode", "source", "deviceName", "index", "deleteOnTerminate",
+              "boot"})
       public PersistentAttachedDisk(Mode mode, URI source, String deviceName, Integer index,
-                                    boolean deleteOnTerminate) {
+                                    boolean deleteOnTerminate, boolean boot) {
          super(index);
          this.mode = checkNotNull(mode, "mode");
          this.source = checkNotNull(source, "source");
          this.deviceName = fromNullable(deviceName);
          this.deleteOnTerminate = deleteOnTerminate;
+         this.boot = boot;
       }
 
       private final Mode mode;
       private final URI source;
       private final boolean deleteOnTerminate;
       private final Optional<String> deviceName;
+      private final boolean boot;
 
       @Override
       public boolean isPersistent() {
@@ -572,6 +557,13 @@ public class Instance extends Resource {
       }
 
       /**
+       * @return the Name of the persistent disk resource
+       */
+      public String getSourceDiskName() {
+         return getLast(Splitter.on("/").split(source.toString()), null);
+      }
+
+      /**
        * @return Must be unique within the instance when specified. This represents a unique
        *         device name that is reflected into the /dev/ tree of a Linux operating system running within the
        *         instance. If not specified, a default will be chosen by the system.
@@ -588,10 +580,25 @@ public class Instance extends Resource {
          return deleteOnTerminate;
       }
 
+      /**
+       * @return If true, this is the boot disk for this instance.
+       */
+      public boolean isBoot() {
+         return boot;
+      }
+
       public static Builder builder() {
          return new Builder();
       }
 
+      /**
+       * {@inheritDoc}
+       */
+      protected Objects.ToStringHelper string() {
+         return toStringHelper(this).add("boot", boot);
+      }
+
+
       public static final class Builder {
 
          private Mode mode;
@@ -599,6 +606,7 @@ public class Instance extends Resource {
          private String deviceName;
          private Integer index;
          private boolean deleteOnTerminate;
+         private boolean boot;
 
          /**
           * @see org.jclouds.googlecomputeengine.domain.Instance.PersistentAttachedDisk#getMode()
@@ -640,9 +648,17 @@ public class Instance extends Resource {
             return this;
          }
 
+         /**
+          * @see org.jclouds.googlecomputeengine.domain.Instance.PersistentAttachedDisk#isBoot()
+          */
+         public Builder boot(Boolean boot) {
+            this.boot = boot;
+            return this;
+         }
+
          public PersistentAttachedDisk build() {
             return new PersistentAttachedDisk(this.mode, this.source, this.deviceName, this.index,
-                    this.deleteOnTerminate);
+                    this.deleteOnTerminate, this.boot);
          }
 
          public Builder fromPersistentAttachedDisk(PersistentAttachedDisk in) {
@@ -650,7 +666,8 @@ public class Instance extends Resource {
                     .source(in.getSource())
                     .deviceName(in.getDeviceName().orNull())
                     .index(in.getIndex())
-                    .deleteOnTerminate(in.isDeleteOnTerminate());
+                    .deleteOnTerminate(in.isDeleteOnTerminate())
+                    .boot(in.isBoot());
          }
       }
    }
@@ -658,7 +675,7 @@ public class Instance extends Resource {
    /**
     * A network interface for an Instance.
     *
-    * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/instances"/>
+    * @see <a href="https://developers.google.com/compute/docs/reference/v1/instances"/>
     */
    public static final class NetworkInterface {
 
@@ -952,7 +969,7 @@ public class Instance extends Resource {
     * The output of an instance's serial port;
     *
     * @author David Alves
-    * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/instances/serialPort"/>
+    * @see <a href="https://developers.google.com/compute/docs/reference/v1/instances/serialPort"/>
     */
    public static final class SerialPortOutput {
 
@@ -1060,7 +1077,7 @@ public class Instance extends Resource {
     * A service account for which access tokens are to be made available to the instance through metadata queries.
     *
     * @author David Alves
-    * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/instances"/>
+    * @see <a href="https://developers.google.com/compute/docs/reference/v1/instances"/>
     */
    public static final class ServiceAccount {
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceTemplate.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceTemplate.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceTemplate.java
index a8d52c2..328b0bc 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceTemplate.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceTemplate.java
@@ -21,11 +21,13 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import static org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface.AccessConfig.Type;
 
 import java.net.URI;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
@@ -42,7 +44,7 @@ public class InstanceTemplate {
    protected URI image;
    protected Set<Instance.ServiceAccount> serviceAccounts = Sets.newLinkedHashSet();
 
-   protected transient Set<PersistentDisk> disks = Sets.newLinkedHashSet();
+   protected transient List<PersistentDisk> disks = Lists.newArrayList();
    protected transient Set<NetworkInterface> networkInterfaces = Sets.newLinkedHashSet();
    protected transient Map<String, String> metadata = Maps.newLinkedHashMap();
    protected transient String machineTypeName;
@@ -100,7 +102,15 @@ public class InstanceTemplate {
     * @see org.jclouds.googlecomputeengine.domain.Instance#getDisks()
     */
    public InstanceTemplate addDisk(PersistentDisk.Mode mode, URI source) {
-      this.disks.add(new PersistentDisk(mode, source, null, null));
+      this.disks.add(new PersistentDisk(mode, source, null, false, false));
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Instance#getDisks()
+    */
+   public InstanceTemplate addDisk(PersistentDisk.Mode mode, URI source, Boolean deleteOnTerminate) {
+      this.disks.add(new PersistentDisk(mode, source, null, deleteOnTerminate, false));
       return this;
    }
 
@@ -108,15 +118,24 @@ public class InstanceTemplate {
     * @see org.jclouds.googlecomputeengine.domain.Instance#getDisks()
     */
    public InstanceTemplate addDisk(PersistentDisk.Mode mode, URI source, String deviceName, Boolean deleteOnTerminate) {
-      this.disks.add(new PersistentDisk(mode, source, deviceName, deleteOnTerminate));
+      this.disks.add(new PersistentDisk(mode, source, deviceName, deleteOnTerminate, false));
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Instance#getDisks()
+    */
+   public InstanceTemplate addDisk(PersistentDisk.Mode mode, URI source, String deviceName,
+                                   Boolean deleteOnTerminate, Boolean boot) {
+      this.disks.add(new PersistentDisk(mode, source, deviceName, deleteOnTerminate, boot));
       return this;
    }
 
    /**
     * @see org.jclouds.googlecomputeengine.domain.Instance#getDisks()
     */
-   public InstanceTemplate disks(Set<PersistentDisk> disks) {
-      this.disks = Sets.newLinkedHashSet();
+   public InstanceTemplate disks(List<PersistentDisk> disks) {
+      this.disks = Lists.newArrayList();
       this.disks.addAll(checkNotNull(disks, "disks"));
       return this;
    }
@@ -198,7 +217,7 @@ public class InstanceTemplate {
    /**
     * @see org.jclouds.googlecomputeengine.domain.Instance#getDisks()
     */
-   public Set<PersistentDisk> getDisks() {
+   public List<PersistentDisk> getDisks() {
       return disks;
    }
 
@@ -290,17 +309,20 @@ public class InstanceTemplate {
          READ_ONLY
       }
 
-      public PersistentDisk(Mode mode, URI source, String deviceName, Boolean deleteOnTerminate) {
+      public PersistentDisk(Mode mode, URI source, String deviceName, Boolean deleteOnTerminate,
+                            Boolean boot) {
          this.mode = checkNotNull(mode, "mode");
          this.source = checkNotNull(source, "source");
          this.deviceName = deviceName;
-         this.deleteOnTerminate = deleteOnTerminate;
+         this.deleteOnTerminate = checkNotNull(deleteOnTerminate, "deleteOnTerminate");
+         this.boot = checkNotNull(boot, "boot");
       }
 
       private final Mode mode;
       private final URI source;
       private final Boolean deleteOnTerminate;
       private final String deviceName;
+      private final Boolean boot;
 
       /**
        * @return the mode in which to attach this disk, either READ_WRITE or READ_ONLY.
@@ -332,6 +354,13 @@ public class InstanceTemplate {
       public boolean isDeleteOnTerminate() {
          return deleteOnTerminate;
       }
+
+      /**
+       * @return If true, boot from this disk.
+       */
+      public boolean isBoot() {
+         return boot;
+      }
    }
 
    public static class NetworkInterface {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Kernel.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Kernel.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Kernel.java
deleted file mode 100644
index 127ebdd..0000000
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Kernel.java
+++ /dev/null
@@ -1,91 +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.domain;
-
-import static com.google.common.base.Optional.fromNullable;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.beans.ConstructorProperties;
-import java.net.URI;
-import java.util.Date;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Optional;
-
-/**
- * Represents a kernel.
- *
- * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/kernels"/>
- */
-@Beta
-public final class Kernel extends Resource {
-   private final Optional<Deprecated> deprecated;
-
-   @ConstructorProperties({
-           "id", "creationTimestamp", "selfLink", "name", "description", "deprecated"
-   })
-   private Kernel(String id, Date creationTimestamp, URI selfLink, String name, String description,
-                  Deprecated deprecated) {
-      super(Kind.KERNEL, id, creationTimestamp, selfLink, name, description);
-      this.deprecated = fromNullable(deprecated);
-   }
-
-   /**
-    * @return the deprecation information for this kernel
-    */
-   public Optional<Deprecated> getDeprecated() {
-      return deprecated;
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public Builder toBuilder() {
-      return new Builder().fromKernel(this);
-   }
-
-   public static final class Builder extends Resource.Builder<Builder> {
-
-      private Deprecated deprecated;
-
-      /**
-       * @see Kernel#getDeprecated()
-       */
-      public Builder deprecated(Deprecated deprecated) {
-         this.deprecated = checkNotNull(deprecated, "deprecated");
-         return this;
-      }
-
-      @Override
-      protected Builder self() {
-         return this;
-      }
-
-      public Kernel build() {
-         return new Kernel(super.id, super.creationTimestamp, super.selfLink, super.name,
-                 super.description, deprecated);
-      }
-
-      public Builder fromKernel(Kernel in) {
-         return super.fromResource(in)
-                 .deprecated(in.getDeprecated().orNull());
-      }
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java
index 86b1a2c..c18ec58 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java
@@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableList;
  * Represents a machine type used to host an instance.
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/machineTypes"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/machineTypes"/>
  */
 @Beta
 public final class MachineType extends Resource {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java
index 2235873..166fa89 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java
@@ -32,7 +32,7 @@ import com.google.common.base.Optional;
  * Represents a network used to enable instance communication.
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/networks"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/networks"/>
  */
 @Beta
 public final class Network extends Resource {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java
index b3547ce..ee292cd 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java
@@ -38,7 +38,7 @@ import com.google.common.collect.ImmutableList;
  * Describes an operation being executed on some Resource
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/operations"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/operations"/>
  */
 @Beta
 public class Operation extends Resource {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java
index 7b036a0..3c17130 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java
@@ -27,7 +27,7 @@ import com.google.common.base.Objects.ToStringHelper;
 /**
  * Quotas assigned to a given project or region.
  *
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/projects#resource"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/projects#resource"/>
  */
 @Beta
 public class Quota {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java
index 4bd260b..c8d8094 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java
@@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableSet;
  * Represents a region resource.
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/regions"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/regions"/>
  */
 @Beta
 public final class Region extends Resource {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java
index 8abb381..98cb368 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java
@@ -57,8 +57,6 @@ public class Resource {
       OPERATION_LIST,
       INSTANCE,
       INSTANCE_LIST,
-      KERNEL,
-      KERNEL_LIST,
       MACHINE_TYPE,
       MACHINE_TYPE_LIST,
       PROJECT,

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java
index 73acd26..a981b75 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java
@@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableSet;
  * Represents a route resource.
  *
  * @author Andrew Bayer
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/routes"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/routes"/>
  */
 @Beta
 public final class Route extends Resource {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Snapshot.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Snapshot.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Snapshot.java
index 5528047..821eebb 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Snapshot.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Snapshot.java
@@ -31,7 +31,7 @@ import com.google.common.base.Optional;
  * A Persistent Disk Snapshot resource.
  *
  * @author Andrew Bayer
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/snapshots"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/snapshots"/>
  */
 @Beta
 public final class Snapshot extends AbstractDisk {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Zone.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Zone.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Zone.java
index c672222..1bf7df3 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Zone.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Zone.java
@@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableSet;
  * Represents a zone resource.
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/zones"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/zones"/>
  */
 @Beta
 public final class Zone extends Resource {
@@ -182,7 +182,7 @@ public final class Zone extends Resource {
     * Scheduled maintenance windows for the zone. When the zone is in a maintenance window,
     * all resources which reside in the zone will be unavailable.
     *
-    * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/zones"/>
+    * @see <a href="https://developers.google.com/compute/docs/reference/v1/zones"/>
     */
    public static final class MaintenanceWindow {
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/AddressApi.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/AddressApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/AddressApi.java
index 042fc59..abf08eb 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/AddressApi.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/AddressApi.java
@@ -55,7 +55,7 @@ import org.jclouds.rest.binders.BindToJsonPayload;
  * Provides access to Addresses via their REST API.
  *
  * @author Andrew Bayer
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/addresses"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/addresses"/>
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(OAuthAuthenticator.class)

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/DiskApi.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/DiskApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/DiskApi.java
index 5c49de1..028edbc 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/DiskApi.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/DiskApi.java
@@ -55,7 +55,7 @@ import org.jclouds.rest.binders.BindToJsonPayload;
  * Provides access to Disks via their REST API.
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/disks"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/disks"/>
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(OAuthAuthenticator.class)
@@ -98,6 +98,50 @@ public interface DiskApi {
                           @PathParam("zone") String zone);
 
    /**
+    * Creates a persistent disk resource from the specified image, in the specified project,
+    * specifying the size of the disk.
+    *
+    * @param sourceImage fully qualified URL for the image to be copied.
+    * @param diskName the name of disk.
+    * @param sizeGb   the size of the disk
+    * @param zone     the name of the zone where the disk is to be created.
+    * @return an Operation resource. To check on the status of an operation, poll the Operations resource returned to
+    *         you, and look for the status field.
+    */
+   @Named("Disks:insert")
+   @POST
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Produces(MediaType.APPLICATION_JSON)
+   @Path("/zones/{zone}/disks")
+   @OAuthScopes({COMPUTE_SCOPE})
+   @MapBinder(BindToJsonPayload.class)
+   Operation createFromImageWithSizeInZone(@QueryParam("sourceImage") String sourceImage,
+                                           @PayloadParam("name") String diskName,
+                                           @PayloadParam("sizeGb") int sizeGb,
+                                           @PathParam("zone") String zone);
+
+   /**
+    * Creates a persistent disk resource from the specified image, in the specified project,
+    * with the default disk size.
+    *
+    * @param sourceImage fully qualified URL for the image to be copied.
+    * @param diskName the name of disk.
+    * @param zone     the name of the zone where the disk is to be created.
+    * @return an Operation resource. To check on the status of an operation, poll the Operations resource returned to
+    *         you, and look for the status field.
+    */
+   @Named("Disks:insert")
+   @POST
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Produces(MediaType.APPLICATION_JSON)
+   @Path("/zones/{zone}/disks")
+   @OAuthScopes({COMPUTE_SCOPE})
+   @MapBinder(BindToJsonPayload.class)
+   Operation createFromImageInZone(@QueryParam("sourceImage") String sourceImage,
+                                   @PayloadParam("name") String diskName,
+                                   @PathParam("zone") String zone);
+
+   /**
     * Deletes the specified persistent disk resource.
     *
     * @param zone     the zone the disk is in.

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/FirewallApi.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/FirewallApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/FirewallApi.java
index df034e4..3b607e3 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/FirewallApi.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/FirewallApi.java
@@ -63,7 +63,7 @@ import org.jclouds.rest.binders.BindToJsonPayload;
  * <p/>
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/firewalls"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/firewalls"/>
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(OAuthAuthenticator.class)

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/GlobalOperationApi.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/GlobalOperationApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/GlobalOperationApi.java
index 7a9a5b4..fd0251a 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/GlobalOperationApi.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/GlobalOperationApi.java
@@ -49,7 +49,7 @@ import org.jclouds.rest.annotations.Transform;
  * Provides access to Global Operations via their REST API.
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/globalOperations"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/globalOperations"/>
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(OAuthAuthenticator.class)

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ImageApi.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ImageApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ImageApi.java
index ff55184..23d3251 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ImageApi.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ImageApi.java
@@ -51,7 +51,7 @@ import org.jclouds.rest.annotations.Transform;
  * <p/>
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/images"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/images"/>
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(OAuthAuthenticator.class)

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/2aa7340a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/InstanceApi.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/InstanceApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/InstanceApi.java
index 88a4f83..dbcc366 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/InstanceApi.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/InstanceApi.java
@@ -63,7 +63,7 @@ import org.jclouds.rest.binders.BindToJsonPayload;
  * Provides access to Instances via their REST API.
  *
  * @author David Alves
- * @see <a href="https://developers.google.com/compute/docs/reference/v1beta16/instances"/>
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/instances"/>
  * @see InstanceApi
  */
 @SkipEncoding({'/', '='})