You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by an...@apache.org on 2016/10/10 00:01:55 UTC

[01/13] libcloud git commit: Added property plan in DimensionDataNetworkDomain return

Repository: libcloud
Updated Branches:
  refs/heads/trunk 9ebc0b49e -> 4d11ec272


Added property plan in DimensionDataNetworkDomain return


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

Branch: refs/heads/trunk
Commit: ff06265c4132b15b8818f795980a5ba04b8aeb22
Parents: 4c0bc38
Author: Samuel Chong <sa...@gmail.com>
Authored: Wed Oct 5 13:05:46 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Wed Oct 5 13:05:46 2016 +1100

----------------------------------------------------------------------
 libcloud/common/dimensiondata.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff06265c/libcloud/common/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/common/dimensiondata.py b/libcloud/common/dimensiondata.py
index 90a0728..45f2c5e 100644
--- a/libcloud/common/dimensiondata.py
+++ b/libcloud/common/dimensiondata.py
@@ -672,9 +672,9 @@ class DimensionDataNetworkDomain(object):
 
     def __repr__(self):
         return (('<DimensionDataNetworkDomain: id=%s, name=%s, '
-                 'description=%s, location=%s, status=%s>')
+                 'description=%s, location=%s, status=%s, plan=%s>')
                 % (self.id, self.name, self.description, self.location,
-                   self.status))
+                   self.status, self.plan))
 
 
 class DimensionDataPublicIpBlock(object):


[05/13] libcloud git commit: Added Data contract classes for IpAddressList, PortList, NIC

Posted by an...@apache.org.
Added Data contract classes for IpAddressList, PortList, NIC


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

Branch: refs/heads/trunk
Commit: e6d582e55c4f5bbc906456b7003ded471a6434c6
Parents: 5327c11
Author: Samuel Chong <sa...@gmail.com>
Authored: Thu Oct 6 11:30:46 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Thu Oct 6 11:30:46 2016 +1100

----------------------------------------------------------------------
 libcloud/common/dimensiondata.py | 230 ++++++++++++++++++++++++++++++++++
 1 file changed, 230 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/e6d582e5/libcloud/common/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/common/dimensiondata.py b/libcloud/common/dimensiondata.py
index af792c3..6633e64 100644
--- a/libcloud/common/dimensiondata.py
+++ b/libcloud/common/dimensiondata.py
@@ -848,6 +848,7 @@ class DimensionDataFirewallAddress(object):
                self.port_begin, self.port_end, self.address_list_id,
                self.port_list_id))
 
