Author: tomaz
Date: Fri Dec  9 17:33:24 2011
New Revision: 1212531

URL: http://svn.apache.org/viewvc?rev=1212531&view=rev
Log:
Add 'extra' attribute to the LoadBalancer object and retrieve all the virtual IP
addresses in the Rackspace LoadBalancer driver. Contributed by Dave King, part 
of GITHUB-42.

Added:
    
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18940_ex_public_ips.json
    
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18941_ex_private_ips.json
    
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18945_ex_public_ips.json
Modified:
    libcloud/trunk/CHANGES
    libcloud/trunk/libcloud/loadbalancer/base.py
    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=1212531&r1=1212530&r2=1212531&view=diff
==============================================================================
--- libcloud/trunk/CHANGES (original)
+++ libcloud/trunk/CHANGES Fri Dec  9 17:33:24 2011
@@ -1,5 +1,13 @@
                                    -*- coding: utf-8 -*-
 
+Changes with Apache Libcloud in development:
+
+  *) Load-balancer:
+
+    - Add 'extra' attribute to the LoadBalancer object and retrieve all the
+      virtual IP addresses in the Rackspace driver.
+      [Dave King]
+
 Changes with Apache Libcloud 0.7.1:
 
   *) General:

Modified: libcloud/trunk/libcloud/loadbalancer/base.py
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/loadbalancer/base.py?rev=1212531&r1=1212530&r2=1212531&view=diff
==============================================================================
--- libcloud/trunk/libcloud/loadbalancer/base.py (original)
+++ libcloud/trunk/libcloud/loadbalancer/base.py Fri Dec  9 17:33:24 2011
@@ -49,13 +49,14 @@ class LoadBalancer(object):
     Provide a common interface for handling Load Balancers.
     """
 
-    def __init__(self, id, name, state, ip, port, driver):
+    def __init__(self, id, name, state, ip, port, driver, extra=None):
         self.id = str(id) if id else None
         self.name = name
         self.state = state
         self.ip = ip
         self.port = port
         self.driver = driver
+        self.extra = extra or {}
 
     def attach_compute_node(self, node):
         return self.driver.balancer_attach_compute_node(balancer=self,

Modified: libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py?rev=1212531&r1=1212530&r2=1212531&view=diff
==============================================================================
--- libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py (original)
+++ libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py Fri Dec  9 
17:33:24 2011
@@ -30,6 +30,7 @@ from libcloud.common.openstack import Op
 from libcloud.common.rackspace import (
         AUTH_URL_US, AUTH_URL_UK)
 
+
 class RackspaceResponse(JsonResponse):
 
     def parse_body(self):
@@ -178,6 +179,7 @@ class RackspaceLBDriver(Driver):
     def _to_balancer(self, el):
         ip = None
         port = None
+        sourceAddresses = {}
 
         if 'virtualIps' in el:
             ip = el["virtualIps"][0]["address"]
@@ -185,14 +187,23 @@ class RackspaceLBDriver(Driver):
         if 'port' in el:
             port = el["port"]
 
-        lb = LoadBalancer(id=el["id"],
+        if 'sourceAddresses' in el:
+            sourceAddresses = el['sourceAddresses']
+
+        return LoadBalancer(id=el["id"],
                 name=el["name"],
                 state=self.LB_STATE_MAP.get(
                     el["status"], State.UNKNOWN),
                 ip=ip,
                 port=port,
-                driver=self.connection.driver)
-        return lb
+                driver=self.connection.driver,
+                extra={
+                    "publicVips": self._ex_public_virtual_ips(el) or [],
+                    "privateVips": self._ex_private_virtual_ips(el) or [],
+                    "ipv6PublicSource": sourceAddresses.get("ipv6Public"),
+                    "ipv4PublicSource": sourceAddresses.get("ipv4Public"),
+                    "ipv4PrivateSource": sourceAddresses.get("ipv4Servicenet")
+                })
 
     def _to_members(self, object):
         return [ self._to_member(el) for el in object["nodes"] ]
@@ -203,6 +214,21 @@ class RackspaceLBDriver(Driver):
                 port=el["port"])
         return lbmember
 
+    def _ex_private_virtual_ips(self, el):
+        if not 'virtualIps' in el:
+            return None
+
+        servicenet_vips = [ip for ip in el['virtualIps']
+                           if ip['type'] == 'SERVICENET']
+        return [vip["address"] for vip in servicenet_vips]
+
+    def _ex_public_virtual_ips(self, el):
+        if not 'virtualIps' in el:
+            return None
+
+        public_vips = [ip for ip in el['virtualIps'] if ip['type'] == 'PUBLIC']
+        return [vip["address"] for vip in public_vips]
+
 
 class RackspaceUKLBDriver(RackspaceLBDriver):
     connectionCls = RackspaceUKConnection

Added: 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18940_ex_public_ips.json
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18940_ex_public_ips.json?rev=1212531&view=auto
==============================================================================
--- 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18940_ex_public_ips.json
 (added)
+++ 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18940_ex_public_ips.json
 Fri Dec  9 17:33:24 2011
@@ -0,0 +1 @@
+{"loadBalancer":{"name":"new ord 
balancer","id":18940,"protocol":"HTTP","port":80,"algorithm":"RANDOM","status":"ACTIVE","cluster":{"name":"ztm-n06.lbaas.ord1.rackspace.net"},"nodes":[{"address":"10.181.231.202","id":94692,"port":80,"status":"ONLINE","condition":"ENABLED"}],"created":{"time":"2011-12-09T13:30:40Z"},"virtualIps":[{"address":"50.56.49.149","id":2359,"type":"PUBLIC","ipVersion":"IPV4"}],"sourceAddresses":{"ipv6Public":"2001:4801:7901::6/64","ipv4Servicenet":"10.183.252.25","ipv4Public":"184.106.100.25"},"updated":{"time":"2011-12-09T13:32:05Z"},"connectionLogging":{"enabled":false}}}

Added: 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18941_ex_private_ips.json
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18941_ex_private_ips.json?rev=1212531&view=auto
==============================================================================
--- 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18941_ex_private_ips.json
 (added)
+++ 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18941_ex_private_ips.json
 Fri Dec  9 17:33:24 2011
@@ -0,0 +1 @@
+{"loadBalancer":{"name":"servicenet","id":18941,"protocol":"HTTP","port":80,"algorithm":"RANDOM","status":"BUILD","cluster":{"name":"ztm-n06.lbaas.ord1.rackspace.net"},"nodes":[{"address":"10.183.32.247","id":94693,"port":80,"status":"ONLINE","condition":"ENABLED"}],"created":{"time":"2011-12-09T13:33:28Z"},"virtualIps":[{"address":"10.183.252.175","id":572,"type":"SERVICENET","ipVersion":"IPV4"}],"sourceAddresses":{"ipv6Public":"2001:4801:7901::6/64","ipv4Servicenet":"10.183.252.25","ipv4Public":"184.106.100.25"},"updated":{"time":"2011-12-09T13:33:28Z"},"connectionLogging":{"enabled":false}}}
\ No newline at end of file

Added: 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18945_ex_public_ips.json
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18945_ex_public_ips.json?rev=1212531&view=auto
==============================================================================
--- 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18945_ex_public_ips.json
 (added)
+++ 
libcloud/trunk/test/loadbalancer/fixtures/rackspace/v1_slug_loadbalancers_18945_ex_public_ips.json
 Fri Dec  9 17:33:24 2011
@@ -0,0 +1 @@
+{"loadBalancer":{"name":"new ord 
balancer","id":18940,"protocol":"HTTP","port":80,"algorithm":"RANDOM","status":"ACTIVE","cluster":{"name":"ztm-n06.lbaas.ord1.rackspace.net"},"nodes":[{"address":"10.181.231.202","id":94692,"port":80,"status":"ONLINE","condition":"ENABLED"}],"created":{"time":"2011-12-09T13:30:40Z"},"virtualIps":[{"address":"50.56.49.149","id":2359,"type":"PUBLIC","ipVersion":"IPV4"}],"sourceAddresses":{"ipv6Public":"2001:4801:7901::6/64","ipv4Servicenet":"10.183.252.25","ipv4Public":"184.106.100.25"},"updated":{"time":"2011-12-09T13:32:05Z"},"connectionLogging":{"enabled":false}}}

Modified: libcloud/trunk/test/loadbalancer/test_rackspace.py
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/test/loadbalancer/test_rackspace.py?rev=1212531&r1=1212530&r2=1212531&view=diff
==============================================================================
--- libcloud/trunk/test/loadbalancer/test_rackspace.py (original)
+++ libcloud/trunk/test/loadbalancer/test_rackspace.py Fri Dec  9 17:33:24 2011
@@ -91,6 +91,32 @@ class RackspaceLBTests(unittest.TestCase
         self.assertEquals(balancer.name, 'test2')
         self.assertEquals(balancer.id, '8290')
 
+    def test_get_balancer_extra_public_vips(self):
+        balancer = self.driver.get_balancer(balancer_id='18940')
+        self.assertEquals(balancer.extra["publicVips"], ['50.56.49.149'])
+
+    def test_get_balancer_extra_private_vips(self):
+        balancer = self.driver.get_balancer(balancer_id='18941')
+
+        self.assertEquals(balancer.extra["privateVips"], ['10.183.252.175'])
+
+    def test_get_balancer_extra_private_vips_empty(self):
+        balancer = self.driver.get_balancer(balancer_id='18945')
+
+        self.assertEquals(balancer.extra['privateVips'], [])
+
+    def test_get_balancer_extra_public_source_ipv4(self):
+        balancer = self.driver.get_balancer(balancer_id='18940')
+        self.assertEquals(balancer.extra["ipv4PublicSource"], '184.106.100.25')
+
+    def test_get_balancer_extra_public_source_ipv6(self):
+        balancer = self.driver.get_balancer(balancer_id='18940')
+        self.assertEquals(balancer.extra["ipv6PublicSource"], 
'2001:4801:7901::6/64')
+
+    def test_get_balancer_extra_private_source_ipv4(self):
+        balancer = self.driver.get_balancer(balancer_id='18940')
+        self.assertEquals(balancer.extra["ipv4PrivateSource"], '10.183.252.25')
+
     def test_balancer_list_members(self):
         balancer = self.driver.get_balancer(balancer_id='8290')
         members = balancer.list_members()
@@ -111,7 +137,6 @@ class RackspaceLBTests(unittest.TestCase
         member = balancer.list_members()[0]
 
         ret = balancer.detach_member(member)
-
         self.assertTrue(ret)
 
 
@@ -188,6 +213,28 @@ class RackspaceLBMockHttp(MockHttpTestCa
 
         raise NotImplementedError
 
+    def _v1_0_slug_loadbalancers_18940(self, method, url, body, headers):
+        if method == "GET":
+            body = 
self.fixtures.load("v1_slug_loadbalancers_18940_ex_public_ips.json")
+            return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+        raise NotImplementedError
+
+    def _v1_0_slug_loadbalancers_18945(self, method, url, body, headers):
+        if method == "GET":
+            body = 
self.fixtures.load("v1_slug_loadbalancers_18945_ex_public_ips.json")
+            return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+        raise NotImplementedError
+
+
+    def _v1_0_slug_loadbalancers_18941(self, method, url, body, headers):
+        if method == "GET":
+            body = 
self.fixtures.load("v1_slug_loadbalancers_18941_ex_private_ips.json")
+            return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+        raise NotImplementedError
+
     def _v1_1_auth(self, method, url, body, headers):
         headers = { 'content-type': 'application/json; charset=UTF-8'}
         body = self.auth_fixtures.load('_v1_1__auth.json')


Reply via email to