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'