tools: qvm-start
The tool and tests for it.
This commit is contained in:
		
							parent
							
								
									8f7b902034
								
							
						
					
					
						commit
						b6d06d856d
					
				
							
								
								
									
										67
									
								
								qubesmgmt/tests/tools/qvm_start.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								qubesmgmt/tests/tools/qvm_start.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | |||||||
|  | # -*- encoding: utf8 -*- | ||||||
|  | # | ||||||
|  | # The Qubes OS Project, http://www.qubes-os.org | ||||||
|  | # | ||||||
|  | # Copyright (C) 2017 Marek Marczykowski-Górecki | ||||||
|  | #                               <marmarek@invisiblethingslab.com> | ||||||
|  | # | ||||||
|  | # 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 <http://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | 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() | ||||||
|  | 
 | ||||||
							
								
								
									
										58
									
								
								qubesmgmt/tools/qvm_start.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								qubesmgmt/tools/qvm_start.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | |||||||
|  | # -*- encoding: utf8 -*- | ||||||
|  | # | ||||||
|  | # The Qubes OS Project, http://www.qubes-os.org | ||||||
|  | # | ||||||
|  | # Copyright (C) 2017 Marek Marczykowski-Górecki | ||||||
|  | #                               <marmarek@invisiblethingslab.com> | ||||||
|  | # | ||||||
|  | # 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 <http://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | '''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()) | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki