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])
 


Reply via email to