You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2014/01/03 15:59:19 UTC

[07/44] git commit: Test updates for v1 plus additional changes: Add snapshot support Add .get() to many locations to make the conversion from json dictionary to libcloud objects more robust.

Test updates for v1 plus additional changes:
  Add snapshot support
  Add .get() to many locations to make the conversion from json dictionary to
  libcloud objects more robust.


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/2d3caa8c
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/2d3caa8c
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/2d3caa8c

Branch: refs/heads/trunk
Commit: 2d3caa8cf79aae4ed7fead824178eeac5fa9ba82
Parents: 0d47758
Author: Rick Wright <ri...@google.com>
Authored: Fri Dec 13 13:07:26 2013 -0800
Committer: Rick Wright <ri...@google.com>
Committed: Fri Dec 13 13:07:26 2013 -0800

----------------------------------------------------------------------
 libcloud/compute/drivers/gce.py                 |  270 ++-
 .../fixtures/gce/aggregated_addresses.json      |   18 +-
 .../compute/fixtures/gce/aggregated_disks.json  |  115 +-
 .../gce/aggregated_forwardingRules.json         |   32 +-
 .../fixtures/gce/aggregated_instances.json      |  260 +--
 .../fixtures/gce/aggregated_machineTypes.json   | 1825 ++++++++++--------
 .../fixtures/gce/aggregated_targetPools.json    |   28 +-
 .../test/compute/fixtures/gce/generic_disk.json |   13 +
 .../compute/fixtures/gce/global_firewalls.json  |   22 +-
 .../gce/global_firewalls_lcfirewall.json        |    4 +-
 .../gce/global_firewalls_lcfirewall_delete.json |    4 +-
 .../gce/global_firewalls_lcfirewall_put.json    |    4 +-
 .../fixtures/gce/global_firewalls_post.json     |    4 +-
 .../fixtures/gce/global_httpHealthChecks.json   |   24 +-
 .../global_httpHealthChecks_basic-check.json    |    2 +-
 .../global_httpHealthChecks_lchealthcheck.json  |    2 +-
 ...l_httpHealthChecks_lchealthcheck_delete.json |    4 +-
 ...obal_httpHealthChecks_lchealthcheck_put.json |    4 +-
 ...althChecks_libcloud-lb-demo-healthcheck.json |    2 +-
 .../gce/global_httpHealthChecks_post.json       |    4 +-
 .../compute/fixtures/gce/global_images.json     |   10 +-
 .../compute/fixtures/gce/global_networks.json   |    8 +-
 .../fixtures/gce/global_networks_default.json   |    2 +-
 .../fixtures/gce/global_networks_lcnetwork.json |    2 +-
 .../gce/global_networks_lcnetwork_delete.json   |    4 +-
 ...l_networks_libcloud-demo-europe-network.json |    2 +-
 .../global_networks_libcloud-demo-network.json  |    2 +-
 .../fixtures/gce/global_networks_post.json      |    4 +-
 ...tion_global_firewalls_lcfirewall_delete.json |    4 +-
 ...eration_global_firewalls_lcfirewall_put.json |    4 +-
 ...rations_operation_global_firewalls_post.json |    4 +-
 ...l_httpHealthChecks_lchealthcheck_delete.json |    4 +-
 ...obal_httpHealthChecks_lchealthcheck_put.json |    4 +-
 ..._operation_global_httpHealthChecks_post.json |    4 +-
 ...ration_global_networks_lcnetwork_delete.json |    4 +-
 ...erations_operation_global_networks_post.json |    4 +-
 ..._us-central1_addresses_lcaddress_delete.json |    6 +-
 ...tion_regions_us-central1_addresses_post.json |    6 +-
 ...forwardingRules_lcforwardingrule_delete.json |    6 +-
 ...egions_us-central1_forwardingRules_post.json |    6 +-
 ...tPools_lctargetpool_addHealthCheck_post.json |    6 +-
 ...rgetPools_lctargetpool_addInstance_post.json |    6 +-
 ...entral1_targetPools_lctargetpool_delete.json |    6 +-
 ...ols_lctargetpool_removeHealthCheck_post.json |    6 +-
 ...tPools_lctargetpool_removeInstance_post.json |    6 +-
 ...on_regions_us-central1_targetPools_post.json |    6 +-
 ...ion_zones_europe-west1-a_instances_post.json |    6 +-
 ...zones_us-central1-a_disks_lcdisk_delete.json |    6 +-
 ...peration_zones_us-central1-a_disks_post.json |    6 +-
 ...-central1-a_instances_lcnode-000_delete.json |    6 +-
 ...-central1-a_instances_lcnode-001_delete.json |    6 +-
 ...1-a_instances_node-name_attachDisk_post.json |    6 +-
 ...s-central1-a_instances_node-name_delete.json |    6 +-
 ...1-a_instances_node-name_detachDisk_post.json |    6 +-
 ...ntral1-a_instances_node-name_reset_post.json |    6 +-
 ...ral1-a_instances_node-name_setTags_post.json |    6 +-
 ...tion_zones_us-central1-a_instances_post.json |    6 +-
 libcloud/test/compute/fixtures/gce/project.json |    2 +-
 .../projects_debian-cloud_global_images.json    |  172 +-
 libcloud/test/compute/fixtures/gce/regions.json |   18 +-
 .../gce/regions_us-central1_addresses.json      |   10 +-
 ...regions_us-central1_addresses_lcaddress.json |    4 +-
 ..._us-central1_addresses_lcaddress_delete.json |    6 +-
 .../gce/regions_us-central1_addresses_post.json |    6 +-
 .../regions_us-central1_forwardingRules.json    |   14 +-
 ...ntral1_forwardingRules_lcforwardingrule.json |    6 +-
 ...forwardingRules_lcforwardingrule_delete.json |    6 +-
 ...al1_forwardingRules_libcloud-lb-demo-lb.json |    6 +-
 ...egions_us-central1_forwardingRules_post.json |    6 +-
 .../gce/regions_us-central1_targetPools.json    |   24 +-
 ...ns_us-central1_targetPools_lctargetpool.json |   10 +-
 ...tPools_lctargetpool_addHealthCheck_post.json |    6 +-
 ...rgetPools_lctargetpool_addInstance_post.json |    6 +-
 ...entral1_targetPools_lctargetpool_delete.json |    6 +-
 ...ols_lctargetpool_removeHealthCheck_post.json |    6 +-
 ...tPools_lctargetpool_removeInstance_post.json |    6 +-
 ...ral1_targetPools_libcloud-lb-demo-lb-tp.json |   12 +-
 .../regions_us-central1_targetPools_post.json   |    6 +-
 ...egions_us-central1_targetPools_www-pool.json |   12 +-
 libcloud/test/compute/fixtures/gce/zones.json   |   35 +-
 .../gce/zones_europe-west1-a_instances.json     |   83 +-
 .../zones_europe-west1-a_instances_post.json    |    6 +-
 ...rope-west1-a_machineTypes_n1-standard-1.json |    2 +-
 .../fixtures/gce/zones_us-central1-a.json       |    4 +-
 .../fixtures/gce/zones_us-central1-a_disks.json |   33 +-
 .../gce/zones_us-central1-a_disks_lcdisk.json   |    4 +-
 ...zones_us-central1-a_disks_lcdisk_delete.json |    6 +-
 .../gce/zones_us-central1-a_disks_post.json     |    6 +-
 .../gce/zones_us-central1-a_instances.json      |  213 +-
 ...ones_us-central1-a_instances_lcnode-000.json |   28 +-
 ...-central1-a_instances_lcnode-000_delete.json |    6 +-
 ...ones_us-central1-a_instances_lcnode-001.json |   26 +-
 ...-central1-a_instances_lcnode-001_delete.json |    6 +-
 ...zones_us-central1-a_instances_node-name.json |   26 +-
 ...1-a_instances_node-name_attachDisk_post.json |    6 +-
 ...s-central1-a_instances_node-name_delete.json |    8 +-
 ...1-a_instances_node-name_detachDisk_post.json |    6 +-
 ...ntral1-a_instances_node-name_reset_post.json |    6 +-
 ...ral1-a_instances_node-name_setTags_post.json |    6 +-
 .../gce/zones_us-central1-a_instances_post.json |    6 +-
 .../gce/zones_us-central1-a_machineTypes.json   |   96 +-
 ...s-central1-a_machineTypes_n1-standard-1.json |    2 +-
 ...l1-b_instances_libcloud-lb-demo-www-000.json |   29 +-
 ...l1-b_instances_libcloud-lb-demo-www-001.json |   31 +-
 libcloud/test/compute/test_gce.py               |   93 +-
 libcloud/test/loadbalancer/test_gce.py          |    6 +-
 106 files changed, 2252 insertions(+), 1710 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/2d3caa8c/libcloud/compute/drivers/gce.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/gce.py b/libcloud/compute/drivers/gce.py
