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/07/20 15:45:44 UTC

git commit: Support GCE LB session affinity

Repository: libcloud
Updated Branches:
  refs/heads/trunk d12def1d8 -> a26da95ef


Support GCE LB session affinity

Add support for sessionAffinity to the GCE Load Balancer driver.
sessionAffinity has the effect of causing clients to "stick" to a
particular backend server.

Also, trivial documentation fixes:

  * resolve ambiguous type specification in create_balancer
  * fix typo in development doc

Closes #341

Signed-off-by: Tomaz Muraus <to...@apache.org>


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

Branch: refs/heads/trunk
Commit: a26da95ef1d532ba2379eafc707c358922d462e3
Parents: d12def1
Author: Lee Verberne <ve...@google.com>
Authored: Thu Jul 10 13:31:34 2014 -0700
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sun Jul 20 15:45:30 2014 +0200

----------------------------------------------------------------------
 CHANGES.rst                                        |  9 +++++++++
 docs/development.rst                               |  4 ++--
 libcloud/compute/drivers/gce.py                    |  9 ++++++++-
 libcloud/loadbalancer/drivers/gce.py               | 13 ++++++++++---
 ...s-central1_targetPools_lctargetpool_sticky.json |  9 +++++++++
 libcloud/test/compute/test_gce.py                  | 17 +++++++++++++++++
 6 files changed, 55 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/a26da95e/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index 5ffdb69..17999cc 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -16,6 +16,15 @@ Compute
   (LIBCLOUD-594, GITHUB-337)
   [Atsushi Sasaki]
 
+
+Loadbalancer
+~~~~~~~~~~~~
+
+- Allow user to specify session affinity algorithm in the GCE driver by passing
+  ``ex_session_affinity`` argument to the ``create_balancer`` method.
+  (LIBCLOUD-595, GITHUB-341)
+  [Lee Verberne, Eric Johnson]
+
 Changes with Apache Libcloud 0.15.1
 -----------------------------------
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a26da95e/docs/development.rst
----------------------------------------------------------------------
diff --git a/docs/development.rst b/docs/development.rst
index 3bd9ea4..8899df9 100644
--- a/docs/development.rst
+++ b/docs/development.rst
@@ -212,8 +212,8 @@ Bad (please avoid):
         description = kwargs.get('description', None)
         public_ips = kwargs.get('public_ips', None)
 
-5. When returning a dictionary, document it's structure
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+5. When returning a dictionary, document its structure
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Dynamic nature of Python can be very nice and useful, but if (ab)use it in a
 wrong way it can also make it hard for the API consumer to understand what is

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a26da95e/libcloud/compute/drivers/gce.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/gce.py b/libcloud/compute/drivers/gce.py
index 28bcb48..62164fd 100644
--- a/libcloud/compute/drivers/gce.py
+++ b/libcloud/compute/drivers/gce.py
@@ -1350,7 +1350,7 @@ class GCENodeDriver(NodeDriver):
         return node_list
 
     def ex_create_targetpool(self, name, region=None, healthchecks=None,
-                             nodes=None):
+                             nodes=None, session_affinity=None):
         """
         Create a target pool.
 
@@ -1367,6 +1367,10 @@ class GCENodeDriver(NodeDriver):
         :keyword  nodes:  Optional list of nodes to attach to the pool
         :type     nodes:  ``list`` of ``str`` or :class:`Node`
 
+        :keyword  session_affinity:  Optional algorithm to use for session
+                                     affinity.
+        :type     session_affinity:  ``str``
+
         :return:  Target Pool object
         :rtype:   :class:`GCETargetPool`
         """
@@ -1391,6 +1395,8 @@ class GCENodeDriver(NodeDriver):
             else:
                 node_list = [n.extra['selfLink'] for n in nodes]
             targetpool_data['instances'] = node_list
+        if session_affinity:
+            targetpool_data['sessionAffinity'] = session_affinity
 
         request = '/regions/%s/targetPools' % (region.name)
 
@@ -3316,6 +3322,7 @@ class GCENodeDriver(NodeDriver):
         extra = {}
         extra['selfLink'] = targetpool.get('selfLink')
         extra['description'] = targetpool.get('description')
