Fix ThinPool revision handling
This commit is contained in:
parent
f3072e7dd0
commit
824c359319
@ -34,50 +34,39 @@ class ThinPool(qubes.storage.Pool):
|
|||||||
|
|
||||||
driver = 'lvm_thin'
|
driver = 'lvm_thin'
|
||||||
|
|
||||||
def __init__(self, volume_group, thin_pool, **kwargs):
|
def __init__(self, volume_group, thin_pool, revisions_to_keep=1, **kwargs):
|
||||||
super(ThinPool, self).__init__(**kwargs)
|
super(ThinPool, self).__init__(revisions_to_keep=revisions_to_keep,
|
||||||
|
**kwargs)
|
||||||
self.volume_group = volume_group
|
self.volume_group = volume_group
|
||||||
self.thin_pool = thin_pool
|
self.thin_pool = thin_pool
|
||||||
self._pool_id = "{!s}/{!s}".format(volume_group, thin_pool)
|
self._pool_id = "{!s}/{!s}".format(volume_group, thin_pool)
|
||||||
self.log = logging.getLogger('qube.storage.lvm.%s' % self._pool_id)
|
self.log = logging.getLogger('qube.storage.lvm.%s' % self._pool_id)
|
||||||
|
|
||||||
def backup(self, volume):
|
|
||||||
msg = "Expected volume_type 'snap' got {!s}"
|
|
||||||
msg = msg.format(volume.volume_type)
|
|
||||||
assert volume.volume_type == 'snap', msg
|
|
||||||
cmd = ['remove', volume.vid + "-back"]
|
|
||||||
qubes_lvm(cmd, self.log)
|
|
||||||
cmd = ['clone', volume.vid, volume.vid + "-back"]
|
|
||||||
qubes_lvm(cmd, self.log)
|
|
||||||
volume.backups = [volume.vid + "-back"]
|
|
||||||
return volume
|
|
||||||
|
|
||||||
def clone(self, source, target):
|
def clone(self, source, target):
|
||||||
cmd = ['clone', source.vid, target.vid]
|
cmd = ['clone', source.vid, target.vid]
|
||||||
qubes_lvm(cmd, self.log)
|
qubes_lvm(cmd, self.log)
|
||||||
return target
|
return target
|
||||||
|
|
||||||
def commit(self, volume):
|
def _commit(self, volume):
|
||||||
msg = "Expected rw:True & volume_type 'snap' got {!s} & rw:{!s}"
|
msg = "Trying to commit {!s}, but it has save_on_stop == False"
|
||||||
msg = msg.format(volume.volume_type, volume.rw)
|
msg = msg.format(volume)
|
||||||
assert volume.volume_type == 'snap' and volume.rw, msg
|
assert volume.save_on_stop, msg
|
||||||
assert volume.path.endswith("-snap")
|
|
||||||
self.backup(volume)
|
msg = "Trying to commit {!s}, but it has rw == False"
|
||||||
cmd = ['remove', volume.vid]
|
msg = msg.format(volume)
|
||||||
qubes_lvm(cmd, self.log)
|
assert volume.rw, msg
|
||||||
cmd = ['clone', volume.path, volume.vid]
|
assert hasattr(volume, '_vid_snap')
|
||||||
qubes_lvm(cmd, self.log)
|
|
||||||
|
|
||||||
def _backup(self, volume):
|
|
||||||
msg = "Expected volume_type 'snap' got {!s}"
|
|
||||||
msg = msg.format(volume.volume_type)
|
|
||||||
assert volume.volume_type == 'snap', msg
|
|
||||||
cmd = ['remove', volume.vid + "-back"]
|
cmd = ['remove', volume.vid + "-back"]
|
||||||
qubes_lvm(cmd, self.log)
|
qubes_lvm(cmd, self.log)
|
||||||
cmd = ['clone', volume.vid, volume.vid + "-back"]
|
cmd = ['clone', volume._vid_snap, volume.vid + "-back"]
|
||||||
qubes_lvm(cmd, self.log)
|
qubes_lvm(cmd, self.log)
|
||||||
volume.backups = [volume.vid + "-back"]
|
|
||||||
return 'XXX'
|
cmd = ['remove', volume.vid]
|
||||||
|
qubes_lvm(cmd, self.log)
|
||||||
|
cmd = ['clone', volume._vid_snap, volume.vid]
|
||||||
|
qubes_lvm(cmd, self.log)
|
||||||
|
cmd = ['remove', volume._vid_snap]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def config(self):
|
def config(self):
|
||||||
@ -188,6 +177,18 @@ class ThinPool(qubes.storage.Pool):
|
|||||||
volume._vid_snap = volume.vid + '-snap'
|
volume._vid_snap = volume.vid + '-snap'
|
||||||
return volume
|
return volume
|
||||||
|
|
||||||
|
def revert(self, volume, revision=None):
|
||||||
|
old_path = volume.path + '-back'
|
||||||
|
if not os.path.exists(old_path):
|
||||||
|
msg = "Volume {!s} has no {!s}".format(volume, old_path)
|
||||||
|
raise qubes.storage.StoragePoolException(msg)
|
||||||
|
|
||||||
|
cmd = ['remove', volume.vid]
|
||||||
|
qubes_lvm(cmd, self.log)
|
||||||
|
cmd = ['clone', volume.vid + '-back', volume.vid]
|
||||||
|
qubes_lvm(cmd, self.log)
|
||||||
|
return volume
|
||||||
|
|
||||||
def _reset(self, volume):
|
def _reset(self, volume):
|
||||||
self.remove(volume)
|
self.remove(volume)
|
||||||
self.create(volume)
|
self.create(volume)
|
||||||
@ -208,18 +209,15 @@ class ThinPool(qubes.storage.Pool):
|
|||||||
|
|
||||||
def stop(self, volume):
|
def stop(self, volume):
|
||||||
if volume.save_on_stop:
|
if volume.save_on_stop:
|
||||||
cmd = ['remove', volume.vid]
|
self._commit(volume)
|
||||||
qubes_lvm(cmd, self.log)
|
|
||||||
cmd = ['clone', volume._vid_snap, volume.vid]
|
if volume._is_volatile:
|
||||||
qubes_lvm(cmd, self.log)
|
|
||||||
cmd = ['remove', volume._vid_snap]
|
|
||||||
qubes_lvm(cmd, self.log)
|
|
||||||
elif volume._is_volatile:
|
|
||||||
cmd = ['remove', volume.vid]
|
cmd = ['remove', volume.vid]
|
||||||
qubes_lvm(cmd, self.log)
|
qubes_lvm(cmd, self.log)
|
||||||
else:
|
else:
|
||||||
cmd = ['remove', volume._vid_snap]
|
cmd = ['remove', volume._vid_snap]
|
||||||
qubes_lvm(cmd, self.log)
|
qubes_lvm(cmd, self.log)
|
||||||
|
return volume
|
||||||
|
|
||||||
def _snapshot(self, volume):
|
def _snapshot(self, volume):
|
||||||
if volume.source is None:
|
if volume.source is None:
|
||||||
@ -299,6 +297,11 @@ class ThinVolume(qubes.storage.Volume):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def revisions(self):
|
def revisions(self):
|
||||||
|
path = self.path + '-back'
|
||||||
|
if os.path.exists(path):
|
||||||
|
seconds = os.path.getctime(path)
|
||||||
|
iso_date = qubes.storage.isodate(seconds).split('.', 1)[0]
|
||||||
|
return {iso_date: path}
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
Loading…
Reference in New Issue
Block a user