Przeglądaj źródła

Implement simple VM actions

QubesOS/qubes-issues#853
Marek Marczykowski-Górecki 7 lat temu
rodzic
commit
61cb9887af

+ 75 - 0
qubesmgmt/tests/vm/actions.py

@@ -0,0 +1,75 @@
+# -*- 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 unittest
+
+import qubesmgmt.tests.vm
+
+
+class TC_00_Actions(qubesmgmt.tests.vm.VMTestCase):
+    def test_000_start(self):
+        self.app.expected_calls[
+            ('test-vm', 'mgmt.vm.Start', None, None)] = \
+            b'0\x00'
+        self.vm.start()
+        self.assertAllCalled()
+
+    def test_001_shutdown(self):
+        self.app.expected_calls[
+            ('test-vm', 'mgmt.vm.Shutdown', None, None)] = \
+            b'0\x00'
+        self.vm.shutdown()
+        self.assertAllCalled()
+
+    def test_002_kill(self):
+        self.app.expected_calls[
+            ('test-vm', 'mgmt.vm.Kill', None, None)] = \
+            b'0\x00'
+        self.vm.kill()
+        self.assertAllCalled()
+
+    def test_003_pause(self):
+        self.app.expected_calls[
+            ('test-vm', 'mgmt.vm.Pause', None, None)] = \
+            b'0\x00'
+        self.vm.pause()
+        self.assertAllCalled()
+
+    def test_004_unpause(self):
+        self.app.expected_calls[
+            ('test-vm', 'mgmt.vm.Unpause', None, None)] = \
+            b'0\x00'
+        self.vm.unpause()
+        self.assertAllCalled()
+
+    @unittest.skip('Not part of the mgmt API yet')
+    def test_005_suspend(self):
+        self.app.expected_calls[
+            ('test-vm', 'mgmt.vm.Suspend', None, None)] = \
+            b'0\x00'
+        self.vm.suspend()
+        self.assertAllCalled()
+
+    @unittest.skip('Not part of the mgmt API yet')
+    def test_006_resume(self):
+        self.app.expected_calls[
+            ('test-vm', 'mgmt.vm.Resume', None, None)] = \
+            b'0\x00'
+        self.vm.resume()
+        self.assertAllCalled()

+ 1 - 0
qubesmgmt/tests/vm/properties.py

@@ -144,6 +144,7 @@ class TC_01_SpecialCases(qubesmgmt.tests.vm.VMTestCase):
             ('test-vm', 'mgmt.vm.property.Set', 'name', b'test-vm2')] = \
             b'0\x00'
         self.vm.name = 'test-vm2'
+        # here should be no separate mgmt.vm.property.Get+name call
         self.assertEqual(self.vm.name, 'test-vm2')
         self.assertAllCalled()
 

+ 70 - 0
qubesmgmt/vm/__init__.py

@@ -28,6 +28,7 @@ class QubesVM(qubesmgmt.base.PropertyHolder):
 
     @property
     def name(self):
+        '''Domain name'''
         return self._method_dest
 
     @name.setter
@@ -39,3 +40,72 @@ class QubesVM(qubesmgmt.base.PropertyHolder):
             str(new_value).encode('utf-8'))
         self._method_dest = new_value
         self.app.domains.clear_cache()
+
+    def start(self):
+        '''
+        Start domain.
+
+        :return:
+        '''
+        self.qubesd_call(self._method_dest, 'mgmt.vm.Start')
+
+    def shutdown(self):
+        '''
+        Shutdown domain.
+
+        :return:
+        '''
+        # TODO: force parameter
+        # TODO: wait parameter (using event?)
+        self.qubesd_call(self._method_dest, 'mgmt.vm.Shutdown')
+
+    def kill(self):
+        '''
+        Kill domain (forcefuly shutdown).
+
+        :return:
+        '''
+        self.qubesd_call(self._method_dest, 'mgmt.vm.Kill')
+
+    def pause(self):
+        '''
+        Pause domain.
+
+        Pause its execution without any prior notification.
+
+        :return:
+        '''
+        self.qubesd_call(self._method_dest, 'mgmt.vm.Pause')
+
+    def unpause(self):
+        '''
+        Unpause domain.
+
+        Opposite to :py:meth:`pause`.
+
+        :return:
+        '''
+        self.qubesd_call(self._method_dest, 'mgmt.vm.Unpause')
+
+    def suspend(self):
+        '''
+        Suspend domain.
+
+        Give domain a chance to prepare for suspend - for example suspend
+        used PCI devices.
+
+        :return:
+        '''
+        raise NotImplementedError
+        #self.qubesd_call(self._method_dest, 'mgmt.vm.Suspend')
+
+    def resume(self):
+        '''
+        Resume domain.
+
+        Opposite to :py:meth:`suspend`.
+
+        :return:
+        '''
+        raise NotImplementedError
+        #self.qubesd_call(self._method_dest, 'mgmt.vm.Resume')