summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIsaku Yamahata <yamahata@valinux.co.jp>2011-05-13 23:08:57 +0900
committerIsaku Yamahata <yamahata@valinux.co.jp>2011-05-13 23:08:57 +0900
commitbbbea57cf6ab28c3ad1081041275e0d6d2bbd308 (patch)
tree23a5d1ea88de9d7d45e2e71f667126f398bfd478
parent321d724df5f0c4ca008da2a08ef279ca18df0733 (diff)
downloadnova-bbbea57cf6ab28c3ad1081041275e0d6d2bbd308.tar.gz
nova-bbbea57cf6ab28c3ad1081041275e0d6d2bbd308.tar.xz
nova-bbbea57cf6ab28c3ad1081041275e0d6d2bbd308.zip
volume/driver: factor out lvm opration
Factor out lvm operation for implementing basic snapshot later.
-rw-r--r--nova/volume/driver.py62
1 files changed, 34 insertions, 28 deletions
diff --git a/nova/volume/driver.py b/nova/volume/driver.py
index ba0a7efef..ec7be37bf 100644
--- a/nova/volume/driver.py
+++ b/nova/volume/driver.py
@@ -90,37 +90,47 @@ class VolumeDriver(object):
raise exception.Error(_("volume group %s doesn't exist")
% FLAGS.volume_group)
- def create_volume(self, volume):
- """Creates a logical volume. Can optionally return a Dictionary of
- changes to the volume object to be persisted."""
- if int(volume['size']) == 0:
- sizestr = '100M'
- else:
- sizestr = '%sG' % volume['size']
+ def _create_volume(self, volume_name, sizestr):
self._try_execute('sudo', 'lvcreate', '-L', sizestr, '-n',
- volume['name'],
- FLAGS.volume_group)
-
- def delete_volume(self, volume):
- """Deletes a logical volume."""
+ volume_name, FLAGS.volume_group)
+
+ def _copy_volume(self, srcstr, deststr, size_in_g):
+ self._execute('sudo', 'dd', 'if=%s' % srcstr, 'of=%s' % deststr,
+ 'count=%d' % (size_in_g * 1024), 'bs=1M')
+
+ def _volume_not_present(self, volume_name):
+ path_name = '%s/%s' % (FLAGS.volume_group, volume_name)
try:
- self._try_execute('sudo', 'lvdisplay',
- '%s/%s' %
- (FLAGS.volume_group,
- volume['name']))
+ self._try_execute('sudo', 'lvdisplay', path_name)
except Exception as e:
- # If the volume isn't present, then don't attempt to delete
+ # If the volume isn't present
return True
+ return False
+ def _delete_volume(self, volume, size_in_g):
+ """Deletes a logical volume."""
# zero out old volumes to prevent data leaking between users
# TODO(ja): reclaiming space should be done lazy and low priority
- self._execute('sudo', 'dd', 'if=/dev/zero',
- 'of=%s' % self.local_path(volume),
- 'count=%d' % (volume['size'] * 1024),
- 'bs=1M')
+ self._copy_volume('/dev/zero', self.local_path(volume), size_in_g)
self._try_execute('sudo', 'lvremove', '-f', "%s/%s" %
- (FLAGS.volume_group,
- volume['name']))
+ (FLAGS.volume_group, volume['name']))
+
+ def _sizestr(self, size_in_g):
+ if int(size_in_g) == 0:
+ return '100M'
+ return '%sG' % size_in_g
+
+ def create_volume(self, volume):
+ """Creates a logical volume. Can optionally return a Dictionary of
+ changes to the volume object to be persisted."""
+ self._create_volume(volume['name'], self._sizestr(volume['size']))
+
+ def delete_volume(self, volume):
+ """Deletes a logical volume."""
+ if self._volume_not_present(volume['name']):
+ # If the volume isn't present, then don't attempt to delete
+ return True
+ self._delete_volume(volume, volume['size'])
def create_snapshot(self, snapshot):
"""Creates a snapshot."""
@@ -608,13 +618,9 @@ class SheepdogDriver(VolumeDriver):
def create_volume(self, volume):
"""Creates a sheepdog volume"""
- if int(volume['size']) == 0:
- sizestr = '100M'
- else:
- sizestr = '%sG' % volume['size']
self._try_execute('qemu-img', 'create',
"sheepdog:%s" % volume['name'],
- sizestr)
+ self._sizestr(volume['size']))
def delete_volume(self, volume):
"""Deletes a logical volume"""