From b8d1884cb12f9d8a0075fc62853f9c731cba0855 Mon Sep 17 00:00:00 2001 From: Pawel Marczewski Date: Fri, 31 Jan 2020 11:16:11 +0100 Subject: [PATCH 1/2] qvm-kill: ignore already off domains See QubesOS/qubes-issues#5607. --- qubesadmin/tests/tools/qvm_kill.py | 5 ++--- qubesadmin/tools/qvm_kill.py | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qubesadmin/tests/tools/qvm_kill.py b/qubesadmin/tests/tools/qvm_kill.py index d9419e0..b88a7fb 100644 --- a/qubesadmin/tests/tools/qvm_kill.py +++ b/qubesadmin/tests/tools/qvm_kill.py @@ -1,4 +1,4 @@ -# -*- encoding: utf8 -*- +# -*- encoding: utf-8 -*- # # The Qubes OS Project, http://www.qubes-os.org # @@ -52,7 +52,6 @@ class TC_00_qvm_kill(qubesadmin.tests.QubesTestCase): self.assertAllCalled() def test_003_not_running(self): - # TODO: some option to ignore this error? self.app.expected_calls[ ('some-vm', 'admin.vm.Kill', None, None)] = \ b'2\x00QubesVMNotStartedError\x00\x00Domain is powered off: ' \ @@ -62,6 +61,6 @@ class TC_00_qvm_kill(qubesadmin.tests.QubesTestCase): b'0\x00some-vm class=AppVM state=Halted\n' self.assertEqual( qubesadmin.tools.qvm_kill.main(['some-vm'], app=self.app), - 1) + 0) self.assertAllCalled() diff --git a/qubesadmin/tools/qvm_kill.py b/qubesadmin/tools/qvm_kill.py index 9bba46d..c1e5bd7 100644 --- a/qubesadmin/tools/qvm_kill.py +++ b/qubesadmin/tools/qvm_kill.py @@ -28,7 +28,6 @@ import qubesadmin.tools parser = qubesadmin.tools.QubesArgumentParser( description='forceful shutdown of a domain', vmname_nargs='+') - def main(args=None, app=None): '''Main routine of :program:`qvm-kill`. @@ -42,6 +41,8 @@ def main(args=None, app=None): for domain in args.domains: try: domain.kill() + except qubesadmin.exc.QubesVMNotStartedError: + pass except (IOError, OSError, qubesadmin.exc.QubesException) as e: exit_code = 1 parser.print_error(str(e)) From bcb91594b2cb1d305391426220f7d4fe7866555c Mon Sep 17 00:00:00 2001 From: Pawel Marczewski Date: Fri, 31 Jan 2020 11:25:31 +0100 Subject: [PATCH 2/2] qvm-kill: make error message more clear See QubesOS/qubes-issues#5607. --- qubesadmin/tests/tools/qvm_kill.py | 14 ++++++++++++++ qubesadmin/tools/qvm_kill.py | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/qubesadmin/tests/tools/qvm_kill.py b/qubesadmin/tests/tools/qvm_kill.py index b88a7fb..3309bbf 100644 --- a/qubesadmin/tests/tools/qvm_kill.py +++ b/qubesadmin/tests/tools/qvm_kill.py @@ -64,3 +64,17 @@ class TC_00_qvm_kill(qubesadmin.tests.QubesTestCase): 0) self.assertAllCalled() + def test_004_other_error(self): + self.app.expected_calls[ + ('some-vm', 'admin.vm.Kill', None, None)] = \ + b'2\x00QubesVMError\x00\x00Error message\x00' + self.app.expected_calls[ + ('dom0', 'admin.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + with qubesadmin.tests.tools.StderrBuffer() as stderr: + self.assertEqual( + qubesadmin.tools.qvm_kill.main(['some-vm'], app=self.app), + 1) + self.assertAllCalled() + self.assertIn("Failed to kill 'some-vm': Error message", + stderr.getvalue()) diff --git a/qubesadmin/tools/qvm_kill.py b/qubesadmin/tools/qvm_kill.py index c1e5bd7..88dd6d5 100644 --- a/qubesadmin/tools/qvm_kill.py +++ b/qubesadmin/tools/qvm_kill.py @@ -45,7 +45,8 @@ def main(args=None, app=None): pass except (IOError, OSError, qubesadmin.exc.QubesException) as e: exit_code = 1 - parser.print_error(str(e)) + parser.print_error("Failed to kill '{}': {}".format( + domain.name, e)) return exit_code