Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/pr/124'

* origin/pr/124:
  Add missing docstrings
  Add a test for vm.get_mem()
  Update tests to mock admin.vm.CurrentState
  qvm-ls: display memory as integer number
  Use admin.vm.CurrentState method for power state and memory

Fixes QubesOS/qubes-issues#5166
Marek Marczykowski-Górecki 4 rokov pred
rodič
commit
31db7ecbc0

+ 4 - 4
qubesadmin/tests/app.py

@@ -916,11 +916,11 @@ class TC_30_QubesRemote(unittest.TestCase):
 
     @mock.patch('os.isatty', lambda fd: fd == 2)
     def test_014_run_service_no_autostart1(self):
-        self.set_proc_stdout( b'0\x00some-vm class=AppVM state=Running\n')
+        self.set_proc_stdout( b'0\x00power_state=Running')
         self.app.run_service('some-vm', 'service.name', autostart=False)
         self.proc_mock.assert_has_calls([
             call([qubesadmin.config.QREXEC_CLIENT_VM,
-                  'some-vm', 'admin.vm.List'],
+                  'some-vm', 'admin.vm.CurrentState'],
                  stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                  stderr=subprocess.PIPE),
             call().communicate(None),
@@ -932,11 +932,11 @@ class TC_30_QubesRemote(unittest.TestCase):
 
     @mock.patch('os.isatty', lambda fd: fd == 2)
     def test_015_run_service_no_autostart2(self):
-        self.set_proc_stdout( b'0\x00some-vm class=AppVM state=Halted\n')
+        self.set_proc_stdout( b'0\x00power_state=Halted')
         with self.assertRaises(qubesadmin.exc.QubesVMNotRunningError):
             self.app.run_service('some-vm', 'service.name', autostart=False)
         self.proc_mock.assert_called_once_with([
             qubesadmin.config.QREXEC_CLIENT_VM,
-            'some-vm', 'admin.vm.List'],
+            'some-vm', 'admin.vm.CurrentState'],
             stdin=subprocess.PIPE, stdout=subprocess.PIPE,
             stderr=subprocess.PIPE)

+ 21 - 21
qubesadmin/tests/tools/qvm_check.py

@@ -1,4 +1,4 @@
-# -*- encoding: utf8 -*-
+# -*- encoding: utf-8 -*-
 #
 # The Qubes OS Project, http://www.qubes-os.org
 #