+
 class DimensionDataNatRule(object):
     """
     An IP NAT rule in a network domain
@@ -1519,3 +1520,232 @@ class DimensionDataTagKey(object):
     def __repr__(self):
         return (('<DimensionDataTagKey: name=%s>')
                 % (self.name))
+
+
+class DimensionDataIpAddressList(object):
+    """
+    DimensionData IP Address list
+    """
+
+    def __init__(self, id, name, description, ip_version,
+                 ip_address_collection,
+                 state, create_time, child_ip_address_lists=None):
+        """"
+        Initialize an instance of :class:`DimensionDataIpAddressList`
+
+        :param id: GUID of the IP Address List key
+        :type  id: ``str``
+
+        :param name: Name of the IP Address List
+        :type  name: ``str``
+
+        :param description: Description of the IP Address List
+        :type  description: ``str``
+
+        :param ip_version: IP version. E.g. IPV4, IPV6
+        :type  ip_version: ``str``
+
+        :param ip_address_collection: Collection of DimensionDataIpAddress
+        :type  ip_address_collection: ``List``
+
+        :param state: IP Address list state
+        :type  state: ``str``
+
+        :param create_time: IP Address List created time
+        :type  create_time: ``date time``
+
+        :param child_ip_address_lists: List of IP address list to be included
+        :type  child_ip_address_lists: List
+        of :class:'DimensionDataIpAddressList'
+        """
+        self.id = id
+        self.name = name
+        self.description = description
+        self.ip_version = ip_version
+        self.ip_address_collection = ip_address_collection
+        self.state = state
+        self.create_time = create_time
+        self.child_ip_address_lists = child_ip_address_lists
+
+    def __repr__(self):
+        return ('<DimensionDataIpAddressList: id=%s, name=%s, description=%s, '
+                'ip_version=%s, ip_address_collection=%s, state=%s, '
+                'create_time=%s, child_ip_address_lists=%s>'
+                % (self.id, self.name, self.description, self.ip_version,
+                   self.ip_address_collection, self.state, self.create_time,
+                   self.child_ip_address_lists))
+
+
+class DimensionDataChildIpAddressList(object):
+    """
+    DimensionData Child IP Address list
+    """
+
+    def __init__(self, id, name):
+        """"
+        Initialize an instance of :class:`DimensionDataChildIpAddressList`
+
+        :param id: GUID of the IP Address List key
+        :type  id: ``str``
+
+        :param name: Name of the IP Address List
+        :type  name: ``str``
+
+        """
+        self.id = id
+        self.name = name
+
+    def __repr__(self):
+        return ('<DimensionDataChildIpAddressList: id=%s, name=%s>'
+                % (self.id, self.name))
+
+
+class DimensionDataIpAddress(object):
+    """
+    A representation of IP Address in Dimension Data
+    """
+
+    def __init__(self, begin, end=None, prefix_size=None):
+        """
+        Initialize an instance of :class:`DimensionDataIpAddress`
+
+        :param begin: IP Address Begin
+        :type  begin: ``str``
+
+        :param end: IP Address end
+        :type  end: ``str``
+
+        :param prefixSize: IP Address prefix size
+        :type  prefixSize: ``int``
+        """
+        self.begin = begin
+        self.end = end
+        self.prefix_size = prefix_size
+
+    def __repr__(self):
+        return ('<DimensionDataIpAddress: begin=%s, end=%s, prefix_size=%s>'
+                % (self.begin, self.end, self.prefix_size))
+
+
+class DimensionDataPortList(object):
+    """
+    DimensionData Port list
+    """
+
+    def __init__(self, id, name, description, port_collection,
+                 child_port_list_lists,
+                 state, create_time):
+        """"
+        Initialize an instance of :class:`DimensionDataPortList`
+
+        :param id: GUID of the Port List key
+        :type  id: ``str``
+
+        :param name: Name of the Port List
+        :type  name: ``str``
+
+        :param description: Description of the Port List
+        :type  description: ``str``
+
+        :param port_collection: Collection of DimensionDataPort
+        :type  port_collection: ``List``
+
+        :param child_port_list_lists: Collection of DimensionDataChildPort
+        :type  child_port_list_lists: ``List``
+
+        :param state: Port list state
+        :type  state: ``str``
+
+        :param create_time: Port List created time
+        :type  create_time: ``date time``
+        """
+        self.id = id
+        self.name = name
+        self.description = description
+        self.port_collection = port_collection
+        self.child_port_list_lists = child_port_list_lists
+        self.state = state
+        self.create_time = create_time
+
+    def __repr__(self):
+        return (
+            "<DimensionDataPortList: id=%s, name=%s, description=%s, "
+            "port_collection=%s, child_port_list=%s, state=%s, create_time=%s>"
+            % (self.id, self.name, self.description,
+               self.port_collection, self.child_port_list, self.state,
+               self.create_time))
+
+
+class DimensionDataChildPortList(object):
+    """
+    DimensionData Child Port list
+    """
+
+    def __init__(self, id, name):
+        """"
+        Initialize an instance of :class:`DimensionDataChildIpAddressList`
+
+        :param id: GUID of the child port list key
+        :type  id: ``str``
+
+        :param name: Name of the child port List
+        :type  name: ``str``
+
+        """
+        self.id = id
+        self.name = name
+
+    def __repr__(self):
+        return ('<DimensionDataChildPortList: id=%s, name=%s>'
+                % (self.id, self.name))
+
+
+class DimensionDataPort(object):
+    """
+    A representation of Port in Dimension Data
+    """
+
+    def __init__(self, begin, end=None):
+        """
+        Initialize an instance of :class:`DimensionDataPort`
+
+        :param begin: Port Number Begin
+        :type  begin: ``str``
+
+        :param end: Port Number end
+        :type  end: ``str``
+        """
+        self.begin = begin
+        self.end = end
+
+    def __repr__(self):
+        return ('<DimensionDataPort: begin=%s, end=%s>'
+                % (self.begin, self.end))
+
+
+class DimensionDataNic(object):
+    """
+    A representation of Network Adapter in Dimension Data
+    """
+
+    def __init__(self, private_ip_v4=None, vlan=None, network_adapter=None):
+        """
+        Initialize an instance of :class:`DimensionDataNic`
+
+        :param private_ip_v4: IPv4
+        :type  private_ip_v4: ``str``
+
+        :param vlan: Network VLAN
+        :type  vlan: class: DimensionDataVlan or ``str``
+
+        :param network_adapter: Network Adapter Name
+        :type  network_adapter: ``str``
+        """
+        self.private_ip_v4 = private_ip_v4
+        self.vlan = vlan
+        self.network_adapter_name = network_adapter
+
+    def __repr__(self):
+        return ('<DimensionDataNic: private_ip_v4=%s, vlan=%s,'
+                'network_adapter=%s>'
+                % (self.private_ip_v4, self.vlan, self.network_adapter))


[06/13] libcloud git commit: Added Edit firewall rule feature and CRUD operation for IpAddressList, PortList in DD driver

Posted by an...@apache.org.
Added Edit firewall rule feature and CRUD operation for IpAddressList, PortList in DD driver


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

Branch: refs/heads/trunk
Commit: 2eb1b4a32e1048d063da0ebea4cac01f2da60270
Parents: e6d582e
Author: Samuel Chong <sa...@gmail.com>
Authored: Thu Oct 6 11:43:28 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Thu Oct 6 11:43:28 2016 +1100

----------------------------------------------------------------------
 libcloud/compute/drivers/dimensiondata.py | 640 +++++++++++++++++++++++++
 1 file changed, 640 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/2eb1b4a3/libcloud/compute/drivers/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/dimensiondata.py b/libcloud/compute/drivers/dimensiondata.py
index 9bdeb86..89f7c66 100644
--- a/libcloud/compute/drivers/dimensiondata.py
+++ b/libcloud/compute/drivers/dimensiondata.py
@@ -38,6 +38,13 @@ from libcloud.common.dimensiondata import DimensionDataFirewallRule
 from libcloud.common.dimensiondata import DimensionDataFirewallAddress
 from libcloud.common.dimensiondata import DimensionDataNatRule
 from libcloud.common.dimensiondata import DimensionDataAntiAffinityRule
+from libcloud.common.dimensiondata import DimensionDataIpAddressList
+from libcloud.common.dimensiondata import DimensionDataChildIpAddressList
+from libcloud.common.dimensiondata import DimensionDataIpAddress
+from libcloud.common.dimensiondata import DimensionDataPortList
+from libcloud.common.dimensiondata import DimensionDataPort
+from libcloud.common.dimensiondata import DimensionDataChildPortList
+from libcloud.common.dimensiondata import DimensionDataNic
 from libcloud.common.dimensiondata import NetworkDomainServicePlan
 from libcloud.common.dimensiondata import DimensionDataTagKey
 from libcloud.common.dimensiondata import DimensionDataTag
@@ -1470,6 +1477,113 @@ class DimensionDataNodeDriver(NodeDriver):
         rule.id = rule_id
         return rule
 
+    def ex_edit_firewall_rule(self, rule, position,
+                              relative_rule_for_position=None):
+        """
+        Edit a firewall rule
+
+        :param rule: (required) The rule in which to create
+        :type  rule: :class:`DimensionDataFirewallRule`
+
+        :param position: (required) There are two types of positions
+                         with position_relative_to_rule arg and without it
+                         With: 'BEFORE' or 'AFTER'
+                         Without: 'FIRST' or 'LAST'
+        :type  position: ``str``
+
+        :param relative_rule_for_position: (optional) The rule or rule name in
+                                           which to decide the relative rule
+                                           for positioning.
+        :type  relative_rule_for_position:
+            :class:`DimensionDataFirewallRule` or ``str``
+
+        :rtype: ``bool``
+        """
+
+        positions_without_rule = ('FIRST', 'LAST')
+        positions_with_rule = ('BEFORE', 'AFTER')
+
+        edit_node = ET.Element('editFirewallRule',
+                               {'xmlns': TYPES_URN, 'id': rule.id})
+        ET.SubElement(edit_node, "action").text = rule.action
+        ET.SubElement(edit_node, "protocol").text = rule.protocol
+
+        # Source address
+        source = ET.SubElement(edit_node, "source")
+        if rule.source.address_list_id is not None:
+            source_ip = ET.SubElement(source, 'ipAddressListId')
+            source_ip.text = rule.source.address_list_id
+        else:
+            source_ip = ET.SubElement(source, 'ip')
+            if rule.source.any_ip:
+                source_ip.set('address', 'ANY')
+            else:
+                source_ip.set('address', rule.source.ip_address)
+                if rule.source.ip_prefix_size is not None:
+                    source_ip.set('prefixSize',
+                                  str(rule.source.ip_prefix_size))
+
+        # Setup source port rule
+        if rule.source.port_list_id is not None:
+            source_port = ET.SubElement(source, 'portListId')
+            source_port.text = rule.source.port_list_id
+        else:
+            if rule.source.port_begin is not None:
+                source_port = ET.SubElement(source, 'port')
+                source_port.set('begin', rule.source.port_begin)
+            if rule.source.port_end is not None:
+                source_port.set('end', rule.source.port_end)
+        # Setup destination port rule
+        dest = ET.SubElement(edit_node, "destination")
+        if rule.destination.address_list_id is not None:
+            dest_ip = ET.SubElement(dest, 'ipAddressListId')
+            dest_ip.text = rule.destination.address_list_id
+        else:
+            dest_ip = ET.SubElement(dest, 'ip')
+            if rule.destination.any_ip:
+                dest_ip.set('address', 'ANY')
+            else:
+                dest_ip.set('address', rule.destination.ip_address)
+                if rule.destination.ip_prefix_size is not None:
+                    dest_ip.set('prefixSize', rule.destination.ip_prefix_size)
+        if rule.destination.port_list_id is not None:
+            dest_port = ET.SubElement(dest, 'portListId')
+            dest_port.text = rule.destination.port_list_id
+        else:
+            if rule.destination.port_begin is not None:
+                dest_port = ET.SubElement(dest, 'port')
+                dest_port.set('begin', rule.destination.port_begin)
+            if rule.destination.port_end is not None:
+                dest_port.set('end', rule.destination.port_end)
+        # Set up positioning of rule
+        ET.SubElement(edit_node, "enabled").text = str(rule.enabled).lower()
+        placement = ET.SubElement(edit_node, "placement")
+        if relative_rule_for_position is not None:
+            if position not in positions_with_rule:
+                raise ValueError("When position_relative_to_rule is specified"
+                                 " position must be %s"
+                                 % ', '.join(positions_with_rule))
+            if isinstance(relative_rule_for_position,
+                          DimensionDataFirewallRule):
+                rule_name = relative_rule_for_position.name
+            else:
+                rule_name = relative_rule_for_position
+            placement.set('relativeToRule', rule_name)
+        else:
+            if position not in positions_without_rule:
+                raise ValueError("When position_relative_to_rule is not"
+                                 " specified position must be %s"
+                                 % ', '.join(positions_without_rule))
+        placement.set('position', position)
+
+        response = self.connection.request_with_orgId_api_2(
+            'network/editFirewallRule',
+            method='POST',
+            data=ET.tostring(edit_node)).object
+
+        response_code = findtext(response, 'responseCode', TYPES_URN)
+        return response_code in ['IN_PROGRESS', 'OK']
+
     def ex_get_firewall_rule(self, network_domain, rule_id):
         locations = self.list_locations()
         rule = self.connection.request_with_orgId_api_2(
@@ -2379,6 +2493,427 @@ class DimensionDataNodeDriver(NodeDriver):
             % (datacenter_id, start_date, end_date))
         return self._format_csv(result.response)
 
+    def ex_list_ip_address_list(self, ex_network_domain):
+        """
+        List IP Address List by network domain ID specified
+
+        :param  ex_network_domain: The network domain or network domain ID
+        :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'
+
+        :return: a list of DimensionDataIpAddressList objects
+        :rtype: ``list`` of :class:`DimensionDataIpAddressList`
+        """
+        params = {'networkDomainId': self._network_domain_to_network_domain_id(
+            ex_network_domain)}
+        response = self.connection.request_with_orgId_api_2(
+            'network/ipAddressList', params=params).object
+        return self._to_ip_address_lists(response)
+
+    def ex_get_ip_address_list(self, ex_network_domain,
+                               ex_ip_address_list_name):
+        """
+        Get IP Address List by name in network domain specified
+
+        :param  ex_network_domain: (required) The network domain or network
+                                   domain ID in which ipaddresslist resides.
+        :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'
+
+        :param    ex_ip_address_list_name: (required) Get 'IP Address List' by
+                                            name
+        :type     ex_ip_address_list_name: :``str``
+
+        :return: a list of DimensionDataIpAddressList objects
+        :rtype: ``list`` of :class:`DimensionDataIpAddressList`
+        """
+
+        ip_address_lists = self.ex_list_ip_address_list(ex_network_domain)
+        return list(filter(lambda x: x.name == ex_ip_address_list_name,
+                           ip_address_lists))
+
+    def ex_create_ip_address_list(self, ex_network_domain, name,
+                                  description,
+                                  ip_version, ip_address_collection,
+                                  child_ip_address_list=None):
+        """
+        Create IP Address List. IP Address list.
+
+        :param  ex_network_domain: The network domain or network domain ID
+        :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'
+
+        :param    name:  IP Address List Name (required)
+        :type      name: :``str``
+
+        :param    description:  IP Address List Description (optional)
+        :type      description: :``str``
+
+        :param    ip_version:  IP Version of ip address (required)
+        :type      ip_version: :``str``
+
+        :param    ip_address_collection:  List of IP Address. At least one
+                                          ipAddress element or one
+                                          childIpAddressListId element must
+                                          be provided.
+        :type      ip_address_collection: :``str``
+
+        :param    child_ip_address_list:  Child IP Address List or id to be
+                                          included in this IP Address List.
+                                          At least one ipAddress or
+                                          one childIpAddressListId
+                                          must be provided.
+        :type     child_ip_address_list:
+                        :class:'DimensionDataChildIpAddressList` or `str``
+
+        :return: a list of DimensionDataIpAddressList objects
+        :rtype: ``list`` of :class:`DimensionDataIpAddressList`
+        """
+        if (ip_address_collection is None and
+                child_ip_address_list is None):
+            raise ValueError("At least one ipAddress element or one "
+                             "childIpAddressListId element must be "
+                             "provided.")
+
+        create_ip_address_list = ET.Element('createIpAddressList',
+                                            {'xmlns': TYPES_URN})
+        ET.SubElement(
+            create_ip_address_list,
+            'networkDomainId'
+        ).text = self._network_domain_to_network_domain_id(ex_network_domain)
+
+        ET.SubElement(
+            create_ip_address_list,
+            'name'
+        ).text = name
+
+        ET.SubElement(
+            create_ip_address_list,
+            'description'
+        ).text = description
+
+        ET.SubElement(
+            create_ip_address_list,
+            'ipVersion'
+        ).text = ip_version
+
+        for ip in ip_address_collection:
+            ip_address = ET.SubElement(
+                create_ip_address_list,
+                'ipAddress',
+            )
+            ip_address.set('begin', ip.begin)
+
+            if ip.end:
+                ip_address.set('end', ip.end)
+
+            if ip.prefix_size:
+                ip_address.set('prefixSize', ip.prefix_size)
+
+        if child_ip_address_list is not None:
+            ET.SubElement(
+                create_ip_address_list,
+                'childIpAddressListId'
+            ).text = \
+                self._child_ip_address_list_to_child_ip_address_list_id(
+                    child_ip_address_list)
+
+        response = self.connection.request_with_orgId_api_2(
+            'network/createIpAddressList',
+            method='POST',
+            data=ET.tostring(create_ip_address_list)).object
+
+        response_code = findtext(response, 'responseCode', TYPES_URN)
+        return response_code in ['IN_PROGRESS', 'OK']
+
+    def ex_edit_ip_address_list(self, ex_ip_address_list, description,
+                                ip_address_collection,
+                                child_ip_address_lists=None):
+        """
+        Edit IP Address List. IP Address list.
+
+        :param    ex_ip_address_list:  (required) IpAddressList object or
+                                       IpAddressList ID
+        :type     ex_ip_address_list: :class:'DimensionDataIpAddressList'
+                    or ``str``
+
+        :param    description:  IP Address List Description
+        :type      description: :``str``
+
+        :param    ip_address_collection:  List of IP Address
+        :type     ip_address_collection: ''list'' of
+                                         :class:'DimensionDataIpAddressList'
+
+        :param   child_ip_address_lists:  Child IP Address List or id to be
+                                          included in this IP Address List
+        :type    child_ip_address_lists:  ``list`` of
+                                    :class:'DimensionDataChildIpAddressList'
+                                    or ``str``
+
+        :return: a list of DimensionDataIpAddressList objects
+        :rtype: ``list`` of :class:`DimensionDataIpAddressList`
+        """
+        edit_ip_address_list = ET.Element(
+            'editIpAddressList',
+            {'xmlns': TYPES_URN,
+             "id": self._ip_address_list_to_ip_address_list_id(
+                 ex_ip_address_list),
+             'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance"
+             })
+
+        ET.SubElement(
+            edit_ip_address_list,
+            'description'
+        ).text = description
+
+        for ip in ip_address_collection:
+            ip_address = ET.SubElement(
+                edit_ip_address_list,
+                'ipAddress',
+            )
+            ip_address.set('begin', ip.begin)
+
+            if ip.end:
+                ip_address.set('end', ip.end)
+
+            if ip.prefix_size:
+                ip_address.set('prefixSize', ip.prefix_size)
+
+        if child_ip_address_lists is not None:
+            ET.SubElement(
+                edit_ip_address_list,
+                'childIpAddressListId'
+            ).text = self._child_ip_address_list_to_child_ip_address_list_id(
+                child_ip_address_lists)
+        else:
+            ET.SubElement(
+                edit_ip_address_list,
+                'childIpAddressListId',
+                {'xsi:nil': 'true'}
+            )
+
+        response = self.connection.request_with_orgId_api_2(
+            'network/editIpAddressList',
+            method='POST',
+            data=ET.tostring(edit_ip_address_list)).object
+
+        response_code = findtext(response, 'responseCode', TYPES_URN)
+        return response_code in ['IN_PROGRESS', 'OK']
+
+    def ex_delete_ip_address_list(self, ex_ip_address_list):
+        """
+        Delete IP Address List by ID
+
+        :param    ex_ip_address_list:  IP Address List object or IP Address
+        List ID (required)
+        :type     ex_ip_address_list: :class:'DimensionDataIpAddressList'
+                    or ``str``
+
+        :rtype: ``bool``
+        """
+
+        delete_ip_address_list = \
+            ET.Element('deleteIpAddressList', {'xmlns': TYPES_URN, 'id': self
+                       ._ip_address_list_to_ip_address_list_id(
+                           ex_ip_address_list)})
+
+        response = self.connection.request_with_orgId_api_2(
+            'network/deleteIpAddressList',
+            method='POST',
+            data=ET.tostring(delete_ip_address_list)).object
+
+        response_code = findtext(response, 'responseCode', TYPES_URN)
+        return response_code in ['IN_PROGRESS', 'OK']
+
+    def ex_list_port_list(self, ex_network_domain):
+        """
+        List Port List by network domain ID specified
+
+        :param  ex_network_domain: The network domain or network domain ID
+        :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'
+
+        :return: a list of DimensionDataPortList objects
+        :rtype: ``list`` of :class:`DimensionDataPortList`
+        """
+        params = {'networkDomainId':
+                  self._network_domain_to_network_domain_id(ex_network_domain)}
+        response = self.connection.request_with_orgId_api_2(
+            'network/portList', params=params).object
+        return self._to_port_lists(response)
+
+    def ex_get_port_list(self, ex_port_list):
+        """
+        Get Port List
+
+        :param  ex_port_list: The ex_port_list or ex_port_list ID
+        :type   ex_port_list: :class:`DimensionDataNetworkDomain` or 'str'
+
+        :return:  DimensionDataPortList object
+        :rtype:  :class:`DimensionDataPort`
+        """
+
+        url_path = ('network/portList/%s' % self._port_list_to_port_list_id(
+            ex_port_list))
+        response = self.connection.request_with_orgId_api_2(
+            url_path).object
+        return self._to_port_list(response)
+
+    def ex_create_port_list(self, ex_network_domain, name, description,
+                            port_collection, child_port_list_lists=None):
+        """
+        Create Port List.
+
+        :param    ex_network_domain:  (required) The network domain in
+                                       which to create PortList. Provide
+                                       networkdomain object or its id.
+        :type      ex_network_domain: :``str``
+
+        :param    name:  Port List Name
+        :type     name: :``str``
+
+        :param    description:  IP Address List Description
+        :type     description: :``str``
+
+        :param    port_collection:  List of Port Address
+        :type     port_collection: :``str``
+
+        :param    child_port_list_lists:  Child Port List to be included in
+                                          this Port List
+        :type     child_port_list_lists: :``str`` or ''list of
+                                         :class:'DimensionDataChildPortList'
+
+        :return: result of operation
+        :rtype: ``bool``
+        """
+        new_port_list = ET.Element('createPortList', {'xmlns': TYPES_URN})
+        ET.SubElement(
+            new_port_list,
+            'networkDomainId'
+        ).text = self._network_domain_to_network_domain_id(ex_network_domain)
+
+        ET.SubElement(
+            new_port_list,
+            'name'
+        ).text = name
+
+        ET.SubElement(
+            new_port_list,
+            'description'
+        ).text = description
+
+        for port in port_collection:
+            p = ET.SubElement(
+                new_port_list,
+                'port'
+            )
+            p.set('begin', port.begin)
+
+            if port.end:
+                p.set('end', port.end)
+
+        if child_port_list_lists is not None:
+            for child in child_port_list_lists:
+                ET.SubElement(
+                    new_port_list,
+                    'childPortListId'
+                ).text = self._child_port_list_to_child_port_list_id(child)
+
+        response = self.connection.request_with_orgId_api_2(
+            'network/createPortList',
+            method='POST',
+            data=ET.tostring(new_port_list)).object
+
+        response_code = findtext(response, 'responseCode', TYPES_URN)
+        return response_code in ['IN_PROGRESS', 'OK']
+
+    def ex_edit_port_list(self, ex_port_list, description,
+                          port_collection, child_port_list_lists=None):
+        """
+        Edit Port List.
+
+        :param    ex_port_list:  Port List to be edited
+                                        (required)
+        :type      ex_port_list: :``str`` or :class:'DimensionDataPortList'
+
+        :param    description:  Port List Description
+        :type      description: :``str``
+
+        :param    port_collection:  List of Port Address
+        :type      port_collection: :``str``
+
+        :param    child_port_list_lists:  Child Port List to be included in
+                                          this IP Address List
+        :type      child_port_list_lists: :``list`` of
+                                          :class'DimensionDataChildPortList'
+                                          or ''str''
+
+        :return: a list of DimensionDataPortList objects
+        :rtype: ``list`` of :class:`DimensionDataPortList`
+        """
+
+        existing_port_address_list = ET.Element(
+            'editPortList',
+            {
+                "id": self._port_list_to_port_list_id(ex_port_list),
+                'xmlns': TYPES_URN,
+                'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance"
+            })
+
+        ET.SubElement(
+            existing_port_address_list,
+            'description'
+        ).text = description
+
+        for port in port_collection:
+            p = ET.SubElement(
+                existing_port_address_list,
+                'port'
+            )
+            p.set('begin', port.begin)
+
+            if port.end:
+                p.set('end', port.end)
+
+        if child_port_list_lists is not None:
+            for child in child_port_list_lists:
+                ET.SubElement(
+                    existing_port_address_list,
+                    'childPortListId'
+                ).text = self._child_port_list_to_child_port_list_id(child)
+        else:
+            ET.SubElement(
+                existing_port_address_list,
+                'childPortListId',
+                {'xsi:nil': 'true'}
+            )
+
+        response = self.connection.request_with_orgId_api_2(
+            'network/editPortList',
+            method='POST',
+            data=ET.tostring(existing_port_address_list)).object
+
+        response_code = findtext(response, 'responseCode', TYPES_URN)
+        return response_code in ['IN_PROGRESS', 'OK']
+
+    def ex_delete_port_list(self, ex_port_list):
+        """
+        Delete Port List
+        :param    ex_port_list:  Port List to be deleted
+        :type     ex_port_list: :``str`` or :class:'DimensionDataPortList'
+
+        :rtype: ``bool``
+        """
+
+        delete_port_list = ET.Element(
+            'deletePortList',
+            {'xmlns': TYPES_URN,
+             'id': self._port_list_to_port_list_id(ex_port_list)})
+
+        response = self.connection.request_with_orgId_api_2(
+            'network/deletePortList',
+            method='POST',
+            data=ET.tostring(delete_port_list)).object
+
+        response_code = findtext(response, 'responseCode', TYPES_URN)
+        return response_code in ['IN_PROGRESS', 'OK']
+
     def _format_csv(self, http_response):
         text = http_response.read()
         lines = str.splitlines(ensure_string(text))
@@ -2828,6 +3363,75 @@ class DimensionDataNodeDriver(NodeDriver):
                                     TYPES_URN))
         return s
 
+    def _to_ip_address_lists(self, object):
+        ip_address_lists = []
+        for element in findall(object, 'ipAddressList', TYPES_URN):
+            ip_address_lists.append(self._to_ip_address_list(element))
+
+        return ip_address_lists
+
+    def _to_ip_address_list(self, element):
+        ipAddresses = []
+        for ip in findall(element, 'ipAddress', TYPES_URN):
+            ipAddresses.append(self._to_ip_address(ip))
+
+        child_ip_address_lists = []
+        for child_ip_list in findall(element, 'childIpAddressList',
+                                     TYPES_URN):
+            child_ip_address_lists.append(self
+                                          ._to_child_ip_list(child_ip_list))
+
+        return DimensionDataIpAddressList(
+            id=element.get('id'),
+            name=findtext(element, 'name', TYPES_URN),
+            description=findtext(element, 'description', TYPES_URN),
+            ip_version=findtext(element, 'ipVersion', TYPES_URN),
+            ip_address_collection=ipAddresses,
+            state=findtext(element, 'state', TYPES_URN),
+            create_time=findtext(element, 'createTime', TYPES_URN),
+            child_ip_address_lists=child_ip_address_lists
+        )
+
+    def _to_child_ip_list(self, element):
+        return DimensionDataChildIpAddressList(
+            id=element.get('id'),
+            name=element.get('name')
+        )
+
+    def _to_ip_address(self, element):
+        return DimensionDataIpAddress(
+            begin=element.get('begin'),
+            end=element.get('end'),
+            prefix_size=element.get('prefixSize')
+        )
+
+    def _to_port_lists(self, object):
+        port_lists = []
+        for element in findall(object, 'portList', TYPES_URN):
+            port_lists.append(self._to_port_list(element))
+
+        return port_lists
+
+    def _to_port_list(self, element):
+        ports = []
+        for port in findall(element, 'port', TYPES_URN):
+            ports.append(self._to_port(element=port))
+
+        child_port_list_lists = []
+        for child in findall(element, 'childPortList', TYPES_URN):
+            child_port_list_lists.append(
+                self._to_child_port_list(element=child))
+
+        return DimensionDataPortList(
+            id=element.get('id'),
+            name=findtext(element, 'name', TYPES_URN),
+            description=findtext(element, 'description', TYPES_URN),
+            port_collection=ports,
+            child_port_list_lists=child_port_list_lists,
+            state=findtext(element, 'state', TYPES_URN),
+            create_time=findtext(element, 'createTime', TYPES_URN)
+        )
+
     def _image_needs_auth(self, image):
         if not isinstance(image, NodeImage):
             image = self.ex_get_image_by_id(image)
@@ -2836,6 +3440,20 @@ class DimensionDataNodeDriver(NodeDriver):
         return True
 
     @staticmethod
+    def _to_port(element):
+        return DimensionDataPort(
+            begin=element.get('begin'),
+            end=element.get('end')
+        )
+
+    @staticmethod
+    def _to_child_port_list(element):
+        return DimensionDataChildPortList(
+            id=element.get('id'),
+            name=element.get('name')
+        )
+
+    @staticmethod
     def _get_node_state(state, started, action):
         try:
             return NODE_STATE_MAP[(state, started, action)]
@@ -2882,5 +3500,27 @@ class DimensionDataNodeDriver(NodeDriver):
         return dd_object_to_id(tag_key, DimensionDataTagKey, id_value='name')
 
     @staticmethod
+    def _ip_address_list_to_ip_address_list_id(ip_addr_list):
+        return dd_object_to_id(ip_addr_list, DimensionDataIpAddressList,
+                               id_value='id')
+
+    @staticmethod
+    def _child_ip_address_list_to_child_ip_address_list_id(child_ip_addr_list):
+        return dd_object_to_id(child_ip_addr_list,
+                               DimensionDataChildIpAddressList,
+                               id_value='id')
+
+    @staticmethod
+    def _port_list_to_port_list_id(port_list):
+        return dd_object_to_id(port_list, DimensionDataPortList,
+                               id_value='id')
+
+    @staticmethod
+    def _child_port_list_to_child_port_list_id(child_port_list):
+        return dd_object_to_id(child_port_list,
+                               DimensionDataChildPortList,
+                               id_value='id')
+
+    @staticmethod
     def _str2bool(string):
         return string.lower() in ("true")


[03/13] libcloud git commit: Merge branch 'trunk' of https://github.com/samuelchong/libcloud into trunk

Posted by an...@apache.org.
Merge branch 'trunk' of https://github.com/samuelchong/libcloud into trunk


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

Branch: refs/heads/trunk
Commit: 2672b78f9a9ee5f88656ba5dce9366493b73f65f
Parents: 25c5ba9 7440bf5
Author: Samuel Chong <sa...@gmail.com>
Authored: Thu Oct 6 11:04:39 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Thu Oct 6 11:04:39 2016 +1100

----------------------------------------------------------------------

----------------------------------------------------------------------



[08/13] libcloud git commit: Unit test for firewall edit, portlist CRUD and IPAddressList CRUD

Posted by an...@apache.org.
Unit test for firewall edit, portlist CRUD and IPAddressList CRUD


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

Branch: refs/heads/trunk
Commit: 04c70e2285f3e2d64f72b16874f0882374133701
Parents: 009f226
Author: Samuel Chong <sa...@gmail.com>
Authored: Thu Oct 6 15:14:00 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Thu Oct 6 15:14:00 2016 +1100

----------------------------------------------------------------------
 .../dimensiondata/ip_address_list_create.xml    |   9 +
 .../dimensiondata/ip_address_list_delete.xml    |  10 +
 .../dimensiondata/ip_address_list_edit.xml      |  10 +
 .../fixtures/dimensiondata/ip_address_lists.xml |  46 ++
 .../ip_address_lists_FILTERBYNAME.xml           |  14 +
 .../fixtures/dimensiondata/port_list_create.xml |   9 +
 .../fixtures/dimensiondata/port_list_delete.xml |  10 +
 .../fixtures/dimensiondata/port_list_edit.xml   |   8 +
 .../fixtures/dimensiondata/port_list_get.xml    |  15 +
 .../fixtures/dimensiondata/port_list_lists.xml  |  38 +
 libcloud/test/compute/test_dimensiondata.py     | 753 ++++++++++++++++++-
 11 files changed, 921 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_create.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_create.xml b/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_create.xml
new file mode 100644
index 0000000..09317ef
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_create.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<response
+        requestId="na9_20160321T074626030-0400_7e9fffe7-190b-46f2-9107- 9d52fe57d0ad"
+        xmlns="urn:didata.com:api:cloud:types">
+    <operation>CREATE_IP_ADDRESS_LIST</operation>
+    <responseCode>OK</responseCode>
+    <message>IP Address List 'myAddressList' has been created.</message>
+    <info name="ipAddressListId" value="9e6b496d-5261-4542-91aa-b50c7f569c54"/>
+</response>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_delete.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_delete.xml b/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_delete.xml
new file mode 100644
index 0000000..13f323a
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_delete.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<response
+        requestId="na9_20160321T074626030-0400_7e9fffe7-190b-46f2-9107- 9d52fe57d0ad"
+        xmlns="urn:didata.com:api:cloud:types">
+    <operation>DELETE_IP_ADDRESS_LIST</operation>
+    <responseCode>OK</responseCode>
+    <message>IP Address List with Id 84e34850-595d-436e-a885-7cd37edb24a4 has
+        been deleted.
+    </message>
+</response>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_edit.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_edit.xml b/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_edit.xml
new file mode 100644
index 0000000..3462afa
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/ip_address_list_edit.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<response
+        requestId="na9_20160321T074626030-0400_7e9fffe7-190b-46f2-9107- 9d52fe57d0ad"
+        xmlns="urn:didata.com:api:cloud:types">
+    <operation>EDIT_IP_ADDRESS_LIST</operation>
+    <responseCode>OK</responseCode>
+    <message>IP Address List 'MyIpAddressList' has been edited
+        successfully.
+    </message>
+</response>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/fixtures/dimensiondata/ip_address_lists.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/ip_address_lists.xml b/libcloud/test/compute/fixtures/dimensiondata/ip_address_lists.xml
new file mode 100644
index 0000000..708c882
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/ip_address_lists.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ipAddressLists xmlns="urn:didata.com:api:cloud:types" pageNumber="1" pageCount="4" totalCount="4" pageSize="250">
+    <ipAddressList id="0291ef78-4059-4bc1-b433-3f6ad698dc41">
+        <name>TestIPList2</name>
+        <description>Test web server IP addresses list</description>
+        <ipVersion>IPV4</ipVersion>
+        <ipAddress begin="190.1.1.0"/>
+        <ipAddress begin="190.1.1.3"/>
+        <ipAddress begin="190.1.1.10" end="190.1.1.20"/>
+        <ipAddress begin="190.1.2.0" prefixSize="24"/>
+        <state>NORMAL</state>
+        <createTime>2016-09-01T01:19:53.000Z</createTime>
+    </ipAddressList>
+    <ipAddressList id="bf09778f-b5ef-43a0-ba41-24ce30085deb">
+        <name>TestIPList_sub_2</name>
+        <description>Test web server IP addresses list</description>
+        <ipVersion>IPV4</ipVersion>
+        <ipAddress begin="190.1.1.0"/>
+        <ipAddress begin="190.1.1.3"/>
+        <ipAddress begin="190.1.1.10" end="190.1.1.20"/>
+        <ipAddress begin="190.1.2.0" prefixSize="24"/>
+        <childIpAddressList id="0291ef78-4059-4bc1-b433-3f6ad698dc41" name="TestIPList2"/>
+        <state>NORMAL</state>
+        <createTime>2016-09-01T01:20:56.000Z</createTime>
+    </ipAddressList>
+    <ipAddressList id="863847dd-046d-492d-9b84-ebea39c262c6">
+        <name>Test_IP_Address_List_2</name>
+        <description>Test Description</description>
+        <ipVersion>IPV4</ipVersion>
+        <ipAddress begin="190.2.2.100"/>
+        <childIpAddressList id="0291ef78-4059-4bc1-b433-3f6ad698dc41" name="TestIPList2"/>
+        <state>NORMAL</state>
+        <createTime>2016-09-05T05:37:56.000Z</createTime>
+    </ipAddressList>
+    <ipAddressList id="5e7c323f-c885-4e4b-9a27-94c44217dbd3">
+        <name>Test_IP_Address_List_3</name>
+        <description>Test Description</description>
+        <ipVersion>IPV4</ipVersion>
+        <ipAddress begin="190.2.2.0" prefixSize="24"/>
+        <ipAddress begin="190.2.2.100"/>
+        <ipAddress begin="190.2.2.106" end="190.2.2.108"/>
+        <childIpAddressList id="0291ef78-4059-4bc1-b433-3f6ad698dc41" name="TestIPList2"/>
+        <state>NORMAL</state>
+        <createTime>2016-09-05T05:57:53.000Z</createTime>
+    </ipAddressList>
+</ipAddressLists>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/fixtures/dimensiondata/ip_address_lists_FILTERBYNAME.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/ip_address_lists_FILTERBYNAME.xml b/libcloud/test/compute/fixtures/dimensiondata/ip_address_lists_FILTERBYNAME.xml
new file mode 100644
index 0000000..301a106
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/ip_address_lists_FILTERBYNAME.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ipAddressLists xmlns="urn:didata.com:api:cloud:types" pageNumber="1" pageCount="1" totalCount="1" pageSize="250">
+    <ipAddressList id="5e7c323f-c885-4e4b-9a27-94c44217dbd3">
+        <name>Test_IP_Address_List_3</name>
+        <description>Test Description</description>
+        <ipVersion>IPV4</ipVersion>
+        <ipAddress begin="190.2.2.0" prefixSize="24"/>
+        <ipAddress begin="190.2.2.100"/>
+        <ipAddress begin="190.2.2.106" end="190.2.2.108"/>
+        <childIpAddressList id="0291ef78-4059-4bc1-b433-3f6ad698dc41" name="TestIPList2"/>
+        <state>NORMAL</state>
+        <createTime>2016-09-05T05:57:53.000Z</createTime>
+    </ipAddressList>
+</ipAddressLists>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/fixtures/dimensiondata/port_list_create.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/port_list_create.xml b/libcloud/test/compute/fixtures/dimensiondata/port_list_create.xml
new file mode 100644
index 0000000..eb1ba7e
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/port_list_create.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<response
+        requestId="na9_20160321T074626030-0400_7e9fffe7-190b-46f2-9107- 9d52fe57d0ad"
+        xmlns="urn:didata.com:api:cloud:types">
+    <operation>CREATE_PORT_LIST</operation>
+    <responseCode>OK</responseCode>
+    <message>Port List 'MyPortList' has been created.</message>
+    <info name="portListId" value="9e6b496d-5261-4542-91aa-b50c7f569c54"/>
+</response>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/fixtures/dimensiondata/port_list_delete.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/port_list_delete.xml b/libcloud/test/compute/fixtures/dimensiondata/port_list_delete.xml
new file mode 100644
index 0000000..6414c26
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/port_list_delete.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<response
+        requestId="na9_20160321T074626030-0400_7e9fffe7-190b-46f2-9107- 9d52fe57d0ad"
+        xmlns="urn:didata.com:api:cloud:types">
+    <operation>DELETE_PORT_LIST</operation>
+    <responseCode>OK</responseCode>
+    <message>Port List with Id 84e34850-595d-436e-a885-7cd37edb24a4 has been
+        deleted.
+    </message>
+</response>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/fixtures/dimensiondata/port_list_edit.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/port_list_edit.xml b/libcloud/test/compute/fixtures/dimensiondata/port_list_edit.xml
new file mode 100644
index 0000000..fe95f57
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/port_list_edit.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<response
+        requestId="na9_20160321T074626030-0400_7e9fffe7-190b-46f2-9107- 9d52fe57d0ad"
+        xmlns="urn:didata.com:api:cloud:types">
+    <operation>EDIT_PORT_LIST</operation>
+    <responseCode>OK</responseCode>
+    <message>Port List 'MyPortList' has been edited successfully.</message>
+</response>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/fixtures/dimensiondata/port_list_get.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/port_list_get.xml b/libcloud/test/compute/fixtures/dimensiondata/port_list_get.xml
new file mode 100644
index 0000000..815a48b
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/port_list_get.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<portList id="c8c92ea3-2da8-4d51-8153-f39bec794d69"
+          xmlns="urn:didata.com:api:cloud:types">
+    <name>MyPortList</name>
+    <description>Production Servers</description>
+    <port begin="8000" end="9600"/>
+    <port begin="25"/>
+    <port begin="443"/>
+    <childPortList id="c8c92ea3-2da8-4d51-8153-f39bec794d68"
+                   name="tomcatPorts"/>
+    <childPortList id="c8c92ea3-2da8-4d51-8153-f39bec794d67"
+                   name="mySqlPorts"/>
+    <state>NORMAL</state>
+    <createTime>2015-06-21T18:54:42.000Z</createTime>
+</portList>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/fixtures/dimensiondata/port_list_lists.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/port_list_lists.xml b/libcloud/test/compute/fixtures/dimensiondata/port_list_lists.xml
new file mode 100644
index 0000000..e42bd47
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/port_list_lists.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<portLists pageNumber="1" pageCount="1" totalCount="3" pageSize="3"
+           xmlns="urn:didata.com:api:cloud:types">
+    <!--Zero or more repetitions:-->
+    <portList id="c8c92ea3-2da8-4d51-8153-f39bec794d69"
+              xmlns="urn:didata.com:api:cloud:types">
+        <name>MyPortList</name>
+        <description>Production Servers</description>
+        <port begin="8000" end="9600"/>
+        <port begin="25"/>
+        <port begin="443"/>
+        <childPortList id="c8c92ea3-2da8-4d51-8153-f39bec794d68"
+                       name="tomcatPorts"/>
+        <childPortList id="c8c92ea3-2da8-4d51-8153-f39bec794d67"
+                       name="mySqlPorts"/>
+        <state>NORMAL</state>
+        <createTime>2015-06-21T18:54:42.000Z</createTime>
+    </portList>
+     <portList id="d52198b1-4a89-4d09-bc29-7b94fd9129dc">
+        <name>MyPortList2</name>
+        <description>Core functions</description>
+        <port begin="8080"/>
+        <port begin="8899" end="9023"/>
+        <port begin="9500"/>
+        <childPortList id="a9cd4984-6ff5-4f93-89ff-8618ab642bb9" name="MyPortList"/>
+        <state>NORMAL</state>
+        <createTime>2016-09-01T01:36:49.000Z</createTime>
+    </portList>
+    <portList id="b6557c5a-45fa-4138-89bd-8fe68392691b">
+        <name>Test_Port_List_1</name>
+        <description>Test Description</description>
+        <port begin="6000"/>
+        <port begin="6001" end="6010"/>
+        <childPortList id="a9cd4984-6ff5-4f93-89ff-8618ab642bb9" name="MyPortList"/>
+        <state>NORMAL</state>
+        <createTime>2016-09-06T02:32:29.000Z</createTime>
+    </portList>
+</portLists>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/04c70e22/libcloud/test/compute/test_dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_dimensiondata.py b/libcloud/test/compute/test_dimensiondata.py
index b7da6ae..a7bfa92 100644
--- a/libcloud/test/compute/test_dimensiondata.py
+++ b/libcloud/test/compute/test_dimensiondata.py
@@ -26,6 +26,9 @@ from libcloud.common.types import InvalidCredsError
 from libcloud.common.dimensiondata import DimensionDataAPIException, NetworkDomainServicePlan
 from libcloud.common.dimensiondata import DimensionDataServerCpuSpecification, DimensionDataServerDisk, DimensionDataServerVMWareTools
 from libcloud.common.dimensiondata import DimensionDataTag, DimensionDataTagKey
+from libcloud.common.dimensiondata import DimensionDataIpAddress, \
+    DimensionDataIpAddressList, DimensionDataChildIpAddressList, \
+    DimensionDataPortList, DimensionDataPort, DimensionDataChildPortList
 from libcloud.common.dimensiondata import TYPES_URN
 from libcloud.compute.drivers.dimensiondata import DimensionDataNodeDriver as DimensionData
 from libcloud.compute.base import Node, NodeAuthPassword, NodeLocation
@@ -33,7 +36,7 @@ from libcloud.test import MockHttp, unittest, MockRawResponse, StorageMockHttp
 from libcloud.test.compute import TestCaseMixin
 from libcloud.test.file_fixtures import ComputeFileFixtures
 from libcloud.test.secrets import DIMENSIONDATA_PARAMS
-from libcloud.utils.xml import fixxpath, findtext
+from libcloud.utils.xml import fixxpath, findtext, findall
 
 
 class DimensionDataTests(unittest.TestCase, TestCaseMixin):
@@ -745,6 +748,48 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         rule = self.driver.ex_create_firewall_rule(net, specific_source_ip_rule, 'FIRST')
         self.assertEqual(rule.id, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
 
+    def test_ex_create_firewall_rule_with_source_ip(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rules = self.driver.ex_list_firewall_rules(net)
+        specific_source_ip_rule = \
+            list(filter(lambda x: x.name == 'SpecificSourceIP',
+                        rules))[0]
+        specific_source_ip_rule.source.any_ip = False
+        specific_source_ip_rule.source.ip_address = '10.0.0.1'
+        specific_source_ip_rule.source.ip_prefix_size = '15'
+        rule = self.driver.ex_create_firewall_rule(net,
+                                                   specific_source_ip_rule,
+                                                   'FIRST')
+        self.assertEqual(rule.id, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+
+    def test_ex_create_firewall_rule_with_any_ip(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rules = self.driver.ex_list_firewall_rules(net)
+        specific_source_ip_rule = \
+            list(filter(lambda x: x.name == 'SpecificSourceIP',
+                        rules))[0]
+        specific_source_ip_rule.source.any_ip = True
+        rule = self.driver.ex_create_firewall_rule(net,
+                                                   specific_source_ip_rule,
+                                                   'FIRST')
+        self.assertEqual(rule.id, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+
+    def test_ex_create_firewall_rule_ip_prefix_size(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_list_firewall_rules(net)[0]
+        rule.source.address_list_id = None
+        rule.source.any_ip = False
+        rule.source.ip_address = '10.2.1.1'
+        rule.source.ip_prefix_size = '10'
+        rule.destination.address_list_id = None
+        rule.destination.any_ip = False
+        rule.destination.ip_address = '10.0.0.1'
+        rule.destination.ip_prefix_size = '20'
+        self.driver.ex_create_firewall_rule(net, rule, 'LAST')
+
     def test_ex_create_firewall_rule_address_list(self):
         net = self.driver.ex_get_network_domain('8cdfd607-f429-4df6-9352-162cfc0891be')
         rule = self.driver.ex_list_firewall_rules(net)[0]
@@ -759,6 +804,18 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         rule.destination.port_list_id = '12345'
         self.driver.ex_create_firewall_rule(net, rule, 'LAST')
 
+    def test_ex_create_firewall_rule_port(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_list_firewall_rules(net)[0]
+        rule.source.port_list_id = None
+        rule.source.port_begin = '8000'
+        rule.source.port_end = '8005'
+        rule.destination.port_list_id = None
+        rule.destination.port_begin = '7000'
+        rule.destination.port_end = '7005'
+        self.driver.ex_create_firewall_rule(net, rule, 'LAST')
+
     def test_ex_create_firewall_rule_ALL_VALUES(self):
         net = self.driver.ex_get_network_domain('8cdfd607-f429-4df6-9352-162cfc0891be')
         rules = self.driver.ex_list_firewall_rules(net)
@@ -806,6 +863,146 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         result = self.driver.ex_delete_firewall_rule(rule)
         self.assertTrue(result)
 
+    def test_ex_edit_firewall_rule(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        rule.source.any_ip = True
+        result = self.driver.ex_edit_firewall_rule(rule=rule, position='LAST')
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_source_ipaddresslist(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        rule.source.address_list_id = '802abc9f-45a7-4efb-9d5a-810082368222'
+        rule.source.any_ip = False
+        rule.source.ip_address = '10.0.0.1'
+        rule.source.ip_prefix_size = 10
+        result = self.driver.ex_edit_firewall_rule(rule=rule, position='LAST')
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_destination_ipaddresslist(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        rule.destination.address_list_id = '802abc9f-45a7-4efb-9d5a-810082368222'
+        rule.destination.any_ip = False
+        rule.destination.ip_address = '10.0.0.1'
+        rule.destination.ip_prefix_size = 10
+        result = self.driver.ex_edit_firewall_rule(rule=rule, position='LAST')
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_destination_ipaddress(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        rule.source.address_list_id = None
+        rule.source.any_ip = False
+        rule.source.ip_address = '10.0.0.1'
+        rule.source.ip_prefix_size = '10'
+        result = self.driver.ex_edit_firewall_rule(rule=rule, position='LAST')
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_source_ipaddress(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        rule.destination.address_list_id = None
+        rule.destination.any_ip = False
+        rule.destination.ip_address = '10.0.0.1'
+        rule.destination.ip_prefix_size = '10'
+        result = self.driver.ex_edit_firewall_rule(rule=rule, position='LAST')
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_with_relative_rule(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        placement_rule = self.driver.ex_list_firewall_rules(
+            network_domain=net)[-1]
+        result = self.driver.ex_edit_firewall_rule(
+            rule=rule, position='BEFORE',
+            relative_rule_for_position=placement_rule)
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_with_relative_rule_by_name(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        placement_rule = self.driver.ex_list_firewall_rules(
+            network_domain=net)[-1]
+        result = self.driver.ex_edit_firewall_rule(
+            rule=rule, position='BEFORE',
+            relative_rule_for_position=placement_rule.name)
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_source_portlist(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        rule.source.port_list_id = '802abc9f-45a7-4efb-9d5a-810082368222'
+        result = self.driver.ex_edit_firewall_rule(rule=rule, position='LAST')
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_source_port(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        rule.source.port_list_id = None
+        rule.source.port_begin = '3'
+        rule.source.port_end = '10'
+        result = self.driver.ex_edit_firewall_rule(rule=rule, position='LAST')
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_destination_portlist(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        rule.destination.port_list_id = '802abc9f-45a7-4efb-9d5a-810082368222'
+        result = self.driver.ex_edit_firewall_rule(rule=rule, position='LAST')
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_destination_port(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        rule.destination.port_list_id = None
+        rule.destination.port_begin = '3'
+        rule.destination.port_end = '10'
+        result = self.driver.ex_edit_firewall_rule(rule=rule, position='LAST')
+        self.assertTrue(result)
+
+    def test_ex_edit_firewall_rule_invalid_position_fail(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        with self.assertRaises(ValueError):
+            self.driver.ex_edit_firewall_rule(rule=rule, position='BEFORE')
+
+    def test_ex_edit_firewall_rule_invalid_position_relative_rule_fail(self):
+        net = self.driver.ex_get_network_domain(
+            '8cdfd607-f429-4df6-9352-162cfc0891be')
+        rule = self.driver.ex_get_firewall_rule(
+            net, 'd0a20f59-77b9-4f28-a63b-e58496b73a6c')
+        relative_rule = self.driver.ex_list_firewall_rules(
+            network_domain=net)[-1]
+        with self.assertRaises(ValueError):
+            self.driver.ex_edit_firewall_rule(rule=rule, position='FIRST',
+                                              relative_rule_for_position=relative_rule)
+
     def test_ex_create_nat_rule(self):
         net = self.driver.ex_get_network_domain('8cdfd607-f429-4df6-9352-162cfc0891be')
         rule = self.driver.ex_create_nat_rule(net, '1.2.3.4', '4.3.2.1')
@@ -1185,6 +1382,370 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         self.assertEqual(len(report_content), 42)
         self.assertEqual(len(report_content[0]), 4)
 
+    def test_ex_list_ip_address_list(self):
+        net_domain = self.driver.ex_list_network_domains()[0]
+        ip_list = self.driver.ex_list_ip_address_list(
+            ex_network_domain=net_domain)
+        self.assertTrue(isinstance(ip_list, list))
+        self.assertEqual(len(ip_list), 4)
+        self.assertTrue(isinstance(ip_list[0].name, str))
+        self.assertTrue(isinstance(ip_list[0].description, str))
+        self.assertTrue(isinstance(ip_list[0].ip_version, str))
+        self.assertTrue(isinstance(ip_list[0].state, str))
+        self.assertTrue(isinstance(ip_list[0].create_time, str))
+        self.assertTrue(isinstance(ip_list[0].child_ip_address_lists, list))
+        self.assertEqual(len(ip_list[1].child_ip_address_lists), 1)
+        self.assertTrue(isinstance(ip_list[1].child_ip_address_lists[0].name,
+                                   str))
+
+    def test_ex_get_ip_address_list(self):
+        net_domain = self.driver.ex_list_network_domains()[0]
+        DimensionDataMockHttp.type = 'FILTERBYNAME'
+        ip_list = self.driver.ex_get_ip_address_list(
+            ex_network_domain=net_domain.id,
+            ex_ip_address_list_name='Test_IP_Address_List_3')
+        self.assertTrue(isinstance(ip_list, list))
+        self.assertEqual(len(ip_list), 1)
+        self.assertTrue(isinstance(ip_list[0].name, str))
+        self.assertTrue(isinstance(ip_list[0].description, str))
+        self.assertTrue(isinstance(ip_list[0].ip_version, str))
+        self.assertTrue(isinstance(ip_list[0].state, str))
+        self.assertTrue(isinstance(ip_list[0].create_time, str))
+        ips = ip_list[0].ip_address_collection
+        self.assertEqual(len(ips), 3)
+        self.assertTrue(isinstance(ips[0].begin, str))
+        self.assertTrue(isinstance(ips[0].prefix_size, str))
+        self.assertTrue(isinstance(ips[2].end, str))
+
+    def test_ex_create_ip_address_list_FAIL(self):
+        net_domain = self.driver.ex_list_network_domains()[0]
+
+        with self.assertRaises(TypeError):
+            self.driver.ex_create_ip_address_list(
+                ex_network_domain=net_domain.id)
+
+    def test_ex_create_ip_address_list(self):
+        name = "Test_IP_Address_List_3"
+        description = "Test Description"
+        ip_version = "IPV4"
+        child_ip_address_list_id = '0291ef78-4059-4bc1-b433-3f6ad698dc41'
+        child_ip_address_list = DimensionDataChildIpAddressList(
+            id=child_ip_address_list_id,
+            name="test_child_ip_addr_list")
+        net_domain = self.driver.ex_list_network_domains()[0]
+        ip_address_1 = DimensionDataIpAddress(begin='190.2.2.100')
+        ip_address_2 = DimensionDataIpAddress(begin='190.2.2.106',
+                                              end='190.2.2.108')
+        ip_address_3 = DimensionDataIpAddress(begin='190.2.2.0',
+                                              prefix_size='24')
+        ip_address_collection = {ip_address_1, ip_address_2,
+                                 ip_address_3}
+
+        # Create IP Address List
+        success = self.driver.ex_create_ip_address_list(
+            ex_network_domain=net_domain, name=name,
+            ip_version=ip_version, description=description,
+            ip_address_collection=ip_address_collection,
+            child_ip_address_list=child_ip_address_list)
+
+        self.assertTrue(success)
+
+    def test_ex_create_ip_address_list_STR(self):
+        name = "Test_IP_Address_List_3"
+        description = "Test Description"
+        ip_version = "IPV4"
+        child_ip_address_list_id = '0291ef78-4059-4bc1-b433-3f6ad698dc41'
+        net_domain = self.driver.ex_list_network_domains()[0]
+        ip_address_1 = DimensionDataIpAddress(begin='190.2.2.100')
+        ip_address_2 = DimensionDataIpAddress(begin='190.2.2.106',
+                                              end='190.2.2.108')
+        ip_address_3 = DimensionDataIpAddress(begin='190.2.2.0',
+                                              prefix_size='24')
+        ip_address_collection = {ip_address_1, ip_address_2,
+                                 ip_address_3}
+
+        # Create IP Address List
+        success = self.driver.ex_create_ip_address_list(
+            ex_network_domain=net_domain.id, name=name,
+            ip_version=ip_version, description=description,
+            ip_address_collection=ip_address_collection,
+            child_ip_address_list=child_ip_address_list_id)
+
+        self.assertTrue(success)
+
+    def test_ex_edit_ip_address_list(self):
+        ip_address_1 = DimensionDataIpAddress(begin='190.2.2.111')
+        ip_address_collection = {ip_address_1}
+
+        child_ip_address_list = DimensionDataChildIpAddressList(
+            id='2221ef78-4059-4bc1-b433-3f6ad698dc41',
+            name="test_child_ip_address_list edited")
+
+        ip_address_list = DimensionDataIpAddressList(
+            id='1111ef78-4059-4bc1-b433-3f6ad698d111',
+            name="test ip address list edited",
+            ip_version="IPv4", description="test",
+            ip_address_collection=ip_address_collection,
+            child_ip_address_lists=child_ip_address_list,
+            state="NORMAL",
+            create_time='2015-09-29T02:49:45'
+        )
+
+        success = self.driver.ex_edit_ip_address_list(
+            ex_ip_address_list=ip_address_list,
+            description="test ip address list",
+            ip_address_collection=ip_address_collection,
+            child_ip_address_lists=child_ip_address_list
+        )
+
+        self.assertTrue(success)
+
+    def test_ex_edit_ip_address_list_STR(self):
+        ip_address_1 = DimensionDataIpAddress(begin='190.2.2.111')
+        ip_address_collection = {ip_address_1}
+
+        child_ip_address_list = DimensionDataChildIpAddressList(
+            id='2221ef78-4059-4bc1-b433-3f6ad698dc41',
+            name="test_child_ip_address_list edited")
+
+        success = self.driver.ex_edit_ip_address_list(
+            ex_ip_address_list='84e34850-595d- 436e-a885-7cd37edb24a4',
+            description="test ip address list",
+            ip_address_collection=ip_address_collection,
+            child_ip_address_lists=child_ip_address_list
+        )
+
+        self.assertTrue(success)
+
+    def test_ex_delete_ip_address_list(self):
+        child_ip_address_list = DimensionDataChildIpAddressList(
+            id='2221ef78-4059-4bc1-b433-3f6ad698dc41',
+            name="test_child_ip_address_list edited")
+
+        ip_address_list = DimensionDataIpAddressList(
+            id='1111ef78-4059-4bc1-b433-3f6ad698d111',
+            name="test ip address list edited",
+            ip_version="IPv4", description="test",
+            ip_address_collection=None,
+            child_ip_address_lists=child_ip_address_list,
+            state="NORMAL",
+            create_time='2015-09-29T02:49:45'
+        )
+
+        success = self.driver.ex_delete_ip_address_list(
+            ex_ip_address_list=ip_address_list)
+        self.assertTrue(success)
+
+    def test_ex_delete_ip_address_list_STR(self):
+        success = self.driver.ex_delete_ip_address_list(
+            ex_ip_address_list='111ef78-4059-4bc1-b433-3f6ad698d111')
+        self.assertTrue(success)
+
+    def test_ex_list_port_lists(self):
+        net_domain = self.driver.ex_list_network_domains()[0]
+        port_list = self.driver.ex_list_port_list(
+            ex_network_domain=net_domain)
+        self.assertTrue(isinstance(port_list, list))
+        self.assertEqual(len(port_list), 3)
+        self.assertTrue(isinstance(port_list[0].name, str))
+        self.assertTrue(isinstance(port_list[0].description, str))
+        self.assertTrue(isinstance(port_list[0].state, str))
+        self.assertTrue(isinstance(port_list[0].port_collection, list))
+        self.assertTrue(isinstance(port_list[0].port_collection[0].begin, str))
+        self.assertTrue(isinstance(port_list[0].port_collection[0].end, str))
+        self.assertTrue(isinstance(port_list[0].child_port_list_lists, list))
+        self.assertTrue(isinstance(port_list[0].child_port_list_lists[0].id,
+                                   str))
+        self.assertTrue(isinstance(port_list[0].child_port_list_lists[0].name,
+                                   str))
+        self.assertTrue(isinstance(port_list[0].create_time, str))
+
+    def test_ex_get_port_list(self):
+        net_domain = self.driver.ex_list_network_domains()[0]
+
+        port_list = self.driver.ex_list_port_list(
+            ex_network_domain=net_domain)[0]
+
+        port_list = self.driver.ex_get_port_list(
+            ex_port_list=port_list)
+        self.assertTrue(isinstance(port_list, DimensionDataPortList))
+
+        self.assertTrue(isinstance(port_list.name, str))
+        self.assertTrue(isinstance(port_list.description, str))
+        self.assertTrue(isinstance(port_list.state, str))
+        self.assertTrue(isinstance(port_list.port_collection, list))
+        self.assertTrue(isinstance(port_list.port_collection[0].begin, str))
+        self.assertTrue(isinstance(port_list.port_collection[0].end, str))
+        self.assertTrue(isinstance(port_list.child_port_list_lists, list))
+        self.assertTrue(isinstance(port_list.child_port_list_lists[0].id,
+                                   str))
+        self.assertTrue(isinstance(port_list.child_port_list_lists[0].name,
+                                   str))
+        self.assertTrue(isinstance(port_list.create_time, str))
+
+    def test_ex_get_port_list_STR(self):
+        net_domain = self.driver.ex_list_network_domains()[0]
+
+        port_list = self.driver.ex_list_port_list(
+            ex_network_domain=net_domain)[0]
+
+        port_list = self.driver.ex_get_port_list(
+            ex_port_list=port_list.id)
+        self.assertTrue(isinstance(port_list, DimensionDataPortList))
+
+        self.assertTrue(isinstance(port_list.name, str))
+        self.assertTrue(isinstance(port_list.description, str))
+        self.assertTrue(isinstance(port_list.state, str))
+        self.assertTrue(isinstance(port_list.port_collection, list))
+        self.assertTrue(isinstance(port_list.port_collection[0].begin, str))
+        self.assertTrue(isinstance(port_list.port_collection[0].end, str))
+        self.assertTrue(isinstance(port_list.child_port_list_lists, list))
+        self.assertTrue(isinstance(port_list.child_port_list_lists[0].id,
+                                   str))
+        self.assertTrue(isinstance(port_list.child_port_list_lists[0].name,
+                                   str))
+        self.assertTrue(isinstance(port_list.create_time, str))
+
+    def test_ex_create_port_list_NOCHILDPORTLIST(self):
+        name = "Test_Port_List"
+        description = "Test Description"
+
+        net_domain = self.driver.ex_list_network_domains()[0]
+
+        port_1 = DimensionDataPort(begin='8080')
+        port_2 = DimensionDataIpAddress(begin='8899',
+                                              end='9023')
+        port_collection = {port_1, port_2}
+
+        # Create IP Address List
+        success = self.driver.ex_create_port_list(
+            ex_network_domain=net_domain, name=name,
+            description=description,
+            port_collection=port_collection
+        )
+
+        self.assertTrue(success)
+
+    def test_ex_create_port_list(self):
+        name = "Test_Port_List"
+        description = "Test Description"
+
+        net_domain = self.driver.ex_list_network_domains()[0]
+
+        port_1 = DimensionDataPort(begin='8080')
+        port_2 = DimensionDataIpAddress(begin='8899',
+                                              end='9023')
+        port_collection = {port_1, port_2}
+
+        child_port_1 = DimensionDataChildPortList(
+            id="333174a2-ae74-4658-9e56-50fc90e086cf", name='test port 1')
+        child_port_2 = DimensionDataChildPortList(
+            id="311174a2-ae74-4658-9e56-50fc90e04444", name='test port 2')
+        child_ports = {child_port_1, child_port_2}
+
+        # Create IP Address List
+        success = self.driver.ex_create_port_list(
+            ex_network_domain=net_domain, name=name,
+            description=description,
+            port_collection=port_collection,
+            child_port_list_lists=child_ports
+        )
+
+        self.assertTrue(success)
+
+    def test_ex_create_port_list_STR(self):
+        name = "Test_Port_List"
+        description = "Test Description"
+
+        net_domain = self.driver.ex_list_network_domains()[0]
+
+        port_1 = DimensionDataPort(begin='8080')
+        port_2 = DimensionDataIpAddress(begin='8899',
+                                              end='9023')
+        port_collection = {port_1, port_2}
+
+        child_port_1 = DimensionDataChildPortList(
+            id="333174a2-ae74-4658-9e56-50fc90e086cf", name='test port 1')
+        child_port_2 = DimensionDataChildPortList(
+            id="311174a2-ae74-4658-9e56-50fc90e04444", name='test port 2')
+        child_ports_ids = {child_port_1.id, child_port_2.id}
+
+        # Create IP Address List
+        success = self.driver.ex_create_port_list(
+            ex_network_domain=net_domain.id, name=name,
+            description=description,
+            port_collection=port_collection,
+            child_port_list_lists=child_ports_ids
+        )
+
+        self.assertTrue(success)
+
+    def test_ex_edit_port_list(self):
+        net_domain = self.driver.ex_list_network_domains()[0]
+        port_list = self.driver.ex_list_port_list(net_domain)[0]
+
+        description = "Test Description"
+
+        port_1 = DimensionDataPort(begin='8080')
+        port_2 = DimensionDataIpAddress(begin='8899',
+                                        end='9023')
+        port_collection = {port_1, port_2}
+
+        child_port_1 = DimensionDataChildPortList(
+            id="333174a2-ae74-4658-9e56-50fc90e086cf", name='test port 1')
+        child_port_2 = DimensionDataChildPortList(
+            id="311174a2-ae74-4658-9e56-50fc90e04444", name='test port 2')
+        child_ports = {child_port_1.id, child_port_2.id}
+
+        # Create IP Address List
+        success = self.driver.ex_edit_port_list(
+            ex_port_list=port_list,
+            description=description,
+            port_collection=port_collection,
+            child_port_list_lists=child_ports
+        )
+        self.assertTrue(success)
+
+    def test_ex_edit_port_list_STR(self):
+        port_list_id = "484174a2-ae74-4658-9e56-50fc90e086cf"
+        description = "Test Description"
+
+        port_1 = DimensionDataPort(begin='8080')
+        port_2 = DimensionDataIpAddress(begin='8899',
+                                        end='9023')
+        port_collection = {port_1, port_2}
+
+        child_port_1 = DimensionDataChildPortList(
+            id="333174a2-ae74-4658-9e56-50fc90e086cf", name='test port 1')
+        child_port_2 = DimensionDataChildPortList(
+            id="311174a2-ae74-4658-9e56-50fc90e04444", name='test port 2')
+        child_ports_ids = {child_port_1.id, child_port_2.id}
+
+        # Create IP Address List
+        success = self.driver.ex_edit_port_list(
+            ex_port_list=port_list_id,
+            description=description,
+            port_collection=port_collection,
+            child_port_list_lists=child_ports_ids
+        )
+        self.assertTrue(success)
+
+    def test_ex_delete_port_list(self):
+        net_domain = self.driver.ex_list_network_domains()[0]
+        port_list = self.driver.ex_list_port_list(net_domain)[0]
+
+        success = self.driver.ex_delete_port_list(
+            ex_port_list=port_list)
+        self.assertTrue(success)
+
+    def test_ex_delete_port_list_STR(self):
+        net_domain = self.driver.ex_list_network_domains()[0]
+        port_list = self.driver.ex_list_port_list(net_domain)[0]
+
+        success = self.driver.ex_delete_port_list(
+            ex_port_list=port_list.id)
+        self.assertTrue(success)
+
 
 class InvalidRequestError(Exception):
     def __init__(self, tag):
@@ -2234,5 +2795,195 @@ class DimensionDataMockHttp(StorageMockHttp, MockHttp):
         )
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
+    def _caas_2_3_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_ipAddressList(
+            self, method, url, body, headers):
+        body = self.fixtures.load('ip_address_lists.xml')
+        return httplib.OK, body, {}, httplib.responses[httplib.OK]
+
+    def _caas_2_3_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_ipAddressList_FILTERBYNAME(
+            self, method, url, body, headers):
+        body = self.fixtures.load('ip_address_lists_FILTERBYNAME.xml')
+        return httplib.OK, body, {}, httplib.responses[httplib.OK]
+
+    def _caas_2_3_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_createIpAddressList(
+            self, method, url, body, headers):
+        request = ET.fromstring(body)
+        if request.tag != "{urn:didata.com:api:cloud:types}" \
+                          "createIpAddressList":
+            raise InvalidRequestError(request.tag)
+
+        net_domain = findtext(request, 'networkDomainId', TYPES_URN)
+        if net_domain is None:
+            raise ValueError("Network Domain should not be empty")
+
+        name = findtext(request, 'name', TYPES_URN)
+        if name is None:
+            raise ValueError("Name should not be empty")
+
+        ip_version = findtext(request, 'ipVersion', TYPES_URN)
+        if ip_version is None:
+            raise ValueError("IP Version should not be empty")
+
+        ip_address_col_required = findall(request, 'ipAddress', TYPES_URN)
+        child_ip_address_required = findall(request, 'childIpAddressListId',
+                                            TYPES_URN)
+
+        if 0 == len(ip_address_col_required) and \
+                0 == len(child_ip_address_required):
+            raise ValueError("At least one ipAddress element or "
+                             "one childIpAddressListId element must be "
+                             "provided.")
+
+        if ip_address_col_required[0].get('begin') is None:
+            raise ValueError("IP Address should not be empty")
+
+        body = self.fixtures.load(
+            'ip_address_list_create.xml'
+        )
+        return httplib.OK, body, {}, httplib.responses[httplib.OK]
+
+    def _caas_2_3_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_editIpAddressList(
+            self, method, url, body, headers):
+        request = ET.fromstring(body)
+        if request.tag != "{urn:didata.com:api:cloud:types}" \
+                          "editIpAddressList":
+            raise InvalidRequestError(request.tag)
+
+        ip_address_list = request.get('id')
+        if ip_address_list is None:
+            raise ValueError("IpAddressList ID should not be empty")
+
+        name = findtext(request, 'name', TYPES_URN)
+        if name is not None:
+            raise ValueError("Name should not exists in request")
+
+        ip_version = findtext(request, 'ipVersion', TYPES_URN)
+        if ip_version is not None:
+            raise ValueError("IP Version should not exists in request")
+
+        ip_address_col_required = findall(request, 'ipAddress', TYPES_URN)
+        child_ip_address_required = findall(request, 'childIpAddressListId',
+                                            TYPES_URN)
+
+        if 0 == len(ip_address_col_required) and \
+                0 == len(child_ip_address_required):
+            raise ValueError("At least one ipAddress element or "
+                             "one childIpAddressListId element must be "
+                             "provided.")
+
+        if ip_address_col_required[0].get('begin') is None:
+            raise ValueError("IP Address should not be empty")
+
+        body = self.fixtures.load(
+            'ip_address_list_edit.xml'
+        )
+        return httplib.OK, body, {}, httplib.responses[httplib.OK]
+
+    def _caas_2_3_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_deleteIpAddressList(
+            self, method, url, body, headers):
+        request = ET.fromstring(body)
+        if request.tag != "{urn:didata.com:api:cloud:types}" \
+                          "deleteIpAddressList":
+            raise InvalidRequestError(request.tag)
+
+        ip_address_list = request.get('id')
+        if ip_address_list is None:
+            raise ValueError("IpAddressList ID should not be empty")
+
+        body = self.fixtures.load(
+            'ip_address_list_delete.xml'
+        )
+
+        return httplib.OK, body, {}, httplib.responses[httplib.OK]
+
+    def _caas_2_3_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_portList(
+            self, method, url, body, headers):
+        body = self.fixtures.load(
+            'port_list_lists.xml'
+        )
+
+        return httplib.OK, body, {}, httplib.responses[httplib.OK]
+
+    def _caas_2_3_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_portList_c8c92ea3_2da8_4d51_8153_f39bec794d69(
+            self, method, url, body, headers):
+        body = self.fixtures.load(
+            'port_list_get.xml'
+        )
+
+        return httplib.OK, body, {}, httplib.responses[httplib.OK]
+
+    def _caas_2_3_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_createPortList(
+            self, method, url, body, headers):
+
+        request = ET.fromstring(body)
+        if request.tag != "{urn:didata.com:api:cloud:types}" \
+                          "createPortList":
+            raise InvalidRequestError(request.tag)
+
+        net_domain = findtext(request, 'networkDomainId', TYPES_URN)
+        if net_domain is None:
+            raise ValueError("Network Domain should not be empty")
+
+        ports_required = findall(request, 'port', TYPES_URN)
+        child_port_list_required = findall(request, 'childPortListId',
+                                           TYPES_URN)
+
+        if 0 == len(ports_required) and \
+                0 == len(child_port_list_required):
+            raise ValueError("At least one port element or one "
+                             "childPortListId element must be provided")
+
+        if ports_required[0].get('begin') is None:
+            raise ValueError("PORT begin value should not be empty")
+
+        body = self.fixtures.load(
+            'port_list_create.xml'
+        )
+
+        return httplib.OK, body, {}, httplib.responses[httplib.OK]
+
+    def _caas_2_3_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_editPortList(
+            self, method, url, body, headers):
+
+        request = ET.fromstring(body)
+        if request.tag != "{urn:didata.com:api:cloud:types}" \
+                          "editPortList":
+            raise InvalidRequestError(request.tag)
+
+        ports_required = findall(request, 'port', TYPES_URN)
+        child_port_list_required = findall(request, 'childPortListId',
+                                           TYPES_URN)
+
+        if 0 == len(ports_required) and \
+                0 == len(child_port_list_required):
+            raise ValueError("At least one port element or one "
+                             "childPortListId element must be provided")
+
+        if ports_required[0].get('begin') is None:
+            raise ValueError("PORT begin value should not be empty")
+
+        body = self.fixtures.load(
+            'port_list_edit.xml'
+        )
+
+        return httplib.OK, body, {}, httplib.responses[httplib.OK]
+
+    def _caas_2_3_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_deletePortList(
+            self, method, url, body, headers):
+        request = ET.fromstring(body)
+        if request.tag != "{urn:didata.com:api:cloud:types}" \
+                          "deletePortList":
+            raise InvalidRequestError(request.tag)
+
+        port_list = request.get('id')
+        if port_list is None:
+            raise ValueError("Port List ID should not be empty")
+
+        body = self.fixtures.load(
+            'ip_address_list_delete.xml'
+        )
+
+        return httplib.OK, body, {}, httplib.responses[httplib.OK]
+
 if __name__ == '__main__':
     sys.exit(unittest.main())


[02/13] libcloud git commit: Merge remote-tracking branch 'apache/trunk' into trunk

Posted by an...@apache.org.
Merge remote-tracking branch 'apache/trunk' into trunk


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

Branch: refs/heads/trunk
Commit: 7440bf51c023936c7d1895e8f37ce707b26832d7
Parents: ff06265 e2e3476
Author: Samuel Chong <sa...@gmail.com>
Authored: Wed Oct 5 17:07:15 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Wed Oct 5 17:07:15 2016 +1100

----------------------------------------------------------------------

----------------------------------------------------------------------



[04/13] libcloud git commit: Added post_list_id property to DimensionDataFirewallAddress class

Posted by an...@apache.org.
Added post_list_id property to DimensionDataFirewallAddress class


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

Branch: refs/heads/trunk
Commit: 5327c11048392f06eef901547a94bd899a26169d
Parents: 2672b78
Author: Samuel Chong <sa...@gmail.com>
Authored: Thu Oct 6 11:26:56 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Thu Oct 6 11:26:56 2016 +1100

----------------------------------------------------------------------
 libcloud/common/dimensiondata.py | 9 +++++++++
 1 file changed, 9 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/5327c110/libcloud/common/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/common/dimensiondata.py b/libcloud/common/dimensiondata.py
index 45f2c5e..af792c3 100644
--- a/libcloud/common/dimensiondata.py
+++ b/libcloud/common/dimensiondata.py
@@ -833,11 +833,20 @@ class DimensionDataFirewallAddress(object):
         self.any_ip = any_ip
         self.ip_address = ip_address
         self.ip_prefix_size = ip_prefix_size
+        self.port_list_id = port_list_id
         self.port_begin = port_begin
         self.port_end = port_end
         self.address_list_id = address_list_id
         self.port_list_id = port_list_id
 
+    def __repr__(self):
+        return (
+            '<DimensionDataFirewallAddress: any_ip=%s, ip_address=%s, '
+            'ip_prefix_size=%s, port_begin=%s, port_end=%s, '
+            'address_list_id=%s, port_list_id=%s>'
+            % (self.any_ip, self.ip_address, self.ip_prefix_size,
+               self.port_begin, self.port_end, self.address_list_id,
+               self.port_list_id))
 
 class DimensionDataNatRule(object):
     """


