Repository: libcloud
Updated Branches:
  refs/heads/trunk b8a6e4b01 -> 8493954fc


Updated create_volume routine in the cloudstack.py file to support 
"DiskOffering" selection using same variable name as for OpenStack 
(ex_volume_type). This allows one to specify a specific volume type. When 
ex_volume_type is specified, the size of the volume is defined by that volume 
type, unless it is adjustable. Updated tests to validate changes to 
create_volume.

Closes #785

Signed-off-by: Tomaz Muraus <to...@tomaz.me>


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

Branch: refs/heads/trunk
Commit: 93111df72905c472a2103bf02e6652dcc4f9a7d3
Parents: b8a6e4b
Author: Greg Bishop <greg.bis...@scality.com>
Authored: Wed May 11 16:53:05 2016 -0400
Committer: Tomaz Muraus <to...@tomaz.me>
Committed: Sat Jun 4 19:26:28 2016 +0200

----------------------------------------------------------------------
 libcloud/compute/drivers/cloudstack.py          | 23 ++++++++++++++-----
 .../cloudstack/createVolume_withvolumetype.json |  1 +
 .../listDiskOfferings_withvolumetype.json       |  1 +
 .../cloudstack/listZones_withvolumetype.json    |  1 +
 libcloud/test/compute/test_cloudstack.py        | 24 ++++++++++++++++++++
 5 files changed, 44 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/93111df7/libcloud/compute/drivers/cloudstack.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/cloudstack.py 
b/libcloud/compute/drivers/cloudstack.py
index 387e1c7..55d1643 100644
--- a/libcloud/compute/drivers/cloudstack.py
+++ b/libcloud/compute/drivers/cloudstack.py
@@ -2111,17 +2111,28 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, 
NodeDriver):
 
         return projects
 
-    def create_volume(self, size, name, location=None, snapshot=None):
+    def create_volume(self, size, name, location=None, snapshot=None,
+                      ex_volume_type=None):
         """
         Creates a data volume
         Defaults to the first location
         """
-        for diskOffering in self.ex_list_disk_offerings():
-            if diskOffering.size == size or diskOffering.customizable:
-                break
+        if ex_volume_type is None:
+            for diskOffering in self.ex_list_disk_offerings():
+                if diskOffering.size == size or diskOffering.customizable:
+                    break
+            else:
+                raise LibcloudError(
+                    'Disk offering with size=%s not found' % size)
         else:
-            raise LibcloudError(
-                'Disk offering with size=%s not found' % size)
+            for diskOffering in self.ex_list_disk_offerings():
+                if diskOffering.name == ex_volume_type:
+                    if not diskOffering.customizable:
+                        size = diskOffering.size
+                    break
+            else:
+                raise LibcloudError(
+                    'Volume type with name=%s not found' % ex_volume_type)
 
         if location is None:
             location = self.list_locations()[0]

http://git-wip-us.apache.org/repos/asf/libcloud/blob/93111df7/libcloud/test/compute/fixtures/cloudstack/createVolume_withvolumetype.json
----------------------------------------------------------------------
diff --git 
a/libcloud/test/compute/fixtures/cloudstack/createVolume_withvolumetype.json 
b/libcloud/test/compute/fixtures/cloudstack/createVolume_withvolumetype.json
new file mode 100644
index 0000000..dc51b35
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudstack/createVolume_withvolumetype.json
@@ -0,0 +1 @@
+{ "createvolumeresponse" : 
{"id":"60338035-92fb-4d27-98d4-b60ad4b38b87","jobid":"createvolumejob"} }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/93111df7/libcloud/test/compute/fixtures/cloudstack/listDiskOfferings_withvolumetype.json
----------------------------------------------------------------------
diff --git 
a/libcloud/test/compute/fixtures/cloudstack/listDiskOfferings_withvolumetype.json
 
b/libcloud/test/compute/fixtures/cloudstack/listDiskOfferings_withvolumetype.json
new file mode 100644
index 0000000..f279b95
--- /dev/null
+++ 
b/libcloud/test/compute/fixtures/cloudstack/listDiskOfferings_withvolumetype.json
@@ -0,0 +1 @@
+{ "listdiskofferingsresponse" : { "count":1 ,"diskoffering" : [  
{"id":"6345e3b7-227e-4209-8f8c-1f94219696e6","name":"Disk offer 
1","displaytext":"Disk offer 1 display 
name","disksize":10,"created":"2012-04-24T16:35:55+0200","iscustomized":false}  
] } }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/93111df7/libcloud/test/compute/fixtures/cloudstack/listZones_withvolumetype.json
----------------------------------------------------------------------
diff --git 
a/libcloud/test/compute/fixtures/cloudstack/listZones_withvolumetype.json 
b/libcloud/test/compute/fixtures/cloudstack/listZones_withvolumetype.json
new file mode 100644
index 0000000..0316936
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudstack/listZones_withvolumetype.json
@@ -0,0 +1 @@
+{ "listzonesresponse" : { "zone" : [  
{"id":1,"name":"Sydney","networktype":"Advanced","securitygroupsenabled":false} 
] } }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/93111df7/libcloud/test/compute/test_cloudstack.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_cloudstack.py 
b/libcloud/test/compute/test_cloudstack.py
index 1dfc2af..fdc3f45 100644
--- a/libcloud/test/compute/test_cloudstack.py
+++ b/libcloud/test/compute/test_cloudstack.py
@@ -544,6 +544,30 @@ class CloudStackCommonTestCase(TestCaseMixin):
 
         self.assertEqual(volumeName, volume.name)
 
+    def test_create_volume_no_matching_volume_type(self):
+        """If the ex_disk_type does not exit, then an exception should be
+        thrown."""
+
+        location = self.driver.list_locations()[0]
+
+        self.assertRaises(
+            LibcloudError,
+            self.driver.create_volume,
+            'vol-0', location, 11, ex_volume_type='FooVolumeType')
+
+    def test_create_volume_with_defined_volume_type(self):
+        CloudStackMockHttp.fixture_tag = 'withvolumetype'
+
+        volumeName = 'vol-0'
+        volLocation = self.driver.list_locations()[0]
+        diskOffering = self.driver.ex_list_disk_offerings()[0]
+        volumeType = diskOffering.name
+
+        volume = self.driver.create_volume(10, volumeName, 
location=volLocation,
+                                           ex_volume_type=volumeType)
+
+        self.assertEqual(volumeName, volume.name)
+
     def test_attach_volume(self):
         node = self.driver.list_nodes()[0]
         volumeName = 'vol-0'

Reply via email to