From f1ff6c26d8721b06be69fa37af37290067e060e5 Mon Sep 17 00:00:00 2001 From: Pawel Marczewski Date: Tue, 21 Jan 2020 15:34:24 +0100 Subject: [PATCH] Move devices check to on_domain_pre_deleted --- qubes/api/admin.py | 8 -------- qubes/app.py | 9 +++++++++ qubes/tests/app.py | 9 +++++++++ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/qubes/api/admin.py b/qubes/api/admin.py index 1e407dc1..17a3ecd8 100644 --- a/qubes/api/admin.py +++ b/qubes/api/admin.py @@ -1201,14 +1201,6 @@ class QubesAdminAPI(qubes.api.AbstractQubesAPI): if not self.dest.is_halted(): raise qubes.exc.QubesVMNotHaltedError(self.dest) - assignments = self.dest.get_provided_assignments() - if assignments: - desc = ', '.join( - assignment.ident for assignment in assignments) - raise qubes.exc.QubesVMInUseError(self.dest, - 'VM has devices attached persistently to other VMs: ' + - desc) - if self.dest.installed_by_rpm: raise qubes.exc.QubesVMInUseError(self.dest, "VM installed by package manager: " + self.dest.name) diff --git a/qubes/app.py b/qubes/app.py index c8e875b2..c14d1f60 100644 --- a/qubes/app.py +++ b/qubes/app.py @@ -1462,6 +1462,15 @@ class Qubes(qubes.PropertyHolder): except AttributeError: pass + assignments = vm.get_provided_assignments() + if assignments: + desc = ', '.join( + assignment.ident for assignment in assignments) + raise qubes.exc.QubesVMInUseError( + vm, + 'VM has devices attached persistently to other VMs: ' + + desc) + @qubes.events.handler('domain-delete') def on_domain_deleted(self, event, vm): # pylint: disable=unused-argument diff --git a/qubes/tests/app.py b/qubes/tests/app.py index 551abfa1..eceb62ee 100644 --- a/qubes/tests/app.py +++ b/qubes/tests/app.py @@ -673,6 +673,15 @@ class TC_90_Qubes(qubes.tests.QubesTestCase): with self.assertRaises(qubes.exc.QubesVMInUseError): del self.app.domains[appvm] + def test_206_remove_attached(self): + # See also qubes.tests.api_admin. + vm = self.app.add_new_vm( + 'AppVM', name='test-vm', template=self.template, label='red') + assignment = mock.Mock(ident='1234') + vm.get_provided_assignments = lambda: [assignment] + with self.assertRaises(qubes.exc.QubesVMInUseError): + del self.app.domains[vm] + @qubes.tests.skipUnlessGit def test_900_example_xml_in_doc(self): self.assertXMLIsValid(