[12/13] libcloud git commit: fix network_adapter_name property in DimensionDataNic data contract class

Posted by an...@apache.org.
fix network_adapter_name property in DimensionDataNic data contract class


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

Branch: refs/heads/trunk
Commit: 487e0b77aae6c8bedcc1a0cbe1df038861c1fa29
Parents: a32546f
Author: Samuel Chong <sa...@gmail.com>
Authored: Mon Oct 10 10:53:36 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Mon Oct 10 10:53:36 2016 +1100

----------------------------------------------------------------------
 libcloud/common/dimensiondata.py | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/487e0b77/libcloud/common/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/common/dimensiondata.py b/libcloud/common/dimensiondata.py
index 5f618f9..84bca0d 100644
--- a/libcloud/common/dimensiondata.py
+++ b/libcloud/common/dimensiondata.py
@@ -1729,7 +1729,8 @@ class DimensionDataNic(object):
     A representation of Network Adapter in Dimension Data
     """
 
-    def __init__(self, private_ip_v4=None, vlan=None, network_adapter=None):
+    def __init__(self, private_ip_v4=None, vlan=None,
+                 network_adapter_name=None):
         """
         Initialize an instance of :class:`DimensionDataNic`
 
@@ -1739,14 +1740,14 @@ class DimensionDataNic(object):
         :param vlan: Network VLAN
         :type  vlan: class: DimensionDataVlan or ``str``
 