index 852b944..faa2905 100644
--- a/libcloud/compute/drivers/gce.py
+++ b/libcloud/compute/drivers/gce.py
@@ -24,9 +24,11 @@ import sys
 from libcloud.common.google import GoogleResponse
 from libcloud.common.google import GoogleBaseConnection
 from libcloud.common.google import ResourceNotFoundError
+from libcloud.common.google import ResourceExistsError
 
 from libcloud.compute.base import Node, NodeDriver, NodeImage, NodeLocation
-from libcloud.compute.base import NodeSize, StorageVolume, UuidMixin
+from libcloud.compute.base import NodeSize, StorageVolume, VolumeSnapshot
+from libcloud.compute.base import UuidMixin
 from libcloud.compute.providers import Provider
 from libcloud.compute.types import NodeState
 
@@ -292,6 +294,13 @@ class GCERegion(UuidMixin):
             self.id, self.name, self.status)
 
 
+class GCESnapshot(VolumeSnapshot):
+    def __init__(self, id, name, size, status, driver, extra=None):
+        self.name = name
+        self.status = status
+        super(GCESnapshot, self).__init__(id, driver, size, extra)
+
+
 class GCETargetPool(UuidMixin):
     def __init__(self, id, name, region, healthchecks, nodes, driver,
                  extra=None):
@@ -953,6 +962,20 @@ class GCENodeDriver(NodeDriver):
                 list_sizes = [self._to_node_size(s) for s in response['items']]
         return list_sizes
 
+    def ex_list_snapshots(self):
+        """
+        Return the list of disk snapshots in the project.
+
+        :return:  A list of snapshot objects
+        :rtype:   ``list`` of :class:`GCESnapshot`
+        """
+        list_snapshots = []
+        request = '/global/snapshots'
+        response = self.connection.request(request, method='GET').object
+        list_snapshots = [self._to_snapshot(s) for s in
+                          response.get('items', [])]
+        return list_snapshots
+
     def ex_list_targetpools(self, region=None):
         """
         Return the list of target pools.
@@ -1310,7 +1333,7 @@ class GCENodeDriver(NodeDriver):
 
     def create_node(self, name, size, image, location=None,
                     ex_network='default', ex_tags=None, ex_metadata=None,
-                    ex_boot_disk=None, use_existing_disk=False):
+                    ex_boot_disk=None, use_existing_disk=True):
         """
         Create a new node and return a node object for the node.
 
@@ -1374,7 +1397,7 @@ class GCENodeDriver(NodeDriver):
     def ex_create_multiple_nodes(self, base_name, size, image, number,
                                  location=None, ex_network='default',
                                  ex_tags=None, ex_metadata=None,
-                                 ignore_errors=True, use_existing_disk=False,
+                                 ignore_errors=True, use_existing_disk=True,
                                  timeout=DEFAULT_TASK_COMPLETION_TIMEOUT):
         """
         Create multiple nodes and return a list of Node objects.
@@ -1395,6 +1418,8 @@ class GCENodeDriver(NodeDriver):
         :param  image: The image to use to create the nodes.
         :type   image: ``str`` or :class:`NodeImage`
 
+        return self.ex_get_snapshot(name)
+
         :param  number: The number of nodes to create.
         :type   number: ``int``
 
@@ -1489,6 +1514,7 @@ class GCENodeDriver(NodeDriver):
                         e = self._catch_error(ignore_errors=ignore_errors)
                         error = e.value
                         code = e.code
+                        response = {'status': 'DONE'}
                     if response['status'] == 'DONE':
                         status['disk_response'] = None
                         if error:
@@ -1517,6 +1543,7 @@ class GCENodeDriver(NodeDriver):
                             e = self._catch_error(ignore_errors=ignore_errors)
                             error = e.value
                             code = e.code
+                            response = {'status': 'DONE'}
                         if response['status'] == 'DONE':
                             status['node_response'] = None
                         if error:
@@ -1607,8 +1634,8 @@ class GCENodeDriver(NodeDriver):
         :keyword  image: Image to create disk from.
         :type     image: :class:`NodeImage` or ``str`` or ``None``
 
-        :keyword  snapshot: Snapshot to create image from (needs full URI)
-        :type     snapshot: ``str``
+        :keyword  snapshot: Snapshot to create image from
+        :type     snapshot: :class:`GCESnapshot` or ``str`` or ``None``
 
         :return:  Tuple containg the request string, the data dictionary and
                   the URL parameters
@@ -1626,8 +1653,15 @@ class GCENodeDriver(NodeDriver):
             volume_data['description'] = 'Image: %s' % (
                 image.extra['selfLink'])
         if snapshot:
-            volume_data['sourceSnapshot'] = snapshot
-            volume_data['description'] = 'Snapshot: %s' % (snapshot)
+            # Check for full URI to not break backward-compatibility
+            if snapshot.startswith('https'):
+                snapshot_link = snapshot
+            else:
+                if not hasattr(snapshot, 'name'):
+                    snapshot = self.ex_get_snapshot(snapshot)
+                snapshot_link = snapshot.extra['selfLink']
+            volume_data['sourceSnapshot'] = snapshot_link
+            volume_data['description'] = 'Snapshot: %s' % (snapshot_link)
         location = location or self.zone
         if not hasattr(location, 'name'):
             location = self.ex_get_zone(location)
@@ -1636,7 +1670,7 @@ class GCENodeDriver(NodeDriver):
         return request, volume_data, params
 
     def create_volume(self, size, name, location=None, image=None,
-                      snapshot=None, use_existing=False):
+                      snapshot=None, use_existing=True):
         """
         Create a volume (disk).
 
@@ -1654,8 +1688,8 @@ class GCENodeDriver(NodeDriver):
         :keyword  image: Image to create disk from.
         :type     image: :class:`NodeImage` or ``str`` or ``None``
 
-        :keyword  snapshot: Snapshot to create image from (needs full URI)
-        :type     snapshot: ``str``
+        :keyword  snapshot: Snapshot to create image from
+        :type     snapshot: :class:`GCESnapshot` or ``str`` or ``None``
 
         :keyword  use_existing: If True and a disk with the given name already
                                 exists, return an object for that disk instead
