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 <samuelcho...@gmail.com>
Authored: Thu Oct 6 15:14:00 2016 +1100
Committer: Samuel Chong <samuelcho...@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())

Reply via email to