-        :param network_adapter: Network Adapter Name
-        :type  network_adapter: ``str``
+        :param network_adapter_name: Network Adapter Name
+        :type  network_adapter_name: ``str``
         """
         self.private_ip_v4 = private_ip_v4
         self.vlan = vlan
-        self.network_adapter_name = network_adapter
+        self.network_adapter_name = network_adapter_name
 
     def __repr__(self):
         return ('<DimensionDataNic: private_ip_v4=%s, vlan=%s,'
-                'network_adapter=%s>'
-                % (self.private_ip_v4, self.vlan, self.network_adapter))
+                'network_adapter_name=%s>'
+                % (self.private_ip_v4, self.vlan, self.network_adapter_name))


[10/13] libcloud git commit: Add sample code for Edit FW, CRUD for ipaddresslist and portlist

Posted by an...@apache.org.
Add sample code for Edit FW, CRUD for ipaddresslist and portlist

Add sample codes and rename port_list_list to portlist_list to avoid
confusion


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

Branch: refs/heads/trunk
Commit: 9e3c7da2403b30da67441e5a63ca79fff6236e3d
Parents: 026c973
Author: Samuel Chong <sa...@gmail.com>
Authored: Fri Oct 7 17:05:40 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Fri Oct 7 17:05:40 2016 +1100

----------------------------------------------------------------------
 libcloud/compute/drivers/dimensiondata.py   | 350 +++++++++++++++++++++--
 libcloud/test/compute/test_dimensiondata.py | 128 ++++-----
 2 files changed, 384 insertions(+), 94 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/9e3c7da2/libcloud/compute/drivers/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/dimensiondata.py b/libcloud/compute/drivers/dimensiondata.py
index a76fcdc..08343ad 100644
--- a/libcloud/compute/drivers/dimensiondata.py
+++ b/libcloud/compute/drivers/dimensiondata.py
@@ -1481,6 +1481,44 @@ class DimensionDataNodeDriver(NodeDriver):
         """
         Edit a firewall rule
 
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> # driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> # Get location
+        >>> location = driver.ex_get_location_by_id(id='AU9')
+        >>>
+        >>> # Get network domain by location
+        >>> networkDomainName = "Baas QA"
+        >>> network_domains = driver.ex_list_network_domains(location=location)
+        >>> my_network_domain = [d for d in network_domains if d.name ==
+                              networkDomainName][0]
+        >>>
+        >>>
+        >>> # List firewall rules
+        >>> firewall_rules = driver.ex_list_firewall_rules(my_network_domain)
+        >>>
+        >>> # Get Firewall Rule by name
+        >>> pprint("List specific firewall rule by name")
+        >>> fire_rule_under_test = (list(filter(lambda x: x.name ==
+                                   'My_New_Firewall_Rule', firewall_rules))[0])
+        >>> pprint(fire_rule_under_test.source)
+        >>> pprint(fire_rule_under_test.destination)
+        >>>
+        >>> # Edit Firewall
+        >>> fire_rule_under_test.destination.address_list_id =
+                '5e7c323f-c885-4e4b-9a27-94c44217dbd3'
+        >>> fire_rule_under_test.destination.port_list_id =
+                'b6557c5a-45fa-4138-89bd-8fe68392691b'
+        >>> result = driver.ex_edit_firewall_rule(fire_rule_under_test, 'LAST')
+        >>> pprint(result)
+
         :param rule: (required) The rule in which to create
         :type  rule: :class:`DimensionDataFirewallRule`
 
