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)