@@ -71,8 +71,8 @@ class TC_00_qvm_check(qubesadmin.tests.QubesTestCase):
             b'some-vm2 class=AppVM state=Running\n' \
             b'some-vm3 class=AppVM state=Halted\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Running\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         with self.assertLogs() as logger:
             self.assertEqual(
                 qubesadmin.tools.qvm_check.main(['--running', 'some-vm'],
@@ -87,11 +87,11 @@ class TC_00_qvm_check(qubesadmin.tests.QubesTestCase):
             b'some-vm2 class=AppVM state=Running\n' \
             b'some-vm3 class=AppVM state=Halted\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Running\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('some-vm2', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm2 class=AppVM state=Running\n'
+            ('some-vm2', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         with self.assertLogs() as logger:
             self.assertEqual(qubesadmin.tools.qvm_check.main(
                 ['--running', 'some-vm', 'some-vm2'], app=self.app), 0)
@@ -107,14 +107,14 @@ class TC_00_qvm_check(qubesadmin.tests.QubesTestCase):
             b'some-vm2 class=AppVM state=Running\n' \
             b'some-vm3 class=AppVM state=Halted\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Running\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('some-vm2', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm2 class=AppVM state=Running\n'
+            ('some-vm2', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('some-vm3', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm3 class=AppVM state=Halted\n'
+            ('some-vm3', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         with self.assertLogs() as logger:
             self.assertEqual(
                 qubesadmin.tools.qvm_check.main(['--running', '--all'],
@@ -131,8 +131,8 @@ class TC_00_qvm_check(qubesadmin.tests.QubesTestCase):
             b'some-vm2 class=AppVM state=Running\n' \
             b'some-vm3 class=AppVM state=Halted\n'
         self.app.expected_calls[
-            ('some-vm3', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm3 class=AppVM state=Halted\n'
+            ('some-vm3', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         with self.assertLogs() as logger:
             self.assertEqual(
                 qubesadmin.tools.qvm_check.main(['--running', 'some-vm3'],
@@ -148,8 +148,8 @@ class TC_00_qvm_check(qubesadmin.tests.QubesTestCase):
             b'some-vm2 class=AppVM state=Paused\n' \
             b'some-vm3 class=AppVM state=Halted\n'
         self.app.expected_calls[
-            ('some-vm2', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm2 class=AppVM state=Paused\n'
+            ('some-vm2', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Paused'
         with self.assertLogs() as logger:
             self.assertEqual(
                 qubesadmin.tools.qvm_check.main(['--paused', 'some-vm2'],
@@ -164,11 +164,11 @@ class TC_00_qvm_check(qubesadmin.tests.QubesTestCase):
             b'some-vm2 class=AppVM state=Paused\n' \
             b'some-vm3 class=AppVM state=Halted\n'
         self.app.expected_calls[
-            ('some-vm2', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm2 class=AppVM state=Paused\n'
+            ('some-vm2', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Paused'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Running\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         with self.assertLogs() as logger:
             self.assertEqual(qubesadmin.tools.qvm_check.main(
                 ['--paused', 'some-vm2', 'some-vm'], app=self.app), 3)

+ 10 - 10
qubesadmin/tests/tools/qvm_ls.py

@@ -279,14 +279,14 @@ class TC_90_List_with_qubesd_calls(qubesadmin.tests.QubesTestCase):
             b'template1 class=TemplateVM state=Halted\n' \
             b'sys-net class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('vm1', 'admin.vm.List', None, None)] = \
-            b'0\x00vm1 class=AppVM state=Running\n'
+            ('vm1', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('sys-net', 'admin.vm.List', None, None)] = \
-            b'0\x00sys-net class=AppVM state=Running\n'
+            ('sys-net', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('template1', 'admin.vm.List', None, None)] = \
-            b'0\x00template1 class=TemplateVM state=Halted\n'
+            ('template1', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         props = {
             'label': b'type=label green',
             'template': b'type=vm template1',
@@ -331,11 +331,11 @@ class TC_90_List_with_qubesd_calls(qubesadmin.tests.QubesTestCase):
             b'template1 class=TemplateVM state=Halted\n' \
             b'sys-net class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('vm1', 'admin.vm.List', None, None)] = \
-            b'0\x00vm1 class=AppVM state=Running\n'
+            ('vm1', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('sys-net', 'admin.vm.List', None, None)] = \
-            b'0\x00sys-net class=AppVM state=Running\n'
+            ('sys-net', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         props = {
             'label': b'type=label green',
             'template': b'type=vm template1',

+ 13 - 13
qubesadmin/tests/tools/qvm_run.py

@@ -1,4 +1,4 @@
-# -*- encoding: utf8 -*-
+# -*- encoding: utf-8 -*-
 #
 # The Qubes OS Project, http://www.qubes-os.org
 #
@@ -69,14 +69,14 @@ class TC_00_qvm_run(qubesadmin.tests.QubesTestCase):
             b'test-vm2 class=AppVM state=Running\n' \
             b'test-vm3 class=AppVM state=Halted\n'
         self.app.expected_calls[
-            ('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Running\n'
+            ('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('test-vm2', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm2 class=AppVM state=Running\n'
+            ('test-vm2', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('test-vm3', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm3 class=AppVM state=Halted\n'
+            ('test-vm3', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('test-vm', 'admin.vm.feature.CheckWithTemplate', 'os', None)] = \
             b'2\x00QubesFeatureNotFoundError\x00\x00Feature \'os\' not set\x00'
@@ -445,11 +445,11 @@ class TC_00_qvm_run(qubesadmin.tests.QubesTestCase):
             b'test-vm2 class=AppVM state=Running\n' \
             b'test-vm3 class=AppVM state=Halted\n'
         self.app.expected_calls[
-            ('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Running\n'
+            ('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('test-vm3', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm3 class=AppVM state=Halted\n'
+            ('test-vm3', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('test-vm', 'admin.vm.feature.CheckWithTemplate', 'os', None)] = \
             b'2\x00QubesFeatureNotFoundError\x00\x00Feature \'os\' not set\x00'
@@ -474,8 +474,8 @@ class TC_00_qvm_run(qubesadmin.tests.QubesTestCase):
             b'test-vm2 class=AppVM state=Running\n' \
             b'test-vm3 class=AppVM state=Halted\n'
         self.app.expected_calls[
-            ('test-vm3', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm3 class=AppVM state=Halted\n'
+            ('test-vm3', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         ret = qubesadmin.tools.qvm_run.main(
             ['--no-gui', '--no-autostart', 'test-vm3', 'command'],
             app=self.app)

+ 35 - 35
qubesadmin/tests/tools/qvm_shutdown.py

@@ -1,4 +1,4 @@
-# -*- encoding: utf8 -*-
+# -*- encoding: utf-8 -*-
 #
 # The Qubes OS Project, http://www.qubes-os.org
 #
@@ -101,9 +101,9 @@ class TC_00_qvm_shutdown(qubesadmin.tests.QubesTestCase):
             ('dom0', 'admin.vm.List', None, None)] = \
             b'0\x00some-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            [b'0\x00some-vm class=AppVM state=Running\n'] + \
-            [b'0\x00some-vm class=AppVM state=Halted\n']
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            [b'0\x00power_state=Running'] + \
+            [b'0\x00power_state=Halted']
         qubesadmin.tools.qvm_shutdown.main(['--wait', 'some-vm'], app=self.app)
         self.assertAllCalled()
 
@@ -141,14 +141,14 @@ class TC_00_qvm_shutdown(qubesadmin.tests.QubesTestCase):
             b'some-vm class=AppVM state=Running\n' \
             b'other-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Halted\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
-            ('other-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00other-vm class=AppVM state=Halted\n'
+            ('other-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
-            ('sys-net', 'admin.vm.List', None, None)] = \
-            b'0\x00sys-net class=AppVM state=Halted\n'
+            ('sys-net', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         qubesadmin.tools.qvm_shutdown.main(['--wait', '--all'], app=self.app)
         self.assertAllCalled()
 
@@ -189,14 +189,14 @@ class TC_00_qvm_shutdown(qubesadmin.tests.QubesTestCase):
             b'some-vm class=AppVM state=Running\n' \
             b'other-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Halted\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
-            ('other-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00other-vm class=AppVM state=Halted\n'
+            ('other-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
-            ('sys-net', 'admin.vm.List', None, None)] = \
-            b'0\x00sys-net class=AppVM state=Halted\n'
+            ('sys-net', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         qubesadmin.tools.qvm_shutdown.main(['--wait', '--all'], app=self.app)
         self.assertAllCalled()
 
@@ -222,20 +222,20 @@ class TC_00_qvm_shutdown(qubesadmin.tests.QubesTestCase):
             b'some-vm class=AppVM state=Running\n' \
             b'other-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            [b'0\x00some-vm class=AppVM state=Running\n',
-            b'0\x00some-vm class=AppVM state=Halted\n',
-            b'0\x00some-vm class=AppVM state=Halted\n']
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            [b'0\x00power_state=Running',
+            b'0\x00power_state=Halted',
+            b'0\x00power_state=Halted']
         self.app.expected_calls[
-            ('other-vm', 'admin.vm.List', None, None)] = \
-            [b'0\x00other-vm class=AppVM state=Running\n',
-            b'0\x00other-vm class=AppVM state=Halted\n',
-            b'0\x00other-vm class=AppVM state=Halted\n']
+            ('other-vm', 'admin.vm.CurrentState', None, None)] = \
+            [b'0\x00power_state=Running',
+            b'0\x00power_state=Halted',
+            b'0\x00power_state=Halted']
         self.app.expected_calls[
-            ('sys-net', 'admin.vm.List', None, None)] = \
-            [b'0\x00sys-net class=AppVM state=Running\n',
-            b'0\x00sys-net class=AppVM state=Halted\n',
-            b'0\x00sys-net class=AppVM state=Halted\n']
+            ('sys-net', 'admin.vm.CurrentState', None, None)] = \
+            [b'0\x00power_state=Running',
+            b'0\x00power_state=Halted',
+            b'0\x00power_state=Halted']
         with unittest.mock.patch('qubesadmin.tools.qvm_shutdown.have_events',
                 False):
             qubesadmin.tools.qvm_shutdown.main(['--wait', '--all'], app=self.app)
@@ -282,17 +282,17 @@ class TC_00_qvm_shutdown(qubesadmin.tests.QubesTestCase):
             b'some-vm class=AppVM state=Running\n' \
             b'other-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = [
-            b'0\x00some-vm class=AppVM state=Running\n',
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = [
+            b'0\x00power_state=Running',
         ]
         self.app.expected_calls[
-            ('other-vm', 'admin.vm.List', None, None)] = [
-            b'0\x00other-vm class=AppVM state=Running\n',
-            b'0\x00other-vm class=AppVM state=Running\n',
+            ('other-vm', 'admin.vm.CurrentState', None, None)] = [
+            b'0\x00power_state=Running',
+            b'0\x00power_state=Running',
         ]
         self.app.expected_calls[
-            ('sys-net', 'admin.vm.List', None, None)] = \
-            b'0\x00sys-net class=AppVM state=Halted\n'
+            ('sys-net', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         qubesadmin.tools.qvm_shutdown.main(
             ['--wait', '--all', '--timeout=1'], app=self.app)
         self.assertAllCalled()

+ 19 - 19
qubesadmin/tests/tools/qvm_start.py

@@ -1,4 +1,4 @@
-# -*- encoding: utf8 -*-
+# -*- encoding: utf-8 -*-
 #
 # The Qubes OS Project, http://www.qubes-os.org
 #
@@ -33,8 +33,8 @@ class TC_00_qvm_start(qubesadmin.tests.QubesTestCase):
             ('dom0', 'admin.vm.List', None, None)] = \
             b'0\x00some-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Halted\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('some-vm', 'admin.vm.Start', None, None)] = b'0\x00'
         qubesadmin.tools.qvm_start.main(['some-vm'], app=self.app)
@@ -63,8 +63,8 @@ class TC_00_qvm_start(qubesadmin.tests.QubesTestCase):
             ('dom0', 'admin.vm.List', None, None)] = \
             b'0\x00some-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Runnin\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Runnin'
         self.assertEqual(
             qubesadmin.tools.qvm_start.main(['some-vm'], app=self.app),
             1)
@@ -76,8 +76,8 @@ class TC_00_qvm_start(qubesadmin.tests.QubesTestCase):
             b'0\x00dom0 class=AdminVM state=Running\n' \
             b'some-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Halted\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('dom0', 'admin.vm.device.block.Available', None, None)] = \
             b'0\x00sr0\n'
@@ -99,8 +99,8 @@ class TC_00_qvm_start(qubesadmin.tests.QubesTestCase):
             b'0\x00dom0 class=AdminVM state=Running\n' \
             b'some-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Halted\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('dom0', 'admin.vm.device.block.Available', None, None)] = \
             b'0\x00sdb1\n'
@@ -122,8 +122,8 @@ class TC_00_qvm_start(qubesadmin.tests.QubesTestCase):
             b'0\x00dom0 class=AdminVM state=Running\n' \
             b'some-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Halted\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('dom0', 'admin.vm.device.block.Available', None, None)] = \
             b'0\x00sdb1\n'
@@ -146,8 +146,8 @@ class TC_00_qvm_start(qubesadmin.tests.QubesTestCase):
             b'0\x00dom0 class=AdminVM state=Running\n' \
             b'some-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Halted\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('dom0', 'admin.vm.device.block.Available', None, None)] = \
             b'0\x00loop12\n'
@@ -175,8 +175,8 @@ class TC_00_qvm_start(qubesadmin.tests.QubesTestCase):
             b'other-vm class=AppVM state=Running\n' \
             b'some-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Halted\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('other-vm', 'admin.vm.device.block.Available', None, None)] = \
             b'0\x00loop7\n'
@@ -208,8 +208,8 @@ class TC_00_qvm_start(qubesadmin.tests.QubesTestCase):
             b'other-vm class=AppVM state=Running\n' \
             b'some-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Halted\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('some-vm', 'admin.vm.device.block.Attach', 'other-vm+loop7',
                 b'devtype=cdrom persistent=True read-only=True')] = b'0\x00'
@@ -232,8 +232,8 @@ class TC_00_qvm_start(qubesadmin.tests.QubesTestCase):
             b'other-vm class=AppVM state=Running\n' \
             b'some-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('some-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00some-vm class=AppVM state=Halted\n'
+            ('some-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('some-vm', 'admin.vm.device.block.Attach', 'other-vm+loop7',
                 b'devtype=cdrom persistent=True read-only=True')] = \

+ 23 - 23
qubesadmin/tests/tools/qvm_start_gui.py

@@ -1,4 +1,4 @@
-# -*- encoding: utf8 -*-
+# -*- encoding: utf-8 -*-
 #
 # The Qubes OS Project, http://www.qubes-os.org
 #
@@ -184,8 +184,8 @@ class TC_00_qvm_start_gui(qubesadmin.tests.QubesTestCase):
             ('dom0', 'admin.vm.List', None, None)] = \
             b'0\x00test-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Running\n'
+            ('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
             ('test-vm', 'admin.vm.property.Get', 'xid', None)] = \
             b'0\x00default=False type=int 3000'
@@ -215,8 +215,8 @@ class TC_00_qvm_start_gui(qubesadmin.tests.QubesTestCase):
             ('dom0', 'admin.vm.List', None, None)] = \
             b'0\x00test-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Running\n'
+            ('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
             ('test-vm', 'admin.vm.property.Get', 'xid', None)] = \
             b'0\x00default=False type=int 3000'
@@ -251,8 +251,8 @@ class TC_00_qvm_start_gui(qubesadmin.tests.QubesTestCase):
             ('dom0', 'admin.vm.List', None, None)] = \
             b'0\x00test-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Running\n'
+            ('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
             ('test-vm', 'admin.vm.property.Get', 'xid', None)] = \
             b'0\x00default=False type=int 3000'
@@ -377,8 +377,8 @@ class TC_00_qvm_start_gui(qubesadmin.tests.QubesTestCase):
             b'0\x00test-vm class=AppVM state=Running\n' \
             b'gui-vm class=AppVM state=Running'
         self.app.expected_calls[
-            ('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Running\n'
+            ('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
             ('test-vm', 'admin.vm.feature.CheckWithTemplate', 'gui', None)] = \
             b'0\x00True'
@@ -506,8 +506,8 @@ HDMI1 connected 2560x1920+0+0 (normal left inverted right x axis y axis) 206mm x
             ('dom0', 'admin.vm.List', None, None)] = \
             b'0\x00test-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Running\n'
+            ('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
             ('test-vm', 'admin.vm.feature.CheckWithTemplate',
              'no-monitor-layout', None)] = \
@@ -562,8 +562,8 @@ HDMI1 connected 2560x1920+0+0 (normal left inverted right x axis y axis) 206mm x
             ('dom0', 'admin.vm.List', None, None)] = \
             b'0\x00test-vm class=AppVM state=Halted\n'
         self.app.expected_calls[
-            ('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Halted\n'
+            ('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('test-vm', 'admin.vm.feature.CheckWithTemplate',
              'no-monitor-layout', None)] = \
@@ -591,8 +591,8 @@ HDMI1 connected 2560x1920+0+0 (normal left inverted right x axis y axis) 206mm x
             ('dom0', 'admin.vm.List', None, None)] = \
             b'0\x00test-vm class=AppVM state=Running\n'
         self.app.expected_calls[
-            ('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Running\n'
+            ('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
             ('test-vm', 'admin.vm.property.Get', 'xid', None)] = \
             b'0\x00default=False type=int 123'
@@ -642,17 +642,17 @@ HDMI1 connected 2560x1920+0+0 (normal left inverted right x axis y axis) 206mm x
             b'test-vm4 class=AppVM state=Halted\n' \
             b'gui-vm class=AppVM state=Running'
         self.app.expected_calls[
-            ('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Running\n'
+            ('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('test-vm2', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm2 class=AppVM state=Running\n'
+            ('test-vm2', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('test-vm3', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm3 class=AppVM state=Running\n'
+            ('test-vm3', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.app.expected_calls[
-            ('test-vm4', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm4 class=AppVM state=Halted\n'
+            ('test-vm4', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.app.expected_calls[
             ('test-vm', 'admin.vm.feature.CheckWithTemplate',
              'gui', None)] = \

+ 14 - 9
qubesadmin/tests/vm/properties.py

@@ -1,4 +1,4 @@
-# -*- encoding: utf8 -*-
+# -*- encoding: utf-8 -*-
 #
 # The Qubes OS Project, http://www.qubes-os.org
 #
@@ -213,33 +213,38 @@ class TC_01_SpecialCases(qubesadmin.tests.vm.VMTestCase):
         self.assertAllCalled()
 
     def test_010_power_state_running(self):
-        self.app.expected_calls[('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Running\n'
+        self.app.expected_calls[('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Running'
         self.assertEqual(self.vm.get_power_state(), 'Running')
         self.assertTrue(self.vm.is_running())
         self.assertFalse(self.vm.is_halted())
         self.assertFalse(self.vm.is_paused())
 
     def test_011_power_state_paused(self):
-        self.app.expected_calls[('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Paused\n'
+        self.app.expected_calls[('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Paused'
         self.assertEqual(self.vm.get_power_state(), 'Paused')
         self.assertTrue(self.vm.is_running())
         self.assertFalse(self.vm.is_halted())
         self.assertTrue(self.vm.is_paused())
 
     def test_012_power_state_halted(self):
-        self.app.expected_calls[('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Halted\n'
+        self.app.expected_calls[('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Halted'
         self.assertEqual(self.vm.get_power_state(), 'Halted')
         self.assertFalse(self.vm.is_running())
         self.assertTrue(self.vm.is_halted())
         self.assertFalse(self.vm.is_paused())
 
     def test_012_power_state_transient(self):
-        self.app.expected_calls[('test-vm', 'admin.vm.List', None, None)] = \
-            b'0\x00test-vm class=AppVM state=Transient\n'
+        self.app.expected_calls[('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00power_state=Transient'
         self.assertEqual(self.vm.get_power_state(), 'Transient')
         self.assertTrue(self.vm.is_running())
         self.assertFalse(self.vm.is_halted())
         self.assertFalse(self.vm.is_paused())
+
+    def test_015_mem(self):
+        self.app.expected_calls[('test-vm', 'admin.vm.CurrentState', None, None)] = \
+            b'0\x00mem=1234'
+        self.assertEqual(self.vm.get_mem(), 1234)

+ 1 - 1
qubesadmin/tools/qvm_ls.py

@@ -349,7 +349,7 @@ Column('GATEWAY',
     doc='Network gateway.')
 
 Column('MEMORY',
-    attr=(lambda vm: vm.get_mem() / 1024 if vm.is_running() else None),
+    attr=(lambda vm: vm.get_mem() // 1024 if vm.is_running() else None),
     doc='Memory currently used by VM')
 
 Column('DISK',

+ 16 - 11
qubesadmin/vm/__init__.py

@@ -1,4 +1,4 @@
-# -*- encoding: utf8 -*-
+# -*- encoding: utf-8 -*-
 #
 # The Qubes OS Project, http://www.qubes-os.org
 #
@@ -182,19 +182,24 @@ class QubesVM(qubesadmin.base.PropertyHolder):
         '''
 
         try:
-            vm_list_info = [line
-                for line in self.qubesd_call(
-                    self._method_dest, 'admin.vm.List', None, None
-                ).decode('ascii').split('\n')
-                if line.startswith(self._method_dest+' ')]
+            return self._get_current_state()['power_state']
         except qubesadmin.exc.QubesDaemonNoResponseError:
             return 'NA'
-        assert len(vm_list_info) == 1
-        #  name class=... state=... other=...
-        # NOTE: when querying dom0, we get whole list
-        vm_state = vm_list_info[0].strip().partition('state=')[2].split(' ')[0]
-        return vm_state
 
+    def get_mem(self):
+        '''Get current memory usage from VM.'''
+
+        return int(self._get_current_state()['mem'])
+
+    def _get_current_state(self):
+        '''Call admin.vm.CurrentState, and return the result as a dict.'''
+
+        state = {}
+        response = self.qubesd_call(self._method_dest, 'admin.vm.CurrentState')
+        for part in response.decode('ascii').split():
+            name, value = part.split('=', 1)
+            state[name] = value
+        return state
 
     def is_halted(self):
         ''' Check whether this domain's state is 'Halted'