Changed add/remove disk for dimensiondata driver to use new API
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/fce3074f Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/fce3074f Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/fce3074f Branch: refs/heads/trunk Commit: fce3074f29e936b06c09248ea26e30c8805202f6 Parents: 8185276 Author: anthony-shaw <anthonys...@apache.org> Authored: Fri Apr 15 15:59:56 2016 +1000 Committer: anthony-shaw <anthonys...@apache.org> Committed: Sat Apr 16 15:35:19 2016 +1000 ---------------------------------------------------------------------- libcloud/compute/drivers/dimensiondata.py | 55 ++++++++++++++++---- .../fixtures/dimensiondata/server_addDisk.xml | 9 ++++ .../dimensiondata/server_removeDisk.xml | 6 +++ libcloud/test/compute/test_dimensiondata.py | 13 ++++- 4 files changed, 71 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/fce3074f/libcloud/compute/drivers/dimensiondata.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/dimensiondata.py b/libcloud/compute/drivers/dimensiondata.py index 29009db..1b9695f 100644 --- a/libcloud/compute/drivers/dimensiondata.py +++ b/libcloud/compute/drivers/dimensiondata.py @@ -1674,7 +1674,8 @@ class DimensionDataNodeDriver(NodeDriver): response_code = findtext(result, 'responseCode', TYPES_URN) return response_code in ['IN_PROGRESS', 'OK'] - def ex_add_storage_to_node(self, node, amount, speed='STANDARD'): + def ex_add_storage_to_node(self, node, amount, + speed='STANDARD', scsi_id=None): """ Add storage to the node @@ -1687,13 +1688,25 @@ class DimensionDataNodeDriver(NodeDriver): :param speed: The disk speed type :type speed: ``str`` + :param scsi_id: The target SCSI ID (optional) + :type scsi_id: ``int`` + :rtype: ``bool`` """ - result = self.connection.request_with_orgId_api_1( - 'server/%s?addLocalStorage&amount=%s&speed=%s' % - (node.id, amount, speed)).object - response_code = findtext(result, 'result', GENERAL_NS) - return response_code in ['IN_PROGRESS', 'SUCCESS'] + update_node = ET.Element('addDisk', + {'xmlns': TYPES_URN}) + update_node.set('id', node.id) + ET.SubElement(update_node, 'sizeGb').text = str(amount) + ET.SubElement(update_node, 'speed').text = speed.upper() + if scsi_id is not None: + ET.SubElement(update_node, 'scsiId').text = str(scsi_id) + + result = self.connection.request_with_orgId_api_2( + 'server/addDisk', + method='POST', + data=ET.tostring(update_node)).object + response_code = findtext(result, 'responseCode', TYPES_URN) + return response_code in ['IN_PROGRESS', 'OK'] def ex_remove_storage_from_node(self, node, disk_id): """ @@ -1707,11 +1720,31 @@ class DimensionDataNodeDriver(NodeDriver): :rtype: ``bool`` """ - result = self.connection.request_with_orgId_api_1( - 'server/%s/disk/%s?delete' % - (node.id, disk_id)).object - response_code = findtext(result, 'result', GENERAL_NS) - return response_code in ['IN_PROGRESS', 'SUCCESS'] + disk = [disk for disk in node.extra['disks'] + if disk.scsi_id == disk_id][0] + return self.ex_remove_storage(disk.id) + + def ex_remove_storage(self, disk_id): + """ + Remove storage from a node + + :param node: The server to add storage to + :type node: :class:`Node` + + :param disk_id: The ID of the disk to remove + :type disk_id: ``str`` + + :rtype: ``bool`` + """ + update_node = ET.Element('removeDisk', + {'xmlns': TYPES_URN}) + update_node.set('id', disk_id) + result = self.connection.request_with_orgId_api_2( + 'server/removeDisk', + method='POST', + data=ET.tostring(update_node)).object + response_code = findtext(result, 'responseCode', TYPES_URN) + return response_code in ['IN_PROGRESS', 'OK'] def ex_change_storage_speed(self, node, disk_id, speed): """ http://git-wip-us.apache.org/repos/asf/libcloud/blob/fce3074f/libcloud/test/compute/fixtures/dimensiondata/server_addDisk.xml ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/dimensiondata/server_addDisk.xml b/libcloud/test/compute/fixtures/dimensiondata/server_addDisk.xml new file mode 100644 index 0000000..4e49bd5 --- /dev/null +++ b/libcloud/test/compute/fixtures/dimensiondata/server_addDisk.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<response requestId="na9_20160321T074626030-0400_7e9fffe7-190b-46f2-9107 © 2016 Dimension Data Cloud Solutions 260 9d52fe57d0ad" xmlns="urn:didata.com:api:cloud:types"> + <operation>ADD_DISK</operation> + <responseCode>IN_PROGRESS</responseCode> + <message>The request to add a 20 GB Standard Speed Disk on Server 'SERVER-1' has been accepted and is being processed.</message> + <info name="diskId" value="9e6b496d-5261-4542-91aa-b50c7f569c54" /> + <info name="scsiId" value="4" /> + <info name="speed" value="STANDARD" /> +</response> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/libcloud/blob/fce3074f/libcloud/test/compute/fixtures/dimensiondata/server_removeDisk.xml ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/dimensiondata/server_removeDisk.xml b/libcloud/test/compute/fixtures/dimensiondata/server_removeDisk.xml new file mode 100644 index 0000000..8b2d17f --- /dev/null +++ b/libcloud/test/compute/fixtures/dimensiondata/server_removeDisk.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<response requestId="na9_20160321T074626030-0400_7e9fffe7-190b-46f2-91079d52fe57d0ad" xmlns="urn:didata.com:api:cloud:types"> + <operation>REMOVE_DISK</operation> + <responseCode>IN_PROGRESS</responseCode> + <message>Request to Remove disk '540c4d86-4d84-11e4-a91c-0030487e0302' from Server 'Server 1' has been accepted and is being processed.</message> +</response> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/libcloud/blob/fce3074f/libcloud/test/compute/test_dimensiondata.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_dimensiondata.py b/libcloud/test/compute/test_dimensiondata.py index 2402cb8..721b37e 100644 --- a/libcloud/test/compute/test_dimensiondata.py +++ b/libcloud/test/compute/test_dimensiondata.py @@ -798,7 +798,7 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin): def test_ex_remove_storage_from_node(self): node = self.driver.list_nodes()[0] - result = self.driver.ex_remove_storage_from_node(node, 1) + result = self.driver.ex_remove_storage_from_node(node, 0) self.assertTrue(result) def test_ex_change_storage_speed(self): @@ -1733,5 +1733,16 @@ class DimensionDataMockHttp(MockHttp): 'server_cleanServer.xml') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) + def _caas_2_2_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_addDisk(self, method, url, body, headers): + body = self.fixtures.load( + 'server_addDisk.xml') + return (httplib.OK, body, {}, httplib.responses[httplib.OK]) + + def _caas_2_2_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_removeDisk(self, method, url, body, headers): + body = self.fixtures.load( + 'server_removeDisk.xml') + return (httplib.OK, body, {}, httplib.responses[httplib.OK]) + + if __name__ == '__main__': sys.exit(unittest.main())