Author: tomaz
Date: Sat Mar 31 02:42:03 2012
New Revision: 1307703
URL: http://svn.apache.org/viewvc?rev=1307703&view=rev
Log:
Add new ex_create_balancer_access_rule and
ex_create_balancer_access_rule_no_poll method to the Rackspace driver.
This patch has been submitted by Dave King and is part of LIBCLOUD-170.
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=1307703&r1=1307702&r2=1307703&view=diff
==============================================================================
--- libcloud/trunk/CHANGES (original)
+++ libcloud/trunk/CHANGES Sat Mar 31 02:42:03 2012
@@ -8,6 +8,13 @@ Changes with Apache Libcloud 0.9.1:
instead of a list. Reported by Jouke Waleson. ; LIBCLOUD-175
[Tomaz Muraus]
+ *) Load-balancer:
+
+ - Add new ex_create_balancer_access_rule and
+ ex_create_balancer_access_rule_no_poll method to the Rackspace driver. ;
+ LIBCLOUD-170
+ [Dave King]
+
Changes with Apache Libcloud 0.9.0:
*) General:
Modified: libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py?rev=1307703&r1=1307702&r2=1307703&view=diff
==============================================================================
--- libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py (original)
+++ libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py Sat Mar 31
02:42:03 2012
@@ -1076,17 +1076,12 @@ class RackspaceLBDriver(Driver, OpenStac
balancer = self._get_updated_balancer(balancer)
access_list = balancer.extra['accessList']
- # LB API does not return the ID for the newly created item, so we have
- # to fudge it. Rule types and addresses are unique, so this is a safe
- # way to uniquely identify the new access rule.
- created_rule = [r for r in access_list \
- if rule.rule_type == r.rule_type and \
- rule.address == r.address]
+ created_rule = self._find_matching_rule(rule, access_list)
if not created_rule:
raise LibcloudError('Could not find created rule')
- return created_rule[0]
+ return created_rule
def ex_create_balancer_access_rule_no_poll(self, balancer, rule):
"""
@@ -1110,6 +1105,76 @@ class RackspaceLBDriver(Driver, OpenStac
return resp.status == httplib.ACCEPTED
+ def ex_create_balancer_access_rules(self, balancer, rules):
+ """
+ Adds a list of access rules to a Balancer's access list. This method
+ blocks until the update request has been processed and the balancer is
+ in a RUNNING state again.
+
+ @param balancer: Balancer to create the access rule for.
+ @type balancer: C{Balancer}
+
+ @param rules: List of C{RackspaceAccessRule} to add to the balancer.
+ @type rules: C{list}
+
+ @rtype: C{RackspaceAccessRule}
+ @return: The created access rules.
+ """
+ accepted = self.ex_create_balancer_access_rules_no_poll(balancer,
rules)
+ if not accepted:
+ msg = 'Create access rules not accepted'
+ raise LibcloudError(msg, driver=self)
+
+ balancer = self._get_updated_balancer(balancer)
+ access_list = balancer.extra['accessList']
+
+ created_rules = []
+ for r in rules:
+ matched_rule = self._find_matching_rule(r, access_list)
+ if matched_rule:
+ created_rules.append(matched_rule)
+
+ if len(created_rules) != len(rules):
+ raise LibcloudError('Could not find all created rules')
+
+ return created_rules
+
+ def _find_matching_rule(self, rule_to_find, access_list):
+ """
+ LB API does not return the ID for the newly created rules, so we have
+ to search the list to find the rule with a matching rule type and
+ address to return an object with the right identifier.it. The API
+ enforces rule type and address uniqueness.
+ """
+ for r in access_list:
+ if rule_to_find.rule_type == r.rule_type and \
+ rule_to_find.address == r.address:
+ return r
+
+ return None
+
+ def ex_create_balancer_access_rules_no_poll(self, balancer, rules):
+ """
+ Adds a list of access rules to a Balancer's access list. This method
+ returns immediately.
+
+ @param balancer: Balancer to create the access rule for.
+ @type balancer: C{Balancer}
+
+ @param rules: List of C{RackspaceAccessRule} to add to the balancer.
+ @type rules: C{list}
+
+ @rtype: C{bool}
+ @return: Returns whether the create request was accepted.
+ """
+ uri = '/loadbalancers/%s/accesslist' % (balancer.id)
+ resp = self.connection.request(uri, method='POST',
+ data=json.dumps({
+ 'accessList' : [rule._to_dict() for rule in rules]
+ }))
+
+ return resp.status == httplib.ACCEPTED
+
def ex_destroy_balancer_access_rule(self, balancer, rule):
"""
Removes an access rule from a Balancer's access list. This method
Modified: libcloud/trunk/test/loadbalancer/test_rackspace.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/loadbalancer/test_rackspace.py?rev=1307703&r1=1307702&r2=1307703&view=diff
==============================================================================
--- libcloud/trunk/test/loadbalancer/test_rackspace.py (original)
+++ libcloud/trunk/test/loadbalancer/test_rackspace.py Sat Mar 31 02:42:03 2012
@@ -376,6 +376,33 @@ class RackspaceLBTests(unittest.TestCase
self.assertTrue(resp)
+ def test_ex_create_balancer_access_rules(self):
+ balancer = self.driver.get_balancer(balancer_id='94699')
+
+ rules = [RackspaceAccessRule(rule_type=RackspaceAccessRuleType.ALLOW,
+ address='2001:4801:7901::6/64'),
+ RackspaceAccessRule(rule_type=RackspaceAccessRuleType.DENY,
+ address='8.8.8.8/0')]
+
+ rules = self.driver.ex_create_balancer_access_rules(balancer, rules)
+
+ self.assertEquals(2, len(rules))
+ self.assertEquals(2884, rules[0].id)
+ self.assertEquals(3006, rules[1].id)
+
+ def test_ex_create_balancer_access_rules_no_poll(self):
+ balancer = self.driver.get_balancer(balancer_id='94699')
+
+ rules = [RackspaceAccessRule(rule_type=RackspaceAccessRuleType.ALLOW,
+ address='2001:4801:7901::6/64'),
+ RackspaceAccessRule(rule_type=RackspaceAccessRuleType.DENY,
+ address='8.8.8.8/0')]
+
+ resp = self.driver.ex_create_balancer_access_rules_no_poll(balancer,
+ rules)
+
+ self.assertTrue(resp)
+
def test_ex_destroy_balancer_access_rule(self):
balancer = self.driver.get_balancer(balancer_id='94698')
@@ -1240,6 +1267,16 @@ class RackspaceLBMockHttp(MockHttpTestCa
msg='Did not delete access rule with id %d' % id)
return (httplib.ACCEPTED, '', {},
httplib.responses[httplib.ACCEPTED])
+ elif method == 'POST':
+
+ json_body = json.loads(body)
+ access_list = json_body['accessList']
+ self.assertEquals('ALLOW', access_list[0]['type'])
+ self.assertEquals('2001:4801:7901::6/64',
access_list[0]['address'])
+ self.assertEquals('DENY', access_list[1]['type'])
+ self.assertEquals('8.8.8.8/0', access_list[1]['address'])
+
+ return (httplib.ACCEPTED, '', {},
httplib.responses[httplib.ACCEPTED])
raise NotImplementedError