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 2013/10/04 18:02:58 UTC

[2/5] GCE Loadbalancer Support and improvements in the compute

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/loadbalancer/drivers/gce.py
----------------------------------------------------------------------
diff --git a/libcloud/loadbalancer/drivers/gce.py b/libcloud/loadbalancer/drivers/gce.py
new file mode 100644
index 0000000..904ff9c
--- /dev/null
+++ b/libcloud/loadbalancer/drivers/gce.py
@@ -0,0 +1,363 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+try:
+    import simplejson as json
+except ImportError:
+    import json
+
+from libcloud.loadbalancer.base import LoadBalancer, Member, Driver, Algorithm
+from libcloud.compute.drivers.gce import GCEConnection, GCENodeDriver
+
+# GCE doesn't actually give you a algorithm choice, but this is here simply as
+# the closest match.  The actual algorithm is described here:
+# https://developers.google.com/compute/docs/load-balancing/#overview
+DEFAULT_ALGORITHM = Algorithm.RANDOM
+
+
+class GCELBDriver(Driver):
+    connectionCls = GCEConnection
+    apiname = 'googleapis'
+    name = 'Google Compute Engine'
+    website = 'https://www.googleapis.com/'
+
+    _VALUE_TO_ALGORITHM_MAP = {
+        'RANDOM': Algorithm.RANDOM
+    }
+
+    def __init__(self, *args, **kwargs):
+
+        if kwargs.get('gce_driver'):
+            self.gce = kwargs['gce_driver']
+        else:
+            self.gce = GCENodeDriver(*args, **kwargs)
+
+        self.connection = self.gce.connection
+
+    def _get_node_from_ip(self, ip):
+        """
+        Return the node object that matches a given public IP address.
+
+        :param  ip: Public IP address to search for
+        :type   ip: ``str``
+
+        :return:  Node object that has the given IP, or None if not found.
+        :rtype:   :class:`Node` or None
+        """
+        all_nodes = self.gce.list_nodes(ex_zone='all')
+        for node in all_nodes:
+            if ip in node.public_ips:
+                return node
+        return None
+
+    def list_protocols(self):
+        """
+        Return a list of supported protocols.
+
+        For GCE, this is simply a hardcoded list.
+
+        :rtype: ``list`` of ``str``
+        """
+        return ['TCP', 'UDP']
+
+    def list_balancers(self, ex_region=None):
+        """
+        List all loadbalancers
+
+        :keyword  ex_region: The region to return balancers from.  If None,
+                             will default to self.region.  If 'all', will
+                             return all balancers.
+        :type     ex_region: ``str`` or :class:`GCERegion` or ``None``
+
+        :rtype: ``list`` of :class:`LoadBalancer`
+        """
+        balancers = []
+        for fwr in self.gce.ex_list_forwarding_rules(region=ex_region):
+            balancers.append(self._forwarding_rule_to_loadbalancer(fwr))
+        return balancers
+
+    def create_balancer(self, name, port, protocol, algorithm, members,
+                        ex_region=None, ex_healthchecks=None, ex_address=None):
+        """
+        Create a new load balancer instance.
+
+        For GCE, this means creating a forwarding rule and a matching target
+        pool, then adding the members to the target pool.
+
+        :param  name: Name of the new load balancer (required)
+        :type   ``str``
+
+        :param  port: Port or range of ports the load balancer should listen
+                      on, defaults to all ports.  Examples: '80', '5000-5999'
+        :type   port: ``str``
+
+        :param  protocol: Load balancer protocol.  Should be 'tcp' or 'udp',
+                          defaults to 'tcp'.
+        :type   protocol: ``str``
+
+        :param  members: List of Members to attach to balancer.  Can be Member
+                         objects or Node objects.  Node objects are preferred
+                         for GCE, but Member objects are accepted to comply
+                         with the established libcloud API.  Note that the
+                         'port' attribute of the members is ignored.
+        :type   members: ``list`` of :class:`Member` or :class:`Node`
+
+        :param  algorithm: Load balancing algorithm.  Ignored for GCE which
+                           uses a hashing-based algorithm.
+        :type   algorithm: :class:`Algorithm` or ``None``
+
+        :keyword  ex_region:  Optional region to create the load balancer in.
+                              Defaults to the default region of the GCE Node
+                              Driver.
+        :type     ex_region:  C{GCERegion} or ``str``
+
+        :keyword  ex_healthchecks: Optional list of healthcheck objects or
+                                   names to add to the load balancer.
+        :type     ex_healthchecks: ``list`` of :class:`GCEHealthCheck` or ``str``
+
+        :keyword  ex_address: Optional static address object to be assigned to
+                              the load balancer.
+        :type     ex_address: C{GCEAddress}
+
+        :return:  LoadBalancer object
+        :rtype:   :class:`LoadBalancer`
+        """
+        unused = algorithm
+
+        node_list = []
+        for member in members:
+            # Member object
+            if hasattr(member, 'ip'):
+                if member.extra.get('node'):
+                    node_list.append(member.extra['node'])
+                else:
+                    node_list.append(self._get_node_from_ip(member.ip))
+            # Node object
+            elif hasattr(member, 'name'):
+                node_list.append(member)
+            # Assume it's a node name otherwise
+            else:
+                node_list.append(self.gce.ex_get_node(member, 'all'))
+
+        # Create Target Pool
+        tp_name = '%s-tp' % name
+        targetpool = self.gce.ex_create_targetpool(
+            tp_name, region=ex_region, healthchecks=ex_healthchecks,
+            nodes=node_list)
+
+        # Create the Forwarding rule, but if it fails, delete the target pool.
+        try:
+            forwarding_rule = self.gce.ex_create_forwarding_rule(
+                name, targetpool, region=ex_region, protocol=protocol,
+                port_range=port, address=ex_address)
+        except:
+            targetpool.destroy()
+            raise
+
+        # Reformat forwarding rule to LoadBalancer object
+        return self._forwarding_rule_to_loadbalancer(forwarding_rule)
+
+    def destroy_balancer(self, balancer):
+        """
+        Destroy a load balancer.
+
+        For GCE, this means destroying the associated forwarding rule, then
+        destroying the target pool that was attached to the forwarding rule.
+
+        :param  balancer: LoadBalancer which should be used
+        :type   balancer: :class:`LoadBalancer`
+
+        :return:  True if successful
+        :rtype:   ``bool``
+        """
+        destroy = balancer.extra['forwarding_rule'].destroy()
+        if destroy:
+            tp_destroy = balancer.extra['targetpool'].destroy()
+            return tp_destroy
+        else:
+            return destroy
+
+    def get_balancer(self, balancer_id):
+        """
+        Return a :class:`LoadBalancer` object.
+
+        :param  balancer_id: Name of load balancer you wish to fetch.  For GCE,
+                             this is the name of the associated forwarding
+                             rule.
+        :param  balancer_id: ``str``
+
+        :rtype: :class:`LoadBalancer`
+        """
+        fwr = self.gce.ex_get_forwarding_rule(balancer_id)
+        return self._forwarding_rule_to_loadbalancer(fwr)
+
+    def balancer_attach_compute_node(self, balancer, node):
+        """
+        Attach a compute node as a member to the load balancer.
+
+        :param balancer: LoadBalancer which should be used
+        :type  balancer: :class:`LoadBalancer`
+
+        :param node: Node to join to the balancer
+        :type  node: :class:`Node`
+
+        :return: Member after joining the balancer.
+        :rtype: :class:`Member`
+        """
+        add_node = balancer.extra['targetpool'].add_node(node)
+        if add_node:
+            return self._node_to_member(node, balancer)
+
+    def balancer_attach_member(self, balancer, member):
+        """
+        Attach a member to balancer
+
+        :param balancer: LoadBalancer which should be used
+        :type  balancer: :class:`LoadBalancer`
+
+        :param member: Member to join to the balancer
+        :type member: :class:`Member`
+
+        :return: Member after joining the balancer.
+        :rtype: :class:`Member`
+        """
+        node = member.extra.get('node') or self._get_node_from_ip(member.ip)
+        add_node = balancer.extra['targetpool'].add_node(node)
+        if add_node:
+            return self._node_to_member(node, balancer)
+
+    def balancer_detach_member(self, balancer, member):
+        """
+        Detach member from balancer
+
+        :param balancer: LoadBalancer which should be used
+        :type  balancer: :class:`LoadBalancer`
+
+        :param member: Member which should be used
+        :type member: :class:`Member`
+
+        :return: True if member detach was successful, otherwise False
+        :rtype: ``bool``
+        """
+        node = member.extra.get('node') or self._get_node_from_ip(member.ip)
+        remove_node = balancer.extra['targetpool'].remove_node(node)
+        return remove_node
+
+    def balancer_list_members(self, balancer):
+        """
+        Return list of members attached to balancer
+
+        :param balancer: LoadBalancer which should be used
+        :type  balancer: :class:`LoadBalancer`
+
+        :rtype: ``list`` of :class:`Member`
+        """
+        return [self._node_to_member(n, balancer) for n in
+                balancer.extra['targetpool'].nodes]
+
+    def ex_create_healthcheck(self, *args, **kwargs):
+        return self.gce.ex_create_healthcheck(*args, **kwargs)
+
+    def ex_list_healthchecks(self):
+        return self.gce.ex_list_healthchecks()
+
+    def ex_balancer_attach_healthcheck(self, balancer, healthcheck):
+        """
+        Attach a healthcheck to balancer
+
+        :param balancer: LoadBalancer which should be used
+        :type  balancer: :class:`LoadBalancer`
+
+        :param healthcheck: Healthcheck to add
+        :type  healthcheck: :class:`GCEHealthCheck`
+
+        :return: True if successful
+        :rtype:  ``bool``
+        """
+        return balancer.extra['targetpool'].add_healthcheck(healthcheck)
+
+    def ex_balancer_detach_healthcheck(self, balancer, healthcheck):
+        """
+        Detach healtcheck from balancer
+
+        :param balancer: LoadBalancer which should be used
+        :type  balancer: :class:`LoadBalancer`
+
+        :param healthcheck: Healthcheck to remove
+        :type  healthcheck: :class:`GCEHealthCheck`
+
+        :return: True if successful
+        :rtype: ``bool``
+        """
+        return balancer.extra['targetpool'].remove_healthcheck(healthcheck)
+
+    def ex_balancer_list_healthchecks(self, balancer):
+        """
+        Return list of healthchecks attached to balancer
+
+        :param  balancer: LoadBalancer which should be used
+        :type   balancer: :class:`LoadBalancer`
+
+        :rtype: ``list`` of :class:`HealthChecks`
+        """
+        return balancer.extra['healthchecks']
+
+    def _node_to_member(self, node, balancer):
+        """
+        Return a Member object based on a Node.
+
+        :param  node: Node object
+        :type   node: :class:`Node`
+
+        :keyword  balancer: The balancer the member is attached to.
+        :type     balancer: :class:`LoadBalancer`
+
+        :return:  Member object
+        :rtype:   :class:`Member`
+        """
+        # A balancer can have a node as a member, even if the node doesn't
+        # exist.  In this case, 'node' is simply a string to where the resource
+        # would be found if it was there.
+        if hasattr(node, 'name'):
+            member_id = node.name
+            member_ip = node.public_ips[0]
+        else:
+            member_id = node
+            member_ip = None
+
+        extra = {'node': node}
+        return Member(id=member_id, ip=member_ip, port=balancer.port,
+                      balancer=balancer, extra=extra)
+
+    def _forwarding_rule_to_loadbalancer(self, forwarding_rule):
+        """
+        Return a Load Balancer object based on a GCEForwardingRule object.
+
+        :param  forwarding_rule: ForwardingRule object
+        :type   forwarding_rule: :class:`GCEForwardingRule`
+
+        :return:  LoadBalancer object
+        :rtype:   :class:`LoadBalancer`
+        """
+        extra = {}
+        extra['forwarding_rule'] = forwarding_rule
+        extra['targetpool'] = forwarding_rule.targetpool
+        extra['healthchecks'] = forwarding_rule.targetpool.healthchecks
+
+        return LoadBalancer(id=forwarding_rule.id,
+                            name=forwarding_rule.name, state=None,
+                            ip=forwarding_rule.address,
+                            port=forwarding_rule.extra['portRange'],
+                            driver=self, extra=extra)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/loadbalancer/providers.py
----------------------------------------------------------------------
diff --git a/libcloud/loadbalancer/providers.py b/libcloud/loadbalancer/providers.py
index 3ed140d..54ce72b 100644
--- a/libcloud/loadbalancer/providers.py
+++ b/libcloud/loadbalancer/providers.py
@@ -37,8 +37,9 @@ DRIVERS = {
         Provider.ELB:
             ('libcloud.loadbalancer.drivers.elb', 'ElasticLBDriver'),
         Provider.CLOUDSTACK:
-            ('libcloud.loadbalancer.drivers.cloudstack', 'CloudStackLBDriver')
-
+            ('libcloud.loadbalancer.drivers.cloudstack', 'CloudStackLBDriver'),
+        Provider.GCE:
+            ('libcloud.loadbalancer.drivers.gce', 'GCELBDriver')
 }
 
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/loadbalancer/types.py
----------------------------------------------------------------------
diff --git a/libcloud/loadbalancer/types.py b/libcloud/loadbalancer/types.py
index 40246f9..133bf7e 100644
--- a/libcloud/loadbalancer/types.py
+++ b/libcloud/loadbalancer/types.py
@@ -39,6 +39,7 @@ class Provider(object):
     BRIGHTBOX = 'brightbox'
     ELB = 'elb'
     CLOUDSTACK = 'cloudstack'
