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