You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2014/12/09 17:59:23 UTC

jclouds-labs-google git commit: Updates to InstanceApi. 100% coverage

Repository: jclouds-labs-google
Updated Branches:
  refs/heads/master d3205b1b2 -> 8e4a17f57


Updates to InstanceApi. 100% coverage


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

Branch: refs/heads/master
Commit: 8e4a17f57092760cc04243514b49365cd98ffd07
Parents: d3205b1
Author: Daniel Broudy <br...@google.com>
Authored: Thu Dec 4 15:29:21 2014 -0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Dec 9 17:54:08 2014 +0100

----------------------------------------------------------------------
 .../GoogleComputeEngineServiceAdapter.java      |   2 +
 .../googlecomputeengine/domain/AttachDisk.java  |  31 ++--
 .../googlecomputeengine/domain/Instance.java    |  37 +++--
 .../googlecomputeengine/domain/NewInstance.java |  18 ++-
 .../features/InstanceApi.java                   |   8 +-
 .../features/InstanceApiLiveTest.java           |  28 +++-
 .../features/InstanceApiMockTest.java           |  54 ++++++-
 .../parse/ParseInstanceSerialOutputTest.java    |  11 +-
 .../parse/ParseInstanceTest.java                |  14 +-
 .../test/resources/instance_attach_disk.json    |  21 ++-
 .../src/test/resources/instance_get.json        |  13 +-
 .../src/test/resources/instance_list.json       | 155 ++++++++++---------
 .../test/resources/instance_serial_port.json    |   5 +-
 13 files changed, 271 insertions(+), 126 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/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 fb3f7f6..29f239d 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
