Author: tomaz
Date: Fri Feb 10 21:45:43 2012
New Revision: 1242944

URL: http://svn.apache.org/viewvc?rev=1242944&view=rev
Log:
Allow user to specify condition and weight when adding a member to the Rackspace
loadbalancer driver. This patch has been submitted by Adam Pickeral and is part
of LIBCLOUD-150.

Added:
    
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8291.json
Modified:
    libcloud/trunk/CHANGES
    libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py
    libcloud/trunk/test/loadbalancer/test_rackspace.py

Modified: libcloud/trunk/CHANGES
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/CHANGES?rev=1242944&r1=1242943&r2=1242944&view=diff
==============================================================================
--- libcloud/trunk/CHANGES (original)
+++ libcloud/trunk/CHANGES Fri Feb 10 21:45:43 2012
@@ -1,5 +1,13 @@
                                    -*- coding: utf-8 -*-
 
+Changes with Apache Libcloud in development:
+
+  *) Load-balancer:
+
+    - Allow user to specify a condition and weight when adding a member in
+      the Rackspace driver.
+      [Adam Pickeral]
+
 Changes with Apache Libcloud 0.8.0:
 
   *) General:

Modified: libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py?rev=1242944&r1=1242943&r2=1242944&view=diff
==============================================================================
--- libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py (original)
+++ libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py Fri Feb 10 
21:45:43 2012
@@ -338,17 +338,30 @@ class RackspaceLBDriver(Driver):
                                 algorithm=algorithm)
 
         balancer_attrs.update({
-            "virtualIps": [{"type": "PUBLIC"}],
-            "nodes": [{"address": member.ip,
-                "port": member.port,
-                "condition": "ENABLED"} for member in members],
+            'virtualIps': [{'type': 'PUBLIC'}],
+            'nodes': [self._member_attributes(member) for member in members],
             })
         balancer_object = {"loadBalancer": balancer_attrs}
 
         resp = self.connection.request('/loadbalancers',
                 method='POST',
                 data=json.dumps(balancer_object))
-        return self._to_balancer(resp.object["loadBalancer"])
+        return self._to_balancer(resp.object['loadBalancer'])
+
+    def _member_attributes(self, member):
+        member_attributes = {'address': member.ip,
+                             'port': member.port}
+
+        member_attributes.update(self._kwargs_to_mutable_member_attrs(
+            **member.extra))
+
+        # If the condition is not specified on the member, then it should be 
set
+        # to ENABLED by default
+        if 'condition' not in member_attributes:
+            member_attributes['condition'] = \
+            self.CONDITION_LB_MEMBER_MAP[MemberCondition.ENABLED]
+
+        return member_attributes
 
     def destroy_balancer(self, balancer):
         uri = '/loadbalancers/%s' % (balancer.id)
@@ -380,14 +393,7 @@ class RackspaceLBDriver(Driver):
         return self._to_balancer(resp.object["loadBalancer"])
 
     def balancer_attach_member(self, balancer, member):
