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