You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2016/04/16 19:39:43 UTC

[02/11] libcloud git commit: Changed add/remove disk for dimensiondata driver to use new API

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/ex_connection_class_kwargs_regression_fix
Commit: fce3074f29e936b06c09248ea26e30c8805202f6
Parents: 8185276
Author: anthony-shaw <an...@apache.org>
Authored: Fri Apr 15 15:59:56 2016 +1000
Committer: anthony-shaw <an...@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())