From 09851c0fcfb24402a27d595d0746e02ca49860e6 Mon Sep 17 00:00:00 2001
From: Bill Woodward <wpwood@gmail.com>
Date: Mon, 30 Jan 2012 10:35:14 -0800
Subject: [PATCH] In the Rackspace LB Driver, map the IMAP protocol names to the values expected by the Rackspace LB API.

---
 libcloud/loadbalancer/drivers/rackspace.py |   13 ++++++-
 test/loadbalancer/test_rackspace.py        |   57 ++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+), 1 deletions(-)

diff --git libcloud/loadbalancer/drivers/rackspace.py libcloud/loadbalancer/drivers/rackspace.py
index c2be4ce..f89eed4 100644
--- libcloud/loadbalancer/drivers/rackspace.py
+++ libcloud/loadbalancer/drivers/rackspace.py
@@ -1214,6 +1214,17 @@ class RackspaceLBDriver(Driver):
                 extra=extra)
         return lbmember
 
+    def _protocol_to_value(self, protocol):
+        non_standard_protocols = {'imapv2': 'IMAPv2', 'imapv3': 'IMAPv3', 'imapv4': 'IMAPv4'}
+        protocol_name = protocol.lower()
+
+        if protocol_name in non_standard_protocols:
+            protocol_value = non_standard_protocols[protocol_name]
+        else:
+            protocol_value = protocol.upper()
+
+        return protocol_value
+
     def _kwargs_to_mutable_attrs(self, **attrs):
         update_attrs = {}
         if "name" in attrs:
@@ -1224,7 +1235,7 @@ class RackspaceLBDriver(Driver):
             update_attrs['algorithm'] = algorithm_value
 
         if "protocol" in attrs:
-            update_attrs['protocol'] = attrs['protocol'].upper()
+            update_attrs['protocol'] = self._protocol_to_value(attrs['protocol'])
 
         if "port" in attrs:
             update_attrs['port'] = int(attrs['port'])
diff --git test/loadbalancer/test_rackspace.py test/loadbalancer/test_rackspace.py
index f9d9c7c..55a59dd 100644
--- test/loadbalancer/test_rackspace.py
+++ test/loadbalancer/test_rackspace.py
@@ -631,6 +631,27 @@ class RackspaceLBTests(unittest.TestCase):
         updated_balancer = self.driver.update_balancer(balancer, protocol='HTTPS')
         self.assertEqual('HTTPS', updated_balancer.extra['protocol'])
 
+    def test_update_balancer_protocol_to_imapv2(self):
+        balancer = LoadBalancer(id='3135', name='LB_update',
+            state='PENDING_UPDATE', ip='10.34.4.3',
+            port=80, driver=self.driver)
+        updated_balancer = self.driver.update_balancer(balancer, protocol='imapv2')
+        self.assertEqual('IMAPv2', updated_balancer.extra['protocol'])
+
+    def test_update_balancer_protocol_to_imapv3(self):
+        balancer = LoadBalancer(id='3136', name='LB_update',
+            state='PENDING_UPDATE', ip='10.34.4.3',
+            port=80, driver=self.driver)
+        updated_balancer = self.driver.update_balancer(balancer, protocol='IMAPV3')
+        self.assertEqual('IMAPv3', updated_balancer.extra['protocol'])
+
+    def test_update_balancer_protocol_to_imapv4(self):
+        balancer = LoadBalancer(id='3137', name='LB_update',
+            state='PENDING_UPDATE', ip='10.34.4.3',
+            port=80, driver=self.driver)
+        updated_balancer = self.driver.update_balancer(balancer, protocol='IMAPv4')
+        self.assertEqual('IMAPv4', updated_balancer.extra['protocol'])
+
     def test_update_balancer_port(self):
         balancer = LoadBalancer(id='3131', name='LB_update',
                                          state='PENDING_UPDATE', ip='10.34.4.3',
@@ -1142,6 +1163,42 @@ class RackspaceLBMockHttp(MockHttpTestCase):
             return (httplib.BAD_REQUEST, "", {}, httplib.responses[httplib.BAD_REQUEST])
         raise NotImplementedError
 
+    def _v1_0_slug_loadbalancers_3135(self, method, url, body, headers):
+        """ update_balancer(b, protocol='IMAPv3'), then get_balancer('3135') """
+        if method == "PUT":
+            self.assertEqual(json.loads(body), {'protocol': 'IMAPv2'})
+            return (httplib.ACCEPTED, "", {}, httplib.responses[httplib.ACCEPTED])
+        elif method == "GET":
+            response_body = json.loads(self.fixtures.load("v1_slug_loadbalancers_3xxx.json"))
+            response_body['loadBalancer']['id'] = 3135
+            response_body['loadBalancer']['protocol'] = 'IMAPv2'
+            return (httplib.OK, json.dumps(response_body), {}, httplib.responses[httplib.OK])
+        raise NotImplementedError
+
+    def _v1_0_slug_loadbalancers_3136(self, method, url, body, headers):
+        """ update_balancer(b, protocol='IMAPv3'), then get_balancer('3136') """
+        if method == "PUT":
+            self.assertEqual(json.loads(body), {'protocol': 'IMAPv3'})
+            return (httplib.ACCEPTED, "", {}, httplib.responses[httplib.ACCEPTED])
+        elif method == "GET":
+            response_body = json.loads(self.fixtures.load("v1_slug_loadbalancers_3xxx.json"))
+            response_body['loadBalancer']['id'] = 3136
+            response_body['loadBalancer']['protocol'] = 'IMAPv3'
+            return (httplib.OK, json.dumps(response_body), {}, httplib.responses[httplib.OK])
+        raise NotImplementedError
+
+    def _v1_0_slug_loadbalancers_3137(self, method, url, body, headers):
+        """ update_balancer(b, protocol='IMAPv3'), then get_balancer('3137') """
+        if method == "PUT":
+            self.assertEqual(json.loads(body), {'protocol': 'IMAPv4'})
+            return (httplib.ACCEPTED, "", {}, httplib.responses[httplib.ACCEPTED])
+        elif method == "GET":
+            response_body = json.loads(self.fixtures.load("v1_slug_loadbalancers_3xxx.json"))
+            response_body['loadBalancer']['id'] = 3137
+            response_body['loadBalancer']['protocol'] = 'IMAPv4'
+            return (httplib.OK, json.dumps(response_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')
-- 
1.7.4.1