@@ -2496,6 +2534,30 @@ class DimensionDataNodeDriver(NodeDriver):
         """
         List IP Address List by network domain ID specified
 
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> # Get location
+        >>> location = driver.ex_get_location_by_id(id='AU9')
+        >>>
+        >>> # Get network domain by location
+        >>> networkDomainName = "Baas QA"
+        >>> network_domains = driver.ex_list_network_domains(location=location)
+        >>> my_network_domain = [d for d in network_domains if d.name ==
+                              networkDomainName][0]
+        >>>
+        >>> # List IP Address List of network domain
+        >>> ipaddresslist_list = driver.ex_list_ip_address_list(
+        >>>     ex_network_domain=my_network_domain)
+        >>> pprint(ipaddresslist_list)
+
         :param  ex_network_domain: The network domain or network domain ID
         :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'
 
@@ -2513,6 +2575,32 @@ class DimensionDataNodeDriver(NodeDriver):
         """
         Get IP Address List by name in network domain specified
 
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> # Get location
+        >>> location = driver.ex_get_location_by_id(id='AU9')
+        >>>
+        >>> # Get network domain by location
+        >>> networkDomainName = "Baas QA"
+        >>> network_domains = driver.ex_list_network_domains(location=location)
+        >>> my_network_domain = [d for d in network_domains if d.name ==
+                              networkDomainName][0]
+        >>>
+        >>> # Get IP Address List by Name
+        >>> ipaddresslist_list_by_name = driver.ex_get_ip_address_list(
+        >>>     ex_network_domain=my_network_domain,
+        >>>     ex_ip_address_list_name='My_IP_AddressList_1')
+        >>> pprint(ipaddresslist_list_by_name)
+
+
         :param  ex_network_domain: (required) The network domain or network
                                    domain ID in which ipaddresslist resides.
         :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'
