libcloud-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From to...@apache.org
Subject [03/10] libcloud git commit: Complete IP block functionality
Date Thu, 08 Oct 2015 12:19:21 GMT
Complete IP block functionality

Closes #593


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

Branch: refs/heads/trunk
Commit: 4ee01b6640cadc6abea8f277cdebc37a9a2ac988
Parents: f3e7d51
Author: Anthony Shaw <anthony.p.shaw@gmail.com>
Authored: Tue Oct 6 13:05:40 2015 +1100
Committer: Tomaz Muraus <tomaz@apache.org>
Committed: Thu Oct 8 14:12:05 2015 +0200

----------------------------------------------------------------------
 libcloud/common/dimensiondata.py                |  21 ++++
 libcloud/compute/drivers/dimensiondata.py       | 106 ++++++++++++++++---
 ...bc_8dabe5a7d0e4_network_addPublicIpBlock.xml |   7 ++
 ..._9cbc_8dabe5a7d0e4_network_publicIpBlock.xml |  10 ++
 ...ock_4487241a_f0ca_11e3_9315_d4bed9b167ba.xml |   8 ++
 ...ock_9945dc4a_bdce_11e4_8c14_b8ca3a5d9ef8.xml |   8 ++
 ...8dabe5a7d0e4_network_removePublicIpBlock.xml |   8 ++
 libcloud/test/compute/test_dimensiondata.py     |  52 +++++++++
 8 files changed, 206 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/4ee01b66/libcloud/common/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/common/dimensiondata.py b/libcloud/common/dimensiondata.py
index 722ea5d..6c517fc 100644
--- a/libcloud/common/dimensiondata.py
+++ b/libcloud/common/dimensiondata.py
@@ -301,6 +301,27 @@ class DimensionDataNetworkDomain(object):
                    self.status))
 
 
+class DimensionDataPublicIpBlock(object):
+    """
+    DimensionData Public IP Block with location.
+    """
+
+    def __init__(self, id, baseIp, size, location, network_domain,
+                 status):
+        self.id = str(id)
+        self.baseIp = baseIp
+        self.size = size
+        self.location = location
+        self.network_domain = network_domain
+        self.status = status
+
+    def __repr__(self):
+        return (('<DimensionDataNetworkDomain: id=%s, baseIp=%s,'
+                 'size=%s, location=%s, status=%s>')
+                % (self.id, self.baseIp, self.size, self.location,
+                   self.status))
+
+
 class DimensionDataVlan(object):
     """
     DimensionData VLAN.

http://git-wip-us.apache.org/repos/asf/libcloud/blob/4ee01b66/libcloud/compute/drivers/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/dimensiondata.py b/libcloud/compute/drivers/dimensiondata.py
index be22fb7..a2cad9f 100644
--- a/libcloud/compute/drivers/dimensiondata.py
+++ b/libcloud/compute/drivers/dimensiondata.py
@@ -28,6 +28,7 @@ from libcloud.common.dimensiondata import (DimensionDataConnection,
 from libcloud.common.dimensiondata import DimensionDataNetwork
 from libcloud.common.dimensiondata import DimensionDataNetworkDomain
 from libcloud.common.dimensiondata import DimensionDataVlan
+from libcloud.common.dimensiondata import DimensionDataPublicIpBlock
 from libcloud.common.dimensiondata import NetworkDomainServicePlan
 from libcloud.common.dimensiondata import API_ENDPOINTS
 from libcloud.common.dimensiondata import DEFAULT_REGION
@@ -167,8 +168,8 @@ class DimensionDataNodeDriver(NodeDriver):
             'server/deleteServer',
             method='POST',
             data=ET.tostring(request_elm)).object
-        result = findtext(body, 'responseCode', TYPES_URN)
-        return result == 'IN_PROGRESS'
+        responseCode = findtext(body, 'responseCode', TYPES_URN)
+        return responseCode == 'IN_PROGRESS' or responseCode == 'OK'
 
     def reboot_node(self, node):
         request_elm = ET.Element('rebootServer',
@@ -177,8 +178,8 @@ class DimensionDataNodeDriver(NodeDriver):
             'server/rebootServer',
             method='POST',
             data=ET.tostring(request_elm)).object
-        result = findtext(body, 'responseCode', TYPES_URN)
-        return result == 'IN_PROGRESS'
+        responseCode = findtext(body, 'responseCode', TYPES_URN)
+        return responseCode == 'IN_PROGRESS' or responseCode == 'OK'
 
     def list_nodes(self):
         nodes = self._to_nodes(
@@ -306,8 +307,8 @@ class DimensionDataNodeDriver(NodeDriver):
             'server/startServer',
             method='POST',
             data=ET.tostring(request_elm)).object
-        result = findtext(body, 'responseCode', TYPES_URN)
-        return result == 'IN_PROGRESS'
+        responseCode = findtext(body, 'responseCode', TYPES_URN)
+        return responseCode == 'IN_PROGRESS' or responseCode == 'OK'
 
     def ex_shutdown_graceful(self, node):
         """