+    GCE = 'gce'
 
 
 class State(object):

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/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
new file mode 100644
index 0000000..c6f648a
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/aggregated_forwardingRules.json
@@ -0,0 +1,57 @@
+{
+  "id": "projects/project_name/aggregated/forwardingRules",
+  "items": {
+    "regions/europe-west1": {
+      "warning": {
+        "code": "NO_RESULTS_ON_PAGE",
+        "data": [
+          {
+            "key": "scope",
+            "value": "regions/europe-west1"
+          }
+        ],
+        "message": "There are no results for scope 'regions/europe-west1' on this page."
+      }
+    },
+    "regions/us-central1": {
+      "forwardingRules": [
+        {
+          "IPAddress": "173.255.119.224",
+          "IPProtocol": "TCP",
+          "creationTimestamp": "2013-09-03T00:17:25.544-07:00",
+          "id": "10901665092293158938",
+          "kind": "compute#forwardingRule",
+          "name": "lcforwardingrule",
+          "portRange": "8000-8500",
+          "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+          "target": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
+        },
+        {
+          "IPAddress": "173.255.119.185",
+          "IPProtocol": "TCP",
+          "creationTimestamp": "2013-09-02T22:25:50.575-07:00",
+          "id": "15826316229163619337",
+          "kind": "compute#forwardingRule",
+          "name": "libcloud-lb-demo-lb",
+          "portRange": "80-80",
+          "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+          "target": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
+        }
+      ]
+    },
+    "regions/us-central2": {
+      "warning": {
+        "code": "NO_RESULTS_ON_PAGE",
+        "data": [
+          {
+            "key": "scope",
+            "value": "regions/us-central2"
+          }
+        ],
+        "message": "There are no results for scope 'regions/us-central2' on this page."
+      }
+    }
+  },
+  "kind": "compute#forwardingRuleAggregatedList",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/aggregated/forwardingRules"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/aggregated_targetPools.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/aggregated_targetPools.json b/libcloud/test/compute/fixtures/gce/aggregated_targetPools.json
new file mode 100644
index 0000000..f57aad5
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/aggregated_targetPools.json
@@ -0,0 +1,64 @@
+{
+  "id": "projects/project_name/aggregated/targetPools",
+  "items": {
+    "regions/europe-west1": {
+      "warning": {
+        "code": "NO_RESULTS_ON_PAGE",
+        "data": [
+          {
+            "key": "scope",
+            "value": "regions/europe-west1"
+          }
+        ],
+        "message": "There are no results for scope 'regions/europe-west1' on this page."
+      }
+    },
+    "regions/us-central1": {
+      "targetPools": [
+        {
+          "creationTimestamp": "2013-09-03T00:51:05.300-07:00",
+          "healthChecks": [
+            "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/libcloud-lb-demo-healthcheck"
+          ],
+          "id": "11690726329826021866",
+          "instances": [
+            "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-000",
+            "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-001"
+          ],
+          "kind": "compute#targetPool",
+          "name": "lctargetpool",
+          "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1"
+        },
+        {
+          "creationTimestamp": "2013-09-02T22:25:45.817-07:00",
+          "healthChecks": [
+            "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/libcloud-lb-demo-healthcheck"
+          ],
+          "id": "16605251746746338499",
+          "instances": [
+            "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-002",
+            "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-001",
+            "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-000"
+          ],
+          "kind": "compute#targetPool",
+          "name": "libcloud-lb-demo-lb-tp",
+          "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1"
+        }
+      ]
+    },
+    "regions/us-central2": {
+      "warning": {
+        "code": "NO_RESULTS_ON_PAGE",
+        "data": [
+          {
+            "key": "scope",
+            "value": "regions/us-central2"
+          }
+        ],
+        "message": "There are no results for scope 'regions/us-central2' on this page."
+      }
+    }
+  },
+  "kind": "compute#targetPoolAggregatedList",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/aggregated/targetPools"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/global_httpHealthChecks.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/global_httpHealthChecks.json b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks.json
new file mode 100644
index 0000000..051fded
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks.json
@@ -0,0 +1,35 @@
+{
+  "id": "projects/project_name/global/httpHealthChecks",
+  "items": [
+    {
+      "checkIntervalSec": 5,
+      "creationTimestamp": "2013-08-19T14:42:28.947-07:00",
+      "description": "",
+      "healthyThreshold": 2,
+      "host": "",
+      "id": "7660832580304455442",
+      "kind": "compute#httpHealthCheck",
+      "name": "basic-check",
+      "port": 80,
+      "requestPath": "/",
+      "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/basic-check",
+      "timeoutSec": 5,
+      "unhealthyThreshold": 2
+    },
+    {
+      "checkIntervalSec": 5,
+      "creationTimestamp": "2013-09-02T22:25:44.759-07:00",
+      "healthyThreshold": 2,
+      "id": "16372093408499501663",
+      "kind": "compute#httpHealthCheck",
+      "name": "libcloud-lb-demo-healthcheck",
+      "port": 80,
+      "requestPath": "/",
+      "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/libcloud-lb-demo-healthcheck",
+      "timeoutSec": 5,
+      "unhealthyThreshold": 2
+    }
+  ],
+  "kind": "compute#httpHealthCheckList",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_basic-check.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_basic-check.json b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_basic-check.json
new file mode 100644
index 0000000..0812ecd
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_basic-check.json
@@ -0,0 +1,15 @@
+{
+  "checkIntervalSec": 5,
+  "creationTimestamp": "2013-08-19T14:42:28.947-07:00",
+  "description": "",
+  "healthyThreshold": 2,
+  "host": "",
+  "id": "7660832580304455442",
+  "kind": "compute#httpHealthCheck",
+  "name": "basic-check",
+  "port": 80,
+  "requestPath": "/",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/basic-check",
+  "timeoutSec": 5,
+  "unhealthyThreshold": 2
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck.json b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck.json
new file mode 100644
index 0000000..76bb117
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck.json
@@ -0,0 +1,14 @@
+{
+  "checkIntervalSec": 10,
+  "creationTimestamp": "2013-09-02T22:18:01.180-07:00",
+  "healthyThreshold": 3,
+  "host": "lchost",
+  "id": "06860603312991823381",
+  "kind": "compute#httpHealthCheck",
+  "name": "lchealthcheck",
+  "port": 8000,
+  "requestPath": "/lc",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/lchealthcheck",
+  "timeoutSec": 10,
+  "unhealthyThreshold": 4
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck_delete.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck_delete.json b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck_delete.json
new file mode 100644
index 0000000..03f97e4
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck_delete.json
@@ -0,0 +1,14 @@
+{
+  "id": "1159296103027566387",
+  "insertTime": "2013-09-02T22:18:02.509-07:00",
+  "kind": "compute#operation",
+  "name": "operation-global_httpHealthChecks_lchealthcheck_delete",
+  "operationType": "delete",
+  "progress": 0,
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/operations/operation-global_httpHealthChecks_lchealthcheck_delete",
+  "startTime": "2013-09-02T22:18:02.558-07:00",
+  "status": "PENDING",
+  "targetId": "06860603312991823381",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/healthChecks/lchealthcheck",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck_put.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck_put.json b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck_put.json
new file mode 100644
index 0000000..1daa897
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_lchealthcheck_put.json
@@ -0,0 +1,14 @@
+{
+  "id": "6717642434182216609",
+  "insertTime": "2013-09-03T02:19:55.574-07:00",
+  "kind": "compute#operation",
+  "name": "operation-global_httpHealthChecks_lchealthcheck_put",
+  "operationType": "update",
+  "progress": 0,
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/operations/operation-global_httpHealthChecks_lchealthcheck_put",
+  "startTime": "2013-09-03T02:19:55.628-07:00",
+  "status": "PENDING",
+  "targetId": "0742691415598204878",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/healthChecks/lchealthcheck",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_libcloud-lb-demo-healthcheck.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_libcloud-lb-demo-healthcheck.json b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_libcloud-lb-demo-healthcheck.json
new file mode 100644
index 0000000..6e772aa
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_libcloud-lb-demo-healthcheck.json
@@ -0,0 +1,13 @@
+{
+  "checkIntervalSec": 5,
+  "creationTimestamp": "2013-09-02T22:25:44.759-07:00",
+  "healthyThreshold": 2,
+  "id": "16372093408499501663",
+  "kind": "compute#httpHealthCheck",
+  "name": "libcloud-lb-demo-healthcheck",
+  "port": 80,
+  "requestPath": "/",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/libcloud-lb-demo-healthcheck",
+  "timeoutSec": 5,
+  "unhealthyThreshold": 2
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_post.json b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_post.json
new file mode 100644
index 0000000..f2f7873
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/global_httpHealthChecks_post.json
@@ -0,0 +1,13 @@
+{
+  "id": "3903393118268087410",
+  "insertTime": "2013-09-03T02:19:54.629-07:00",
+  "kind": "compute#operation",
+  "name": "operation-global_httpHealthChecks_post",
+  "operationType": "insert",
+  "progress": 0,
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/operations/operation-global_httpHealthChecks_post",
+  "startTime": "2013-09-03T02:19:54.718-07:00",
+  "status": "PENDING",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/healthChecks/lchealthcheck",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_lchealthcheck_delete.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_lchealthcheck_delete.json b/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_lchealthcheck_delete.json
new file mode 100644
index 0000000..17cef7b
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_lchealthcheck_delete.json
@@ -0,0 +1,14 @@
+{
+  "id": "1159296103027566387",
+  "insertTime": "2013-09-02T22:18:02.509-07:00",
+  "kind": "compute#operation",
+  "name": "operation-global_httpHealthChecks_lchealthcheck_delete",
+  "operationType": "delete",
+  "progress": 100,
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/operations/operation-global_httpHealthChecks_lchealthcheck_delete",
+  "startTime": "2013-09-02T22:18:02.558-07:00",
+  "status": "DONE",
+  "targetId": "06860603312991823381",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/healthChecks/lchealthcheck",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_lchealthcheck_put.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_lchealthcheck_put.json b/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_lchealthcheck_put.json
new file mode 100644
index 0000000..b69e548
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_lchealthcheck_put.json
@@ -0,0 +1,15 @@
+{
+  "endTime": "2013-09-03T02:20:02.194-07:00",
+  "id": "6717642434182216609",
+  "insertTime": "2013-09-03T02:19:55.574-07:00",
+  "kind": "compute#operation",
+  "name": "operation-global_httpHealthChecks_lchealthcheck_put",
+  "operationType": "update",
+  "progress": 100,
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/operations/operation-global_httpHealthChecks_lchealthcheck_put",
+  "startTime": "2013-09-03T02:19:55.628-07:00",
+  "status": "DONE",
+  "targetId": "0742691415598204878",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/healthChecks/lchealthcheck",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_post.json b/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_post.json
new file mode 100644
index 0000000..534688e
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_global_httpHealthChecks_post.json
@@ -0,0 +1,14 @@
+{
+  "id": "3903393118268087410",
+  "insertTime": "2013-09-03T02:19:54.629-07:00",
+  "kind": "compute#operation",
+  "name": "operation-global_httpHealthChecks_post",
+  "operationType": "insert",
+  "progress": 100,
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/operations/operation-global_httpHealthChecks_post",
+  "startTime": "2013-09-03T02:19:54.718-07:00",
+  "status": "DONE",
+  "targetId": "0742691415598204878",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/healthChecks/lchealthcheck",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_forwardingRules_lcforwardingrule_delete.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_forwardingRules_lcforwardingrule_delete.json b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_forwardingRules_lcforwardingrule_delete.json
new file mode 100644
index 0000000..974c636
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_forwardingRules_lcforwardingrule_delete.json
@@ -0,0 +1,16 @@
+{
+  "endTime": "2013-09-03T00:17:43.917-07:00",
+  "id": "09064254309855814339",
+  "insertTime": "2013-09-03T00:17:36.062-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_forwardingRules_lcforwardingrule_delete",
+  "operationType": "delete",
+  "progress": 100,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_forwardingRules_lcforwardingrule_delete",
+  "startTime": "2013-09-03T00:17:36.168-07:00",
+  "status": "DONE",
+  "targetId": "10901665092293158938",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/forwardingRules/lcforwardingrule",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_forwardingRules_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_forwardingRules_post.json b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_forwardingRules_post.json
new file mode 100644
index 0000000..4c83db1
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_forwardingRules_post.json
@@ -0,0 +1,16 @@
+{
+  "endTime": "2013-09-03T00:17:33.965-07:00",
+  "id": "0651769405845333112",
+  "insertTime": "2013-09-03T00:17:25.381-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_forwardingRules_post",
+  "operationType": "insert",
+  "progress": 100,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_forwardingRules_post",
+  "startTime": "2013-09-03T00:17:25.434-07:00",
+  "status": "DONE",
+  "targetId": "10901665092293158938",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/forwardingRules/lcforwardingrule",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_addHealthCheck_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_addHealthCheck_post.json b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_addHealthCheck_post.json
new file mode 100644
index 0000000..8f4a405
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_addHealthCheck_post.json
@@ -0,0 +1,16 @@
+{
+  "endTime": "2013-09-03T01:28:49.271-07:00",
+  "id": "17341029456963557514",
+  "insertTime": "2013-09-03T01:28:40.774-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_lctargetpool_addHealthCheck_post",
+  "operationType": "addHealthCheck",
+  "progress": 100,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_lctargetpool_addHealthCheck_post",
+  "startTime": "2013-09-03T01:28:40.838-07:00",
+  "status": "DONE",
+  "targetId": "16862638289615591831",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_addInstance_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_addInstance_post.json b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_addInstance_post.json
new file mode 100644
index 0000000..ecac372
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_addInstance_post.json
@@ -0,0 +1,16 @@
+{
+  "endTime": "2013-09-03T01:29:07.021-07:00",
+  "id": "04072826501537092633",
+  "insertTime": "2013-09-03T01:29:03.082-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_lctargetpool_addInstance_post",
+  "operationType": "addInstance",
+  "progress": 100,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_lctargetpool_addInstance_post",
+  "startTime": "2013-09-03T01:29:03.145-07:00",
+  "status": "DONE",
+  "targetId": "16862638289615591831",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_delete.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_delete.json b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_delete.json
new file mode 100644
index 0000000..a790311
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_delete.json
@@ -0,0 +1,15 @@
+{
+  "id": "13500662190763995965",
+  "insertTime": "2013-09-03T00:51:06.799-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_lctargetpool_delete",
+  "operationType": "delete",
+  "progress": 100,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_lctargetpool_delete",
+  "startTime": "2013-09-03T00:51:06.840-07:00",
+  "status": "DONE",
+  "targetId": "13598380121688918358",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post.json b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post.json
new file mode 100644
index 0000000..6c4eeb5
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post.json
@@ -0,0 +1,16 @@
+{
+  "endTime": "2013-09-03T01:28:37.095-07:00",
+  "id": "14738174613993796821",
+  "insertTime": "2013-09-03T01:28:32.889-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post",
+  "operationType": "removeHealthCheck",
+  "progress": 100,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post",
+  "startTime": "2013-09-03T01:28:32.942-07:00",
+  "status": "DONE",
+  "targetId": "16862638289615591831",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_removeInstance_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_removeInstance_post.json b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_removeInstance_post.json
new file mode 100644
index 0000000..cb24504
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_lctargetpool_removeInstance_post.json
@@ -0,0 +1,16 @@
+{
+  "endTime": "2013-09-03T01:28:59.247-07:00",
+  "id": "1815686149437875016",
+  "insertTime": "2013-09-03T01:28:53.049-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_lctargetpool_removeInstance_post",
+  "operationType": "removeInstance",
+  "progress": 100,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_lctargetpool_removeInstance_post",
+  "startTime": "2013-09-03T01:28:53.109-07:00",
+  "status": "DONE",
+  "targetId": "16862638289615591831",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_post.json b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_post.json
new file mode 100644
index 0000000..0e4b666
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/operations_operation_regions_us-central1_targetPools_post.json
@@ -0,0 +1,15 @@
+{
+  "id": "7487852523793007955",
+  "insertTime": "2013-09-03T00:51:05.064-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_post",
+  "operationType": "insert",
+  "progress": 100,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_post",
+  "startTime": "2013-09-03T00:51:05.115-07:00",
+  "status": "DONE",
+  "targetId": "13598380121688918358",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions.json b/libcloud/test/compute/fixtures/gce/regions.json
new file mode 100644
index 0000000..edf3a37
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions.json
@@ -0,0 +1,45 @@
+{
+  "id": "projects/project_name/regions",
+  "items": [
+    {
+      "creationTimestamp": "2013-04-19T17:58:16.641-07:00",
+      "description": "europe-west1",
+      "id": "0827308347805275727",
+      "kind": "compute#region",
+      "name": "europe-west1",
+      "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/europe-west1",
+      "status": "UP",
+      "zones": [
+        "https://www.googleapis.com/compute/v1beta15/zones/europe-west1-a",
+        "https://www.googleapis.com/compute/v1beta15/zones/europe-west1-b"
+      ]
+    },
+    {
+      "creationTimestamp": "2013-04-19T18:17:05.050-07:00",
+      "description": "us-central1",
+      "id": "06713580496607310378",
+      "kind": "compute#region",
+      "name": "us-central1",
+      "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+      "status": "UP",
+      "zones": [
+        "https://www.googleapis.com/compute/v1beta15/zones/us-central1-a",
+        "https://www.googleapis.com/compute/v1beta15/zones/us-central1-b"
+      ]
+    },
+    {
+      "creationTimestamp": "2013-04-19T18:19:05.482-07:00",
+      "description": "us-central2",
+      "id": "04157375529195793136",
+      "kind": "compute#region",
+      "name": "us-central2",
+      "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central2",
+      "status": "UP",
+      "zones": [
+        "https://www.googleapis.com/compute/v1beta15/zones/us-central2-a"
+      ]
+    }
+  ],
+  "kind": "compute#regionList",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules.json
new file mode 100644
index 0000000..fbc1b0e
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules.json
@@ -0,0 +1,31 @@
+{
+  "id": "projects/project_name/regions/us-central1/forwardingRules",
+  "items": [
+    {
+      "IPAddress": "173.255.119.224",
+      "IPProtocol": "TCP",
+      "creationTimestamp": "2013-09-03T00:17:25.544-07:00",
+      "id": "10901665092293158938",
+      "kind": "compute#forwardingRule",
+      "name": "lcforwardingrule",
+      "portRange": "8000-8500",
+      "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+      "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/forwardingRules/lcforwardingrule",
+      "target": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
+    },
+    {
+      "IPAddress": "173.255.119.185",
+      "IPProtocol": "TCP",
+      "creationTimestamp": "2013-09-02T22:25:50.575-07:00",
+      "id": "15826316229163619337",
+      "kind": "compute#forwardingRule",
+      "name": "libcloud-lb-demo-lb",
+      "portRange": "80-80",
+      "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+      "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/forwardingRules/libcloud-lb-demo-lb",
+      "target": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
+    }
+  ],
+  "kind": "compute#forwardingRuleList",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/forwardingRules"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_lcforwardingrule.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_lcforwardingrule.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_lcforwardingrule.json
new file mode 100644
index 0000000..d4c9051
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_lcforwardingrule.json
@@ -0,0 +1,12 @@
+{
+  "IPAddress": "173.255.119.224",
+  "IPProtocol": "TCP",
+  "creationTimestamp": "2013-09-03T00:17:25.544-07:00",
+  "id": "10901665092293158938",
+  "kind": "compute#forwardingRule",
+  "name": "lcforwardingrule",
+  "portRange": "8000-8500",
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/forwardingRules/lcforwardingrule",
+  "target": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_lcforwardingrule_delete.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_lcforwardingrule_delete.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_lcforwardingrule_delete.json
new file mode 100644
index 0000000..1c15638
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_lcforwardingrule_delete.json
@@ -0,0 +1,15 @@
+{
+  "id": "09064254309855814339",
+  "insertTime": "2013-09-03T00:17:36.062-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_forwardingRules_lcforwardingrule_delete",
+  "operationType": "delete",
+  "progress": 0,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_forwardingRules_lcforwardingrule_delete",
+  "startTime": "2013-09-03T00:17:36.168-07:00",
+  "status": "PENDING",
+  "targetId": "10901665092293158938",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/forwardingRules/lcforwardingrule",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_libcloud-lb-demo-lb.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_libcloud-lb-demo-lb.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_libcloud-lb-demo-lb.json
new file mode 100644
index 0000000..99a310e
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_libcloud-lb-demo-lb.json
@@ -0,0 +1,12 @@
+{
+  "IPAddress": "108.59.83.110",
+  "IPProtocol": "TCP",
+  "creationTimestamp": "2013-09-29T13:30:00.702-07:00",
+  "id": "1077550228014866104",
+  "kind": "compute#forwardingRule",
+  "name": "libcloud-lb-demo-lb",
+  "portRange": "80-80",
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/forwardingRules/libcloud-lb-demo-lb",
+  "target": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_post.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_post.json
new file mode 100644
index 0000000..1b08b75
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_forwardingRules_post.json
@@ -0,0 +1,14 @@
+{
+  "id": "0651769405845333112",
+  "insertTime": "2013-09-03T00:17:25.381-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_forwardingRules_post",
+  "operationType": "insert",
+  "progress": 0,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_forwardingRules_post",
+  "startTime": "2013-09-03T00:17:25.434-07:00",
+  "status": "PENDING",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/forwardingRules/lcforwardingrule",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools.json
new file mode 100644
index 0000000..331065b
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools.json
@@ -0,0 +1,38 @@
+{
+  "id": "projects/project_name/regions/us-central1/targetPools",
+  "items": [
+    {
+      "creationTimestamp": "2013-09-03T00:51:05.300-07:00",
+      "healthChecks": [
+        "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/libcloud-lb-demo-healthcheck"
+      ],
+      "id": "13598380121688918358",
+      "instances": [
+        "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-000",
+        "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-001"
+      ],
+      "kind": "compute#targetPool",
+      "name": "lctargetpool",
+      "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+      "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool"
+    },
+    {
+      "creationTimestamp": "2013-09-02T22:25:45.817-07:00",
+      "healthChecks": [
+        "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/libcloud-lb-demo-healthcheck"
+      ],
+      "id": "16862638289615591831",
+      "instances": [
+        "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-002",
+        "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-001",
+        "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-000"
+      ],
+      "kind": "compute#targetPool",
+      "name": "libcloud-lb-demo-lb-tp",
+      "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+      "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
+    }
+  ],
+  "kind": "compute#targetPoolList",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool.json
new file mode 100644
index 0000000..81828f8
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool.json
@@ -0,0 +1,15 @@
+{
+  "creationTimestamp": "2013-09-03T00:51:05.300-07:00",
+  "healthChecks": [
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/libcloud-lb-demo-healthcheck"
+  ],
+  "id": "13598380121688918358",
+  "instances": [
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-000",
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-001"
+  ],
+  "kind": "compute#targetPool",
+  "name": "lctargetpool",
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_addHealthCheck_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_addHealthCheck_post.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_addHealthCheck_post.json
new file mode 100644
index 0000000..7743b89
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_addHealthCheck_post.json
@@ -0,0 +1,15 @@
+{
+  "id": "17341029456963557514",
+  "insertTime": "2013-09-03T01:28:40.774-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_lctargetpool_addHealthCheck_post",
+  "operationType": "addHealthCheck",
+  "progress": 0,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_lctargetpool_addHealthCheck_post",
+  "startTime": "2013-09-03T01:28:40.838-07:00",
+  "status": "PENDING",
+  "targetId": "16862638289615591831",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_addInstance_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_addInstance_post.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_addInstance_post.json
new file mode 100644
index 0000000..1af9354
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_addInstance_post.json
@@ -0,0 +1,15 @@
+{
+  "id": "04072826501537092633",
+  "insertTime": "2013-09-03T01:29:03.082-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_lctargetpool_addInstance_post",
+  "operationType": "addInstance",
+  "progress": 0,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_lctargetpool_addInstance_post",
+  "startTime": "2013-09-03T01:29:03.145-07:00",
+  "status": "PENDING",
+  "targetId": "16862638289615591831",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_delete.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_delete.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_delete.json
new file mode 100644
index 0000000..196a1e0
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_delete.json
@@ -0,0 +1,15 @@
+{
+  "id": "13500662190763995965",
+  "insertTime": "2013-09-03T00:51:06.799-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_lctargetpool_delete",
+  "operationType": "delete",
+  "progress": 0,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_lctargetpool_delete",
+  "startTime": "2013-09-03T00:51:06.840-07:00",
+  "status": "PENDING",
+  "targetId": "13598380121688918358",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post.json
new file mode 100644
index 0000000..be21bbe
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post.json
@@ -0,0 +1,15 @@
+{
+  "id": "14738174613993796821",
+  "insertTime": "2013-09-03T01:28:32.889-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post",
+  "operationType": "removeHealthCheck",
+  "progress": 0,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_lctargetpool_removeHealthCheck_post",
+  "startTime": "2013-09-03T01:28:32.942-07:00",
+  "status": "PENDING",
+  "targetId": "16862638289615591831",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_removeInstance_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_removeInstance_post.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_removeInstance_post.json
new file mode 100644
index 0000000..435e2d2
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_removeInstance_post.json
@@ -0,0 +1,15 @@
+{
+  "id": "1815686149437875016",
+  "insertTime": "2013-09-03T01:28:53.049-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_lctargetpool_removeInstance_post",
+  "operationType": "removeInstance",
+  "progress": 0,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_lctargetpool_removeInstance_post",
+  "startTime": "2013-09-03T01:28:53.109-07:00",
+  "status": "PENDING",
+  "targetId": "16862638289615591831",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_libcloud-lb-demo-lb-tp.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_libcloud-lb-demo-lb-tp.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_libcloud-lb-demo-lb-tp.json
new file mode 100644
index 0000000..47179b7
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_libcloud-lb-demo-lb-tp.json
@@ -0,0 +1,16 @@
+{
+  "creationTimestamp": "2013-09-02T22:25:45.817-07:00",
+  "healthChecks": [
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/libcloud-lb-demo-healthcheck"
+  ],
+  "id": "16862638289615591831",
+  "instances": [
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-002",
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-001",
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-000"
+  ],
+  "kind": "compute#targetPool",
+  "name": "libcloud-lb-demo-lb-tp",
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/libcloud-lb-demo-lb-tp"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_post.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_post.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_post.json
new file mode 100644
index 0000000..32f57cc
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_post.json
@@ -0,0 +1,14 @@
+{
+  "id": "7487852523793007955",
+  "insertTime": "2013-09-03T00:51:05.064-07:00",
+  "kind": "compute#operation",
+  "name": "operation-regions_us-central1_targetPools_post",
+  "operationType": "insert",
+  "progress": 0,
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/operations/operation-regions_us-central1_targetPools_post",
+  "startTime": "2013-09-03T00:51:05.115-07:00",
+  "status": "PENDING",
+  "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/lctargetpool",
+  "user": "user@gserviceaccount.com"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_www-pool.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_www-pool.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_www-pool.json
new file mode 100644
index 0000000..797bf39
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_www-pool.json
@@ -0,0 +1,17 @@
+{
+  "creationTimestamp": "2013-08-19T14:43:25.289-07:00",
+  "description": "",
+  "healthChecks": [
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/httpHealthChecks/basic-check"
+  ],
+  "id": "09965129111508633746",
+  "instances": [
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/www1",
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/www2",
+    "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/www3"
+  ],
+  "kind": "compute#targetPool",
+  "name": "www-pool",
+  "region": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1",
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/regions/us-central1/targetPools/www-pool"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-000.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-000.json b/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-000.json
new file mode 100644
index 0000000..6a3e984
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-000.json
@@ -0,0 +1,52 @@
+{
+  "canIpForward": false,
+  "creationTimestamp": "2013-09-02T22:25:15.878-07:00",
+  "disks": [
+    {
+      "index": 0,
+      "kind": "compute#attachedDisk",
+      "mode": "READ_WRITE",
+      "type": "SCRATCH"
+    }
+  ],
+  "id": "16051209904934263688",
+  "image": "https://www.googleapis.com/compute/v1beta15/projects/debian-cloud/global/images/debian-7-wheezy-v20130723",
+  "kernel": "https://www.googleapis.com/compute/v1beta15/projects/google/global/kernels/gce-v20130603",
+  "kind": "compute#instance",
+  "machineType": "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/machineTypes/n1-standard-1",
+  "metadata": {
+    "fingerprint": "n9EGknQZPSA=",
+    "items": [
+      {
+        "key": "startup-script",
+        "value": "apt-get -y update && apt-get -y install apache2 && hostname > /var/www/index.html"
+      }
+    ],
+    "kind": "compute#metadata"
+  },
+  "name": "libcloud-lb-demo-www-000",
+  "networkInterfaces": [
+    {
+      "accessConfigs": [
+        {
+          "kind": "compute#accessConfig",
+          "name": "External NAT",
+          "natIP": "173.255.113.234",
+          "type": "ONE_TO_ONE_NAT"
+        }
+      ],
+      "name": "nic0",
+      "network": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/networks/default",
+      "networkIP": "10.240.138.154"
+    }
+  ],
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-000",
+  "status": "RUNNING",
+  "tags": {
+    "fingerprint": "XI0he92M8l8=",
+    "items": [
+      "libcloud-lb-demo-www"
+    ]
+  },
+  "zone": "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-001.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-001.json b/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-001.json
new file mode 100644
index 0000000..29d4b4b
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-001.json
@@ -0,0 +1,52 @@
+{
+  "canIpForward": false,
+  "creationTimestamp": "2013-09-02T22:25:16.253-07:00",
+  "disks": [
+    {
+      "index": 0,
+      "kind": "compute#attachedDisk",
+      "mode": "READ_WRITE",
+      "type": "SCRATCH"
+    }
+  ],
+  "id": "11204787063927654129",
+  "image": "https://www.googleapis.com/compute/v1beta15/projects/debian-cloud/global/images/debian-7-wheezy-v20130723",
+  "kernel": "https://www.googleapis.com/compute/v1beta15/projects/google/global/kernels/gce-v20130603",
+  "kind": "compute#instance",
+  "machineType": "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/machineTypes/n1-standard-1",
+  "metadata": {
+    "fingerprint": "n9EGknQZPSA=",
+    "items": [
+      {
+        "key": "startup-script",
+        "value": "apt-get -y update && apt-get -y install apache2 && hostname > /var/www/index.html"
+      }
+    ],
+    "kind": "compute#metadata"
+  },
+  "name": "libcloud-lb-demo-www-001",
+  "networkInterfaces": [
+    {
+      "accessConfigs": [
+        {
+          "kind": "compute#accessConfig",
+          "name": "External NAT",
+          "natIP": "173.255.114.210",
+          "type": "ONE_TO_ONE_NAT"
+        }
+      ],
+      "name": "nic0",
+      "network": "https://www.googleapis.com/compute/v1beta15/projects/project_name/global/networks/default",
+      "networkIP": "10.240.0.123"
+    }
+  ],
+  "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b/instances/libcloud-lb-demo-www-001",
+  "status": "RUNNING",
+  "tags": {
+    "fingerprint": "XI0he92M8l8=",
+    "items": [
+      "libcloud-lb-demo-www"
+    ]
+  },
+  "zone": "https://www.googleapis.com/compute/v1beta15/projects/project_name/zones/us-central1-b"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/2115f9f6/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-002.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-002.json b/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-002.json
new file mode 100644
index 0000000..4800d57
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/zones_us-central1-b_instances_libcloud-lb-demo-www-002.json
@@ -0,0 +1,13 @@
+{
+  "error": {
+    "code": 404,
+    "errors": [
+      {
+        "domain": "global",
+        "message": "The resource 'projects/project-name/zones/us-central1-b/instances/libcloud-lb-demo-www-002' was not found",
+        "reason": "notFound"
+      }
+    ],
+    "message": "The resource 'projects/project-name/zones/us-central1-b/instances/libcloud-lb-demo-www-002' was not found"
+  }
+}