@@ -1666,20 +1700,37 @@ class GCENodeDriver(NodeDriver):
         :rtype:   :class:`StorageVolume`
         """
         vol = None
-        if use_existing:
-            try:
-                vol = self.ex_get_volume(name, location)
-            except:
-                pass
-        if vol:
-            return vol
         request, volume_data, params = self._create_vol_req(
             size, name, location, image, snapshot)
-        self.connection.async_request(request, method='POST', data=volume_data,
-                                      params=params)
+        try:
+            self.connection.async_request(request, method='POST',
+                                          data=volume_data, params=params)
+        except ResourceExistsError:
+            e = sys.exc_info()[1]
+            if not use_existing:
+                raise e
 
         return self.ex_get_volume(name, location)
 
+    def create_volume_snapshot(self, volume, name):
+        """
+        Create a snapshot of the provided Volume.
+
+        :param  volume: A StorageVolume object
+        :type   volume: :class:`StorageVolume`
+
+        :return:  A GCE Snapshot object
+        :rtype:   :class:`GCESnapshot`
+        """
+        snapshot_data = {}
+        snapshot_data['name'] = name
+        request = '/zones/%s/disks/%s/createSnapshot' % (
+            volume.extra['zone'].name, volume.name)
+        self.connection.async_request(request, method='POST',
+                                      data=snapshot_data)
+
+        return self.ex_get_snapshot(name)
+
     def ex_update_healthcheck(self, healthcheck):
         """
         Update a health check with new values.
@@ -2093,22 +2144,31 @@ class GCENodeDriver(NodeDriver):
         self.connection.async_request(request, method='DELETE')
         return True
 
-    def destroy_node(self, node):
+    def destroy_node(self, node, destroy_boot_disk=False):
         """
         Destroy a node.
 
         :param  node: Node object to destroy
         :type   node: :class:`Node`
 
+        :keyword  destroy_boot_disk: If true, also destroy the node's
+                                     boot disk. (Note that this keyword is not
+                                     accessible from the node's .destroy()
+                                     method.)
+        :type     destroy_boot_disk: ``bool``
+
         :return:  True if successful
         :rtype:   ``bool``
         """
         request = '/zones/%s/instances/%s' % (node.extra['zone'].name,
                                               node.name)
         self.connection.async_request(request, method='DELETE')
+        if destroy_boot_disk and node.extra['boot_disk']:
+            node.extra['boot_disk'].destroy()
         return True
 
     def ex_destroy_multiple_nodes(self, nodelist, ignore_errors=True,
+                                  destroy_boot_disk=False,
                                   timeout=DEFAULT_TASK_COMPLETION_TIMEOUT):
         """
         Destroy multiple nodes at once.
@@ -2120,6 +2180,10 @@ class GCENodeDriver(NodeDriver):
                                  more nodes fails to be destroyed.
         :type     ignore_errors: ``bool``
 
+        :keyword  destroy_boot_disk: If true, also destroy the nodes' boot
+                                     disks.
+        :type     destroy_boot_disk: ``bool``
+
         :keyword  timeout: Number of seconds to wait for all nodes to be
                            destroyed.
         :type     timeout: ``int``
@@ -2194,8 +2258,21 @@ class GCENodeDriver(NodeDriver):
         """
         request = '/zones/%s/disks/%s' % (volume.extra['zone'].name,
                                           volume.name)
-        self.connection.async_request(request,
-                                      method='DELETE')
+        self.connection.async_request(request, method='DELETE')
+        return True
+
+    def destroy_volume_snapshot(self, snapshot):
+        """
+        Destroy a snapshot.
+
+        :param  snapshot: Snapshot object to destroy
+        :type   snapshot: :class:`GCESnapshot`
+
+        :return:  True if successfull
+        :rtype:   ``bool``
+        """
+        request = '/global/snapshots/%s' % (snapshot.name)
+        self.connection.async_request(request, method='DELETE')
         return True
 
     def ex_get_address(self, name, region=None):
@@ -2356,6 +2433,20 @@ class GCENodeDriver(NodeDriver):
         response = self.connection.request(request, method='GET').object
         return self._to_node_size(response)
 
+    def ex_get_snapshot(self, name):
+        """
+        Return a Snapshot object based on snapshot name.
+
+        :param  name: The name of the snapshot
+        :type   name: ``str``
+
+        :return:  A GCESnapshot object for the snapshot
+        :rtype:   :class:`GCESnapshot`
+        """
+        request = '/global/snapshots/%s' % (name)
+        response = self.connection.request(request, method='GET').object
+        return self._to_snapshot(response)
+
     def ex_get_volume(self, name, zone=None):
         """
         Return a Volume object based on a volume name and optional zone.
@@ -2460,9 +2551,9 @@ class GCENodeDriver(NodeDriver):
 
         region = self.ex_get_region(address['region'])
 
-        extra['selfLink'] = address['selfLink']
-        extra['status'] = address['status']
-        extra['creationTimestamp'] = address['creationTimestamp']
+        extra['selfLink'] = address.get('selfLink')
+        extra['status'] = address.get('status')
+        extra['creationTimestamp'] = address.get('creationTimestamp')
 
         return GCEAddress(id=address['id'], name=address['name'],
                           address=address['address'],
@@ -2479,18 +2570,18 @@ class GCENodeDriver(NodeDriver):
         :rtype: :class:`GCEHealthCheck`
         """
         extra = {}
-        extra['selfLink'] = healthcheck['selfLink']
-        extra['creationTimestamp'] = healthcheck['creationTimestamp']
+        extra['selfLink'] = healthcheck.get('selfLink')
+        extra['creationTimestamp'] = healthcheck.get('creationTimestamp')
         extra['description'] = healthcheck.get('description')
         extra['host'] = healthcheck.get('host')
 
         return GCEHealthCheck(
             id=healthcheck['id'], name=healthcheck['name'],
-            path=healthcheck['requestPath'], port=healthcheck['port'],
-            interval=healthcheck['checkIntervalSec'],
-            timeout=healthcheck['timeoutSec'],
-            unhealthy_threshold=healthcheck['unhealthyThreshold'],
-            healthy_threshold=healthcheck['healthyThreshold'],
+            path=healthcheck.get('requestPath'), port=healthcheck.get('port'),
+            interval=healthcheck.get('checkIntervalSec'),
+            timeout=healthcheck.get('timeoutSec'),
+            unhealthy_threshold=healthcheck.get('unhealthyThreshold'),
+            healthy_threshold=healthcheck.get('healthyThreshold'),
             driver=self, extra=extra)
 
     def _to_firewall(self, firewall):
@@ -2504,8 +2595,8 @@ class GCENodeDriver(NodeDriver):
         :rtype: :class:`GCEFirewall`
         """
         extra = {}
-        extra['selfLink'] = firewall['selfLink']
-        extra['creationTimestamp'] = firewall['creationTimestamp']
+        extra['selfLink'] = firewall.get('selfLink')
+        extra['creationTimestamp'] = firewall.get('creationTimestamp')
         extra['description'] = firewall.get('description')
         extra['network_name'] = self._get_components_from_path(
             firewall['network'])['name']
@@ -2515,7 +2606,7 @@ class GCENodeDriver(NodeDriver):
         source_tags = firewall.get('sourceTags')
 
         return GCEFirewall(id=firewall['id'], name=firewall['name'],
-                           allowed=firewall['allowed'], network=network,
+                           allowed=firewall.get('allowed'), network=network,
                            source_ranges=source_ranges,
                            source_tags=source_tags,
                            driver=self, extra=extra)
@@ -2531,10 +2622,9 @@ class GCENodeDriver(NodeDriver):
         :rtype: :class:`GCEForwardingRule`
         """
         extra = {}
-        # Use .get to work around a current API bug.
         extra['selfLink'] = forwarding_rule.get('selfLink')
-        extra['portRange'] = forwarding_rule['portRange']
-        extra['creationTimestamp'] = forwarding_rule['creationTimestamp']
+        extra['portRange'] = forwarding_rule.get('portRange')
+        extra['creationTimestamp'] = forwarding_rule.get('creationTimestamp')
         extra['description'] = forwarding_rule.get('description')
 
         region = self.ex_get_region(forwarding_rule['region'])
