Merge remote-tracking branch 'qubesos/pr/44'
* qubesos/pr/44: Fix style else-return tests: update qvm-template-process and qvm-remove tests Add --force to manpage. Avoid cloning installed_by_rpm Print vm list before prompt Use --force instead of --yes Toggle installed_by_rpm in template tool Fix error message grammar Add --yes option and confirm prompt.
This commit is contained in:
commit
51a89a9e77
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
Synopsis
|
Synopsis
|
||||||
--------
|
--------
|
||||||
:command:`qvm-remove` [-h] [--verbose] [--quiet] [--force-root] [--all] [--exclude *EXCLUDE*] [--just-db] [*VMNAME* [*VMNAME* ...]]
|
:command:`qvm-remove` [-h] [--verbose] [--quiet] [--force] [--force-root] [--all] [--exclude *EXCLUDE*] [--just-db] [*VMNAME* [*VMNAME* ...]]
|
||||||
|
|
||||||
Options
|
Options
|
||||||
-------
|
-------
|
||||||
@ -28,6 +28,10 @@ Options
|
|||||||
|
|
||||||
Exclude the qube from :option:`--all`.
|
Exclude the qube from :option:`--all`.
|
||||||
|
|
||||||
|
.. option:: --force, -f
|
||||||
|
|
||||||
|
Do not prompt for confirmation; assume 'yes'.
|
||||||
|
|
||||||
.. option:: --help, -h
|
.. option:: --help, -h
|
||||||
|
|
||||||
Show this help message and exit
|
Show this help message and exit
|
||||||
|
@ -334,7 +334,8 @@ class QubesBase(qubesadmin.base.PropertyHolder):
|
|||||||
assert isinstance(dst_vm, qubesadmin.vm.QubesVM)
|
assert isinstance(dst_vm, qubesadmin.vm.QubesVM)
|
||||||
for prop in src_vm.property_list():
|
for prop in src_vm.property_list():
|
||||||
# handled by admin.vm.Create call
|
# handled by admin.vm.Create call
|
||||||
if prop in ('name', 'qid', 'template', 'label', 'uuid'):
|
if prop in ('name', 'qid', 'template', 'label', 'uuid', \
|
||||||
|
'installed_by_rpm'):
|
||||||
continue
|
continue
|
||||||
if src_vm.property_is_default(prop):
|
if src_vm.property_is_default(prop):
|
||||||
continue
|
continue
|
||||||
|
@ -31,5 +31,5 @@ class TC_00_qvm_remove(qubesadmin.tests.QubesTestCase):
|
|||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
('some-vm', 'admin.vm.Remove', None, None)] = \
|
('some-vm', 'admin.vm.Remove', None, None)] = \
|
||||||
b'0\x00\n'
|
b'0\x00\n'
|
||||||
qubesadmin.tools.qvm_remove.main(['some-vm'], app=self.app)
|
qubesadmin.tools.qvm_remove.main(['-f', 'some-vm'], app=self.app)
|
||||||
self.assertAllCalled()
|
self.assertAllCalled()
|
||||||
|
@ -240,6 +240,9 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
|
|||||||
|
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
('test-vm', 'admin.vm.property.Set', 'netvm', b'')] = b'0\0'
|
('test-vm', 'admin.vm.property.Set', 'netvm', b'')] = b'0\0'
|
||||||
|
self.app.expected_calls[
|
||||||
|
('test-vm', 'admin.vm.property.Set', 'installed_by_rpm', b'True')] \
|
||||||
|
= b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
('test-vm', 'admin.vm.property.Reset', 'netvm', None)] = b'0\0'
|
('test-vm', 'admin.vm.property.Reset', 'netvm', None)] = b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
@ -290,6 +293,9 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
|
|||||||
|
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
('test-vm', 'admin.vm.property.Set', 'netvm', b'')] = b'0\0'
|
('test-vm', 'admin.vm.property.Set', 'netvm', b'')] = b'0\0'
|
||||||
|
self.app.expected_calls[
|
||||||
|
('test-vm', 'admin.vm.property.Set', 'installed_by_rpm', b'True')] \
|
||||||
|
= b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
('test-vm', 'admin.vm.property.Reset', 'netvm', None)] = b'0\0'
|
('test-vm', 'admin.vm.property.Reset', 'netvm', None)] = b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
@ -335,6 +341,9 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
|
|||||||
mock_import_appmenus):
|
mock_import_appmenus):
|
||||||
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
||||||
b'0\0test-vm class=TemplateVM state=Halted\n'
|
b'0\0test-vm class=TemplateVM state=Halted\n'
|
||||||
|
self.app.expected_calls[
|
||||||
|
('test-vm', 'admin.vm.property.Set', 'installed_by_rpm', b'True')] \
|
||||||
|
= b'0\0'
|
||||||
self.app.add_new_vm = mock.Mock()
|
self.app.add_new_vm = mock.Mock()
|
||||||
|
|
||||||
if qubesadmin.tools.qvm_template_postprocess.have_events:
|
if qubesadmin.tools.qvm_template_postprocess.have_events:
|
||||||
@ -365,6 +374,9 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
|
|||||||
b'0\0test-vm class=TemplateVM state=Halted\n'
|
b'0\0test-vm class=TemplateVM state=Halted\n'
|
||||||
self.app.expected_calls[('test-vm', 'admin.vm.Remove', None, None)] = \
|
self.app.expected_calls[('test-vm', 'admin.vm.Remove', None, None)] = \
|
||||||
b'0\0'
|
b'0\0'
|
||||||
|
self.app.expected_calls[
|
||||||
|
('test-vm', 'admin.vm.property.Set', 'installed_by_rpm', b'False')]\
|
||||||
|
= b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
('test-vm', 'admin.vm.property.Get', 'template', None)] = \
|
('test-vm', 'admin.vm.property.Get', 'template', None)] = \
|
||||||
b'2\0QubesNoSuchPropertyError\0\0invalid property \'template\' of ' \
|
b'2\0QubesNoSuchPropertyError\0\0invalid property \'template\' of ' \
|
||||||
|
@ -28,14 +28,29 @@ from qubesadmin.tools import QubesArgumentParser
|
|||||||
parser = QubesArgumentParser(description=__doc__,
|
parser = QubesArgumentParser(description=__doc__,
|
||||||
want_app=True,
|
want_app=True,
|
||||||
vmname_nargs='+')
|
vmname_nargs='+')
|
||||||
|
parser.add_argument("--force", "-f", action="store_true", dest="no_confirm",
|
||||||
|
default=False, help="Do not prompt for confirmation")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main(args=None, app=None): # pylint: disable=missing-docstring
|
def main(args=None, app=None): # pylint: disable=missing-docstring
|
||||||
args = parser.parse_args(args, app=app)
|
args = parser.parse_args(args, app=app)
|
||||||
for vm in args.domains:
|
go_ahead = ""
|
||||||
del args.app.domains[vm.name]
|
if not args.no_confirm:
|
||||||
|
print("This will completely remove the selected VM(s)...")
|
||||||
|
for vm in args.domains:
|
||||||
|
print(" ", vm.name)
|
||||||
|
go_ahead = input("Are you sure? [y/N] ").upper()
|
||||||
|
|
||||||
|
if args.no_confirm or go_ahead == "Y":
|
||||||
|
for vm in args.domains:
|
||||||
|
del args.app.domains[vm.name]
|
||||||
|
retcode = 0
|
||||||
|
else:
|
||||||
|
print("Remove cancelled.")
|
||||||
|
retcode = 1
|
||||||
|
return retcode
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -205,6 +205,7 @@ def post_install(args):
|
|||||||
# if data import fails, remove half-created VM
|
# if data import fails, remove half-created VM
|
||||||
del app.domains[vm.name]
|
del app.domains[vm.name]
|
||||||
raise
|
raise
|
||||||
|
vm.installed_by_rpm = True
|
||||||
import_appmenus(vm, args.dir)
|
import_appmenus(vm, args.dir)
|
||||||
|
|
||||||
if not args.skip_start:
|
if not args.skip_start:
|
||||||
@ -222,10 +223,11 @@ def pre_remove(args):
|
|||||||
try:
|
try:
|
||||||
tpl = app.domains[args.name]
|
tpl = app.domains[args.name]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
parser.error('Qube with this name do not exist')
|
parser.error('No Qube with this name exists')
|
||||||
for appvm in tpl.appvms:
|
for appvm in tpl.appvms:
|
||||||
parser.error('Qube {} use this template'.format(appvm.name))
|
parser.error('Qube {} uses this template'.format(appvm.name))
|
||||||
|
|
||||||
|
tpl.installed_by_rpm = False
|
||||||
del app.domains[args.name]
|
del app.domains[args.name]
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user