tools/qvm-device: allow detaching all devices
QubesOS/qubes-issues#4530
This commit is contained in:
parent
954ffc4bf2
commit
bee55a3bce
@ -8,7 +8,7 @@ Synopsis
|
|||||||
========
|
========
|
||||||
| :command:`qvm-device` [*options*] *DEVICE_CLASS* {list,ls,l} <*vm-name*>
|
| :command:`qvm-device` [*options*] *DEVICE_CLASS* {list,ls,l} <*vm-name*>
|
||||||
| :command:`qvm-device` [*options*] *DEVICE_CLASS* {attach,at,a} <*vm-name*> <*device*>
|
| :command:`qvm-device` [*options*] *DEVICE_CLASS* {attach,at,a} <*vm-name*> <*device*>
|
||||||
| :command:`qvm-device` [*options*] *DEVICE_CLASS* {detach,dt,d} <*vm-name*> <*device*>
|
| :command:`qvm-device` [*options*] *DEVICE_CLASS* {detach,dt,d} <*vm-name*> [<*device*>]
|
||||||
| :command:`qvm-*DEVICE_CLASS*` [*options*] {list,ls,l,attach,at,a,detach,dt,d} <*vmname*> ...
|
| :command:`qvm-*DEVICE_CLASS*` [*options*] {list,ls,l,attach,at,a,detach,dt,d} <*vmname*> ...
|
||||||
|
|
||||||
Tool can be called either as `qvm-device *DEVICE_CLASS* ...`, or
|
Tool can be called either as `qvm-device *DEVICE_CLASS* ...`, or
|
||||||
@ -79,7 +79,8 @@ detach
|
|||||||
|
|
||||||
| :command:`qvm-device` *DEVICE_CLASS* detach [-h] [--verbose] [--quiet] *VMNAME* *BACKEND_DOMAIN:DEVICE_ID*
|
| :command:`qvm-device` *DEVICE_CLASS* detach [-h] [--verbose] [--quiet] *VMNAME* *BACKEND_DOMAIN:DEVICE_ID*
|
||||||
|
|
||||||
Detach the device with *BACKEND_DOMAIN:DEVICE_ID* from domain *VMNAME*
|
Detach the device with *BACKEND_DOMAIN:DEVICE_ID* from domain *VMNAME*.
|
||||||
|
If no device is given, detach all *DEVICE_CLASS* devices.
|
||||||
|
|
||||||
aliases: d, dt
|
aliases: d, dt
|
||||||
|
|
||||||
|
@ -199,3 +199,16 @@ class TC_00_qvm_device(qubesadmin.tests.QubesTestCase):
|
|||||||
['test', 'detach', 'test-vm2', 'test-vm1:dev7'], app=self.app)
|
['test', 'detach', 'test-vm2', 'test-vm1:dev7'], app=self.app)
|
||||||
self.assertAllCalled()
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
def test_022_detach_all(self):
|
||||||
|
''' Test detach action '''
|
||||||
|
self.app.expected_calls[('test-vm2', 'admin.vm.device.test.List',
|
||||||
|
None, None)] = \
|
||||||
|
b'0\0test-vm1+dev1\ntest-vm1+dev2\n'
|
||||||
|
self.app.expected_calls[('test-vm2', 'admin.vm.device.test.Detach',
|
||||||
|
'test-vm1+dev1', None)] = b'0\0'
|
||||||
|
self.app.expected_calls[('test-vm2', 'admin.vm.device.test.Detach',
|
||||||
|
'test-vm1+dev2', None)] = b'0\0'
|
||||||
|
qubesadmin.tools.qvm_device.main(
|
||||||
|
['test', 'detach', 'test-vm2'], app=self.app)
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
@ -130,9 +130,12 @@ def detach_device(args):
|
|||||||
''' Called by the parser to execute the :program:`qvm-devices detach`
|
''' Called by the parser to execute the :program:`qvm-devices detach`
|
||||||
subcommand.
|
subcommand.
|
||||||
'''
|
'''
|
||||||
device_assignment = args.device_assignment
|
|
||||||
vm = args.domains[0]
|
vm = args.domains[0]
|
||||||
vm.devices[args.devclass].detach(device_assignment)
|
if args.device_assignment:
|
||||||
|
vm.devices[args.devclass].detach(args.device_assignment)
|
||||||
|
else:
|
||||||
|
for device_assignment in vm.devices[args.devclass].assignments():
|
||||||
|
vm.devices[args.devclass].detach(device_assignment)
|
||||||
|
|
||||||
|
|
||||||
def init_list_parser(sub_parsers):
|
def init_list_parser(sub_parsers):
|
||||||
@ -169,6 +172,8 @@ class DeviceAction(qubesadmin.tools.QubesAction):
|
|||||||
app = namespace.app
|
app = namespace.app
|
||||||
backend_device_id = getattr(namespace, self.dest)
|
backend_device_id = getattr(namespace, self.dest)
|
||||||
devclass = namespace.devclass
|
devclass = namespace.devclass
|
||||||
|
if backend_device_id is None:
|
||||||
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
vmname, device_id = backend_device_id.split(':', 1)
|
vmname, device_id = backend_device_id.split(':', 1)
|
||||||
@ -232,7 +237,7 @@ def get_parser(device_class=None):
|
|||||||
dest='device_assignment',
|
dest='device_assignment',
|
||||||
action=DeviceAction)
|
action=DeviceAction)
|
||||||
detach_parser.add_argument(metavar='BACKEND:DEVICE_ID',
|
detach_parser.add_argument(metavar='BACKEND:DEVICE_ID',
|
||||||
dest='device_assignment',
|
dest='device_assignment', nargs=argparse.OPTIONAL,
|
||||||
action=DeviceAction, allow_unknown=True)
|
action=DeviceAction, allow_unknown=True)
|
||||||
|
|
||||||
attach_parser.add_argument('--option', '-o', action='append',
|
attach_parser.add_argument('--option', '-o', action='append',
|
||||||
|
Loading…
Reference in New Issue
Block a user