Repository: libcloud
Updated Branches:
  refs/heads/trunk b93d00538 -> 69d27cd5b


Added fetch tags support in elb driver


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/1438d35f
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/1438d35f
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/1438d35f

Branch: refs/heads/trunk
Commit: 1438d35fba02b4791169f499f653f1b618496576
Parents: b93d005
Author: Anton Kozyrev <[email protected]>
Authored: Mon Aug 8 18:56:20 2016 +0300
Committer: Anthony Shaw <[email protected]>
Committed: Fri Sep 30 15:48:25 2016 +1000

----------------------------------------------------------------------
 libcloud/loadbalancer/base.py                   | 13 ++++++++
 libcloud/loadbalancer/drivers/elb.py            | 35 ++++++++++++++++++--
 .../loadbalancer/fixtures/elb/describe_tags.xml | 18 ++++++++++
 libcloud/test/loadbalancer/test_elb.py          | 19 +++++++++++
 4 files changed, 83 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/1438d35f/libcloud/loadbalancer/base.py
----------------------------------------------------------------------
diff --git a/libcloud/loadbalancer/base.py b/libcloud/loadbalancer/base.py
index 171b6bf..ae71942 100644
--- a/libcloud/loadbalancer/base.py
+++ b/libcloud/loadbalancer/base.py
@@ -222,6 +222,19 @@ class Driver(BaseDriver):
         raise NotImplementedError(
             'get_balancer not implemented for this driver')
 
+    def get_tags(self, balancer_id):
+        """
+        Return a dict of tag/value
+
+        :param balancer_id: id of a load balancer you want to fetch tags for
+        :type  balancer_id: ``str``
+
+        :rtype: ``dict``
+        """
+
+        raise NotImplementedError(
+            'get_tags not implemented for this driver')
+
     def update_balancer(self, balancer, **kwargs):
         """
         Sets the name, algorithm, protocol, or port on a load balancer.

http://git-wip-us.apache.org/repos/asf/libcloud/blob/1438d35f/libcloud/loadbalancer/drivers/elb.py
----------------------------------------------------------------------
diff --git a/libcloud/loadbalancer/drivers/elb.py 
b/libcloud/loadbalancer/drivers/elb.py
index 68a94cb..006816b 100644
--- a/libcloud/loadbalancer/drivers/elb.py
+++ b/libcloud/loadbalancer/drivers/elb.py
@@ -63,10 +63,19 @@ class ElasticLBDriver(Driver):
     def list_protocols(self):
         return ['tcp', 'ssl', 'http', 'https']
 
-    def list_balancers(self):
+    def list_balancers(self, ex_fetch_tags=False):
         params = {'Action': 'DescribeLoadBalancers'}
         data = self.connection.request(ROOT, params=params).object
-        return self._to_balancers(data)
+        balancers = self._to_balancers(data)
+
+        if ex_fetch_tags:
+            for lb in balancers:
+                tags = lb.extra.get('tags', {})
+                tags.update(self.get_tags(lb.id))
+                if tags:
+                    lb.extra['tags'] = tags
+
+        return balancers
 
     def create_balancer(self, name, port, protocol, algorithm, members,
                         ex_members_availability_zones=None):
@@ -115,6 +124,14 @@ class ElasticLBDriver(Driver):
         data = self.connection.request(ROOT, params=params).object
         return self._to_balancers(data)[0]
 
+    def get_tags(self, balancer_id):
+        params = {
+            'Action': 'DescribeTags',
+            'LoadBalancerNames.member.1': balancer_id
+        }
+        data = self.connection.request(ROOT, params=params).object
+        return self._to_tags(data)
+
     def balancer_attach_compute_node(self, balancer, node):
         params = {
             'Action': 'RegisterInstancesWithLoadBalancer',
@@ -343,6 +360,20 @@ class ElasticLBDriver(Driver):
 
         return balancer
 
+    def _to_tags(self, data):
+        """
+        return tags dict
+        """
+        tags = {}
+        xpath = 'DescribeTagsResult/TagDescriptions/member/Tags/member'
+        for el in findall(element=data, xpath=xpath, namespace=NS):
+            key = findtext(element=el, xpath='Key', namespace=NS)
+            value = findtext(element=el, xpath='Value', namespace=NS)
+            if key:
+                tags[key] = value
+
+        return tags
+
     def _create_list_params(self, params, items, label):
         """
         return parameter list

http://git-wip-us.apache.org/repos/asf/libcloud/blob/1438d35f/libcloud/test/loadbalancer/fixtures/elb/describe_tags.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/loadbalancer/fixtures/elb/describe_tags.xml 
b/libcloud/test/loadbalancer/fixtures/elb/describe_tags.xml
new file mode 100644
index 0000000..e6e8e96
--- /dev/null
+++ b/libcloud/test/loadbalancer/fixtures/elb/describe_tags.xml
@@ -0,0 +1,18 @@
+<DescribeTagsResponse 
xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/";>
+    <DescribeTagsResult>
+        <TagDescriptions>
+            <member>
+                <Tags>
+                    <member>
+                        <Value>lima</Value>
+                        <Key>project</Key>
+                    </member>
+                </Tags>
+                <LoadBalancerName>tests</LoadBalancerName>
+            </member>
+        </TagDescriptions>
+    </DescribeTagsResult>
+    <ResponseMetadata>
+        <RequestId>07b1ecbc-1100-11e3-acaf-dd7edEXAMPLE</RequestId>
+    </ResponseMetadata>
+</DescribeTagsResponse>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/1438d35f/libcloud/test/loadbalancer/test_elb.py
----------------------------------------------------------------------
diff --git a/libcloud/test/loadbalancer/test_elb.py 
b/libcloud/test/loadbalancer/test_elb.py
index c7afc7c..3ddb1d6 100644
--- a/libcloud/test/loadbalancer/test_elb.py
+++ b/libcloud/test/loadbalancer/test_elb.py
@@ -63,6 +63,21 @@ class ElasticLBTests(unittest.TestCase):
         self.assertEqual(balancers[0].id, 'tests')
         self.assertEqual(balancers[0].name, 'tests')
 
+    def test_list_balancers_with_tags(self):
+        balancers = self.driver.list_balancers(ex_fetch_tags=True)
+
+        self.assertEqual(len(balancers), 1)
+        self.assertEqual(balancers[0].id, 'tests')
+        self.assertEqual(balancers[0].name, 'tests')
+        self.assertTrue(('tags' in balancers[0].extra), 'No tags dict found in 
balancer.extra')
+        self.assertEqual(balancers[0].extra['tags']['project'], 'lima')
+
+    def test_get_tags(self):
+        tags = self.driver.get_tags('tests')
+
+        self.assertEqual(len(tags), 1)
+        self.assertEqual(tags['project'], 'lima')
+
     def test_get_balancer(self):
         balancer = self.driver.get_balancer(balancer_id='tests')
 
@@ -153,6 +168,10 @@ class ElasticLBMockHttp(MockHttpTestCase):
         body = self.fixtures.load('describe_load_balancers.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
+    def _2012_06_01_DescribeTags(self, method, url, body, headers):
+        body = self.fixtures.load('describe_tags.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
     def _2012_06_01_CreateLoadBalancer(self, method, url, body, headers):
         body = self.fixtures.load('create_load_balancer.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])

Reply via email to