Implement creating volumes from OpenStack snapshots LIBCLOUD-673 #close
Signed-off-by: Tomaz Muraus <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/1628fc49 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/1628fc49 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/1628fc49 Branch: refs/heads/trunk Commit: 1628fc49bb39ebfa43f26618aaa7edd6ee80b039 Parents: ceccf30 Author: Allard Hoeve <[email protected]> Authored: Tue Feb 24 13:50:42 2015 +0100 Committer: Tomaz Muraus <[email protected]> Committed: Wed Mar 4 23:30:12 2015 +0100 ---------------------------------------------------------------------- libcloud/compute/drivers/openstack.py | 48 +++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/1628fc49/libcloud/compute/drivers/openstack.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/openstack.py b/libcloud/compute/drivers/openstack.py index da8c05b..313abab 100644 --- a/libcloud/compute/drivers/openstack.py +++ b/libcloud/compute/drivers/openstack.py @@ -149,23 +149,43 @@ class OpenStackNodeDriver(NodeDriver, OpenStackDriverMixin): self.connection.request('/servers/detail', params=params).object) def create_volume(self, size, name, location=None, snapshot=None): + """ + Create a new volume. + + :param size: Size of volume in gigabytes (required) + :type size: ``int`` + + :param name: Name of the volume to be created + :type name: ``str`` + + :param location: Which data center to create a volume in. If + empty, undefined behavior will be selected. + (optional) + :type location: :class:`.NodeLocation` + + :param snapshot: Snapshot from which to create the new + volume. (optional) + :type snapshot: :class:`.VolumeSnapshot` + + :return: The newly created volume. + :rtype: :class:`StorageVolume` + """ + volume = { + 'display_name': name, + 'display_description': name, + 'size': size, + 'volume_type': None, + 'metadata': { + 'contents': name, + } + } + if snapshot: - raise NotImplementedError( - "create_volume does not yet support create from snapshot") + volume['snapshot_id'] = snapshot.id + resp = self.connection.request('/os-volumes', method='POST', - data={ - 'volume': { - 'display_name': name, - 'display_description': name, - 'size': size, - 'volume_type': None, - 'metadata': { - 'contents': name, - }, - 'availability_zone': location, - } - }) + data={'volume': volume}) return self._to_volume(resp.object) def destroy_volume(self, volume):
