From 0533703ddfd273cae2919525bf4e088ae88cda8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Fri, 22 Dec 2017 23:04:42 +0100 Subject: [PATCH] tools/qvm-ls: allow list only selected VMs Restore possibility to list only some VMs, by naming them on command line. --- qubesadmin/tests/tools/qvm_ls.py | 53 ++++++++++++++++++++++++++++++++ qubesadmin/tools/qvm_ls.py | 17 ++++++---- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/qubesadmin/tests/tools/qvm_ls.py b/qubesadmin/tests/tools/qvm_ls.py index 17f3581..2d16c5e 100644 --- a/qubesadmin/tests/tools/qvm_ls.py +++ b/qubesadmin/tests/tools/qvm_ls.py @@ -98,6 +98,21 @@ class TC_50_List(qubesadmin.tests.QubesTestCase): 'dom0 - TestVM\n' 'test-vm pv TestVM\n') + def test_102_list_selected(self): + app = TestApp() + app.domains['test-vm'].internal = False + app.domains['test-vm'].updateable = False + app.domains['test-vm'].template = TestVM('template') + app.domains['test-vm'].netvm = TestVM('sys-net') + app.domains['test-vm'].label = 'green' + app.domains['dom0'].label = 'black' + with qubesadmin.tests.tools.StdoutBuffer() as stdout: + qubesadmin.tools.qvm_ls.main(['test-vm'], app=app) + self.assertEqual(stdout.getvalue(), + 'NAME STATE CLASS LABEL TEMPLATE NETVM\n' + 'test-vm Running TestVM green template sys-net\n') + + class TC_90_List_with_qubesd_calls(qubesadmin.tests.QubesTestCase): def test_100_list_with_status(self): self.app.expected_calls[ @@ -150,3 +165,41 @@ class TC_90_List_with_qubesd_calls(qubesadmin.tests.QubesTestCase): 'template1 Halted TemplateVM black - sys-net\n' 'vm1 Running AppVM green template1 sys-net\n') self.assertAllCalled() + + def test_101_list_selected(self): + self.app.expected_calls[ + ('dom0', 'admin.vm.List', None, None)] = \ + b'0\x00vm1 class=AppVM state=Running\n' \ + 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' + self.app.expected_calls[ + ('sys-net', 'admin.vm.List', None, None)] = \ + b'0\x00sys-net class=AppVM state=Running\n' + props = { + 'label': b'type=label green', + 'template': b'type=vm template1', + 'netvm': b'type=vm sys-net', +# 'virt_mode': b'type=str pv', + } + for key, value in props.items(): + self.app.expected_calls[ + ('vm1', 'admin.vm.property.Get', key, None)] = \ + b'0\x00default=True ' + value + + # setup sys-net + props['label'] = b'type=label red' + for key, value in props.items(): + self.app.expected_calls[ + ('sys-net', 'admin.vm.property.Get', key, None)] = \ + b'0\x00default=True ' + value + + with qubesadmin.tests.tools.StdoutBuffer() as stdout: + qubesadmin.tools.qvm_ls.main(['vm1', 'sys-net'], app=self.app) + self.assertEqual(stdout.getvalue(), + 'NAME STATE CLASS LABEL TEMPLATE NETVM\n' + 'sys-net Running AppVM red template1 sys-net\n' + 'vm1 Running AppVM green template1 sys-net\n') + self.assertAllCalled() diff --git a/qubesadmin/tools/qvm_ls.py b/qubesadmin/tools/qvm_ls.py index 81510e7..c490d86 100644 --- a/qubesadmin/tools/qvm_ls.py +++ b/qubesadmin/tools/qvm_ls.py @@ -384,11 +384,11 @@ FlagsColumn() class Table(object): '''Table that is displayed to the user. - :param qubes.Qubes app: Qubes application object. + :param domains: Domains to include in the table. :param list colnames: Names of the columns (need not to be uppercase). ''' - def __init__(self, app, colnames, spinner, raw_data=False): - self.app = app + def __init__(self, domains, colnames, spinner, raw_data=False): + self.domains = domains self.columns = tuple(Column.columns[col.upper().replace('_', '-')] for col in colnames) self.spinner = spinner @@ -417,12 +417,12 @@ class Table(object): self.spinner.show('please wait...') table_data.append(self.get_head()) self.spinner.update() - for vm in sorted(self.app.domains): + for vm in sorted(self.domains): table_data.append(self.get_row(vm)) self.spinner.hide() qubesadmin.tools.print_table(table_data, stream=stream) else: - for vm in sorted(self.app.domains): + for vm in sorted(self.domains): stream.write('|'.join(self.get_row(vm)) + '\n') @@ -504,6 +504,7 @@ def get_parser(): initial_indent=' ', subsequent_indent=' ') parser = qubesadmin.tools.QubesArgumentParser( + vmname_nargs=argparse.ZERO_OR_MORE, formatter_class=argparse.RawTextHelpFormatter, description='List Qubes domains and their parametres.', epilog='available formats (see --help-formats):\n{}\n\n' @@ -579,7 +580,11 @@ def main(args=None, app=None): else: spinner = qubesadmin.spinner.DummySpinner(sys.stderr) - table = Table(args.app, columns, spinner, args.raw_data) + if args.domains: + domains = args.domains + else: + domains = args.app.domains + table = Table(domains, columns, spinner, args.raw_data) table.write_table(sys.stdout) return 0