-        ip = member.ip
-        port = member.port
-
-        member_object = {"nodes":
-                [{"port": port,
-                    "address": ip,
-                    "condition": "ENABLED"}]
-                }
+        member_object = {"nodes": [self._member_attributes(member)]}
 
         uri = '/loadbalancers/%s/nodes' % (balancer.id)
         resp = self.connection.request(uri, method='POST',

Added: 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8291.json
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8291.json?rev=1242944&view=auto
==============================================================================
--- 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8291.json
 (added)
+++ 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8291.json
 Fri Feb 10 21:45:43 2012
@@ -0,0 +1,56 @@
+{
+    "loadBalancer": {
+        "algorithm": "RANDOM",
+        "cluster": {
+            "name": "ztm-n05.lbaas.ord1.rackspace.net"
+        },
+        "connectionLogging": {
+            "enabled": false
+        },
+        "created": {
+            "time": "2011-04-07T16:27:50Z"
+        },
+        "id": 8291,
+        "name": "test8291",
+        "nodes": [
+            {
+                "address": "10.1.0.11",
+                "condition": "ENABLED",
+                "id": 30944,
+                "port": 80,
+                "status": "ONLINE",
+                "weight": 12
+            },
+            {
+                "address": "10.1.0.10",
+                "condition": "DISABLED",
+                "id": 30945,
+                "port": 80,
+                "status": "OFFLINE",
+                "weight": 8
+            },
+            {
+                "address": "10.1.0.9",
+                "condition": "DRAINING",
+                "id": 30946,
+                "port": 8080,
+                "status": "DRAINING",
+                "weight": 20
+            }
+        ],
+        "port": 80,
+        "protocol": "HTTP",
+        "status": "ACTIVE",
+        "updated": {
+            "time": "2011-04-07T16:28:12Z"
+        },
+        "virtualIps": [
+            {
+                "address": "1.1.1.1",
+                "id": 1151,
+                "ipVersion": "IPV4",
+                "type": "PUBLIC"
+            }
+        ]
+    }
+}

Modified: libcloud/trunk/test/loadbalancer/test_rackspace.py
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/test/loadbalancer/test_rackspace.py?rev=1242944&r1=1242943&r2=1242944&view=diff
==============================================================================
--- libcloud/trunk/test/loadbalancer/test_rackspace.py (original)
+++ libcloud/trunk/test/loadbalancer/test_rackspace.py Fri Feb 10 21:45:43 2012
@@ -103,8 +103,9 @@ class RackspaceLBTests(unittest.TestCase
         balancer = self.driver.create_balancer(name='test2',
                 port=80,
                 algorithm=Algorithm.ROUND_ROBIN,
-                members=(Member(None, '10.1.0.10', 80),
-                    Member(None, '10.1.0.11', 80))
+                members=(Member(None, '10.1.0.10', 80, extra={'condition': 
MemberCondition.DISABLED,
+                                                              'weight': 10}),
+                         Member(None, '10.1.0.11', 80))
                 )
 
         self.assertEquals(balancer.name, 'test2')
@@ -596,6 +597,16 @@ class RackspaceLBTests(unittest.TestCase
 
     def test_balancer_attach_member(self):
         balancer = self.driver.get_balancer(balancer_id='8290')
+        extra = {'condition': MemberCondition.DISABLED,
+                 'weight': 10}
+        member = balancer.attach_member(Member(None, ip='10.1.0.12',
+                                               port='80', extra=extra))
+
+        self.assertEquals(member.ip, '10.1.0.12')
+        self.assertEquals(member.port, 80)
+
+    def test_balancer_attach_member_with_no_condition_specified(self):
+        balancer = self.driver.get_balancer(balancer_id='8291')
         member = balancer.attach_member(Member(None, ip='10.1.0.12',
                                                port='80'))
 
@@ -796,8 +807,14 @@ class RackspaceLBMockHttp(MockHttpTestCa
             return (httplib.OK, body, {}, httplib.responses[httplib.OK])
         elif method == "POST":
             body_json = json.loads(body)
-            self.assertEqual(body_json['loadBalancer']['protocol'], 'HTTP')
-            self.assertEqual(body_json['loadBalancer']['algorithm'], 
'ROUND_ROBIN')
+            loadbalancer_json = body_json['loadBalancer']
+            member_1_json, member_2_json = loadbalancer_json['nodes']
+
+            self.assertEqual(loadbalancer_json['protocol'], 'HTTP')
+            self.assertEqual(loadbalancer_json['algorithm'], 'ROUND_ROBIN')
+            self.assertEqual(member_1_json['condition'], 'DISABLED')
+            self.assertEqual(member_1_json['weight'], 10)
+            self.assertEqual(member_2_json['condition'], 'ENABLED')
 
             body = self.fixtures.load('v1_slug_loadbalancers_post.json')
             return (httplib.ACCEPTED, body, {},
@@ -837,8 +854,12 @@ class RackspaceLBMockHttp(MockHttpTestCa
             body = self.fixtures.load('v1_slug_loadbalancers_8290_nodes.json')
             return (httplib.OK, body, {}, httplib.responses[httplib.OK])
         elif method == "POST":
-            body = 
self.fixtures.load('v1_slug_loadbalancers_8290_nodes_post.json')
-            return (httplib.ACCEPTED, body, {},
+            json_body = json.loads(body)
+            json_node = json_body['nodes'][0]
+            self.assertEqual('DISABLED', json_node['condition'])
+            self.assertEqual(10, json_node['weight'])
+            response_body = 
self.fixtures.load('v1_slug_loadbalancers_8290_nodes_post.json')
+            return (httplib.ACCEPTED, response_body, {},
                     httplib.responses[httplib.ACCEPTED])
         elif method == "DELETE":
             nodes = self.fixtures.load('v1_slug_loadbalancers_8290_nodes.json')
@@ -853,6 +874,24 @@ class RackspaceLBMockHttp(MockHttpTestCa
 
         raise NotImplementedError
 
+    def _v1_0_slug_loadbalancers_8291(self, method, url, body, headers):
+        if method == "GET":
+            body = self.fixtures.load('v1_slug_loadbalancers_8291.json')
+            return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+        raise NotImplementedError
+
+    def _v1_0_slug_loadbalancers_8291_nodes(self, method, url, body, headers):
+        if method == "POST":
+            json_body = json.loads(body)
+            json_node = json_body['nodes'][0]
+            self.assertEqual('ENABLED', json_node['condition'])
+            response_body = 
self.fixtures.load('v1_slug_loadbalancers_8290_nodes_post.json')
+            return (httplib.ACCEPTED, response_body, {},
+                    httplib.responses[httplib.ACCEPTED])
+
+        raise NotImplementedError
+
     def _v1_0_slug_loadbalancers_8290_nodes_30944(self, method, url, body, 
headers):
         if method == "PUT":
             json_body = json.loads(body)


Reply via email to