@@ -153,6 +153,7 @@ public final class GoogleComputeEngineServiceAdapter
       // We need to see the created instance so that we can access the newly created disk.
       AtomicReference<Instance> instance = Atomics.newReference(Instance.create( //
             "0000000000000000000", // id can't be null, but isn't available until provisioning is done.
+            null, // creationTimestamp
             create.targetLink(), // selfLink
             newInstance.name(), // name
             newInstance.description(), // description
@@ -161,6 +162,7 @@ public final class GoogleComputeEngineServiceAdapter
             Instance.Status.PROVISIONING, // status
             null, // statusMessage
             create.zone(), // zone
+            null, // canIpForward
             null, // networkInterfaces
             null, // disks
             newInstance.metadata(), // metadata

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AttachDisk.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AttachDisk.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AttachDisk.java
index 22db29b..6306715 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AttachDisk.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AttachDisk.java
@@ -17,6 +17,7 @@
 package org.jclouds.googlecomputeengine.domain;
 
 import java.net.URI;
+import java.util.List;
 
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
@@ -26,7 +27,7 @@ import com.google.auto.value.AutoValue;
 @AutoValue
 public abstract class AttachDisk {
    @AutoValue
-   abstract static class InitializeParams {
+   public abstract static class InitializeParams {
       /** Override the default naming convention. */
       @Nullable public abstract String diskName();
 
@@ -36,13 +37,15 @@ public abstract class AttachDisk {
       /** The {@link org.jclouds.googlecomputeengine.domain.Image#selfLink() source image}. */
       public abstract URI sourceImage();
 
+      @Nullable public abstract String diskType();
+
       static InitializeParams create(URI sourceImage) {
-         return create(null, null, sourceImage);
+         return create(null, null, sourceImage, null);
       }
 
-      @SerializedNames({ "diskName", "diskSizeGb", "sourceImage" })
-      static InitializeParams create(String diskName, Long diskSizeGb, URI sourceImage) {
-         return new AutoValue_AttachDisk_InitializeParams(diskName, diskSizeGb, sourceImage);
+      @SerializedNames({ "diskName", "diskSizeGb", "sourceImage", "diskType" })
+      public static InitializeParams create(String diskName, Long diskSizeGb, URI sourceImage, String diskType) {
+         return new AutoValue_AttachDisk_InitializeParams(diskName, diskSizeGb, sourceImage, diskType);
       }
 
       InitializeParams() {
@@ -59,6 +62,11 @@ public abstract class AttachDisk {
       READ_ONLY;
    }
 
+   public enum DiskInterface {
+      NVME,
+      SCSI;
+   }
+
    public abstract Type type();
 
    @Nullable public abstract Mode mode();
@@ -82,6 +90,11 @@ public abstract class AttachDisk {
    /** True if this disk will be deleted when the instance is delete. */
    public abstract boolean autoDelete();
 
+   @Nullable public abstract List<String> licenses();
+
+   // Note: this is disks[].interface in the api docs but interface is a Java keyword.
+   @Nullable public abstract DiskInterface diskInterface();
+
    public static AttachDisk existingBootDisk(URI existingBootDisk) {
       return create(Type.PERSISTENT, existingBootDisk, null, true, false);
    }
@@ -96,13 +109,13 @@ public abstract class AttachDisk {
 
    static AttachDisk create(Type type, URI source, InitializeParams initializeParams, boolean boot,
             boolean autoDelete) {
-         return create(type, null, source, null, boot, initializeParams, autoDelete);
+         return create(type, null, source, null, boot, initializeParams, autoDelete, null, null);
       }
 
-   @SerializedNames({"type", "mode", "source", "deviceName", "boot", "initializeParams", "autoDelete" })
+   @SerializedNames({"type", "mode", "source", "deviceName", "boot", "initializeParams", "autoDelete", "licenses", "interface" })
    public static AttachDisk create(Type type, Mode mode, URI source, String deviceName, boolean boot, InitializeParams initializeParams,
-         boolean autoDelete) {
-      return new AutoValue_AttachDisk(type, mode, source, deviceName, boot, initializeParams, autoDelete);
+         boolean autoDelete, List<String> licenses, DiskInterface diskInterface) {
+      return new AutoValue_AttachDisk(type, mode, source, deviceName, boot, initializeParams, autoDelete, licenses, diskInterface);
    }
 
    AttachDisk() {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/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 be5b1e5..cdc2ee4 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
@@ -19,8 +19,11 @@ package org.jclouds.googlecomputeengine.domain;
 import static org.jclouds.googlecloud.internal.NullSafeCopies.copyOf;
 
 import java.net.URI;
+import java.util.Date;
 import java.util.List;
 
+import org.jclouds.googlecomputeengine.domain.AttachDisk.DiskInterface;
+import org.jclouds.googlecomputeengine.domain.AttachDisk.InitializeParams;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
@@ -63,10 +66,20 @@ public abstract class Instance {
 
       public abstract boolean boot();
 
-      @SerializedNames({ "index", "type", "mode", "source", "deviceName", "autoDelete", "boot" })
+      @Nullable public abstract InitializeParams initializeParams();
+
+      @Nullable public abstract List<String> licenses();
+
+      // Note: this is disks[].interface in the api docs but interface is a Java keyword.
+      @Nullable public abstract DiskInterface diskInterface();
+
+      @SerializedNames({ "index", "type", "mode", "source", "deviceName", "autoDelete", "boot",
+         "initializeParams", "licenses", "interface" })
       public static AttachedDisk create(int index, Type type, Mode mode, URI source, String deviceName,
-            boolean autoDelete, boolean boot) {
-         return new AutoValue_Instance_AttachedDisk(index, type, mode, source, deviceName, autoDelete, boot);
+            boolean autoDelete, boolean boot, InitializeParams initializeParams,
+            List<String> licenses, DiskInterface diskInterface) {
+         return new AutoValue_Instance_AttachedDisk(index, type, mode, source, deviceName, autoDelete,
+               boot, initializeParams, licenses, diskInterface);
       }
 
       AttachedDisk() {
@@ -124,7 +137,7 @@ public abstract class Instance {
    @AutoValue
    public abstract static class SerialPortOutput {
 
-      @Nullable public abstract URI selfLink(); // TODO: is this really nullable?!
+      public abstract URI selfLink();
 
       /** The contents of the console output. */
       public abstract String contents();
@@ -200,6 +213,8 @@ public abstract class Instance {
 
    public abstract String id();
 
+   @Nullable public abstract Date creationTimestamp();
+
    public abstract URI selfLink();
 
    public abstract String name();
@@ -221,6 +236,8 @@ public abstract class Instance {
     */
    public abstract URI zone();
 
+   @Nullable public abstract Boolean canIpForward();
+
    public abstract List<NetworkInterface> networkInterfaces();
 
    public abstract List<AttachedDisk> disks();
@@ -231,13 +248,13 @@ public abstract class Instance {
 
    public abstract Scheduling scheduling();
 
-   @SerializedNames({ "id", "selfLink", "name", "description", "tags", "machineType", "status", "statusMessage", "zone",
-         "networkInterfaces", "disks", "metadata", "serviceAccounts", "scheduling"})
-   public static Instance create(String id, URI selfLink, String name, String description, Tags tags, URI machineType,
-         Status status, String statusMessage, URI zone, List<NetworkInterface> networkInterfaces,
+   @SerializedNames({ "id", "creationTimestamp", "selfLink", "name", "description", "tags", "machineType", "status", "statusMessage", "zone",
+         "canIpForward", "networkInterfaces", "disks", "metadata", "serviceAccounts", "scheduling"})
+   public static Instance create(String id, Date creationTimestamp, URI selfLink, String name, String description, Tags tags, URI machineType,
+         Status status, String statusMessage, URI zone, Boolean canIpForward, List<NetworkInterface> networkInterfaces,
          List<AttachedDisk> disks, Metadata metadata, List<ServiceAccount> serviceAccounts, Scheduling scheduling) {
-      return new AutoValue_Instance(id, selfLink, name, description, tags, machineType, status, statusMessage, zone,
-            copyOf(networkInterfaces), copyOf(disks), metadata, copyOf(serviceAccounts), scheduling);
+      return new AutoValue_Instance(id, creationTimestamp, selfLink, name, description, tags, machineType, status, statusMessage, zone,
+            canIpForward, copyOf(networkInterfaces), copyOf(disks), metadata, copyOf(serviceAccounts), scheduling);
    }
 
    Instance() {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/NewInstance.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/NewInstance.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/NewInstance.java
index e70c9dd..fb45764 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/NewInstance.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/NewInstance.java
@@ -24,6 +24,7 @@ import java.util.List;
 
 import org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface.AccessConfig;
 import org.jclouds.googlecomputeengine.domain.Instance.Scheduling;
+import org.jclouds.googlecomputeengine.domain.Instance.ServiceAccount;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
@@ -56,6 +57,8 @@ public abstract class NewInstance {
 
    public abstract URI machineType();
 
+   @Nullable public abstract Boolean canIpForward();
+
    public abstract List<NetworkInterface> networkInterfaces();
 
    public abstract List<AttachDisk> disks();
@@ -67,6 +70,8 @@ public abstract class NewInstance {
    /** Add metadata via {@link Metadata#items()}. */
    public abstract Metadata metadata();
 
+   @Nullable public abstract List<ServiceAccount> serviceAccounts();
+
    @Nullable public abstract Scheduling scheduling();
 
    /** Convenience for creating a new instance with only a boot disk and minimal parameters. */
@@ -83,14 +88,15 @@ public abstract class NewInstance {
             foundBoot = true;
          }
       }
-      return create(name, machineType, ImmutableList.of(NetworkInterface.create(network)), ImmutableList.copyOf(disks),
-            description, Tags.create(), Metadata.create(), null);
+      return create(name, machineType, null, ImmutableList.of(NetworkInterface.create(network)), ImmutableList.copyOf(disks),
+            description, Tags.create(), Metadata.create(), null, null);
    }
 
-   @SerializedNames({ "name", "machineType", "networkInterfaces", "disks", "description", "tags", "metadata", "scheduling" })
-   static NewInstance create(String name, URI machineType, List<NetworkInterface> networkInterfaces,
-         List<AttachDisk> disks, String description, Tags tags, Metadata metadata, Scheduling scheduling) {
-      return new AutoValue_NewInstance(name, machineType, networkInterfaces, disks, description, tags, metadata, scheduling);
+   @SerializedNames({ "name", "machineType", "canIpForward", "networkInterfaces", "disks", "description", "tags", "metadata",
+      "serviceAccounts", "scheduling" })
+   static NewInstance create(String name, URI machineType, Boolean canIpForward, List<NetworkInterface> networkInterfaces,
+         List<AttachDisk> disks, String description, Tags tags, Metadata metadata, List<ServiceAccount> serviceAccounts, Scheduling scheduling) {
+      return new AutoValue_NewInstance(name, machineType, canIpForward, networkInterfaces, disks, description, tags, metadata, serviceAccounts, scheduling);
    }
 
    NewInstance() {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/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 0b61795..7097191 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
@@ -107,7 +107,7 @@ public interface InstanceApi {
    Operation addAccessConfigToNic(@PathParam("instance") String instance,
                                   @BinderParam(BindToJsonPayload.class)
                                   AccessConfig accessConfig,
-                                  @QueryParam("network_interface") String networkInterfaceName);
+                                  @QueryParam("networkInterface") String networkInterfaceName);
 
    /**
     * Deletes an access config from an instance's network interface.
@@ -122,8 +122,8 @@ public interface InstanceApi {
    @DELETE
    @Path("/{instance}/deleteAccessConfig")
    Operation deleteAccessConfigFromNic(@PathParam("instance") String instance,
-                                       @QueryParam("access_config") String accessConfigName,
-                                       @QueryParam("network_interface") String networkInterfaceName);
+                                       @QueryParam("accessConfig") String accessConfigName,
+                                       @QueryParam("networkInterface") String networkInterfaceName);
 
    /**
     * Returns the specified instance's serial port output.
@@ -131,7 +131,7 @@ public interface InstanceApi {
     * @param instance the instance name.
     * @return if successful, this method returns a SerialPortOutput containing the instance's serial output.
     */
-   @Named("Instances:serialPort")
+   @Named("Instances:getSerialPortOutput")
    @GET
    @Path("/{instance}/serialPort")
    SerialPortOutput getSerialPortOutput(@PathParam("instance") String instance);

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java
index fa5676e..bcff586 100644
--- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java
+++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java
@@ -33,6 +33,7 @@ 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.Scheduling;
+import org.jclouds.googlecomputeengine.domain.Instance.SerialPortOutput;
 import org.jclouds.googlecomputeengine.domain.Metadata;
 import org.jclouds.googlecomputeengine.domain.NewInstance;
 import org.jclouds.googlecomputeengine.domain.AttachDisk;
@@ -122,6 +123,14 @@ public class InstanceApiLiveTest extends BaseGoogleComputeEngineApiLiveTest {
    }
 
    @Test(groups = "live", dependsOnMethods = "testInsertInstance")
+   public void testGetSerialPortOutput() {
+      SerialPortOutput output = api().getSerialPortOutput(INSTANCE_NAME);
+      assertNotNull(output);
+      assertNotNull(output.selfLink());
+      assertNotNull(output.contents());
+   }
+
+   @Test(groups = "live", dependsOnMethods = "testInsertInstance")
    public void testSetDiskAutoDelete() {
 
       assertTrue(existsDiskWithNameAndAutoDelete(INSTANCE_NAME, DEFAULT_BOOT_DISK_NAME, true));
@@ -196,13 +205,16 @@ public class InstanceApiLiveTest extends BaseGoogleComputeEngineApiLiveTest {
 
       Instance originalInstance = api().get(INSTANCE_NAME);
       assertOperationDoneSuccessfully(api().attachDisk(INSTANCE_NAME,
-                  AttachDisk.create(AttachDisk.Type.PERSISTENT,
-                                    AttachDisk.Mode.READ_ONLY,
-                                    getDiskUrl(ATTACH_DISK_NAME),
-                                    ATTACH_DISK_DEVICE_NAME,
-                                    false,
-                                    null,
-                                    false)));
+                  AttachDisk.create(AttachDisk.Type.PERSISTENT, // type
+                                    AttachDisk.Mode.READ_ONLY, // mode
+                                    getDiskUrl(ATTACH_DISK_NAME), // source
+                                    ATTACH_DISK_DEVICE_NAME, // deviceName
+                                    false, // boot
+                                    null, // initializeParams
+                                    false, // autoDelete
+                                    null, // licenses
+                                    null // interface
+                                    )));
 
       Instance modifiedInstance = api().get(INSTANCE_NAME);
 
@@ -246,7 +258,7 @@ public class InstanceApiLiveTest extends BaseGoogleComputeEngineApiLiveTest {
       assertOperationDoneSuccessfully(api().reset(INSTANCE_NAME));
    }
 
-   @Test(groups = "live", dependsOnMethods = {"testSetDiskAutoDelete", "testResetInstance", "testSetScheduling"}, alwaysRun = true)
+   @Test(groups = "live", dependsOnMethods = {"testSetDiskAutoDelete", "testResetInstance", "testSetScheduling", "testGetInstance", "testGetSerialPortOutput"}, alwaysRun = true)
    public void testDeleteInstance() {
       assertOperationDoneSuccessfully(api().delete(INSTANCE_NAME));
       assertOperationDoneSuccessfully(diskApi().delete(DISK_NAME));

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiMockTest.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiMockTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiMockTest.java
index 45abb94..50e7426 100644
--- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiMockTest.java
+++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiMockTest.java
@@ -24,6 +24,9 @@ import java.net.URI;
 import java.util.Arrays;
 
 import org.jclouds.googlecomputeengine.domain.AttachDisk;
+import org.jclouds.googlecomputeengine.domain.AttachDisk.DiskInterface;
+import org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface.AccessConfig;
+import org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface.AccessConfig.Type;
 import org.jclouds.googlecomputeengine.domain.Metadata;
 import org.jclouds.googlecomputeengine.domain.NewInstance;
 import org.jclouds.googlecomputeengine.domain.Instance.Scheduling.OnHostMaintenance;
@@ -42,8 +45,8 @@ public class InstanceApiMockTest extends BaseGoogleComputeEngineApiMockTest {
    public void get() throws Exception {
       server.enqueue(jsonResponse("/instance_get.json"));
 
-      assertEquals(instanceApi().get("test-1"), new ParseInstanceTest().expected(url("/projects")));
-      assertSent(server, "GET", "/projects/party/zones/us-central1-a/instances/test-1");
+      assertEquals(instanceApi().get("test-instance"), new ParseInstanceTest().expected(url("/projects")));
+      assertSent(server, "GET", "/projects/party/zones/us-central1-a/instances/test-instance");
    }
 
    public void get_4xx() throws Exception {
@@ -57,7 +60,7 @@ public class InstanceApiMockTest extends BaseGoogleComputeEngineApiMockTest {
       server.enqueue(jsonResponse("/instance_serial_port.json"));
 
       assertEquals(instanceApi().getSerialPortOutput("test-1"),
-            new ParseInstanceSerialOutputTest().expected());
+            new ParseInstanceSerialOutputTest().expected(url("/projects")));
 
       assertSent(server, "GET", "/projects/party/zones/us-central1-a/instances/test-1/serialPort");
    }
@@ -94,6 +97,32 @@ public class InstanceApiMockTest extends BaseGoogleComputeEngineApiMockTest {
             stringFromResource("/instance_insert.json"));
    }
 
+   public void addAccessConfig() throws Exception {
+      server.enqueue(jsonResponse("/zone_operation.json"));
+
+      AccessConfig config = AccessConfig.create("test-access", Type.ONE_TO_ONE_NAT, "1.1.1.1");
+      assertEquals(instanceApi().addAccessConfigToNic("test-instance", config, "test-network"),
+            new ParseZoneOperationTest().expected(url("/projects")));
+
+      assertSent(server, "POST", "/projects/party/zones/us-central1-a/instances/test-instance/"
+            + "addAccessConfig?networkInterface=test-network",
+            "{" +
+            "  \"type\": \"ONE_TO_ONE_NAT\"," +
+            "  \"name\": \"test-access\"," +
+            "  \"natIP\": \"1.1.1.1\"" +
+            "}");
+   }
+
+   public void deleteAccessConfig() throws Exception {
+      server.enqueue(jsonResponse("/zone_operation.json"));
+
+      assertEquals(instanceApi().deleteAccessConfigFromNic("test-instance", "test-access", "test-network"),
+            new ParseZoneOperationTest().expected(url("/projects")));
+
+      assertSent(server, "DELETE", "/projects/party/zones/us-central1-a/instances/test-instance/"
+            + "deleteAccessConfig?accessConfig=test-access&networkInterface=test-network");
+   }
+
    public void delete() throws Exception {
       server.enqueue(jsonResponse("/zone_operation.json"));
 
@@ -154,10 +183,21 @@ public class InstanceApiMockTest extends BaseGoogleComputeEngineApiMockTest {
       server.enqueue(jsonResponse("/zone_operation.json"));
 
       assertEquals(instanceApi().attachDisk("test-1",
-            AttachDisk.create(AttachDisk.Type.PERSISTENT,
-                                     AttachDisk.Mode.READ_ONLY,
-                                     URI.create(url("/projects/party/zones/us-central1-a/disks/testimage1")),
-                                     null, false, null, true)),
+            AttachDisk.create(AttachDisk.Type.PERSISTENT, // type
+                                     AttachDisk.Mode.READ_WRITE, // mode
+                                     URI.create(url("/projects/party/zones/us-central1-a/disks/test")), // source
+                                     "test", // deviceName
+                                     true, // boot
+                                     AttachDisk.InitializeParams.create(
+                                           "test", // diskName
+                                           Long.parseLong("100", 10), // diskSizeGb
+                                           URI.create(url("/projects/party/global/images/test")), // sourceImage
+                                           "pd-standard" // diskType
+                                           ), // initializeParams
+                                     true, // autoDelete
+                                     ImmutableList.of(url("/projects/suse-cloud/global/licenses/sles-12")), // licenses
+                                     DiskInterface.NVME // interface
+                                     )),
             new ParseZoneOperationTest().expected(url("/projects")));
       assertSent(server, "POST", "/projects/party/zones/us-central1-a/instances/test-1/attachDisk",
             stringFromResource("/instance_attach_disk.json"));

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceSerialOutputTest.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceSerialOutputTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceSerialOutputTest.java
index 244f780..5b8eca5 100644
--- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceSerialOutputTest.java
+++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceSerialOutputTest.java
@@ -19,6 +19,8 @@ package org.jclouds.googlecomputeengine.parse;
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 import static org.jclouds.googlecomputeengine.domain.Instance.SerialPortOutput;
 
+import java.net.URI;
+
 import javax.ws.rs.Consumes;
 
 import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
@@ -34,6 +36,13 @@ public class ParseInstanceSerialOutputTest extends BaseGoogleComputeEngineParseT
 
    @Override @Consumes(APPLICATION_JSON)
    public SerialPortOutput expected() {
-      return SerialPortOutput.create(null, "console output");
+      return expected(BASE_URL);
+   }
+
+   @Consumes(APPLICATION_JSON)
+   public SerialPortOutput expected(String baseUrl) {
+      return SerialPortOutput.create(
+            URI.create(baseUrl + "/party/zones/us-central1-a/instances/test-instance/serialPort"),
+            "console output");
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceTest.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceTest.java
index f786a5c..bef2abe 100644
--- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceTest.java
+++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceTest.java
@@ -22,6 +22,8 @@ import java.net.URI;
 
 import javax.ws.rs.Consumes;
 
+import org.jclouds.googlecomputeengine.domain.AttachDisk;
+import org.jclouds.googlecomputeengine.domain.AttachDisk.DiskInterface;
 import org.jclouds.googlecomputeengine.domain.Instance;
 import org.jclouds.googlecomputeengine.domain.Instance.AttachedDisk;
 import org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface;
@@ -51,6 +53,7 @@ public class ParseInstanceTest extends BaseGoogleComputeEngineParseTest<Instance
    public Instance expected(String baseUrl) {
       return Instance.create( //
             "13051190678907570425", // id
+            parse("2012-11-25T23:48:20.758"), // creationTimestamp
             URI.create(baseUrl + "/party/zones/us-central1-a/instances/test-0"), // selfLink
             "test-0", // name
             "desc", // description
@@ -59,6 +62,7 @@ public class ParseInstanceTest extends BaseGoogleComputeEngineParseTest<Instance
             Instance.Status.RUNNING, // status
             null, // statusMessage
             URI.create(baseUrl + "/party/zones/us-central1-a"), // zone
+            true, // canIpForward
             ImmutableList.of(NetworkInterface.create( //
                   "nic0", // name
                   URI.create(baseUrl + "/party/global/networks/default"), // network
@@ -72,7 +76,15 @@ public class ParseInstanceTest extends BaseGoogleComputeEngineParseTest<Instance
                   URI.create(baseUrl + "/party/zones/us-central1-a/disks/test"), // source
                   "test", // deviceName
                   false, // autoDelete
-                  true// boot
+                  true, // boot
+                  AttachDisk.InitializeParams.create(
+                        "test", // diskName
+                        Long.parseLong("100", 10), // diskSizeGb
+                        URI.create(baseUrl + "/party/global/images/test"), // sourceImage
+                        "pd-standard" // diskType
+                        ), // initializeParams
+                  ImmutableList.of(baseUrl + "/suse-cloud/global/licenses/sles-12"), // licenses
+                  DiskInterface.NVME // interface
             )), // disks
             Metadata.create("efgh")
                     .put("aKey", "aValue")

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/google-compute-engine/src/test/resources/instance_attach_disk.json
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/resources/instance_attach_disk.json b/google-compute-engine/src/test/resources/instance_attach_disk.json
index add9ab9..3738015 100644
--- a/google-compute-engine/src/test/resources/instance_attach_disk.json
+++ b/google-compute-engine/src/test/resources/instance_attach_disk.json
@@ -1,7 +1,18 @@
 {
-    "type": "PERSISTENT",
-    "mode": "READ_ONLY",
-    "source": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/disks/testimage1",
-    "boot": false,
-    "autoDelete": true
+  "type": "PERSISTENT",
+  "mode": "READ_WRITE",
+  "deviceName": "test",
+  "source": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/disks/test",
+  "boot": true,
+  "autoDelete": true,
+  "initializeParams": {
+    "diskName": "test",
+    "sourceImage": "https://www.googleapis.com/compute/v1/projects/party/global/images/test",
+    "diskSizeGb": 100,
+    "diskType": "pd-standard"
+  },
+  "licenses": [
+    "https://www.googleapis.com/compute/v1/projects/suse-cloud/global/licenses/sles-12"
+  ],
+  "interface": "NVME"
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/google-compute-engine/src/test/resources/instance_get.json
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/resources/instance_get.json b/google-compute-engine/src/test/resources/instance_get.json
index 984db08..afe7ae8 100644
--- a/google-compute-engine/src/test/resources/instance_get.json
+++ b/google-compute-engine/src/test/resources/instance_get.json
@@ -7,6 +7,7 @@
    "name": "test-0",
    "machineType": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/machineTypes/n1-standard-1",
    "status": "RUNNING",
+   "canIpForward": true,
    "zone": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a",
    "networkInterfaces": [
       {
@@ -24,7 +25,17 @@
          "deviceName": "test",
          "source": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/disks/test",
          "index": 0,
-         "boot": true
+         "boot": true,
+         "initializeParams": {
+            "diskName": "test",
+            "sourceImage": "https://www.googleapis.com/compute/v1/projects/party/global/images/test",
+            "diskSizeGb": "100",
+            "diskType": "pd-standard"
+         },
+         "licenses": [
+            "https://www.googleapis.com/compute/v1/projects/suse-cloud/global/licenses/sles-12"
+         ],
+         "interface": "NVME"
       }
    ],
    "serviceAccounts": [

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/google-compute-engine/src/test/resources/instance_list.json
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/resources/instance_list.json b/google-compute-engine/src/test/resources/instance_list.json
index 47040e2..ed277f3 100644
--- a/google-compute-engine/src/test/resources/instance_list.json
+++ b/google-compute-engine/src/test/resources/instance_list.json
@@ -1,74 +1,85 @@
 {
-   "kind": "compute#instanceList",
-   "id": "projects/party/zones/us-central1-a/instances",
-   "selfLink": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/instances",
-   "items": [
-      {
-         "kind": "compute#instance",
-         "id": "13051190678907570425",
-         "description": "desc",
-         "creationTimestamp": "2012-11-25T23:48:20.758",
-         "selfLink": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/instances/test-0",
-         "name": "test-0",
-         "machineType": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/machineTypes/n1-standard-1",
-         "status": "RUNNING",
-         "zone": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a",
-         "networkInterfaces": [
-            {
-               "kind": "compute#instanceNetworkInterface",
-               "name": "nic0",
-               "networkIP": "10.240.121.115",
-               "network": "https://www.googleapis.com/compute/v1/projects/party/global/networks/default"
-            }
-         ],
-         "disks": [
-            {
-               "kind": "compute#instanceDisk",
-               "type": "PERSISTENT",
-               "mode": "READ_WRITE",
-               "deviceName": "test",
-               "source": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/disks/test",
-               "index": 0,
-               "boot": true
-            }
-         ],
-         "serviceAccounts": [
-            {
-               "kind": "compute#serviceAccount",
-               "email": "default",
-               "scopes": [
-                  "myscope"
-               ]
-            }
-         ],
-         "metadata": {
-            "items": [
-               {
-                  "key": "aKey",
-                  "value": "aValue"
-               },
-               {
-                  "key": "jclouds-image",
-                  "value": "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140718"
-               },
-               {
-                  "key": "jclouds-delete-boot-disk",
-                  "value": "true"
-               }
-            ],
-            "fingerprint": "efgh"
-         },
-         "tags": {
-            "items": [
-               "aTag",
-               "Group-port-42"
-            ],
-            "fingerprint": "abcd"
-         },
-         "scheduling": {
-            "onHostMaintenance": "MIGRATE",
-            "automaticRestart": false
-         }
+  "kind": "compute#instanceList",
+  "id": "projects/party/zones/us-central1-a/instances",
+  "selfLink": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/instances",
+  "items": [
+    {
+      "kind": "compute#instance",
+      "id": "13051190678907570425",
+      "description": "desc",
+      "creationTimestamp": "2012-11-25T23:48:20.758",
+      "selfLink": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/instances/test-0",
+      "name": "test-0",
+      "machineType": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/machineTypes/n1-standard-1",
+      "status": "RUNNING",
+      "canIpForward": true,
+      "zone": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a",
+      "networkInterfaces": [
+        {
+          "kind": "compute#instanceNetworkInterface",
+          "name": "nic0",
+          "networkIP": "10.240.121.115",
+          "network": "https://www.googleapis.com/compute/v1/projects/party/global/networks/default"
+        }
+      ],
+      "disks": [
+        {
+          "kind": "compute#instanceDisk",
+          "type": "PERSISTENT",
+          "mode": "READ_WRITE",
+          "deviceName": "test",
+          "source": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/disks/test",
+          "index": 0,
+          "boot": true,
+          "initializeParams": {
+            "diskName": "test",
+            "sourceImage": "https://www.googleapis.com/compute/v1/projects/party/global/images/test",
+            "diskSizeGb": "100",
+            "diskType": "pd-standard"
+          },
+          "licenses": [
+            "https://www.googleapis.com/compute/v1/projects/suse-cloud/global/licenses/sles-12"
+          ],
+          "interface": "NVME"
+        }
+      ],
+      "serviceAccounts": [
+        {
+          "kind": "compute#serviceAccount",
+          "email": "default",
+          "scopes": [
+            "myscope"
+          ]
+        }
+      ],
+      "metadata": {
+        "items": [
+          {
+            "key": "aKey",
+            "value": "aValue"
+          },
+          {
+            "key": "jclouds-image",
+            "value": "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140718"
+          },
+          {
+            "key": "jclouds-delete-boot-disk",
+            "value": "true"
+          }
+        ],
+        "fingerprint": "efgh"
+      },
+      "tags": {
+        "items": [
+          "aTag",
+          "Group-port-42"
+        ],
+        "fingerprint": "abcd"
+      },
+      "scheduling": {
+        "onHostMaintenance": "MIGRATE",
+        "automaticRestart": false
       }
-   ]
-}
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/8e4a17f5/google-compute-engine/src/test/resources/instance_serial_port.json
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/resources/instance_serial_port.json b/google-compute-engine/src/test/resources/instance_serial_port.json
index 03280cc..98d9ce6 100644
--- a/google-compute-engine/src/test/resources/instance_serial_port.json
+++ b/google-compute-engine/src/test/resources/instance_serial_port.json
@@ -1,4 +1,5 @@
 {
-   "kind": "compute#serialPortOutput",
-   "contents": "console output"
+  "kind": "compute#serialPortOutput",
+  "contents": "console output",
+  "selfLink": "https://www.googleapis.com/compute/v1/projects/party/zones/us-central1-a/instances/test-instance/serialPort"
 }
\ No newline at end of file