@@ -2536,6 +2624,47 @@ class DimensionDataNodeDriver(NodeDriver):
         """
         Create IP Address List. IP Address list.
 
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> from libcloud.common.dimensiondata import DimensionDataIpAddress
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> # Get location
+        >>> location = driver.ex_get_location_by_id(id='AU9')
+        >>>
+        >>> # Get network domain by location
+        >>> networkDomainName = "Baas QA"
+        >>> network_domains = driver.ex_list_network_domains(location=location)
+        >>> my_network_domain = [d for d in network_domains if d.name ==
+                              networkDomainName][0]
+        >>>
+        >>> # IP Address collection
+        >>> ipAddress_1 = DimensionDataIpAddress(begin='190.2.2.100')
+        >>> ipAddress_2 = DimensionDataIpAddress(begin='190.2.2.106',
+                                                 end='190.2.2.108')
+        >>> ipAddress_3 = DimensionDataIpAddress(begin='190.2.2.0',
+                                                 prefix_size='24')
+        >>> ip_address_collection = {ipAddress_1, ipAddress_2, ipAddress_3}
+        >>>
+        >>> # Create IPAddressList
+        >>> result = driver.ex_create_ip_address_list(
+        >>>     ex_network_domain=my_network_domain,
+        >>>     name='My_IP_AddressList_2',
+        >>>     ip_version='IPV4',
+        >>>     description='Test only',
+        >>>     ip_address_collection=ip_address_collection,
+        >>>     child_ip_address_list='08468e26-eeb3-4c3d-8ff2-5351fa6d8a04'
+        >>> )
+        >>>
+        >>> pprint(result)
+
+
         :param  ex_network_domain: The network domain or network domain ID
         :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'
 
@@ -2628,6 +2757,35 @@ class DimensionDataNodeDriver(NodeDriver):
         """
         Edit IP Address List. IP Address list.
 
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> from libcloud.common.dimensiondata import DimensionDataIpAddress
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> # IP Address collection
+        >>> ipAddress_1 = DimensionDataIpAddress(begin='190.2.2.100')
+        >>> ipAddress_2 = DimensionDataIpAddress(begin='190.2.2.106',
+        >>>                                      end='190.2.2.108')
+        >>> ipAddress_3 = DimensionDataIpAddress(
+        >>>                   begin='190.2.2.0', prefix_size='24')
+        >>> ip_address_collection = {ipAddress_1, ipAddress_2, ipAddress_3}
+        >>>
+        >>> # Edit IP Address List
+        >>> ip_address_list_id = '5e7c323f-c885-4e4b-9a27-94c44217dbd3'
+        >>> result = driver.ex_edit_ip_address_list(
+        >>>      ex_ip_address_list=ip_address_list_id,
+        >>>      description="Edit Test",
+        >>>      ip_address_collection=ip_address_collection,
+        >>>      child_ip_address_lists=None
+        >>>      )
+        >>> pprint(result)
+
         :param    ex_ip_address_list:  (required) IpAddressList object or
                                        IpAddressList ID
         :type     ex_ip_address_list: :class:'DimensionDataIpAddressList'
@@ -2700,8 +2858,22 @@ class DimensionDataNodeDriver(NodeDriver):
         """
         Delete IP Address List by ID
 
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> ip_address_list_id = '5e7c323f-c885-4e4b-9a27-94c44217dbd3'
+        >>> result = driver.ex_delete_ip_address_list(ip_address_list_id)
+        >>> pprint(result)
+
         :param    ex_ip_address_list:  IP Address List object or IP Address
-        List ID (required)
+                                        List ID (required)
         :type     ex_ip_address_list: :class:'DimensionDataIpAddressList'
                     or ``str``
 
@@ -2721,9 +2893,34 @@ class DimensionDataNodeDriver(NodeDriver):
         response_code = findtext(response, 'responseCode', TYPES_URN)
         return response_code in ['IN_PROGRESS', 'OK']
 
-    def ex_list_port_list(self, ex_network_domain):
-        """
-        List Port List by network domain ID specified
+    def ex_list_portlist(self, ex_network_domain):
+        """
+        List Portlist by network domain ID specified
+
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> # Get location
+        >>> location = driver.ex_get_location_by_id(id='AU9')
+        >>>
+        >>> # Get network domain by location
+        >>> networkDomainName = "Baas QA"
+        >>> network_domains = driver.ex_list_network_domains(location=location)
+        >>> my_network_domain = [d for d in network_domains if d.name ==
+        >>>                                               networkDomainName][0]
+        >>>
+        >>> # List portlist
+        >>> portLists = driver.ex_list_portlist(
+        >>>     ex_network_domain=my_network_domain)
+        >>> pprint(portLists)
+        >>>
 
         :param  ex_network_domain: The network domain or network domain ID
         :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'
@@ -2737,28 +2934,77 @@ class DimensionDataNodeDriver(NodeDriver):
             'network/portList', params=params).object
         return self._to_port_lists(response)
 
-    def ex_get_port_list(self, ex_port_list):
+    def ex_get_portlist(self, ex_portlist_id):
         """
         Get Port List
 
-        :param  ex_port_list: The ex_port_list or ex_port_list ID
-        :type   ex_port_list: :class:`DimensionDataNetworkDomain` or 'str'
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> # Get specific portlist by ID
+        >>> portlist_id = '27dd8c66-80ff-496b-9f54-2a3da2fe679e'
+        >>> portlist = driver.ex_get_portlist(portlist_id)
+        >>> pprint(portlist)
+
+        :param  ex_portlist_id: The ex_port_list or ex_port_list ID
+        :type   ex_portlist_id: :class:`DimensionDataNetworkDomain` or 'str'
 
         :return:  DimensionDataPortList object
         :rtype:  :class:`DimensionDataPort`
         """
 
-        url_path = ('network/portList/%s' % self._port_list_to_port_list_id(
-            ex_port_list))
+        url_path = ('network/portList/%s' % ex_portlist_id)
         response = self.connection.request_with_orgId_api_2(
             url_path).object
         return self._to_port_list(response)
 
-    def ex_create_port_list(self, ex_network_domain, name, description,
-                            port_collection, child_port_list_lists=None):
+    def ex_create_portlist(self, ex_network_domain, name, description,
+                           port_collection, child_portlist_list=None):
         """
         Create Port List.
 
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> from libcloud.common.dimensiondata import DimensionDataPort
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> # Get location
+        >>> location = driver.ex_get_location_by_id(id='AU9')
+        >>>
+        >>> # Get network domain by location
+        >>> networkDomainName = "Baas QA"
+        >>> network_domains = driver.ex_list_network_domains(location=location)
+        >>> my_network_domain = [d for d in network_domains if d.name ==
+                              networkDomainName][0]
+        >>>
+        >>> # Port Collection
+        >>> port_1 = DimensionDataPort(begin='1000')
+        >>> port_2 = DimensionDataPort(begin='1001', end='1003')
+        >>> port_collection = {port_1, port_2}
+        >>>
+        >>> # Create Port List
+        >>> new_portlist = driver.ex_create_portlist(
+        >>>     ex_network_domain=my_network_domain,
+        >>>     name='MyPortListX',
+        >>>     description="Test only",
+        >>>     port_collection=port_collection,
+        >>>     child_portlist_list={'a9cd4984-6ff5-4f93-89ff-8618ab642bb9'}
+        >>>     )
+        >>> pprint(new_portlist)
+
         :param    ex_network_domain:  (required) The network domain in
                                        which to create PortList. Provide
                                        networkdomain object or its id.
