From b6d06d856d4970a85be53031eda818aaf55a2d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Sun, 16 Apr 2017 03:20:48 +0200 Subject: [PATCH] tools: qvm-start The tool and tests for it. --- qubesmgmt/tests/tools/qvm_start.py | 67 ++++++++++++++++++++++++++++++ qubesmgmt/tools/qvm_start.py | 58 ++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 qubesmgmt/tests/tools/qvm_start.py create mode 100644 qubesmgmt/tools/qvm_start.py diff --git a/qubesmgmt/tests/tools/qvm_start.py b/qubesmgmt/tests/tools/qvm_start.py new file mode 100644 index 0000000..ef15cb9 --- /dev/null +++ b/qubesmgmt/tests/tools/qvm_start.py @@ -0,0 +1,67 @@ +# -*- encoding: utf8 -*- +# +# The Qubes OS Project, http://www.qubes-os.org +# +# Copyright (C) 2017 Marek Marczykowski-Górecki +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this program; if not, see . + +import qubesmgmt.tests +import qubesmgmt.tests.tools +import qubesmgmt.tools.qvm_start + + +class TC_00_qvm_start(qubesmgmt.tests.QubesTestCase): + def test_000_with_vm(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Start', None, None)] = b'0\x00' + qubesmgmt.tools.qvm_start.main(['some-vm'], app=self.app) + self.assertAllCalled() + + def test_001_missing_vm(self): + with self.assertRaises(SystemExit): + with qubesmgmt.tests.tools.StderrBuffer() as stderr: + qubesmgmt.tools.qvm_start.main([], app=self.app) + self.assertIn('one of the arguments --all VMNAME is required', + stderr.getvalue()) + self.assertAllCalled() + + def test_002_invalid_vm(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + with self.assertRaises(SystemExit): + with qubesmgmt.tests.tools.StderrBuffer() as stderr: + qubesmgmt.tools.qvm_start.main(['no-such-vm'], app=self.app) + self.assertIn('no such domain', stderr.getvalue()) + self.assertAllCalled() + + def test_003_already_running(self): + # TODO: some option to ignore this error? + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Start', None, None)] = \ + b'2\x00QubesVMNotHaltedError\x00\x00Domain is running: ' \ + b'some-vm\x00' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + self.assertEqual( + qubesmgmt.tools.qvm_start.main(['some-vm'], app=self.app), + 1) + self.assertAllCalled() + diff --git a/qubesmgmt/tools/qvm_start.py b/qubesmgmt/tools/qvm_start.py new file mode 100644 index 0000000..9a5ae85 --- /dev/null +++ b/qubesmgmt/tools/qvm_start.py @@ -0,0 +1,58 @@ +# -*- encoding: utf8 -*- +# +# The Qubes OS Project, http://www.qubes-os.org +# +# Copyright (C) 2017 Marek Marczykowski-Górecki +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this program; if not, see . + +'''qvm-start - start a domain''' + + +import sys +import qubesmgmt.exc +import qubesmgmt.tools + +parser = qubesmgmt.tools.QubesArgumentParser( + description='start a domain', vmname_nargs='+') + +parser.add_argument('--skip-if-running', + action='store_true', default=False, + help='Do not fail if the qube is already runnning') + +def main(args=None, app=None): + '''Main routine of :program:`qvm-start`. + + :param list args: Optional arguments to override those delivered from \ + command line. + ''' + + args = parser.parse_args(args, app=app) + + exit_code = 0 + for domain in args.domains: + if args.skip_if_running and domain.is_running(): + continue + try: + domain.start() + except (IOError, OSError, qubesmgmt.exc.QubesException) as e: + exit_code = 1 + parser.print_error(str(e)) + + return exit_code + + +if __name__ == '__main__': + sys.exit(main())