@@ -2543,8 +2633,8 @@ class GCENodeDriver(NodeDriver):
 
         return GCEForwardingRule(id=forwarding_rule['id'],
                                  name=forwarding_rule['name'], region=region,
-                                 address=forwarding_rule['IPAddress'],
-                                 protocol=forwarding_rule['IPProtocol'],
+                                 address=forwarding_rule.get('IPAddress'),
+                                 protocol=forwarding_rule.get('IPProtocol'),
                                  targetpool=targetpool,
                                  driver=self, extra=extra)
 
@@ -2560,13 +2650,13 @@ class GCENodeDriver(NodeDriver):
         """
         extra = {}
 
-        extra['selfLink'] = network['selfLink']
-        extra['gatewayIPv4'] = network['gatewayIPv4']
+        extra['selfLink'] = network.get('selfLink')
+        extra['gatewayIPv4'] = network.get('gatewayIPv4')
         extra['description'] = network.get('description')
-        extra['creationTimestamp'] = network['creationTimestamp']
+        extra['creationTimestamp'] = network.get('creationTimestamp')
 
         return GCENetwork(id=network['id'], name=network['name'],
-                          cidr=network['IPv4Range'],
+                          cidr=network.get('IPv4Range'),
                           driver=self, extra=extra)
 
     def _to_node_image(self, image):
@@ -2582,8 +2672,8 @@ class GCENodeDriver(NodeDriver):
         extra = {}
         extra['preferredKernel'] = image.get('preferredKernel', None)
         extra['description'] = image.get('description', None)
-        extra['creationTimestamp'] = image['creationTimestamp']
-        extra['selfLink'] = image['selfLink']
+        extra['creationTimestamp'] = image.get('creationTimestamp')
+        extra['selfLink'] = image.get('selfLink')
         return NodeImage(id=image['id'], name=image['name'], driver=self,
                          extra=extra)
 
@@ -2615,29 +2705,35 @@ class GCENodeDriver(NodeDriver):
         private_ips = []
         extra = {}
 
-        extra['status'] = node['status']
+        extra['status'] = node.get('status')
         extra['description'] = node.get('description')
         extra['zone'] = self.ex_get_zone(node['zone'])
         extra['image'] = node.get('image')
-        extra['machineType'] = node['machineType']
-        extra['disks'] = node['disks']
-        extra['networkInterfaces'] = node['networkInterfaces']
+        extra['machineType'] = node.get('machineType')
+        extra['disks'] = node.get('disks', [])
+        extra['networkInterfaces'] = node.get('networkInterfaces')
         extra['id'] = node['id']
-        extra['selfLink'] = node['selfLink']
+        extra['selfLink'] = node.get('selfLink')
         extra['name'] = node['name']
-        extra['metadata'] = node['metadata']
+        extra['metadata'] = node.get('metadata')
         extra['tags_fingerprint'] = node['tags']['fingerprint']
 
+        extra['boot_disk'] = None
+        for disk in extra['disks']:
+            if disk.get('boot') and disk.get('type') == 'PERSISTENT':
+                bd = self._get_components_from_path(disk['source'])
+                extra['boot_disk'] = self.ex_get_volume(bd['name'], bd['zone'])
+
         if 'items' in node['tags']:
             tags = node['tags']['items']
         else:
             tags = []
         extra['tags'] = tags
 
-        for network_interface in node['networkInterfaces']:
-            private_ips.append(network_interface['networkIP'])
-            for access_config in network_interface['accessConfigs']:
-                public_ips.append(access_config['natIP'])
+        for network_interface in node.get('networkInterfaces', []):
+            private_ips.append(network_interface.get('networkIP'))
+            for access_config in network_interface.get('accessConfigs'):
+                public_ips.append(access_config.get('natIP'))
 
         # For the node attributes, use just machine and image names, not full
         # paths.  Full paths are available in the "extra" dict.
@@ -2663,19 +2759,19 @@ class GCENodeDriver(NodeDriver):
         :rtype: :class:`GCENodeSize`
         """
         extra = {}
-        extra['selfLink'] = machine_type['selfLink']
+        extra['selfLink'] = machine_type.get('selfLink')
         extra['zone'] = self.ex_get_zone(machine_type['zone'])
-        extra['description'] = machine_type['description']
-        extra['guestCpus'] = machine_type['guestCpus']
-        extra['creationTimestamp'] = machine_type['creationTimestamp']
+        extra['description'] = machine_type.get('description')
+        extra['guestCpus'] = machine_type.get('guestCpus')
+        extra['creationTimestamp'] = machine_type.get('creationTimestamp')
         try:
             price = self._get_size_price(size_id=machine_type['name'])
         except KeyError:
             price = None
 
         return GCENodeSize(id=machine_type['id'], name=machine_type['name'],
-                           ram=machine_type['memoryMb'],
-                           disk=machine_type['imageSpaceGb'],
+                           ram=machine_type.get('memoryMb'),
+                           disk=machine_type.get('imageSpaceGb'),
                            bandwidth=0, price=price, driver=self, extra=extra)
 
     def _to_project(self, project):
@@ -2689,13 +2785,13 @@ class GCENodeDriver(NodeDriver):
         :rtype: :class:`GCEProject`
         """
         extra = {}
-        extra['selfLink'] = project['selfLink']
-        extra['creationTimestamp'] = project['creationTimestamp']
-        extra['description'] = project['description']
+        extra['selfLink'] = project.get('selfLink')
+        extra['creationTimestamp'] = project.get('creationTimestamp')
+        extra['description'] = project.get('description')
         metadata = project['commonInstanceMetadata'].get('items')
 
         return GCEProject(id=project['id'], name=project['name'],
-                          metadata=metadata, quotas=project['quotas'],
+                          metadata=metadata, quotas=project.get('quotas'),
                           driver=self, extra=extra)
 
     def _to_region(self, region):
@@ -2709,9 +2805,9 @@ class GCENodeDriver(NodeDriver):
         :rtype: :class:`GCERegion`
         """
         extra = {}
-        extra['selfLink'] = region['selfLink']
-        extra['creationTimestamp'] = region['creationTimestamp']
-        extra['description'] = region['description']
+        extra['selfLink'] = region.get('selfLink')
+        extra['creationTimestamp'] = region.get('creationTimestamp')
+        extra['description'] = region.get('description')
 
         quotas = region.get('quotas')
         zones = [self.ex_get_zone(z) for z in region['zones']]
@@ -2721,10 +2817,30 @@ class GCENodeDriver(NodeDriver):
         deprecated = region.get('deprecated')
 
         return GCERegion(id=region['id'], name=region['name'],
-                         status=region['status'], zones=zones,
+                         status=region.get('status'), zones=zones,
                          quotas=quotas, deprecated=deprecated,
                          driver=self, extra=extra)
 
+    def _to_snapshot(self, snapshot):
+        """
+        Return a Snapshot object from the json-response dictionary.
+
+        :param  snapshot: The dictionary describing the snapshot
+        :type   snapshot: ``dict``
+
+        :return:  Snapshot object
+        :rtype:   :class:`VolumeSnapshot`
+        """
+        extra = {}
+        extra['selfLink'] = snapshot.get('selfLink')
+        extra['creationTimestamp'] = snapshot.get('creationTimestamp')
+        extra['sourceDisk'] = snapshot.get('sourceDisk')
+
+        return GCESnapshot(id=snapshot['id'], name=snapshot['name'],
+                           size=snapshot['diskSizeGb'],
+                           status=snapshot.get('status'), driver=self,
+                           extra=extra)
+
     def _to_storage_volume(self, volume):
         """
         Return a Volume object from the json-response dictionary.
@@ -2736,10 +2852,10 @@ class GCENodeDriver(NodeDriver):
         :rtype: :class:`StorageVolume`
         """
         extra = {}
-        extra['selfLink'] = volume['selfLink']
+        extra['selfLink'] = volume.get('selfLink')
         extra['zone'] = self.ex_get_zone(volume['zone'])
