Skip to content

Commit 8344dad

Browse files
committed
Kill paused qubes on system shutdown
fixes: QubesOS/qubes-issues#8580
1 parent 68070df commit 8344dad

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

qubes/tests/__init__.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,6 +1233,19 @@ def shutdown_and_wait(self, vm, timeout=60):
12331233
del vm
12341234
self.fail("Timeout while waiting for VM {} shutdown".format(name))
12351235

1236+
def shutdown_paused(self, vm, timeout=60):
1237+
self.loop.run_until_complete(vm.pause())
1238+
with self.assertRaises(qubes.exc.QubesVMNotRunningError):
1239+
self.loop.run_until_complete(
1240+
vm.shutdown(wait=True, timeout=timeout, force=False))
1241+
try:
1242+
self.loop.run_until_complete(
1243+
vm.shutdown(wait=True, timeout=timeout, force=True))
1244+
except qubes.exc.QubesException:
1245+
name = vm.name
1246+
del vm
1247+
self.fail("Timeout while waiting for VM {} shutdown".format(name))
1248+
12361249
def prepare_hvm_system_linux(self, vm, init_script, extra_files=None):
12371250
if not os.path.exists('/usr/lib/grub/i386-pc'):
12381251
self.skipTest('grub2 not installed')

qubes/tests/integ/basic.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,15 @@ def test_204_udev_block_exclude_custom_file(self):
353353
pool=pool))
354354
self.assertVolumesExcludedFromUdev(self.vm)
355355

356+
def test_206_shutdown_paused(self):
357+
vmname = self.make_vm_name('vm')
358+
self.vm = self.app.add_new_vm(qubes.vm.appvm.AppVM,
359+
name=vmname, template=self.app.default_template,
360+
label='red')
361+
self.loop.run_until_complete(self.vm.create_on_disk())
362+
self.loop.run_until_complete(self.vm.start())
363+
self.shutdown_paused(self.vm)
364+
356365

357366
class TC_01_Properties(qubes.tests.SystemTestCase):
358367
# pylint: disable=attribute-defined-outside-init

qubes/vm/qubesvm.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1382,10 +1382,17 @@ async def shutdown(self, force=False, wait=False, timeout=None):
13821382
await self.fire_event_async('domain-pre-shutdown',
13831383
pre_event=True, force=force)
13841384

1385+
if self.is_paused() and not force:
1386+
raise qubes.exc.QubesVMNotRunningError(self)
1387+
13851388
if self.__waiter is None:
13861389
self.__waiter = asyncio.get_running_loop().create_future()
13871390
waiter = self.__waiter
1388-
self.libvirt_domain.shutdown()
1391+
1392+
if self.is_paused():
1393+
self.libvirt_domain.destroy()
1394+
else:
1395+
self.libvirt_domain.shutdown()
13891396

13901397
if wait:
13911398
if timeout is None:

0 commit comments

Comments
 (0)