diff --git a/.gitignore b/.gitignore index 41e3399..5fb11b7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ build/ pkgs/ .coverage +__pycache__ diff --git a/Makefile b/Makefile index 2f04ec7..6bf4e05 100644 --- a/Makefile +++ b/Makefile @@ -12,3 +12,9 @@ install: $(PYTHON) setup.py install -O1 $(PYTHON_PREFIX_ARG) --root $(DESTDIR) install -d $(DESTDIR)/etc/xdg/autostart install -m 0644 etc/qvm-start-gui.desktop $(DESTDIR)/etc/xdg/autostart/ + +clean: + rm -rf test-packages/__pycache__ qubesadmin/__pycache__ + rm -rf qubesadmin/*/__pycache__ qubesadmin/tests/*/__pycache__ + rm -rf test-packages/*.egg-info + rm -f .coverage diff --git a/debian/rules b/debian/rules index b7e7fcf..37f215e 100755 --- a/debian/rules +++ b/debian/rules @@ -37,6 +37,10 @@ override_dh_auto_install: install -m 0644 build/man/* \ debian/qubes-core-admin-client/usr/share/man/man1/ +override_dh_clean: + dh_clean -O--buildsystem=pybuild + make clean + # debmake generated override targets # This is example for Cmake (See http://bugs.debian.org/641051 ) #override_dh_auto_configure: diff --git a/doc/manpages/qvm-pool.rst b/doc/manpages/qvm-pool.rst index 2a7f7e1..987b525 100644 --- a/doc/manpages/qvm-pool.rst +++ b/doc/manpages/qvm-pool.rst @@ -51,14 +51,19 @@ Options qubes.xml, but does not delete any content (FIXME: is it really true for all pool drivers?). +.. option:: --set NAME, -s NAME + + Modify a pool. This set options of a pool. Use ``--o`` to specify actual modifications. + + Examples -------- -Create a pool backed by the default `xen` driver. +Create a pool backed by the `file` driver. :: - qvm-pool -o dir_path=/mnt/foo -a foo xen + qvm-pool -o dir_path=/mnt/foo -a foo file Authors ------- diff --git a/qubesadmin/tests/tools/qvm_pool.py b/qubesadmin/tests/tools/qvm_pool.py index 2c993c5..e085820 100644 --- a/qubesadmin/tests/tools/qvm_pool.py +++ b/qubesadmin/tests/tools/qvm_pool.py @@ -92,3 +92,25 @@ class TC_00_qvm_pool(qubesadmin.tests.QubesTestCase): 'volume_group qubes_dom0\n' ) self.assertAllCalled() + + def test_050_set(self): + self.app.expected_calls[('dom0', 'admin.pool.List', None, None)] = \ + b'0\x00pool-file\npool-lvm\n' + self.app.expected_calls[ + ('dom0', 'admin.pool.Set.revisions_to_keep', 'pool-lvm', b'2')] = \ + b'0\x00' + self.assertEqual(0, + qubesadmin.tools.qvm_pool.main(['-s', 'pool-lvm', '-o', + 'revisions_to_keep=2'], + app=self.app)) + self.assertAllCalled() + + def test_051_set_invalid(self): + self.app.expected_calls[('dom0', 'admin.pool.List', None, None)] = \ + b'0\x00pool-file\npool-lvm\n' + with self.assertRaises(SystemExit) as e: + qubesadmin.tools.qvm_pool.main( + ['-s', 'pool-lvm', '-o', 'prop=1'], + app=self.app) + self.assertEqual(e.exception.code, 2) + self.assertAllCalled() diff --git a/qubesadmin/tools/__init__.py b/qubesadmin/tools/__init__.py index 43a24fe..1f387d2 100644 --- a/qubesadmin/tools/__init__.py +++ b/qubesadmin/tools/__init__.py @@ -314,6 +314,9 @@ class PoolsAction(QubesAction): except qubesadmin.exc.QubesException as e: parser.error(str(e)) sys.exit(2) + except KeyError: + parser.error('No such pools: %s' % pool_names) + sys.exit(2) class QubesArgumentParser(argparse.ArgumentParser): diff --git a/qubesadmin/tools/qvm_pool.py b/qubesadmin/tools/qvm_pool.py index 7276c56..1e94f41 100644 --- a/qubesadmin/tools/qvm_pool.py +++ b/qubesadmin/tools/qvm_pool.py @@ -92,6 +92,23 @@ class _Add(argparse.Action): setattr(namespace, 'driver', driver) +class _Set(qubesadmin.tools.PoolsAction): + ''' Action for argument parser that sets pool options. ''' + + def __init__(self, option_strings, dest=None, default=None, metavar=None): + super(_Set, self).__init__(option_strings=option_strings, + dest=dest, + metavar=metavar, + default=default, + help='modify pool (use -o to specify ' + 'modifications)') + + def __call__(self, parser, namespace, name, option_string=None): + print('dupa') + setattr(namespace, 'command', 'set') + super(_Set, self).__call__(parser, namespace, name, option_string) + + class _Options(argparse.Action): ''' Action for argument parser that parsers options. ''' @@ -127,6 +144,8 @@ def get_parser(): dest='command', metavar=('NAME', 'DRIVER')) group.add_argument('-r', '--remove', metavar='NAME', action=_Remove) + group.add_argument('-s', '--set', metavar='POOLNAME', dest='pool', + action=_Set, default=[]) group.add_argument('--help-drivers', dest='command', const='list-drivers', @@ -173,6 +192,17 @@ def main(args=None, app=None): elif args.command == 'info': for pool in args.pools: pool_info(pool) + elif args.command == 'set': + pool = args.pool[0] + for opt, value in args.options.items(): + if not hasattr(type(pool), opt): + parser.error('setting pool option %s is not supported' % ( + pool.name)) + try: + setattr(pool, opt, value) + except qubesadmin.exc.QubesException as e: + parser.error('failed to set pool %s option %s: %s\n' % ( + pool.name, opt, str(e))) return 0