@@ -2773,9 +3019,9 @@ class DimensionDataNodeDriver(NodeDriver):
         :param    port_collection:  List of Port Address
         :type     port_collection: :``str``
 
-        :param    child_port_list_lists:  Child Port List to be included in
-                                          this Port List
-        :type     child_port_list_lists: :``str`` or ''list of
+        :param    child_portlist_list:  List of Child Portlist to be
+                                        included in this Port List
+        :type     child_portlist_list: :``str`` or ''list of
                                          :class:'DimensionDataChildPortList'
 
         :return: result of operation
@@ -2807,8 +3053,8 @@ class DimensionDataNodeDriver(NodeDriver):
             if port.end:
                 p.set('end', port.end)
 
-        if child_port_list_lists is not None:
-            for child in child_port_list_lists:
+        if child_portlist_list is not None:
+            for child in child_portlist_list:
                 ET.SubElement(
                     new_port_list,
                     'childPortListId'
@@ -2822,24 +3068,52 @@ class DimensionDataNodeDriver(NodeDriver):
         response_code = findtext(response, 'responseCode', TYPES_URN)
         return response_code in ['IN_PROGRESS', 'OK']
 
-    def ex_edit_port_list(self, ex_port_list, description,
-                          port_collection, child_port_list_lists=None):
+    def ex_edit_portlist(self, ex_portlist, description,
+                         port_collection, child_portlist_list=None):
         """
         Edit Port List.
 
-        :param    ex_port_list:  Port List to be edited
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> from libcloud.common.dimensiondata import DimensionDataPort
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> # Port Collection
+        >>> port_1 = DimensionDataPort(begin='4200')
+        >>> port_2 = DimensionDataPort(begin='4201', end='4210')
+        >>> port_collection = {port_1, port_2}
+        >>>
+        >>> # Edit Port List
+        >>> editPortlist = driver.ex_get_portlist(
+            '27dd8c66-80ff-496b-9f54-2a3da2fe679e')
+        >>>
+        >>> result = driver.ex_edit_portlist(
+        >>>     ex_portlist=editPortlist.id,
+        >>>     description="Make Changes in portlist",
+        >>>     port_collection=port_collection,
+        >>>     child_portlist_list={'a9cd4984-6ff5-4f93-89ff-8618ab642bb9'}
+        >>> )
+        >>> pprint(result)
+
+        :param    ex_portlist:  Port List to be edited
                                         (required)
-        :type      ex_port_list: :``str`` or :class:'DimensionDataPortList'
+        :type      ex_portlist: :``str`` or :class:'DimensionDataPortList'
 
         :param    description:  Port List Description
         :type      description: :``str``
 
-        :param    port_collection:  List of Port Address
+        :param    port_collection:  List of Ports
         :type      port_collection: :``str``
 
-        :param    child_port_list_lists:  Child Port List to be included in
+        :param    child_portlist_list:  Child PortList to be included in
                                           this IP Address List
-        :type      child_port_list_lists: :``list`` of
+        :type      child_portlist_list: :``list`` of
                                           :class'DimensionDataChildPortList'
                                           or ''str''
 
@@ -2850,7 +3124,7 @@ class DimensionDataNodeDriver(NodeDriver):
         existing_port_address_list = ET.Element(
             'editPortList',
             {
-                "id": self._port_list_to_port_list_id(ex_port_list),
+                "id": self._port_list_to_port_list_id(ex_portlist),
                 'xmlns': TYPES_URN,
                 'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance"
             })
@@ -2870,8 +3144,8 @@ class DimensionDataNodeDriver(NodeDriver):
             if port.end:
                 p.set('end', port.end)
 
-        if child_port_list_lists is not None:
-            for child in child_port_list_lists:
+        if child_portlist_list is not None:
+            for child in child_portlist_list:
                 ET.SubElement(
                     existing_port_address_list,
                     'childPortListId'
@@ -2891,11 +3165,27 @@ class DimensionDataNodeDriver(NodeDriver):
         response_code = findtext(response, 'responseCode', TYPES_URN)
         return response_code in ['IN_PROGRESS', 'OK']
 
-    def ex_delete_port_list(self, ex_port_list):
+    def ex_delete_portlist(self, ex_portlist):
         """
         Delete Port List
-        :param    ex_port_list:  Port List to be deleted
-        :type     ex_port_list: :``str`` or :class:'DimensionDataPortList'
+
+        >>> from pprint import pprint
+        >>> from libcloud.compute.types import Provider
+        >>> from libcloud.compute.providers import get_driver
+        >>> import libcloud.security
+        >>>
+        >>> # Get dimension data driver
+        >>> libcloud.security.VERIFY_SSL_CERT = True
+        >>> cls = get_driver(Provider.DIMENSIONDATA)
+        >>> driver = cls('myusername','mypassword', region='dd-au')
+        >>>
+        >>> # Delete Port List
+        >>> portlist_id = '157531ce-77d4-493c-866b-d3d3fc4a912a'
+        >>> response = driver.ex_delete_portlist(portlist_id)
+        >>> pprint(response)
+
+        :param    ex_portlist:  Port List to be deleted
+        :type     ex_portlist: :``str`` or :class:'DimensionDataPortList'
 
         :rtype: ``bool``
         """
@@ -2903,7 +3193,7 @@ class DimensionDataNodeDriver(NodeDriver):
         delete_port_list = ET.Element(
             'deletePortList',
             {'xmlns': TYPES_URN,
-             'id': self._port_list_to_port_list_id(ex_port_list)})
+             'id': self._port_list_to_port_list_id(ex_portlist)})
 
         response = self.connection.request_with_orgId_api_2(
             'network/deletePortList',

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9e3c7da2/libcloud/test/compute/test_dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_dimensiondata.py b/libcloud/test/compute/test_dimensiondata.py
index a7bfa92..941784e 100644
--- a/libcloud/test/compute/test_dimensiondata.py
+++ b/libcloud/test/compute/test_dimensiondata.py
@@ -1541,56 +1541,56 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
             ex_ip_address_list='111ef78-4059-4bc1-b433-3f6ad698d111')
         self.assertTrue(success)
 
-    def test_ex_list_port_lists(self):
+    def test_ex_list_portlist(self):
         net_domain = self.driver.ex_list_network_domains()[0]
-        port_list = self.driver.ex_list_port_list(
+        portlist = self.driver.ex_list_portlist(
             ex_network_domain=net_domain)
-        self.assertTrue(isinstance(port_list, list))
-        self.assertEqual(len(port_list), 3)
-        self.assertTrue(isinstance(port_list[0].name, str))
-        self.assertTrue(isinstance(port_list[0].description, str))
-        self.assertTrue(isinstance(port_list[0].state, str))
-        self.assertTrue(isinstance(port_list[0].port_collection, list))
-        self.assertTrue(isinstance(port_list[0].port_collection[0].begin, str))
-        self.assertTrue(isinstance(port_list[0].port_collection[0].end, str))
-        self.assertTrue(isinstance(port_list[0].child_port_list_lists, list))
-        self.assertTrue(isinstance(port_list[0].child_port_list_lists[0].id,
+        self.assertTrue(isinstance(portlist, list))
+        self.assertEqual(len(portlist), 3)
+        self.assertTrue(isinstance(portlist[0].name, str))
+        self.assertTrue(isinstance(portlist[0].description, str))
+        self.assertTrue(isinstance(portlist[0].state, str))
+        self.assertTrue(isinstance(portlist[0].port_collection, list))
+        self.assertTrue(isinstance(portlist[0].port_collection[0].begin, str))
+        self.assertTrue(isinstance(portlist[0].port_collection[0].end, str))
+        self.assertTrue(isinstance(portlist[0].child_portlist_list, list))
+        self.assertTrue(isinstance(portlist[0].child_portlist_list[0].id,
                                    str))
-        self.assertTrue(isinstance(port_list[0].child_port_list_lists[0].name,
+        self.assertTrue(isinstance(portlist[0].child_portlist_list[0].name,
                                    str))
-        self.assertTrue(isinstance(port_list[0].create_time, str))
+        self.assertTrue(isinstance(portlist[0].create_time, str))
 
     def test_ex_get_port_list(self):
         net_domain = self.driver.ex_list_network_domains()[0]
 
-        port_list = self.driver.ex_list_port_list(
-            ex_network_domain=net_domain)[0]
-
-        port_list = self.driver.ex_get_port_list(
-            ex_port_list=port_list)
-        self.assertTrue(isinstance(port_list, DimensionDataPortList))
-
-        self.assertTrue(isinstance(port_list.name, str))
-        self.assertTrue(isinstance(port_list.description, str))
-        self.assertTrue(isinstance(port_list.state, str))
-        self.assertTrue(isinstance(port_list.port_collection, list))
-        self.assertTrue(isinstance(port_list.port_collection[0].begin, str))
-        self.assertTrue(isinstance(port_list.port_collection[0].end, str))
-        self.assertTrue(isinstance(port_list.child_port_list_lists, list))
-        self.assertTrue(isinstance(port_list.child_port_list_lists[0].id,
+        portlist_id = self.driver.ex_list_portlist(
+            ex_network_domain=net_domain)[0].id
+
+        portlist = self.driver.ex_get_portlist(
+            ex_portlist_id=portlist_id)
+        self.assertTrue(isinstance(portlist, DimensionDataPortList))
+
+        self.assertTrue(isinstance(portlist.name, str))
+        self.assertTrue(isinstance(portlist.description, str))
+        self.assertTrue(isinstance(portlist.state, str))
+        self.assertTrue(isinstance(portlist.port_collection, list))
+        self.assertTrue(isinstance(portlist.port_collection[0].begin, str))
+        self.assertTrue(isinstance(portlist.port_collection[0].end, str))
+        self.assertTrue(isinstance(portlist.child_portlist_list, list))
+        self.assertTrue(isinstance(portlist.child_portlist_list[0].id,
                                    str))
-        self.assertTrue(isinstance(port_list.child_port_list_lists[0].name,
+        self.assertTrue(isinstance(portlist.child_portlist_list[0].name,
                                    str))
-        self.assertTrue(isinstance(port_list.create_time, str))
+        self.assertTrue(isinstance(portlist.create_time, str))
 
-    def test_ex_get_port_list_STR(self):
+    def test_ex_get_portlist_STR(self):
         net_domain = self.driver.ex_list_network_domains()[0]
 
-        port_list = self.driver.ex_list_port_list(
+        portlist = self.driver.ex_list_portlist(
             ex_network_domain=net_domain)[0]
 
-        port_list = self.driver.ex_get_port_list(
-            ex_port_list=port_list.id)
+        port_list = self.driver.ex_get_portlist(
+            ex_portlist_id=portlist.id)
         self.assertTrue(isinstance(port_list, DimensionDataPortList))
 
         self.assertTrue(isinstance(port_list.name, str))
@@ -1599,14 +1599,14 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         self.assertTrue(isinstance(port_list.port_collection, list))
         self.assertTrue(isinstance(port_list.port_collection[0].begin, str))
         self.assertTrue(isinstance(port_list.port_collection[0].end, str))
-        self.assertTrue(isinstance(port_list.child_port_list_lists, list))
-        self.assertTrue(isinstance(port_list.child_port_list_lists[0].id,
+        self.assertTrue(isinstance(port_list.child_portlist_list, list))
+        self.assertTrue(isinstance(port_list.child_portlist_list[0].id,
                                    str))
-        self.assertTrue(isinstance(port_list.child_port_list_lists[0].name,
+        self.assertTrue(isinstance(port_list.child_portlist_list[0].name,
                                    str))
         self.assertTrue(isinstance(port_list.create_time, str))
 
-    def test_ex_create_port_list_NOCHILDPORTLIST(self):
+    def test_ex_create_portlist_NOCHILDPORTLIST(self):
         name = "Test_Port_List"
         description = "Test Description"
 
@@ -1618,7 +1618,7 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         port_collection = {port_1, port_2}
 
         # Create IP Address List
-        success = self.driver.ex_create_port_list(
+        success = self.driver.ex_create_portlist(
             ex_network_domain=net_domain, name=name,
             description=description,
             port_collection=port_collection
@@ -1626,7 +1626,7 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
 
         self.assertTrue(success)
 
-    def test_ex_create_port_list(self):
+    def test_ex_create_portlist(self):
         name = "Test_Port_List"
         description = "Test Description"
 
@@ -1644,16 +1644,16 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         child_ports = {child_port_1, child_port_2}
 
         # Create IP Address List
-        success = self.driver.ex_create_port_list(
+        success = self.driver.ex_create_portlist(
             ex_network_domain=net_domain, name=name,
             description=description,
             port_collection=port_collection,
-            child_port_list_lists=child_ports
+            child_portlist_list=child_ports
         )
 
         self.assertTrue(success)
 
-    def test_ex_create_port_list_STR(self):
+    def test_ex_create_portlist_STR(self):
         name = "Test_Port_List"
         description = "Test Description"
 
@@ -1671,18 +1671,18 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         child_ports_ids = {child_port_1.id, child_port_2.id}
 
         # Create IP Address List
-        success = self.driver.ex_create_port_list(
+        success = self.driver.ex_create_portlist(
             ex_network_domain=net_domain.id, name=name,
             description=description,
             port_collection=port_collection,
-            child_port_list_lists=child_ports_ids
+            child_portlist_list=child_ports_ids
         )
 
         self.assertTrue(success)
 
-    def test_ex_edit_port_list(self):
+    def test_ex_edit_portlist(self):
         net_domain = self.driver.ex_list_network_domains()[0]
-        port_list = self.driver.ex_list_port_list(net_domain)[0]
+        portlist = self.driver.ex_list_portlist(net_domain)[0]
 
         description = "Test Description"
 
@@ -1698,16 +1698,16 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         child_ports = {child_port_1.id, child_port_2.id}
 
         # Create IP Address List
-        success = self.driver.ex_edit_port_list(
-            ex_port_list=port_list,
+        success = self.driver.ex_edit_portlist(
+            ex_portlist=portlist,
             description=description,
             port_collection=port_collection,
-            child_port_list_lists=child_ports
+            child_portlist_list=child_ports
         )
         self.assertTrue(success)
 
-    def test_ex_edit_port_list_STR(self):
-        port_list_id = "484174a2-ae74-4658-9e56-50fc90e086cf"
+    def test_ex_edit_portlist_STR(self):
+        portlist_id = "484174a2-ae74-4658-9e56-50fc90e086cf"
         description = "Test Description"
 
         port_1 = DimensionDataPort(begin='8080')
@@ -1722,28 +1722,28 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         child_ports_ids = {child_port_1.id, child_port_2.id}
 
         # Create IP Address List
-        success = self.driver.ex_edit_port_list(
-            ex_port_list=port_list_id,
+        success = self.driver.ex_edit_portlist(
+            ex_portlist=portlist_id,
             description=description,
             port_collection=port_collection,
-            child_port_list_lists=child_ports_ids
+            child_portlist_list=child_ports_ids
         )
         self.assertTrue(success)
 
-    def test_ex_delete_port_list(self):
+    def test_ex_delete_portlist(self):
         net_domain = self.driver.ex_list_network_domains()[0]
-        port_list = self.driver.ex_list_port_list(net_domain)[0]
+        portlist = self.driver.ex_list_portlist(net_domain)[0]
 
-        success = self.driver.ex_delete_port_list(
-            ex_port_list=port_list)
+        success = self.driver.ex_delete_portlist(
+            ex_portlist=portlist)
         self.assertTrue(success)
 
-    def test_ex_delete_port_list_STR(self):
+    def test_ex_delete_portlist_STR(self):
         net_domain = self.driver.ex_list_network_domains()[0]
-        port_list = self.driver.ex_list_port_list(net_domain)[0]
+        portlist = self.driver.ex_list_portlist(net_domain)[0]
 
-        success = self.driver.ex_delete_port_list(
-            ex_port_list=port_list.id)
+        success = self.driver.ex_delete_portlist(
+            ex_portlist=portlist.id)
         self.assertTrue(success)
 
 


[11/13] libcloud git commit: fix syntax error of list. Using square bracket instead of curly braces

Posted by an...@apache.org.
fix syntax error of list. Using square bracket instead of curly braces


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

Branch: refs/heads/trunk
Commit: a32546f94ba3e8e4e8f505617a8826b2a5fc63d8
Parents: 9e3c7da
Author: Samuel Chong <sa...@gmail.com>
Authored: Mon Oct 10 10:31:14 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Mon Oct 10 10:31:14 2016 +1100

----------------------------------------------------------------------
 libcloud/compute/drivers/dimensiondata.py   | 10 ++++----
 libcloud/test/compute/test_dimensiondata.py | 30 ++++++++++++------------
 2 files changed, 20 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/a32546f9/libcloud/compute/drivers/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/dimensiondata.py b/libcloud/compute/drivers/dimensiondata.py
index 08343ad..8900086 100644
--- a/libcloud/compute/drivers/dimensiondata.py
+++ b/libcloud/compute/drivers/dimensiondata.py
@@ -1489,7 +1489,7 @@ class DimensionDataNodeDriver(NodeDriver):
         >>> # Get dimension data driver
         >>> libcloud.security.VERIFY_SSL_CERT = True
         >>> cls = get_driver(Provider.DIMENSIONDATA)
-        >>> # driver = cls('myusername','mypassword', region='dd-au')
+        >>> driver = cls('myusername','mypassword', region='dd-au')
         >>>
         >>> # Get location
         >>> location = driver.ex_get_location_by_id(id='AU9')
@@ -2650,7 +2650,7 @@ class DimensionDataNodeDriver(NodeDriver):
                                                  end='190.2.2.108')
         >>> ipAddress_3 = DimensionDataIpAddress(begin='190.2.2.0',
                                                  prefix_size='24')
-        >>> ip_address_collection = {ipAddress_1, ipAddress_2, ipAddress_3}
+        >>> ip_address_collection = [ipAddress_1, ipAddress_2, ipAddress_3]
         >>>
         >>> # Create IPAddressList
         >>> result = driver.ex_create_ip_address_list(
@@ -2774,7 +2774,7 @@ class DimensionDataNodeDriver(NodeDriver):
         >>>                                      end='190.2.2.108')
         >>> ipAddress_3 = DimensionDataIpAddress(
         >>>                   begin='190.2.2.0', prefix_size='24')
-        >>> ip_address_collection = {ipAddress_1, ipAddress_2, ipAddress_3}
+        >>> ip_address_collection = [ipAddress_1, ipAddress_2, ipAddress_3]
         >>>
         >>> # Edit IP Address List
         >>> ip_address_list_id = '5e7c323f-c885-4e4b-9a27-94c44217dbd3'
@@ -2993,7 +2993,7 @@ class DimensionDataNodeDriver(NodeDriver):
         >>> # Port Collection
         >>> port_1 = DimensionDataPort(begin='1000')
         >>> port_2 = DimensionDataPort(begin='1001', end='1003')
-        >>> port_collection = {port_1, port_2}
+        >>> port_collection = [port_1, port_2]
         >>>
         >>> # Create Port List
         >>> new_portlist = driver.ex_create_portlist(
@@ -3087,7 +3087,7 @@ class DimensionDataNodeDriver(NodeDriver):
         >>> # Port Collection
         >>> port_1 = DimensionDataPort(begin='4200')
         >>> port_2 = DimensionDataPort(begin='4201', end='4210')
-        >>> port_collection = {port_1, port_2}
+        >>> port_collection = [port_1, port_2]
         >>>
         >>> # Edit Port List
         >>> editPortlist = driver.ex_get_portlist(

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a32546f9/libcloud/test/compute/test_dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_dimensiondata.py b/libcloud/test/compute/test_dimensiondata.py
index 941784e..36e9a63 100644
--- a/libcloud/test/compute/test_dimensiondata.py
+++ b/libcloud/test/compute/test_dimensiondata.py
@@ -1438,8 +1438,8 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
                                               end='190.2.2.108')
         ip_address_3 = DimensionDataIpAddress(begin='190.2.2.0',
                                               prefix_size='24')
-        ip_address_collection = {ip_address_1, ip_address_2,
-                                 ip_address_3}
+        ip_address_collection = [ip_address_1, ip_address_2,
+                                 ip_address_3]
 
         # Create IP Address List
         success = self.driver.ex_create_ip_address_list(
@@ -1461,8 +1461,8 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
                                               end='190.2.2.108')
         ip_address_3 = DimensionDataIpAddress(begin='190.2.2.0',
                                               prefix_size='24')
-        ip_address_collection = {ip_address_1, ip_address_2,
-                                 ip_address_3}
+        ip_address_collection = [ip_address_1, ip_address_2,
+                                 ip_address_3]
 
         # Create IP Address List
         success = self.driver.ex_create_ip_address_list(
@@ -1475,7 +1475,7 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
 
     def test_ex_edit_ip_address_list(self):
         ip_address_1 = DimensionDataIpAddress(begin='190.2.2.111')
-        ip_address_collection = {ip_address_1}
+        ip_address_collection = [ip_address_1]
 
         child_ip_address_list = DimensionDataChildIpAddressList(
             id='2221ef78-4059-4bc1-b433-3f6ad698dc41',
@@ -1502,7 +1502,7 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
 
     def test_ex_edit_ip_address_list_STR(self):
         ip_address_1 = DimensionDataIpAddress(begin='190.2.2.111')
-        ip_address_collection = {ip_address_1}
+        ip_address_collection = [ip_address_1]
 
         child_ip_address_list = DimensionDataChildIpAddressList(
             id='2221ef78-4059-4bc1-b433-3f6ad698dc41',
@@ -1615,7 +1615,7 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         port_1 = DimensionDataPort(begin='8080')
         port_2 = DimensionDataIpAddress(begin='8899',
                                               end='9023')
-        port_collection = {port_1, port_2}
+        port_collection = [port_1, port_2]
 
         # Create IP Address List
         success = self.driver.ex_create_portlist(
@@ -1635,13 +1635,13 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         port_1 = DimensionDataPort(begin='8080')
         port_2 = DimensionDataIpAddress(begin='8899',
                                               end='9023')
-        port_collection = {port_1, port_2}
+        port_collection = [port_1, port_2]
 
         child_port_1 = DimensionDataChildPortList(
             id="333174a2-ae74-4658-9e56-50fc90e086cf", name='test port 1')
         child_port_2 = DimensionDataChildPortList(
             id="311174a2-ae74-4658-9e56-50fc90e04444", name='test port 2')
-        child_ports = {child_port_1, child_port_2}
+        child_ports = [child_port_1, child_port_2]
 
         # Create IP Address List
         success = self.driver.ex_create_portlist(
@@ -1662,13 +1662,13 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         port_1 = DimensionDataPort(begin='8080')
         port_2 = DimensionDataIpAddress(begin='8899',
                                               end='9023')
-        port_collection = {port_1, port_2}
+        port_collection = [port_1, port_2]
 
         child_port_1 = DimensionDataChildPortList(
             id="333174a2-ae74-4658-9e56-50fc90e086cf", name='test port 1')
         child_port_2 = DimensionDataChildPortList(
             id="311174a2-ae74-4658-9e56-50fc90e04444", name='test port 2')
-        child_ports_ids = {child_port_1.id, child_port_2.id}
+        child_ports_ids = [child_port_1.id, child_port_2.id]
 
         # Create IP Address List
         success = self.driver.ex_create_portlist(
@@ -1689,13 +1689,13 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         port_1 = DimensionDataPort(begin='8080')
         port_2 = DimensionDataIpAddress(begin='8899',
                                         end='9023')
-        port_collection = {port_1, port_2}
+        port_collection = [port_1, port_2]
 
         child_port_1 = DimensionDataChildPortList(
             id="333174a2-ae74-4658-9e56-50fc90e086cf", name='test port 1')
         child_port_2 = DimensionDataChildPortList(
             id="311174a2-ae74-4658-9e56-50fc90e04444", name='test port 2')
-        child_ports = {child_port_1.id, child_port_2.id}
+        child_ports = [child_port_1.id, child_port_2.id]
 
         # Create IP Address List
         success = self.driver.ex_edit_portlist(
@@ -1713,13 +1713,13 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         port_1 = DimensionDataPort(begin='8080')
         port_2 = DimensionDataIpAddress(begin='8899',
                                         end='9023')
-        port_collection = {port_1, port_2}
+        port_collection = [port_1, port_2]
 
         child_port_1 = DimensionDataChildPortList(
             id="333174a2-ae74-4658-9e56-50fc90e086cf", name='test port 1')
         child_port_2 = DimensionDataChildPortList(
             id="311174a2-ae74-4658-9e56-50fc90e04444", name='test port 2')
-        child_ports_ids = {child_port_1.id, child_port_2.id}
+        child_ports_ids = [child_port_1.id, child_port_2.id]
 
         # Create IP Address List
         success = self.driver.ex_edit_portlist(


[09/13] libcloud git commit: rename property name to child_portlist_list

Posted by an...@apache.org.
rename property name to child_portlist_list


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

Branch: refs/heads/trunk
Commit: 026c973e6f5114825c04c69128401f94e89434c5
Parents: 04c70e2
Author: Samuel Chong <sa...@gmail.com>
Authored: Thu Oct 6 16:54:54 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Thu Oct 6 16:54:54 2016 +1100

----------------------------------------------------------------------
 libcloud/common/dimensiondata.py          | 13 +++++++------
 libcloud/compute/drivers/dimensiondata.py |  6 +++---
 2 files changed, 10 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/026c973e/libcloud/common/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/common/dimensiondata.py b/libcloud/common/dimensiondata.py
index 6633e64..5f618f9 100644
--- a/libcloud/common/dimensiondata.py
+++ b/libcloud/common/dimensiondata.py
@@ -1633,7 +1633,7 @@ class DimensionDataPortList(object):
     """
 
     def __init__(self, id, name, description, port_collection,
-                 child_port_list_lists,
+                 child_portlist_list,
                  state, create_time):
         """"
         Initialize an instance of :class:`DimensionDataPortList`
@@ -1650,8 +1650,8 @@ class DimensionDataPortList(object):
         :param port_collection: Collection of DimensionDataPort
         :type  port_collection: ``List``
 
-        :param child_port_list_lists: Collection of DimensionDataChildPort
-        :type  child_port_list_lists: ``List``
+        :param child_portlist_list: Collection of DimensionDataChildPort
+        :type  child_portlist_list: ``List``
 
         :param state: Port list state
         :type  state: ``str``
@@ -1663,16 +1663,17 @@ class DimensionDataPortList(object):
         self.name = name
         self.description = description
         self.port_collection = port_collection
-        self.child_port_list_lists = child_port_list_lists
+        self.child_portlist_list = child_portlist_list
         self.state = state
         self.create_time = create_time
 
     def __repr__(self):
         return (
             "<DimensionDataPortList: id=%s, name=%s, description=%s, "
-            "port_collection=%s, child_port_list=%s, state=%s, create_time=%s>"
+            "port_collection=%s, child_portlist_list=%s, state=%s, "
+            "create_time=%s>"
             % (self.id, self.name, self.description,
-               self.port_collection, self.child_port_list, self.state,
+               self.port_collection, self.child_portlist_list, self.state,
                self.create_time))
 
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/026c973e/libcloud/compute/drivers/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/dimensiondata.py b/libcloud/compute/drivers/dimensiondata.py
index 52283b2..a76fcdc 100644
--- a/libcloud/compute/drivers/dimensiondata.py
+++ b/libcloud/compute/drivers/dimensiondata.py
@@ -3416,9 +3416,9 @@ class DimensionDataNodeDriver(NodeDriver):
         for port in findall(element, 'port', TYPES_URN):
             ports.append(self._to_port(element=port))
 
-        child_port_list_lists = []
+        child_portlist_list = []
         for child in findall(element, 'childPortList', TYPES_URN):
-            child_port_list_lists.append(
+            child_portlist_list.append(
                 self._to_child_port_list(element=child))
 
         return DimensionDataPortList(
@@ -3426,7 +3426,7 @@ class DimensionDataNodeDriver(NodeDriver):
             name=findtext(element, 'name', TYPES_URN),
             description=findtext(element, 'description', TYPES_URN),
             port_collection=ports,
-            child_port_list_lists=child_port_list_lists,
+            child_portlist_list=child_portlist_list,
             state=findtext(element, 'state', TYPES_URN),
             create_time=findtext(element, 'createTime', TYPES_URN)
         )


[07/13] libcloud git commit: Removed unused import

Posted by an...@apache.org.
Removed unused import


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

Branch: refs/heads/trunk
Commit: 009f2266d4d4d1dff1bd6d83463b37757796f787
Parents: 2eb1b4a
Author: Samuel Chong <sa...@gmail.com>
Authored: Thu Oct 6 11:46:16 2016 +1100
Committer: Samuel Chong <sa...@gmail.com>
Committed: Thu Oct 6 11:46:16 2016 +1100

----------------------------------------------------------------------
 libcloud/compute/drivers/dimensiondata.py | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/009f2266/libcloud/compute/drivers/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/dimensiondata.py b/libcloud/compute/drivers/dimensiondata.py
index 89f7c66..52283b2 100644
--- a/libcloud/compute/drivers/dimensiondata.py
+++ b/libcloud/compute/drivers/dimensiondata.py
@@ -44,7 +44,6 @@ from libcloud.common.dimensiondata import DimensionDataIpAddress
 from libcloud.common.dimensiondata import DimensionDataPortList
 from libcloud.common.dimensiondata import DimensionDataPort
 from libcloud.common.dimensiondata import DimensionDataChildPortList
-from libcloud.common.dimensiondata import DimensionDataNic
 from libcloud.common.dimensiondata import NetworkDomainServicePlan
 from libcloud.common.dimensiondata import DimensionDataTagKey
 from libcloud.common.dimensiondata import DimensionDataTag


[13/13] libcloud git commit: Merge branch 'libcloud893' into trunk Closes #893

Posted by an...@apache.org.
Merge branch 'libcloud893' into trunk
Closes #893


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

Branch: refs/heads/trunk
Commit: 4d11ec272957606d07c13171b1f73493b26b8736
Parents: 9ebc0b4 487e0b7
Author: Anthony Shaw <an...@apache.org>
Authored: Mon Oct 10 10:58:55 2016 +1100
Committer: Anthony Shaw <an...@apache.org>
Committed: Mon Oct 10 10:58:55 2016 +1100

----------------------------------------------------------------------
 libcloud/common/dimensiondata.py                | 241 +++++
 libcloud/compute/drivers/dimensiondata.py       | 929 +++++++++++++++++++
 .../dimensiondata/ip_address_list_create.xml    |   9 +
 .../dimensiondata/ip_address_list_delete.xml    |  10 +
 .../dimensiondata/ip_address_list_edit.xml      |  10 +
 .../fixtures/dimensiondata/ip_address_lists.xml |  46 +
 .../ip_address_lists_FILTERBYNAME.xml           |  14 +
 .../fixtures/dimensiondata/port_list_create.xml |   9 +
 .../fixtures/dimensiondata/port_list_delete.xml |  10 +
 .../fixtures/dimensiondata/port_list_edit.xml   |   8 +
 .../fixtures/dimensiondata/port_list_get.xml    |  15 +
 .../fixtures/dimensiondata/port_list_lists.xml  |  38 +
 libcloud/test/compute/test_dimensiondata.py     | 753 ++++++++++++++-
 13 files changed, 2091 insertions(+), 1 deletion(-)
----------------------------------------------------------------------