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

Reply via email to