@@ -327,8 +328,8 @@ class DimensionDataNodeDriver(NodeDriver):
             'server/shutdownServer',
             method='POST',
             data=ET.tostring(request_elm)).object
-        result = findtext(body, 'responseCode', TYPES_URN)
-        return result == 'IN_PROGRESS'
+        responseCode = findtext(body, 'responseCode', TYPES_URN)
+        return responseCode == 'IN_PROGRESS' or responseCode == 'OK'
 
     def ex_power_off(self, node):
         """
@@ -348,8 +349,8 @@ class DimensionDataNodeDriver(NodeDriver):
             'server/powerOffServer',
             method='POST',
             data=ET.tostring(request_elm)).object
-        result = findtext(body, 'responseCode', TYPES_URN)
-        return result == 'IN_PROGRESS'
+        responseCode = findtext(body, 'responseCode', TYPES_URN)
+        return responseCode == 'IN_PROGRESS' or responseCode == 'OK'
 
     def ex_reset(self, node):
         """
@@ -369,8 +370,8 @@ class DimensionDataNodeDriver(NodeDriver):
             'server/resetServer',
             method='POST',
             data=ET.tostring(request_elm)).object
-        result = findtext(body, 'responseCode', TYPES_URN)
-        return result == 'IN_PROGRESS'
+        responseCode = findtext(body, 'responseCode', TYPES_URN)
+        return responseCode == 'IN_PROGRESS' or responseCode == 'OK'
 
     def ex_list_networks(self, location=None):
         """
@@ -473,7 +474,7 @@ class DimensionDataNodeDriver(NodeDriver):
             data=ET.tostring(delete_node)).object
 
         responseCode = findtext(result, 'responseCode', TYPES_URN)
-        return responseCode == 'IN_PROGRESS'
+        return responseCode == 'IN_PROGRESS' or responseCode == 'OK'
 
     def ex_create_vlan(self,
                        network_domain,
@@ -568,7 +569,7 @@ class DimensionDataNodeDriver(NodeDriver):
             data=ET.tostring(delete_node)).object
 
         responseCode = findtext(result, 'responseCode', TYPES_URN)
-        return responseCode == 'IN_PROGRESS'
+        return responseCode == 'IN_PROGRESS' or responseCode == 'OK'
 
     def ex_list_vlans(self, location=None, network_domain=None):
         """
@@ -587,11 +588,63 @@ class DimensionDataNodeDriver(NodeDriver):
                                   .object
         return self._to_vlans(response)
 
+    def ex_add_public_ip_block_to_network_domain(self, network_domain):
+        add_node = ET.Element('addPublicIpBlock', {'xmlns': TYPES_URN})
+        ET.SubElement(add_node, "networkDomainId").text =\
+            network_domain.id
+
+        response = self.connection.request_with_orgId_api_2(
+            'network/addPublicIpBlock',
+            method='POST',
+            data=ET.tostring(add_node)).object
+
+        block_id = None
+
+        for info in findall(response, 'info', TYPES_URN):
+            if info.get('name') == 'publicIpBlockId':
+                block_id = info.get('value')
+        return self.ex_get_public_ip_block(block_id)
+
+    def ex_list_public_ip_blocks(self, network_domain):
+        params = {}
+        params['networkDomainId'] = network_domain.id
+
+        response = self.connection \
+            .request_with_orgId_api_2('network/publicIpBlock',
+                                      params=params).object
+        return self._to_ip_blocks(response)
+
+    def ex_get_public_ip_block(self, block_id):
+        locations = self.list_locations()
+        block = self.connection.request_with_orgId_api_2(
+            'network/publicIpBlock/%s' % block_id).object
+        return self._to_ip_block(block, locations)
+
+    def ex_delete_public_ip_block(self, block):
+        delete_node = ET.Element('removePublicIpBlock', {'xmlns': TYPES_URN})
+        delete_node.set('id', block.id)
+        result = self.connection.request_with_orgId_api_2(
+            'network/removePublicIpBlock',
+            method='POST',
+            data=ET.tostring(delete_node)).object
+
+        responseCode = findtext(result, 'responseCode', TYPES_URN)
+        return responseCode == 'IN_PROGRESS' or responseCode == 'OK'
+
     def ex_get_node_by_id(self, id):
         node = self.connection.request_with_orgId_api_2(
             'server/server/%s' % id).object
         return self._to_node(node)
 