-        extra['status'] = volume['status']
-        extra['creationTimestamp'] = volume['creationTimestamp']
+        extra['status'] = volume.get('status')
+        extra['creationTimestamp'] = volume.get('creationTimestamp')
         extra['description'] = volume.get('description')
 
         return StorageVolume(id=volume['id'], name=volume['name'],
@@ -2756,7 +2872,7 @@ class GCENodeDriver(NodeDriver):
         :rtype:  :class:`GCETargetPool`
         """
         extra = {}
-        extra['selfLink'] = targetpool['selfLink']
+        extra['selfLink'] = targetpool.get('selfLink')
         extra['description'] = targetpool.get('description')
         region = self.ex_get_region(targetpool['region'])
         healthcheck_list = [self.ex_get_healthcheck(h.split('/')[-1]) for h
@@ -2788,9 +2904,9 @@ class GCENodeDriver(NodeDriver):
         :rtype: :class:`GCEZone`
         """
         extra = {}
-        extra['selfLink'] = zone['selfLink']
-        extra['creationTimestamp'] = zone['creationTimestamp']
-        extra['description'] = zone['description']
+        extra['selfLink'] = zone.get('selfLink')
+        extra['creationTimestamp'] = zone.get('creationTimestamp')
+        extra['description'] = zone.get('description')
 
         deprecated = zone.get('deprecated')
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2d3caa8c/libcloud/test/compute/fixtures/gce/aggregated_addresses.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/aggregated_addresses.json b/libcloud/test/compute/fixtures/gce/aggregated_addresses.json
index eee3552..4bab3a2 100644
--- a/libcloud/test/compute/fixtures/gce/aggregated_addresses.json
+++ b/libcloud/test/compute/fixtures/gce/aggregated_addresses.json
@@ -10,8 +10,8 @@
           "id": "10955781597205896134",
           "kind": "compute#address",
           "name": "libcloud-demo-europe-address",
-          "region": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/europe-west1",
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/europe-west1/addresses/libcloud-demo-europe-address",
+          "region": "https://www.googleapis.com/compute/v1/projects/project_name/regions/europe-west1",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/regions/europe-west1/addresses/libcloud-demo-europe-address",
           "status": "RESERVED"
         }
       ]
@@ -25,8 +25,8 @@
           "id": "01531551729918243104",
           "kind": "compute#address",
           "name": "lcaddress",
-          "region": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/us-central1",
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/us-central1/addresses/lcaddress",
+          "region": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1/addresses/lcaddress",
           "status": "RESERVED"
         },
         {
@@ -36,8 +36,8 @@
           "id": "17634862894218443422",
           "kind": "compute#address",
           "name": "libcloud-demo-address",
-          "region": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/us-central1",
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/us-central1/addresses/libcloud-demo-address",
+          "region": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1/addresses/libcloud-demo-address",
           "status": "RESERVED"
         },
         {
@@ -47,8 +47,8 @@
           "id": "11879548153827627972",
           "kind": "compute#address",
           "name": "testaddress",
-          "region": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/us-central1",
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/us-central1/addresses/testaddress",
+          "region": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1/addresses/testaddress",
           "status": "RESERVED"
         }
       ]
@@ -67,5 +67,5 @@
     }
   },
   "kind": "compute#addressAggregatedList",
-  "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/aggregated/addresses"
+  "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/aggregated/addresses"
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2d3caa8c/libcloud/test/compute/fixtures/gce/aggregated_disks.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/aggregated_disks.json b/libcloud/test/compute/fixtures/gce/aggregated_disks.json
index 00d9112..9133041 100644
--- a/libcloud/test/compute/fixtures/gce/aggregated_disks.json
+++ b/libcloud/test/compute/fixtures/gce/aggregated_disks.json
@@ -4,25 +4,53 @@
     "zones/europe-west1-a": {
       "disks": [
         {
-          "creationTimestamp": "2013-11-01T14:45:38.422-07:00",
-          "description": "Image: https://www.googleapis.com/compute/v1beta16/projects/debian-cloud/global/images/debian-7-wheezy-v20131014",
-          "id": "4294778976520895166",
+          "creationTimestamp": "2013-12-13T10:43:33.753-08:00",
+          "description": "Image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "id": "0819226106922408217",
           "kind": "compute#disk",
           "name": "libcloud-demo-europe-boot-disk",
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-boot-disk",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-boot-disk",
           "sizeGb": "10",
+          "sourceImage": "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "sourceImageId": "17312518942796567788",
           "status": "READY",
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a"
         },
         {
-          "creationTimestamp": "2013-11-01T14:45:27.063-07:00",
-          "id": "2488119868186709482",
+          "creationTimestamp": "2013-12-13T10:43:20.420-08:00",
+          "id": "30789070506648158",
           "kind": "compute#disk",
           "name": "libcloud-demo-europe-attach-disk",
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-attach-disk",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-attach-disk",
           "sizeGb": "1",
           "status": "READY",
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a"
+        },
+        {
+          "creationTimestamp": "2013-12-13T10:43:07.390-08:00",
+          "description": "Image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "id": "01221310665639400697",
+          "kind": "compute#disk",
+          "name": "libcloud-demo-europe-np-node",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-np-node",
+          "sizeGb": "10",
+          "sourceImage": "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "sourceImageId": "17312518942796567788",
+          "status": "READY",
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a"
+        },
+        {
+          "creationTimestamp": "2013-12-13T10:43:53.598-08:00",
+          "description": "Image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "id": "17495188440080825940",
+          "kind": "compute#disk",
+          "name": "libcloud-demo-europe-multiple-nodes-000",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-multiple-nodes-000",
+          "sizeGb": "10",
+          "sourceImage": "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "sourceImageId": "17312518942796567788",
+          "status": "READY",
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a"
         }
       ]
     },
@@ -58,39 +86,80 @@
           "id": "8658241308250794904",
           "kind": "compute#disk",
           "name": "test1",
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central1-b/disks/test1",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-b/disks/test1",
           "sizeGb": "10",
           "status": "READY",
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central1-b"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-b"
         }
       ]
     },
     "zones/us-central2-a": {
       "disks": [
         {
-          "creationTimestamp": "2013-11-01T14:43:36.763-07:00",
-          "id": "01690270691106097961",
+          "creationTimestamp": "2013-12-13T10:41:59.430-08:00",
+          "description": "Image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "id": "3371304879167251249",
+          "kind": "compute#disk",
+          "name": "libcloud-demo-boot-disk",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/disks/libcloud-demo-boot-disk",
+          "sizeGb": "10",
+          "sourceImage": "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "sourceImageId": "17312518942796567788",
+          "status": "READY",
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a"
+        },
+        {
+          "creationTimestamp": "2013-12-13T10:42:15.355-08:00",
+          "description": "Image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "id": "12650345960824309663",
+          "kind": "compute#disk",
+          "name": "libcloud-demo-multiple-nodes-000",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/disks/libcloud-demo-multiple-nodes-000",
+          "sizeGb": "10",
+          "sourceImage": "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "sourceImageId": "17312518942796567788",
+          "status": "READY",
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a"
+        },
+        {
+          "creationTimestamp": "2013-12-13T10:41:52.533-08:00",
+          "id": "01867312924613359214",
           "kind": "compute#disk",
           "name": "libcloud-demo-attach-disk",
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/disks/libcloud-demo-attach-disk",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/disks/libcloud-demo-attach-disk",
           "sizeGb": "1",
           "status": "READY",
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a"
         },
         {
-          "creationTimestamp": "2013-11-01T14:43:46.039-07:00",
-          "description": "Image: https://www.googleapis.com/compute/v1beta16/projects/debian-cloud/global/images/debian-7-wheezy-v20131014",
-          "id": "01805374214887472027",
+          "creationTimestamp": "2013-12-13T10:42:15.949-08:00",
+          "description": "Image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "id": "12498700959701905851",
           "kind": "compute#disk",
-          "name": "libcloud-demo-boot-disk",
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/disks/libcloud-demo-boot-disk",
+          "name": "libcloud-demo-multiple-nodes-001",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/disks/libcloud-demo-multiple-nodes-001",
+          "sizeGb": "10",
+          "sourceImage": "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "sourceImageId": "17312518942796567788",
+          "status": "READY",
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a"
+        },
+        {
+          "creationTimestamp": "2013-12-13T10:41:44.063-08:00",
+          "description": "Image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "id": "345757781195247006",
+          "kind": "compute#disk",
+          "name": "libcloud-demo-np-node",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/disks/libcloud-demo-np-node",
           "sizeGb": "10",
+          "sourceImage": "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120",
+          "sourceImageId": "17312518942796567788",
           "status": "READY",
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a"
         }
       ]
     }
   },
   "kind": "compute#diskAggregatedList",
