storage/callback: enforce CallbackPool as the pool attribute of delegated volumes

This fixes a bug preventing the use of the callback pool driver
with disposable VMs.
This commit is contained in:
3hhh 2020-07-05 16:32:47 +02:00
parent caddc1c499
commit 178d4dd997
No known key found for this signature in database
GPG Key ID: EB03A691DB2F0833

View File

@ -96,6 +96,18 @@ class CallbackPool(qubes.storage.Pool):
qvm-pool -r test && sudo rm -rf /mnt/test02 qvm-pool -r test && sudo rm -rf /mnt/test02
less /tmp/callback.log (2x on_volume_stop, 2x on_volume_remove, on_destroy should be added) less /tmp/callback.log (2x on_volume_stop, 2x on_volume_remove, on_destroy should be added)
qvm-pool -o conf_id=testing-succ-file-02 -a test callback
qvm-create -l red -P test test-dvm
qvm-prefs test-dvm template_for_dispvms True
qvm-run --dispvm test-dvm xterm
grep -E 'test-dvm|disp' /var/lib/qubes/qubes.xml
qvm-volume | grep -E 'test-dvm|disp' (unexpected by most users: Qubes OS only places the private volume on the pool, cf. #5933)
ls /mnt/test02/appvms/
cat /tmp/callback.log
#close the disposable VM
qvm-remove test-dvm
qvm-pool -r test
qvm-pool -o conf_id=testing-succ-file-03 -a test callback qvm-pool -o conf_id=testing-succ-file-03 -a test callback
qvm-pool qvm-pool
ls /mnt/test03 ls /mnt/test03
@ -135,7 +147,8 @@ class CallbackPool(qubes.storage.Pool):
sudo cryptsetup status test-eph sudo cryptsetup status test-eph
qvm-create -l red -P teph test-eph (should execute two on_volume_create callbacks) qvm-create -l red -P teph test-eph (should execute two on_volume_create callbacks)
qvm-volume | grep test-eph qvm-volume | grep test-eph
ls /mnt/test_eph/appvms ls /mnt/test_eph/appvms (should have private.img and volatile.img)
ls /var/lib/qubes/appvms/test-eph (should only have the icon)
qvm-start test-eph qvm-start test-eph
#reboot #reboot
ls /mnt/ram (should be empty) ls /mnt/ram (should be empty)
@ -343,7 +356,9 @@ class CallbackPool(qubes.storage.Pool):
return ret return ret
def init_volume(self, vm, volume_config): def init_volume(self, vm, volume_config):
return CallbackVolume(self, self._cb_impl.init_volume(vm, volume_config)) ret = CallbackVolume(self, self._cb_impl.init_volume(vm, volume_config))
volume_config['pool'] = self
return ret
@asyncio.coroutine @asyncio.coroutine
def setup(self): def setup(self):
@ -417,6 +432,7 @@ class CallbackVolume:
''' '''
assert isinstance(impl, qubes.storage.Volume), 'impl must be a qubes.storage.Volume instance. Found a %s instance.' % impl.__class__ assert isinstance(impl, qubes.storage.Volume), 'impl must be a qubes.storage.Volume instance. Found a %s instance.' % impl.__class__
assert isinstance(pool, CallbackPool), 'pool must use a qubes.storage.CallbackPool instance. Found a %s instance.' % pool.__class__ assert isinstance(pool, CallbackPool), 'pool must use a qubes.storage.CallbackPool instance. Found a %s instance.' % pool.__class__
impl.pool = pool #enforce the CallbackPool instance as the parent pool of the volume
self._cb_pool = pool #: CallbackPool instance the Volume belongs to. self._cb_pool = pool #: CallbackPool instance the Volume belongs to.
self._cb_impl = impl #: Backend volume implementation instance. self._cb_impl = impl #: Backend volume implementation instance.