Repository: libcloud Updated Branches: refs/heads/trunk c08d946d2 -> 0f67da81a
ecs_support_list_security_group_attributes Closes #826 Signed-off-by: Tomaz Muraus <to...@tomaz.me> Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/127c3b8f Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/127c3b8f Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/127c3b8f Branch: refs/heads/trunk Commit: 127c3b8fc23453e451fb999bde6ab7db47915f25 Parents: c08d946 Author: netgenius <wuhen...@otcaix.iscas.ac.cn> Authored: Sat Jun 25 08:52:06 2016 +0800 Committer: Tomaz Muraus <to...@tomaz.me> Committed: Sat Jun 25 18:41:59 2016 +0200 ---------------------------------------------------------------------- libcloud/compute/drivers/ecs.py | 55 ++++++++++++++++++++ .../ecs/describe_security_group_attributes.xml | 26 +++++++++ libcloud/test/compute/test_ecs.py | 8 +++ 3 files changed, 89 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/127c3b8f/libcloud/compute/drivers/ecs.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/ecs.py b/libcloud/compute/drivers/ecs.py index 5165ce2..41e8dd1 100644 --- a/libcloud/compute/drivers/ecs.py +++ b/libcloud/compute/drivers/ecs.py @@ -377,6 +377,22 @@ class ECSSecurityGroup(object): return ('<ECSSecurityGroup: id=%s, name=%s, driver=%s ...>' % (self.id, self.name, self.driver.name)) +class ECSSecurityGroupAttribute(object): + + """ + Security group attribute. + """ + def __init__(self, ip_protocol=None, port_range=None, + source_group_id=None, policy=None, nic_type=None): + self.ip_protocol = ip_protocol + self.port_range = port_range + self.source_group_id = source_group_id + self.policy = policy + self.nic_type = nic_type + + def __repr__(self): + return ('<ECSSecurityGroupAttribute: ip_protocol=%s ...>' % + (self.ip_protocol)) class ECSZone(object): """ @@ -828,6 +844,33 @@ class ECSDriver(NodeDriver): return self._request_multiple_pages(self.path, params, _parse_response) + def ex_list_security_group_attributes(self, group_id=None, + nic_type='internet'): + """ + List security group attributes in the current region. + + :keyword group_id: security group id. + :type ex_filters: ``str`` + + :keyword nic_type: internet|intranet. + :type nic_type: ``str`` + + :return: a list of defined security group Attributes + :rtype: ``list`` of ``ECSSecurityGroupAttribute`` + """ + params = {'Action': 'DescribeSecurityGroupAttribute', + 'RegionId': self.region, + 'NicType': nic_type} + + if group_id is None: + raise AttributeError('group_id is required') + params['SecurityGroupId'] = group_id + + resp_object = self.connection.request(self.path, params).object + sga_elements = findall(resp_object, 'Permissions/Permission', + namespace=self.namespace) + return [self._to_security_group_attribute(el) for el in sga_elements] + def ex_list_zones(self, region_id=None): """ List availability zones in the given region or the current region. @@ -1513,6 +1556,18 @@ class ECSDriver(NodeDriver): driver=self, vpc_id=vpc_id, creation_time=creation_time) + def _to_security_group_attribute(self, element): + ip_protocol = findtext(element, 'IpProtocol', namespace=self.namespace) + port_range = findtext(element, 'PortRange', namespace=self.namespace) + source_group_id = findtext(element, 'SourceGroupId', + namespace=self.namespace) + policy = findtext(element, 'Policy', namespace=self.namespace) + nic_type = findtext(element, 'NicType', namespace=self.namespace) + return ECSSecurityGroupAttribute(ip_protocol=ip_protocol, + port_range=port_range, + source_group_id=source_group_id, + policy=policy, nic_type=nic_type) + def _to_zone(self, element): _id = findtext(element, 'ZoneId', namespace=self.namespace) local_name = findtext(element, 'LocalName', namespace=self.namespace) http://git-wip-us.apache.org/repos/asf/libcloud/blob/127c3b8f/libcloud/test/compute/fixtures/ecs/describe_security_group_attributes.xml ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/ecs/describe_security_group_attributes.xml b/libcloud/test/compute/fixtures/ecs/describe_security_group_attributes.xml new file mode 100644 index 0000000..3c7815f --- /dev/null +++ b/libcloud/test/compute/fixtures/ecs/describe_security_group_attributes.xml @@ -0,0 +1,26 @@ +<?xml version='1.0' encoding='UTF-8'?> +<DescribeSecurityGroupsResponse> + <RequestId>94D38899-626D-434A-891F-7E1F77A81525</RequestId> + <TotalCount>4</TotalCount> + <PageNumber>1</PageNumber> + <PageSize>10</PageSize> + <RegionId>cn-hangzhou </RegionId> + <SecurityGroups> + <SecurityGroup> + <SecurityGroupId>sg-F876FF7BA</SecurityGroupId> + <Description>Test</Description> + </SecurityGroup> + <SecurityGroup> + <SecurityGroupId>sg-086FFC27A</SecurityGroupId> + <Description>test00212</Description> + </SecurityGroup> + <SecurityGroup> + <SecurityGroupId>sg-BA4B7975B</SecurityGroupId> + <Description>cn-hangzhou test group</Description> + </SecurityGroup> + <SecurityGroup> + <SecurityGroupId>sg-35F20777C</SecurityGroupId> + <Description>cn-hangzhou test group</Description> + </SecurityGroup> + </SecurityGroups> +</DescribeSecurityGroupsResponse> http://git-wip-us.apache.org/repos/asf/libcloud/blob/127c3b8f/libcloud/test/compute/test_ecs.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_ecs.py b/libcloud/test/compute/test_ecs.py index b04ce24..5c4b099 100644 --- a/libcloud/test/compute/test_ecs.py +++ b/libcloud/test/compute/test_ecs.py @@ -918,6 +918,14 @@ class ECSMockHttp(MockHttpTestCase): resp_body = self.fixtures.load('delete_security_group_by_id.xml') return (httplib.OK, resp_body, {}, httplib.responses[httplib.OK]) + def _list_sgas_DescribeSecurityGroupAttributes(self, method, url, body, headers): + params = {'RegionId': self.test.region, + 'SecurityGroupId': 'sg-fakeSecurityGroupId', + 'NicType': 'internet'} + self.assertUrlContainsQueryParams(url, params) + resp_body = self.fixtures.load('describe_security_group_attributes.xml') + return (httplib.OK, resp_body, {}, httplib.responses[httplib.OK]) + def _DescribeZones(self, method, url, body, headers): resp_body = self.fixtures.load('describe_zones.xml') return (httplib.OK, resp_body, {}, httplib.responses[httplib.OK])