-  "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/aggregated/disks"
-}
\ No newline at end of file
+  "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/aggregated/disks"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2d3caa8c/libcloud/test/compute/fixtures/gce/aggregated_forwardingRules.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/aggregated_forwardingRules.json b/libcloud/test/compute/fixtures/gce/aggregated_forwardingRules.json
index fd3827b..06a1a0e 100644
--- a/libcloud/test/compute/fixtures/gce/aggregated_forwardingRules.json
+++ b/libcloud/test/compute/fixtures/gce/aggregated_forwardingRules.json
@@ -16,26 +16,28 @@
     "regions/us-central1": {
       "forwardingRules": [
         {
-          "IPAddress": "173.255.119.224",
+          "IPAddress": "108.59.86.60",
           "IPProtocol": "TCP",
-          "creationTimestamp": "2013-09-03T00:17:25.544-07:00",
-          "id": "10901665092293158938",
+          "creationTimestamp": "2013-12-13T10:51:47.602-08:00",
+          "id": "0401221837226610637",
           "kind": "compute#forwardingRule",
-          "name": "lcforwardingrule",
-          "portRange": "8000-8500",
-          "region": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/us-central1",
-          "target": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
+          "name": "libcloud-lb-demo-lb",
+          "portRange": "80-80",
+          "region": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1/forwardingRules/libcloud-lb-demo-lb",
+          "target": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
         },
         {
-          "IPAddress": "173.255.119.185",
+          "IPAddress": "173.255.114.35",
           "IPProtocol": "TCP",
-          "creationTimestamp": "2013-09-02T22:25:50.575-07:00",
-          "id": "15826316229163619337",
+          "creationTimestamp": "2013-12-13T10:52:57.170-08:00",
+          "id": "06342111469679701315",
           "kind": "compute#forwardingRule",
-          "name": "libcloud-lb-demo-lb",
-          "portRange": "80-80",
-          "region": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/us-central1",
-          "target": "https://www.googleapis.com/compute/v1beta16/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
+          "name": "lcforwardingrule",
+          "portRange": "8000-8500",
+          "region": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1",
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1/forwardingRules/lcforwardingrule",
+          "target": "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
         }
       ]
     },
@@ -53,5 +55,5 @@
     }
   },
   "kind": "compute#forwardingRuleAggregatedList",
-  "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/aggregated/forwardingRules"
+  "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/aggregated/forwardingRules"
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2d3caa8c/libcloud/test/compute/fixtures/gce/aggregated_instances.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/aggregated_instances.json b/libcloud/test/compute/fixtures/gce/aggregated_instances.json
index 056cbb2..3624fd0 100644
--- a/libcloud/test/compute/fixtures/gce/aggregated_instances.json
+++ b/libcloud/test/compute/fixtures/gce/aggregated_instances.json
@@ -5,123 +5,132 @@
       "instances": [
         {
           "canIpForward": false,
-          "creationTimestamp": "2013-11-01T14:45:44.186-07:00",
+          "creationTimestamp": "2013-12-13T10:43:58.782-08:00",
           "disks": [
             {
               "boot": true,
-              "deviceName": "libcloud-demo-europe-boot-disk",
+              "deviceName": "libcloud-demo-europe-multiple-nodes-000",
               "index": 0,
               "kind": "compute#attachedDisk",
               "mode": "READ_WRITE",
-              "source": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-boot-disk",
+              "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-multiple-nodes-000",
               "type": "PERSISTENT"
             }
           ],
-          "id": "8051468456709756069",
-          "kernel": "https://www.googleapis.com/compute/v1beta16/projects/google/global/kernels/gce-no-conn-track-v20130813",
+          "id": "10947706194464948790",
           "kind": "compute#instance",
-          "machineType": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a/machineTypes/n1-standard-1",
+          "machineType": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/machineTypes/n1-standard-1",
           "metadata": {
             "fingerprint": "42WmSpB8rSM=",
             "kind": "compute#metadata"
           },
-          "name": "libcloud-demo-europe-persist-node",
+          "name": "libcloud-demo-europe-multiple-nodes-000",
           "networkInterfaces": [
             {
               "accessConfigs": [
                 {
                   "kind": "compute#accessConfig",
                   "name": "External NAT",
-                  "natIP": "8.34.211.23",
+                  "natIP": "192.158.28.252",
                   "type": "ONE_TO_ONE_NAT"
                 }
               ],
               "name": "nic0",
-              "network": "https://www.googleapis.com/compute/v1beta16/projects/project_name/global/networks/default",
-              "networkIP": "10.240.188.108"
+              "network": "https://www.googleapis.com/compute/v1/projects/project_name/global/networks/default",
+              "networkIP": "10.240.122.85"
             }
           ],
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a/instances/libcloud-demo-europe-persist-node",
+          "scheduling": {
+            "automaticRestart": true,
+            "onHostMaintenance": "MIGRATE"
+          },
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/instances/libcloud-demo-europe-multiple-nodes-000",
           "status": "RUNNING",
           "tags": {
-            "fingerprint": "EbZdwVRtKyg=",
+            "fingerprint": "W7t6ZyTyIrc=",
             "items": [
-              "libcloud",
-              "newtag"
+              "libcloud"
             ]
           },
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a"
         },
         {
           "canIpForward": false,
-          "creationTimestamp": "2013-11-01T14:46:02.933-07:00",
+          "creationTimestamp": "2013-12-13T10:43:37.267-08:00",
           "disks": [
             {
+              "boot": true,
+              "deviceName": "libcloud-demo-europe-boot-disk",
               "index": 0,
               "kind": "compute#attachedDisk",
               "mode": "READ_WRITE",
-              "type": "SCRATCH"
+              "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-boot-disk",
+              "type": "PERSISTENT"
             }
           ],
-          "id": "04184465693678804555",
-          "image": "https://www.googleapis.com/compute/v1beta16/projects/debian-cloud/global/images/debian-7-wheezy-v20131014",
-          "kernel": "https://www.googleapis.com/compute/v1beta16/projects/google/global/kernels/gce-no-conn-track-v20130813",
+          "id": "517678477070693411",
           "kind": "compute#instance",
-          "machineType": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a/machineTypes/n1-standard-1",
+          "machineType": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/machineTypes/n1-standard-1",
           "metadata": {
             "fingerprint": "42WmSpB8rSM=",
             "kind": "compute#metadata"
           },
-          "name": "libcloud-demo-europe-multiple-nodes-000",
+          "name": "libcloud-demo-europe-persist-node",
           "networkInterfaces": [
             {
               "accessConfigs": [
                 {
                   "kind": "compute#accessConfig",
                   "name": "External NAT",
-                  "natIP": "8.34.211.48",
+                  "natIP": "23.251.128.32",
                   "type": "ONE_TO_ONE_NAT"
                 }
               ],
               "name": "nic0",
-              "network": "https://www.googleapis.com/compute/v1beta16/projects/project_name/global/networks/default",
-              "networkIP": "10.240.141.92"
+              "network": "https://www.googleapis.com/compute/v1/projects/project_name/global/networks/default",
+              "networkIP": "10.240.240.204"
             }
           ],
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a/instances/libcloud-demo-europe-multiple-nodes-000",
+          "scheduling": {
+            "automaticRestart": true,
+            "onHostMaintenance": "MIGRATE"
+          },
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/instances/libcloud-demo-europe-persist-node",
           "status": "RUNNING",
           "tags": {
-            "fingerprint": "W7t6ZyTyIrc=",
+            "fingerprint": "EbZdwVRtKyg=",
             "items": [
-              "libcloud"
+              "libcloud",
+              "newtag"
             ]
           },
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a"
         },
         {
           "canIpForward": false,
-          "creationTimestamp": "2013-11-01T14:44:57.127-07:00",
+          "creationTimestamp": "2013-12-13T10:43:12.706-08:00",
           "disks": [
             {
+              "boot": true,
+              "deviceName": "libcloud-demo-europe-np-node",
               "index": 0,
               "kind": "compute#attachedDisk",
               "mode": "READ_WRITE",
-              "type": "SCRATCH"
+              "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-np-node",
+              "type": "PERSISTENT"
             },
             {
               "deviceName": "libcloud-demo-europe-attach-disk",
               "index": 1,
               "kind": "compute#attachedDisk",
               "mode": "READ_WRITE",
-              "source": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-attach-disk",
+              "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/disks/libcloud-demo-europe-attach-disk",
               "type": "PERSISTENT"
             }
           ],
-          "id": "4450078356274958103",
-          "image": "https://www.googleapis.com/compute/v1beta16/projects/debian-cloud/global/images/debian-7-wheezy-v20131014",
-          "kernel": "https://www.googleapis.com/compute/v1beta16/projects/google/global/kernels/gce-no-conn-track-v20130813",
+          "id": "3421745795082776097",
           "kind": "compute#instance",
-          "machineType": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a/machineTypes/n1-standard-1",
+          "machineType": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/machineTypes/n1-standard-1",
           "metadata": {
             "fingerprint": "42WmSpB8rSM=",
             "kind": "compute#metadata"
@@ -133,16 +142,20 @@
                 {
                   "kind": "compute#accessConfig",
                   "name": "External NAT",
-                  "natIP": "8.34.208.52",
+                  "natIP": "23.251.128.10",
                   "type": "ONE_TO_ONE_NAT"
                 }
               ],
               "name": "nic0",
-              "network": "https://www.googleapis.com/compute/v1beta16/projects/project_name/global/networks/default",
-              "networkIP": "10.240.48.164"
+              "network": "https://www.googleapis.com/compute/v1/projects/project_name/global/networks/default",
+              "networkIP": "10.240.221.125"
             }
           ],
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a/instances/libcloud-demo-europe-np-node",
+          "scheduling": {
+            "automaticRestart": true,
+            "onHostMaintenance": "MIGRATE"
+          },
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/instances/libcloud-demo-europe-np-node",
           "status": "RUNNING",
           "tags": {
             "fingerprint": "W7t6ZyTyIrc=",
@@ -150,7 +163,7 @@
               "libcloud"
             ]
           },
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/europe-west1-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a"
         }
       ]
     },