+    def ex_list_firewall_rules(self, network_domain):
+        params = {}
+        params['networkDomainId'] = network_domain.id
+
+        response = self.connection \
+            .request_with_orgId_api_2('network/firewallRule',
+                                      params=params).object
+        return self._to_firewall_rules(response)
+
     def ex_get_location_by_id(self, id):
         """
         Get location by ID.
@@ -607,6 +660,31 @@ class DimensionDataNodeDriver(NodeDriver):
                 filter(lambda x: x.id == id, self.list_locations()))[0]
         return location
 
+    def _to_ip_blocks(self, object):
+        blocks = []
+        locations = self.list_locations()
+        for element in findall(object, 'publicIpBlock', TYPES_URN):
+            blocks.append(self._to_ip_block(element, locations))
+
+        return blocks
+
+    def _to_ip_block(self, element, locations):
+        status = self._to_status(element.find(fixxpath('state', TYPES_URN)))
+
+        location_id = element.get('datacenterId')
+        location = list(filter(lambda x: x.id == location_id,
+                               locations))[0]
+
+        return DimensionDataPublicIpBlock(
+            id=element.get('id'),
+            network_domain=self.ex_get_network_domain(
+                findtext(element, 'networkDomainId', TYPES_URN)
+            ),
+            baseIp=findtext(element, 'baseIp', TYPES_URN),
+            size=findtext(element, 'size', TYPES_URN),
+            location=location,
+            status=status)
+
     def _to_networks(self, object):
         networks = []
         locations = self.list_locations()

http://git-wip-us.apache.org/repos/asf/libcloud/blob/4ee01b66/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_addPublicIpBlock.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_addPublicIpBlock.xml
b/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_addPublicIpBlock.xml
new file mode 100644
index 0000000..1fcb8d3
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_addPublicIpBlock.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<response requestId="na/2014-04-14T13:37:20/62f06368-c3fb-11e3-b29c-001517c4643e" xmlns="urn:didata.com:api:cloud:types">
+<operation>ADD_PUBLIC_IP_BLOCK</operation>
+<responseCode>OK</responseCode>
+<message>Public IPv4 Address Block has been added successfully to Network Domain.</message>
+<info name="publicIpBlockId" value="4487241a-f0ca-11e3-9315-d4bed9b167ba"/>
+</response>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/4ee01b66/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock.xml
b/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock.xml
new file mode 100644
index 0000000..3a1c1b3
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<publicIpBlocks xmlns="urn:didata.com:api:cloud:types" pageNumber="1" pageCount="1" totalCount="1"
pageSize="250">
+    <publicIpBlock id="9945dc4a-bdce-11e4-8c14-b8ca3a5d9ef8" datacenterId="NA9">
+        <networkDomainId>8cdfd607-f429-4df6-9352-162cfc0891be</networkDomainId>
+        <baseIp>168.128.4.18</baseIp>
+        <size>2</size>
+        <createTime>2015-07-13T04:07:37.000Z</createTime>
+        <state>NORMAL</state>
+    </publicIpBlock>
+</publicIpBlocks>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/4ee01b66/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_4487241a_f0ca_11e3_9315_d4bed9b167ba.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_4487241a_f0ca_11e3_9315_d4bed9b167ba.xml
b/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_4487241a_f0ca_11e3_9315_d4bed9b167ba.xml
new file mode 100644
index 0000000..dc8814b
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_4487241a_f0ca_11e3_9315_d4bed9b167ba.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<publicIpBlock xmlns="urn:didata.com:api:cloud:types" id="9945dc4a-bdce-11e4-8c14-b8ca3a5d9ef8"
datacenterId="NA9">
+    <networkDomainId>8cdfd607-f429-4df6-9352-162cfc0891be</networkDomainId>
+    <baseIp>168.128.4.18</baseIp>
+    <size>2</size>
+    <createTime>2015-07-13T04:07:37.000Z</createTime>
+    <state>NORMAL</state>
+</publicIpBlock>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/4ee01b66/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_9945dc4a_bdce_11e4_8c14_b8ca3a5d9ef8.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_9945dc4a_bdce_11e4_8c14_b8ca3a5d9ef8.xml
b/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_9945dc4a_bdce_11e4_8c14_b8ca3a5d9ef8.xml
new file mode 100644
index 0000000..dc8814b
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_9945dc4a_bdce_11e4_8c14_b8ca3a5d9ef8.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<publicIpBlock xmlns="urn:didata.com:api:cloud:types" id="9945dc4a-bdce-11e4-8c14-b8ca3a5d9ef8"
datacenterId="NA9">
+    <networkDomainId>8cdfd607-f429-4df6-9352-162cfc0891be</networkDomainId>
+    <baseIp>168.128.4.18</baseIp>
+    <size>2</size>
+    <createTime>2015-07-13T04:07:37.000Z</createTime>
+    <state>NORMAL</state>
+</publicIpBlock>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/4ee01b66/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_removePublicIpBlock.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_removePublicIpBlock.xml
b/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_removePublicIpBlock.xml
new file mode 100644
index 0000000..8b6fe34
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_removePublicIpBlock.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<response
+xmlns="urn:didata.com:api:cloud:types" requestId="NA9/2015-02-27T09:31:34.239-05:00/3e762559-c7f5-4d2b-abab-63306d406aa1">
+<operation>REMOVE_PUBLIC_IP_BLOCK</operation>
+<responseCode>OK</responseCode>
+<message>Public Ip Block bef4334a-844b-11e4-a91c-0030487e0302 has been
+removed successfully</message>
+</response>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/4ee01b66/libcloud/test/compute/test_dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_dimensiondata.py b/libcloud/test/compute/test_dimensiondata.py
index fcddcdc..7139633 100644
--- a/libcloud/test/compute/test_dimensiondata.py
+++ b/libcloud/test/compute/test_dimensiondata.py
@@ -273,6 +273,33 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         result = self.driver.ex_expand_vlan(vlan)
         self.assertEqual(vlan.private_ipv4_range_size, '23')
 
+    def test_ex_add_public_ip_block_to_network_domain(self):
+        net = self.driver.ex_get_network_domain('8cdfd607-f429-4df6-9352-162cfc0891be')
+        block = self.driver.ex_add_public_ip_block_to_network_domain(net)
+
+    def test_ex_list_public_ip_blocks(self):
+        net = self.driver.ex_get_network_domain('8cdfd607-f429-4df6-9352-162cfc0891be')
+        blocks = self.driver.ex_list_public_ip_blocks(net)
+        self.assertEqual(blocks[0].baseIp, '168.128.4.18')
+        self.assertEqual(blocks[0].size, '2')
+        self.assertEqual(blocks[0].id, '9945dc4a-bdce-11e4-8c14-b8ca3a5d9ef8')
+        self.assertEqual(blocks[0].location.id, 'NA9')
+        self.assertEqual(blocks[0].network_domain.id, net.id)
+
+    def test_ex_get_public_ip_block(self):
+        net = self.driver.ex_get_network_domain('8cdfd607-f429-4df6-9352-162cfc0891be')
+        block = self.driver.ex_get_public_ip_block('9945dc4a-bdce-11e4-8c14-b8ca3a5d9ef8')
+        self.assertEqual(block.baseIp, '168.128.4.18')
+        self.assertEqual(block.size, '2')
+        self.assertEqual(block.id, '9945dc4a-bdce-11e4-8c14-b8ca3a5d9ef8')
+        self.assertEqual(block.location.id, 'NA9')
+        self.assertEqual(block.network_domain.id, net.id)
+
+    def test_ex_delete_public_ip_block(self):
+        block = self.driver.ex_get_public_ip_block('9945dc4a-bdce-11e4-8c14-b8ca3a5d9ef8')
+        result = self.driver.ex_delete_public_ip_block(block)
+        self.assertTrue(result)
+
 
 class DimensionDataMockHttp(MockHttp):
 
@@ -501,6 +528,31 @@ class DimensionDataMockHttp(MockHttp):
             'caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_expandVlan.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
+    def _caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_addPublicIpBlock(self, method,
url, body, headers):
+        body = self.fixtures.load(
+            'caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_addPublicIpBlock.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_4487241a_f0ca_11e3_9315_d4bed9b167ba(self,
method, url, body, headers):
+        body = self.fixtures.load(
+            'caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_4487241a_f0ca_11e3_9315_d4bed9b167ba.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock(self, method,
url, body, headers):
+        body = self.fixtures.load(
+            'caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_9945dc4a_bdce_11e4_8c14_b8ca3a5d9ef8(self,
method, url, body, headers):
+        body = self.fixtures.load(
+            'caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_publicIpBlock_9945dc4a_bdce_11e4_8c14_b8ca3a5d9ef8.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_removePublicIpBlock(self,
method, url, body, headers):
+        body = self.fixtures.load(
+            'caas_2_0_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_network_removePublicIpBlock.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
 
 if __name__ == '__main__':
     sys.exit(unittest.main())


Mime
View raw message