Author: tomaz
Date: Wed Dec 21 23:46:06 2011
New Revision: 1221946
URL: http://svn.apache.org/viewvc?rev=1221946&view=rev
Log:
Adds status to the Member object and conditions an 'enum'
(Rackspace driver). This patch has been contributed by Mark Everett and is part
of GH-48.
Modified:
libcloud/trunk/CHANGES
libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py
libcloud/trunk/libcloud/loadbalancer/types.py
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8290.json
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8290_nodes.json
libcloud/trunk/test/loadbalancer/test_rackspace.py
Modified: libcloud/trunk/CHANGES
URL:
http://svn.apache.org/viewvc/libcloud/trunk/CHANGES?rev=1221946&r1=1221945&r2=1221946&view=diff
==============================================================================
--- libcloud/trunk/CHANGES (original)
+++ libcloud/trunk/CHANGES Wed Dec 21 23:46:06 2011
@@ -55,10 +55,14 @@ Changes with Apache Libcloud in developm
connection class.
[Dave King]
- - Add 'extra' attribute to the Member object and populate it in
+ - Add 'extra' attribute to the Member object and populate it in
the Rackspace driver.
[Mark Everett]
+ - Adds status to the Member object and conditions an 'enum'
+ (Rackspace driver).
+ [Mark Everett]
+
Changes with Apache Libcloud 0.7.1:
*) General:
Modified: libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py?rev=1221946&r1=1221945&r2=1221946&view=diff
==============================================================================
--- libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py (original)
+++ libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py Wed Dec 21
23:46:06 2011
@@ -25,7 +25,7 @@ from libcloud.utils.misc import reverse_
from libcloud.common.base import JsonResponse
from libcloud.loadbalancer.base import LoadBalancer, Member, Driver, Algorithm
from libcloud.loadbalancer.base import DEFAULT_ALGORITHM
-from libcloud.loadbalancer.types import State
+from libcloud.loadbalancer.types import State, MemberCondition
from libcloud.common.openstack import OpenStackBaseConnection
from libcloud.common.rackspace import (
AUTH_URL_US, AUTH_URL_UK)
@@ -104,8 +104,8 @@ class RackspaceConnectionThrottle(object
@type min_connections: C{int}
@param max_connections: Maximum number of of connections per IP address.
- (Must be between 0 and 100000, 0 allows an
- unlimited number of connections.)
+ (Must be between 0 and 100000, 0 allows an
+ unlimited number of connections.
@type max_connections: C{int}
@param max_connection_rate: Maximum number of connections allowed
@@ -161,7 +161,7 @@ class RackspaceConnection(OpenStackBaseC
_url_key = "lb_url"
def __init__(self, user_id, key, secure=True, **kwargs):
- super(RackspaceConnection, self).__init__(user_id, key, secure,
+ super(RackspaceConnection, self).__init__(user_id, key, secure,
**kwargs)
self.api_version = 'v1.0'
self.accept_format = 'application/json'
@@ -200,6 +200,12 @@ class RackspaceLBDriver(Driver):
'PENDING_DELETE': State.PENDING
}
+ LB_MEMBER_CONDITION_MAP = {
+ 'ENABLED': MemberCondition.ENABLED,
+ 'DISABLED': MemberCondition.DISABLED,
+ 'DRAINING': MemberCondition.DRAINING
+ }
+
_VALUE_TO_ALGORITHM_MAP = {
'RANDOM': Algorithm.RANDOM,
'ROUND_ROBIN': Algorithm.ROUND_ROBIN,
@@ -346,7 +352,8 @@ class RackspaceLBDriver(Driver):
if 'protocol' in el:
extra['protocol'] = el['protocol']
- if 'algorithm' in el and el["algorithm"] in
self._VALUE_TO_ALGORITHM_MAP:
+ if 'algorithm' in el and el["algorithm"] in \
+ self._VALUE_TO_ALGORITHM_MAP:
extra["algorithm"] = self._value_to_algorithm(el["algorithm"])
if 'healthMonitor' in el:
@@ -359,7 +366,8 @@ class RackspaceLBDriver(Driver):
if 'sessionPersistence' in el:
persistence = el["sessionPersistence"]
- extra["sessionPersistenceType"] =
persistence.get("persistenceType")
+ extra["sessionPersistenceType"] = \
+ persistence.get("persistenceType")
if 'connectionLogging' in el:
logging = el["connectionLogging"]
@@ -385,8 +393,13 @@ class RackspaceLBDriver(Driver):
if 'weight' in el:
extra['weight'] = el["weight"]
- if 'condition' in el:
- extra['condition'] = el["condition"]
+ if 'condition' in el and el['condition'] in \
+ self.LB_MEMBER_CONDITION_MAP:
+ extra['condition'] = \
+ self.LB_MEMBER_CONDITION_MAP.get(el["condition"])
+
+ if 'status' in el:
+ extra['status'] = el["status"]
lbmember = Member(id=el["id"],
ip=el["address"],
@@ -415,7 +428,8 @@ class RackspaceLBDriver(Driver):
type = health_monitor_data.get("type")
delay = health_monitor_data.get("delay")
timeout = health_monitor_data.get("timeout")
- attempts_before_deactivation =
health_monitor_data.get("attemptsBeforeDeactivation")
+ attempts_before_deactivation = \
+ health_monitor_data.get("attemptsBeforeDeactivation")
if type == "CONNECT":
return RackspaceHealthMonitor(type=type, delay=delay,
Modified: libcloud/trunk/libcloud/loadbalancer/types.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/loadbalancer/types.py?rev=1221946&r1=1221945&r2=1221946&view=diff
==============================================================================
--- libcloud/trunk/libcloud/loadbalancer/types.py (original)
+++ libcloud/trunk/libcloud/loadbalancer/types.py Wed Dec 21 23:46:06 2011
@@ -52,3 +52,12 @@ class State(object):
UNKNOWN = 2
ERROR = 3
DELETED = 4
+
+class MemberCondition(object):
+ """
+ Each member of a load balancer can have an associated condition
+ which determines its role within the load balancer.
+ """
+ ENABLED = 0
+ DISABLED = 1
+ DRAINING = 2
Modified:
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8290.json
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8290.json?rev=1221946&r1=1221945&r2=1221946&view=diff
==============================================================================
---
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8290.json
(original)
+++
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8290.json
Wed Dec 21 23:46:06 2011
@@ -18,14 +18,24 @@
"condition": "ENABLED",
"id": 30944,
"port": 80,
- "status": "ONLINE"
+ "status": "ONLINE",
+ "weight": 12
},
{
"address": "10.1.0.10",
- "condition": "ENABLED",
+ "condition": "DISABLED",
"id": 30945,
"port": 80,
- "status": "ONLINE"
+ "status": "OFFLINE",
+ "weight": 8
+ },
+ {
+ "address": "10.1.0.9",
+ "condition": "DRAINING",
+ "id": 30946,
+ "port": 8080,
+ "status": "DRAINING",
+ "weight": 20
}
],
"port": 80,
Modified:
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8290_nodes.json
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8290_nodes.json?rev=1221946&r1=1221945&r2=1221946&view=diff
==============================================================================
---
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8290_nodes.json
(original)
+++
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_8290_nodes.json
Wed Dec 21 23:46:06 2011
@@ -13,8 +13,16 @@
"condition": "DISABLED",
"id": 30945,
"port": 80,
- "status": "ONLINE",
+ "status": "OFFLINE",
"weight": 8
+ },
+ {
+ "address": "10.1.0.9",
+ "condition": "DRAINING",
+ "id": 30946,
+ "port": 8080,
+ "status": "DRAINING",
+ "weight": 20
}
]
}
Modified: libcloud/trunk/test/loadbalancer/test_rackspace.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/loadbalancer/test_rackspace.py?rev=1221946&r1=1221945&r2=1221946&view=diff
==============================================================================
--- libcloud/trunk/test/loadbalancer/test_rackspace.py (original)
+++ libcloud/trunk/test/loadbalancer/test_rackspace.py Wed Dec 21 23:46:06 2011
@@ -24,6 +24,7 @@ except ImportError:
from libcloud.utils.py3 import httplib
from libcloud.loadbalancer.base import Member, Algorithm
+from libcloud.loadbalancer.types import MemberCondition
from libcloud.loadbalancer.drivers.rackspace import RackspaceLBDriver
from libcloud.loadbalancer.drivers.rackspace import RackspaceUKLBDriver
from libcloud.loadbalancer.drivers.rackspace import RackspaceAccessRuleType
@@ -140,9 +141,10 @@ class RackspaceLBTests(unittest.TestCase
def test_get_balancer_extra_members(self):
balancer = self.driver.get_balancer(balancer_id='8290')
members = balancer.extra['members']
- self.assertEquals(2, len(members))
+ self.assertEquals(3, len(members))
self.assertEquals('10.1.0.11', members[0].ip)
self.assertEquals('10.1.0.10', members[1].ip)
+ self.assertEquals('10.1.0.9', members[2].ip)
def test_get_balancer_algorithm(self):
balancer = self.driver.get_balancer(balancer_id='8290')
@@ -242,12 +244,13 @@ class RackspaceLBTests(unittest.TestCase
self.assertEquals(allow_rule.rule_type, RackspaceAccessRuleType.ALLOW)
def test_balancer_list_members(self):
+ expected = set(['10.1.0.10:80', '10.1.0.11:80', '10.1.0.9:8080'])
balancer = self.driver.get_balancer(balancer_id='8290')
members = balancer.list_members()
- self.assertEquals(len(members), 2)
- self.assertEquals(set(['10.1.0.10:80', '10.1.0.11:80']),
- set(["%s:%s" % (member.ip, member.port) for member in
members]))
+ self.assertEquals(len(members), 3)
+ self.assertEquals(expected, set(["%s:%s" % (member.ip, member.port) for
+ member in members]))
def test_balancer_members_extra_weight(self):
balancer = self.driver.get_balancer(balancer_id='8290')
@@ -260,12 +263,25 @@ class RackspaceLBTests(unittest.TestCase
balancer = self.driver.get_balancer(balancer_id='8290')
members = balancer.list_members()
- self.assertEquals('ENABLED', members[0].extra['condition'])
- self.assertEquals('DISABLED', members[1].extra['condition'])
+ self.assertEquals(MemberCondition.ENABLED,
+ members[0].extra['condition'])
+ self.assertEquals(MemberCondition.DISABLED,
+ members[1].extra['condition'])
+ self.assertEquals(MemberCondition.DRAINING,
+ members[2].extra['condition'])
+
+ def test_balancer_members_extra_status(self):
+ balancer = self.driver.get_balancer(balancer_id='8290')
+ members = balancer.list_members()
+
+ self.assertEquals('ONLINE', members[0].extra['status'])
+ self.assertEquals('OFFLINE', members[1].extra['status'])
+ self.assertEquals('DRAINING', members[2].extra['status'])
def test_balancer_attach_member(self):
balancer = self.driver.get_balancer(balancer_id='8290')
- member = balancer.attach_member(Member(None, ip='10.1.0.12',
port='80'))
+ member = balancer.attach_member(Member(None, ip='10.1.0.12',
+ port='80'))
self.assertEquals(member.ip, '10.1.0.12')
self.assertEquals(member.port, 80)
@@ -436,7 +452,7 @@ class RackspaceLBMockHttp(MockHttpTestCa
raise NotImplementedError
def _v1_1_auth(self, method, url, body, headers):
- headers = { 'content-type': 'application/json; charset=UTF-8' }
+ headers = {'content-type': 'application/json; charset=UTF-8'}
body = self.auth_fixtures.load('_v1_1__auth.json')
return (httplib.OK, body, headers, httplib.responses[httplib.OK])