@@ -170,20 +183,21 @@
       "instances": [
         {
           "canIpForward": false,
-          "creationTimestamp": "2013-11-01T14:47:29.154-07:00",
+          "creationTimestamp": "2013-12-13T10:45:23.351-08:00",
           "disks": [
             {
+              "boot": true,
+              "deviceName": "persistent-disk-0",
               "index": 0,
               "kind": "compute#attachedDisk",
               "mode": "READ_WRITE",
-              "type": "SCRATCH"
+              "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/disks/node-name",
+              "type": "PERSISTENT"
             }
           ],
-          "id": "10348912619288589086",
-          "image": "https://www.googleapis.com/compute/v1beta16/projects/debian-cloud/global/images/debian-7-wheezy-v20130617",
-          "kernel": "https://www.googleapis.com/compute/v1beta16/projects/google/global/kernels/gce-v20130603",
+          "id": "4006034190819017667",
           "kind": "compute#instance",
-          "machineType": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central1-a/machineTypes/n1-standard-1",
+          "machineType": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/machineTypes/n1-standard-1",
           "metadata": {
             "fingerprint": "42WmSpB8rSM=",
             "kind": "compute#metadata"
@@ -195,21 +209,25 @@
                 {
                   "kind": "compute#accessConfig",
                   "name": "External NAT",
-                  "natIP": "8.35.197.91",
+                  "natIP": "23.236.58.15",
                   "type": "ONE_TO_ONE_NAT"
                 }
               ],
               "name": "nic0",
-              "network": "https://www.googleapis.com/compute/v1beta16/projects/project_name/global/networks/default",
-              "networkIP": "10.240.123.204"
+              "network": "https://www.googleapis.com/compute/v1/projects/project_name/global/networks/default",
+              "networkIP": "10.240.72.75"
             }
           ],
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central1-a/instances/node-name",
+          "scheduling": {
+            "automaticRestart": true,
+            "onHostMaintenance": "MIGRATE"
+          },
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/instances/node-name",
           "status": "RUNNING",
           "tags": {
             "fingerprint": "42WmSpB8rSM="
           },
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central1-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a"
         }
       ]
     },
