Add ex_get_limits method to EC2 driver.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/ac14b3bb Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/ac14b3bb Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/ac14b3bb Branch: refs/heads/trunk Commit: ac14b3bbf8358323f90da4c07c5037f1939688c5 Parents: 88c468a Author: Tomaz Muraus <[email protected]> Authored: Mon Dec 16 23:37:21 2013 +0100 Committer: Tomaz Muraus <[email protected]> Committed: Mon Dec 16 23:37:21 2013 +0100 ---------------------------------------------------------------------- libcloud/compute/drivers/ec2.py | 33 ++++++++++++++++++++ .../ec2/describe_account_attributes.xml | 30 ++++++++++++++++++ libcloud/test/compute/test_ec2.py | 11 +++++++ 3 files changed, 74 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/ac14b3bb/libcloud/compute/drivers/ec2.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py index 3242922..a2d148e 100644 --- a/libcloud/compute/drivers/ec2.py +++ b/libcloud/compute/drivers/ec2.py @@ -793,6 +793,39 @@ class BaseEC2NodeDriver(NodeDriver): ) return images + def ex_get_limits(self): + """ + Retrieve account resource limits. + + :rtype: ``dict`` + """ + attributes = ['max-instances', 'max-elastic-ips', + 'vpc-max-elastic-ips'] + params = {} + params['Action'] = 'DescribeAccountAttributes' + + for index, attribute in enumerate(attributes): + params['AttributeName.%s' % (index)] = attribute + + response = self.connection.request(self.path, params=params) + data = response.object + + elems = data.findall(fixxpath(xpath='accountAttributeSet/item', + namespace=NAMESPACE)) + + result = {'resource': {}} + + for elem in elems: + name = findtext(element=elem, xpath='attributeName', + namespace=NAMESPACE) + value = findtext(element=elem, + xpath='attributeValueSet/item/attributeValue', + namespace=NAMESPACE) + + result['resource'][name] = int(value) + + return result + def list_locations(self): locations = [] for index, availability_zone in \ http://git-wip-us.apache.org/repos/asf/libcloud/blob/ac14b3bb/libcloud/test/compute/fixtures/ec2/describe_account_attributes.xml ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/ec2/describe_account_attributes.xml b/libcloud/test/compute/fixtures/ec2/describe_account_attributes.xml new file mode 100644 index 0000000..bca2e42 --- /dev/null +++ b/libcloud/test/compute/fixtures/ec2/describe_account_attributes.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<DescribeAccountAttributesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/"> + <requestId>a00adaf6-f86c-48eb-85f8-7ac470ae993d</requestId> + <accountAttributeSet> + <item> + <attributeName>max-instances</attributeName> + <attributeValueSet> + <item> + <attributeValue>20</attributeValue> + </item> + </attributeValueSet> + </item> + <item> + <attributeName>max-elastic-ips</attributeName> + <attributeValueSet> + <item> + <attributeValue>5</attributeValue> + </item> + </attributeValueSet> + </item> + <item> + <attributeName>vpc-max-elastic-ips</attributeName> + <attributeValueSet> + <item> + <attributeValue>5</attributeValue> + </item> + </attributeValueSet> + </item> + </accountAttributeSet> +</DescribeAccountAttributesResponse> http://git-wip-us.apache.org/repos/asf/libcloud/blob/ac14b3bb/libcloud/test/compute/test_ec2.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_ec2.py b/libcloud/test/compute/test_ec2.py index f516059..4e31803 100644 --- a/libcloud/test/compute/test_ec2.py +++ b/libcloud/test/compute/test_ec2.py @@ -701,6 +701,13 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin): self.assertEqual(metadata['Num'], '42') self.assertEqual(len(metadata), 3) + def test_ex_get_limits(self): + limits = self.driver.ex_get_limits() + + expected = {'max-instances': 20, 'vpc-max-elastic-ips': 5, + 'max-elastic-ips': 5} + self.assertEqual(limits['resource'], expected) + class EC2USWest1Tests(EC2Tests): region = 'us-west-1' @@ -968,6 +975,10 @@ class EC2MockHttp(MockHttpTestCase): body = self.fixtures.load('modify_image_attribute.xml') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) + def _DescribeAccountAttributes(self, method, url, body, headers): + body = self.fixtures.load('describe_account_attributes.xml') + return (httplib.OK, body, {}, httplib.responses[httplib.OK]) + class EucMockHttp(EC2MockHttp): fixtures = ComputeFileFixtures('ec2')
