Add ThinPool.resize()

This commit is contained in:
Bahtiar `kalkin-` Gadimov 2016-08-28 20:06:11 +02:00
parent 53c8324f17
commit 0561dfce60
No known key found for this signature in database
GPG Key ID: 96ED3C3BA19C3DEE
2 changed files with 50 additions and 3 deletions

View File

@ -192,6 +192,26 @@ class ThinPool(qubes.storage.Pool):
qubes_lvm(cmd, self.log)
return volume
def resize(self, volume, size):
''' Expands volume, throws
:py:class:`qubst.storage.qubes.storage.StoragePoolException` if
given size is less than current_size
'''
if not volume.rw:
msg = 'Can not resize reađonly volume {!s}'.format(volume)
raise qubes.storage.StoragePoolException(msg)
if size <= volume.size:
raise qubes.storage.StoragePoolException(
'For your own safety, shrinking of %s is'
' disabled. If you really know what you'
' are doing, use `truncate` on %s manually.' %
(volume.name, volume.vid))
cmd = ['extend', volume.vid, str(size)]
qubes_lvm(cmd, self.log)
volume.size += size
def _reset(self, volume):
try:
self.remove(volume)

View File

@ -127,6 +127,21 @@ def rename_volume(old_name, new_name):
return new_name
def extend_volume(args):
''' Extends an existing lvm volume. Note this works on any lvm volume not
only thin volumes.
'''
vid = args.name
size = int(args.size) / ( 1000 * 1000)
log.debug("Extending LVM %s to %s", vid, size)
cmd = ["lvextend", "-L+%s" % size, vid]
log.debug(cmd)
retcode = subprocess.call(cmd)
if retcode != 0:
raise IOError("Error extending LVM %s to %s " % (vid, size))
return 0
def init_pool_parser(sub_parsers):
''' Initialize pool subparser '''
pool_parser = sub_parsers.add_parser(
@ -219,6 +234,17 @@ def init_remove_parser(sub_parsers):
remove_parser.set_defaults(func=remove_volume)
def init_extend_parser(sub_parsers):
''' Initialize extend subparser '''
extend_parser = sub_parsers.add_parser('extend',
help='extends a LogicalVolume')
extend_parser.add_argument('name', metavar='VG/VID',
help='volume_group/volume_name')
extend_parser.set_defaults(func=extend_volume)
extend_parser.add_argument(
'size', help='size in bytes of the new ThinPoolLogicalVolume')
def get_parser():
'''Create :py:class:`argparse.ArgumentParser` suitable for
:program:`qubes-lvm`.
@ -230,12 +256,13 @@ def get_parser():
title='commands',
description="For more information see qubes-lvm command -h",
dest='command')
init_pool_parser(sub_parsers)
init_clone_parser(sub_parsers)
init_extend_parser(sub_parsers)
init_import_parser(sub_parsers)
init_new_parser(sub_parsers)
init_volumes_parser(sub_parsers)
init_pool_parser(sub_parsers)
init_remove_parser(sub_parsers)
init_clone_parser(sub_parsers)
init_volumes_parser(sub_parsers)
return parser