@@ -229,115 +247,132 @@
       "instances": [
         {
           "canIpForward": false,
-          "creationTimestamp": "2013-11-01T14:44:03.801-07:00",
+          "creationTimestamp": "2013-12-13T10:42:03.180-08:00",
           "disks": [
             {
+              "boot": true,
+              "deviceName": "libcloud-demo-boot-disk",
               "index": 0,
               "kind": "compute#attachedDisk",
               "mode": "READ_WRITE",
-              "type": "SCRATCH"
+              "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/disks/libcloud-demo-boot-disk",
+              "type": "PERSISTENT"
             }
           ],
-          "id": "8843444782291050664",
-          "image": "https://www.googleapis.com/compute/v1beta16/projects/debian-cloud/global/images/debian-7-wheezy-v20131014",
-          "kernel": "https://www.googleapis.com/compute/v1beta16/projects/google/global/kernels/gce-no-conn-track-v20130813",
+          "id": "2184470466384636715",
           "kind": "compute#instance",
-          "machineType": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/machineTypes/n1-standard-1",
+          "machineType": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/machineTypes/n1-standard-1",
           "metadata": {
             "fingerprint": "42WmSpB8rSM=",
             "kind": "compute#metadata"
           },
-          "name": "libcloud-demo-multiple-nodes-001",
+          "name": "libcloud-demo-persist-node",
           "networkInterfaces": [
             {
               "accessConfigs": [
                 {
                   "kind": "compute#accessConfig",
                   "name": "External NAT",
-                  "natIP": "173.255.121.180",
+                  "natIP": "173.255.120.70",
                   "type": "ONE_TO_ONE_NAT"
                 }
               ],
               "name": "nic0",
-              "network": "https://www.googleapis.com/compute/v1beta16/projects/project_name/global/networks/default",
-              "networkIP": "10.240.167.120"
+              "network": "https://www.googleapis.com/compute/v1/projects/project_name/global/networks/default",
+              "networkIP": "10.240.235.148"
             }
           ],
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/instances/libcloud-demo-multiple-nodes-001",
+          "scheduling": {
+            "automaticRestart": true,
+            "onHostMaintenance": "MIGRATE"
+          },
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/instances/libcloud-demo-persist-node",
           "status": "RUNNING",
           "tags": {
-            "fingerprint": "W7t6ZyTyIrc=",
+            "fingerprint": "EbZdwVRtKyg=",
             "items": [
-              "libcloud"
+              "libcloud",
+              "newtag"
             ]
           },
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a"
         },
         {
           "canIpForward": false,
-          "creationTimestamp": "2013-11-01T14:43:49.457-07:00",
+          "creationTimestamp": "2013-12-13T10:41:47.059-08:00",
           "disks": [
             {
               "boot": true,
-              "deviceName": "libcloud-demo-boot-disk",
+              "deviceName": "libcloud-demo-np-node",
               "index": 0,
               "kind": "compute#attachedDisk",
               "mode": "READ_WRITE",
-              "source": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/disks/libcloud-demo-boot-disk",
+              "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/disks/libcloud-demo-np-node",
+              "type": "PERSISTENT"
+            },
+            {
+              "deviceName": "libcloud-demo-attach-disk",
+              "index": 1,
+              "kind": "compute#attachedDisk",
+              "mode": "READ_WRITE",
+              "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/disks/libcloud-demo-attach-disk",
               "type": "PERSISTENT"
             }
           ],
-          "id": "2278280472037226745",
-          "kernel": "https://www.googleapis.com/compute/v1beta16/projects/google/global/kernels/gce-no-conn-track-v20130813",
+          "id": "18059053700460342373",
           "kind": "compute#instance",
-          "machineType": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/machineTypes/n1-standard-1",
+          "machineType": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/machineTypes/n1-standard-1",
           "metadata": {
             "fingerprint": "42WmSpB8rSM=",
             "kind": "compute#metadata"
           },
-          "name": "libcloud-demo-persist-node",
+          "name": "libcloud-demo-np-node",
           "networkInterfaces": [
             {
               "accessConfigs": [
                 {
                   "kind": "compute#accessConfig",
                   "name": "External NAT",
-                  "natIP": "173.255.121.109",
+                  "natIP": "173.255.120.58",
                   "type": "ONE_TO_ONE_NAT"
                 }
               ],
               "name": "nic0",
-              "network": "https://www.googleapis.com/compute/v1beta16/projects/project_name/global/networks/default",
-              "networkIP": "10.240.102.153"
+              "network": "https://www.googleapis.com/compute/v1/projects/project_name/global/networks/default",
+              "networkIP": "10.240.45.206"
             }
           ],
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/instances/libcloud-demo-persist-node",
+          "scheduling": {
+            "automaticRestart": true,
+            "onHostMaintenance": "MIGRATE"
+          },
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/instances/libcloud-demo-np-node",
           "status": "RUNNING",
           "tags": {
-            "fingerprint": "EbZdwVRtKyg=",
+            "fingerprint": "W7t6ZyTyIrc=",
             "items": [
-              "libcloud",
-              "newtag"
+              "libcloud"
             ]
           },
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a"
         },
         {
           "canIpForward": false,
-          "creationTimestamp": "2013-11-01T14:44:03.256-07:00",
+          "creationTimestamp": "2013-12-13T10:42:24.841-08:00",
           "disks": [
             {
+              "boot": true,
+              "deviceName": "libcloud-demo-multiple-nodes-000",
               "index": 0,
               "kind": "compute#attachedDisk",
               "mode": "READ_WRITE",
-              "type": "SCRATCH"
+              "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/disks/libcloud-demo-multiple-nodes-000",
+              "type": "PERSISTENT"
             }
           ],
-          "id": "0994482023759804723",
-          "image": "https://www.googleapis.com/compute/v1beta16/projects/debian-cloud/global/images/debian-7-wheezy-v20131014",
-          "kernel": "https://www.googleapis.com/compute/v1beta16/projects/google/global/kernels/gce-no-conn-track-v20130813",
+          "id": "4196532528539285480",
           "kind": "compute#instance",
-          "machineType": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/machineTypes/n1-standard-1",
+          "machineType": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/machineTypes/n1-standard-1",
           "metadata": {
             "fingerprint": "42WmSpB8rSM=",
             "kind": "compute#metadata"
@@ -349,16 +384,20 @@
                 {
                   "kind": "compute#accessConfig",
                   "name": "External NAT",
-                  "natIP": "173.255.121.133",
+                  "natIP": "173.255.120.211",
                   "type": "ONE_TO_ONE_NAT"
                 }
               ],
               "name": "nic0",
-              "network": "https://www.googleapis.com/compute/v1beta16/projects/project_name/global/networks/default",
-              "networkIP": "10.240.164.41"
+              "network": "https://www.googleapis.com/compute/v1/projects/project_name/global/networks/default",
+              "networkIP": "10.240.218.251"
             }
           ],
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/instances/libcloud-demo-multiple-nodes-000",
+          "scheduling": {
+            "automaticRestart": true,
+            "onHostMaintenance": "MIGRATE"
+          },
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/instances/libcloud-demo-multiple-nodes-000",
           "status": "RUNNING",
           "tags": {
             "fingerprint": "W7t6ZyTyIrc=",
@@ -366,53 +405,50 @@
               "libcloud"
             ]
           },
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a"
         },
         {
           "canIpForward": false,
-          "creationTimestamp": "2013-11-01T14:43:15.485-07:00",
+          "creationTimestamp": "2013-12-13T10:42:19.041-08:00",
           "disks": [
             {
+              "boot": true,
+              "deviceName": "libcloud-demo-multiple-nodes-001",
               "index": 0,
               "kind": "compute#attachedDisk",
               "mode": "READ_WRITE",
-              "type": "SCRATCH"
-            },
-            {
-              "deviceName": "libcloud-demo-attach-disk",
-              "index": 1,
-              "kind": "compute#attachedDisk",
-              "mode": "READ_WRITE",
-              "source": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/disks/libcloud-demo-attach-disk",
+              "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/disks/libcloud-demo-multiple-nodes-001",
               "type": "PERSISTENT"
             }
           ],
-          "id": "08480381647283539833",
-          "image": "https://www.googleapis.com/compute/v1beta16/projects/debian-cloud/global/images/debian-7-wheezy-v20131014",
-          "kernel": "https://www.googleapis.com/compute/v1beta16/projects/google/global/kernels/gce-no-conn-track-v20130813",
+          "id": "1066146046261788296",
           "kind": "compute#instance",
-          "machineType": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/machineTypes/n1-standard-1",
+          "machineType": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/machineTypes/n1-standard-1",
           "metadata": {
             "fingerprint": "42WmSpB8rSM=",
             "kind": "compute#metadata"
           },
-          "name": "libcloud-demo-np-node",
+          "name": "libcloud-demo-multiple-nodes-001",
           "networkInterfaces": [
             {
               "accessConfigs": [
                 {
                   "kind": "compute#accessConfig",
                   "name": "External NAT",
-                  "natIP": "173.255.121.95",
+                  "natIP": "173.255.120.207",
                   "type": "ONE_TO_ONE_NAT"
                 }
               ],
               "name": "nic0",
-              "network": "https://www.googleapis.com/compute/v1beta16/projects/project_name/global/networks/default",
-              "networkIP": "10.240.37.226"
+              "network": "https://www.googleapis.com/compute/v1/projects/project_name/global/networks/default",
+              "networkIP": "10.240.24.29"
             }
           ],
-          "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a/instances/libcloud-demo-np-node",
+          "scheduling": {
+            "automaticRestart": true,
+            "onHostMaintenance": "MIGRATE"
+          },
+          "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a/instances/libcloud-demo-multiple-nodes-001",
           "status": "RUNNING",
           "tags": {
             "fingerprint": "W7t6ZyTyIrc=",
@@ -420,11 +456,11 @@
               "libcloud"
             ]
           },
-          "zone": "https://www.googleapis.com/compute/v1beta16/projects/project_name/zones/us-central2-a"
+          "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central2-a"
         }
       ]
     }
   },
   "kind": "compute#instanceAggregatedList",
-  "selfLink": "https://www.googleapis.com/compute/v1beta16/projects/project_name/aggregated/instances"
+  "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/aggregated/instances"
 }
\ No newline at end of file