+        extra['sessionAffinity'] = targetpool.get('sessionAffinity')
         region = self.ex_get_region(targetpool['region'])
         healthcheck_list = [self.ex_get_healthcheck(h.split('/')[-1]) for h
                             in targetpool.get('healthChecks', [])]

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a26da95e/libcloud/loadbalancer/drivers/gce.py
----------------------------------------------------------------------
diff --git a/libcloud/loadbalancer/drivers/gce.py b/libcloud/loadbalancer/drivers/gce.py
index 09a32fd..e1fa299 100644
--- a/libcloud/loadbalancer/drivers/gce.py
+++ b/libcloud/loadbalancer/drivers/gce.py
@@ -89,7 +89,8 @@ class GCELBDriver(Driver):
         return balancers
 
     def create_balancer(self, name, port, protocol, algorithm, members,
-                        ex_region=None, ex_healthchecks=None, ex_address=None):
+                        ex_region=None, ex_healthchecks=None, ex_address=None,
+                        ex_session_affinity=None):
         """
         Create a new load balancer instance.
 
@@ -126,12 +127,18 @@ class GCELBDriver(Driver):
         :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``
+                                   ``list`` of ``str``
 
         :keyword  ex_address: Optional static address object to be assigned to
                               the load balancer.
         :type     ex_address: C{GCEAddress}
 
+        :keyword  ex_session_affinity: Optional algorithm to use for session
+                                       affinity.  This will modify the hashing
+                                       algorithm such that a client will tend
+                                       to stick to a particular Member.
+        :type     ex_session_affinity: ``str``
+
         :return:  LoadBalancer object
         :rtype:   :class:`LoadBalancer`
         """
@@ -154,7 +161,7 @@ class GCELBDriver(Driver):
         tp_name = '%s-tp' % name
         targetpool = self.gce.ex_create_targetpool(
             tp_name, region=ex_region, healthchecks=ex_healthchecks,
-            nodes=node_list)
+            nodes=node_list, session_affinity=ex_session_affinity)
 
         # Create the Forwarding rule, but if it fails, delete the target pool.
         try:

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a26da95e/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_sticky.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_sticky.json b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_sticky.json
new file mode 100644
index 0000000..caf3f87
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/regions_us-central1_targetPools_lctargetpool_sticky.json
@@ -0,0 +1,9 @@
+{
+  "creationTimestamp": "2014-07-11T15:52:43.720-07:00",
+  "id": "13598380121688918358",
+  "kind": "compute#targetPool",
+  "name": "lctargetpool-sticky",
+  "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/targetPools/lctargetpool-sticky",
+  "sessionAffinity": "CLIENT_IP_PROTO"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a26da95e/libcloud/test/compute/test_gce.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_gce.py b/libcloud/test/compute/test_gce.py
index faf6303..963675b 100644
--- a/libcloud/test/compute/test_gce.py
+++ b/libcloud/test/compute/test_gce.py
@@ -327,6 +327,17 @@ class GCENodeDriverTest(LibcloudTestCase, TestCaseMixin):
         self.assertEqual(len(targetpool.nodes), len(nodes))
         self.assertEqual(targetpool.region.name, region)
 
+    def test_ex_create_targetpool_session_affinity(self):
+        targetpool_name = 'lctargetpool-sticky'
+        region = 'us-central1'
+        session_affinity = 'CLIENT_IP_PROTO'
+        targetpool = self.driver.ex_create_targetpool(
+            targetpool_name, region=region,
+            session_affinity=session_affinity)
+        self.assertEqual(targetpool.name, targetpool_name)
+        self.assertEqual(targetpool.extra.get('sessionAffinity'),
+                         session_affinity)
+
     def test_ex_create_volume_snapshot(self):
         snapshot_name = 'lcsnapshot'
         volume = self.driver.ex_get_volume('lcdisk')
@@ -1038,6 +1049,12 @@ class GCEMockHttp(MockHttpTestCase):
                 'regions_us-central1_targetPools_lctargetpool.json')
         return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])
 
+    def _regions_us_central1_targetPools_lctargetpool_sticky(self, method, url,
+                                                             body, headers):
+        body = self.fixtures.load(
+            'regions_us-central1_targetPools_lctargetpool_sticky.json')
+        return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])
+
     def _regions_us_central1_targetPools_libcloud_lb_demo_lb_tp(
             self, method, url, body, headers):
         body = self.fixtures.load(