Skip to content

Commit 5e76612

Browse files
committed
Ignore preload as a dependency
There doesn't seem to be a sane setup that would set a preloaded disposable as a property of another qube or a system property. The core already ignores preloaded disposables in certain cases, do the same on the client to not have derived applications such as Qube Manager having to deal with it. Fixes: QubesOS/qubes-issues#10227 For: QubesOS/qubes-issues#1512
1 parent 8b62cd7 commit 5e76612

File tree

2 files changed

+50
-6
lines changed

2 files changed

+50
-6
lines changed

qubesadmin/tests/utils.py

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ def setUp(self):
3535
b'template2 class=TemplateVM state=Running\n' \
3636
b'vm2 class=AppVM state=Running\n' \
3737
b'sys-net class=AppVM state=Running\n' \
38-
b'sys-firewall class=AppVM state=Running\n'
38+
b'sys-firewall class=AppVM state=Running\n' \
39+
b'test-dvm class=AppVM state=Running\n' \
40+
b'disp1 class=DispVM state=Running\n' \
41+
b'disp2 class=DispVM state=Running\n'
3942

4043
self.global_properties = ['default_dispvm', 'default_netvm',
4144
'default_guivm', 'default_audiovm',
@@ -47,13 +50,20 @@ def setUp(self):
4750
('dom0', 'admin.property.Get', prop, None)] = \
4851
b'0\x00default=True type=vm vm2'
4952

50-
self.vms = ['vm1', 'vm2', 'sys-net', 'sys-firewall',
51-
'template1', 'template2']
53+
self.vms = [
54+
'vm1', 'vm2', 'sys-net', 'sys-firewall', 'template1', 'template2',
55+
'test-dvm', 'disp1', 'disp2',
56+
]
5257

53-
self.vm_properties = ['template', 'netvm', 'guivm', 'audiovm',
54-
'default_dispvm', 'management_dispvm']
58+
self.vm_properties = [
59+
'template', 'netvm', 'guivm', 'audiovm', 'default_dispvm',
60+
'management_dispvm'
61+
]
5562

5663
for vm in self.vms:
64+
self.app.expected_calls[
65+
(vm, 'admin.vm.property.Get', 'is_preload', None)
66+
] = b'2\0QubesNoSuchPropertyError\0\0invalid property\0'
5767
for prop in self.vm_properties:
5868
if not prop.startswith('template') or \
5969
not vm.startswith('template'):
@@ -65,6 +75,7 @@ def setUp(self):
6575
(vm, 'admin.vm.property.Get', prop, None)] = \
6676
b'2\0QubesNoSuchPropertyError\0\0invalid property\0'
6777

78+
6879
def test_00_only_global(self):
6980
result = qubesadmin.utils.vm_dependencies(self.app,
7081
self.app.domains['vm2'])
@@ -114,6 +125,27 @@ def test_04_defaults(self):
114125

115126
self.assertListEqual(result, [(self.app.domains['vm1'], 'netvm')])
116127

128+
def test_05_preloaded_disposables(self):
129+
self.app.expected_calls[
130+
('disp1', 'admin.vm.property.Get', 'template', None)
131+
] = b'0\x00default=False type=vm test-dvm'
132+
self.app.expected_calls[
133+
('disp2', 'admin.vm.property.Get', 'template', None)
134+
] = b'0\x00default=False type=vm test-dvm'
135+
self.app.expected_calls[
136+
('disp1', 'admin.vm.property.Get', 'is_preload', None)
137+
] = b'0\x00default=False type=bool False'
138+
self.app.expected_calls[
139+
('disp2', 'admin.vm.property.Get', 'is_preload', None)
140+
] = b'0\x00default=False type=bool True'
141+
142+
result = qubesadmin.utils.vm_dependencies(
143+
self.app, self.app.domains['test-dvm']
144+
)
145+
self.assertListEqual(
146+
result, [(self.app.domains['disp1'], 'template')]
147+
)
148+
117149

118150
class TestVMExecEncode(qubesadmin.tests.QubesTestCase):
119151
def test_00_encode(self):

qubesadmin/utils.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,26 @@ def vm_dependencies(app, reference_vm):
143143
for vm in app.domains:
144144
if vm == reference_vm:
145145
continue
146+
is_preload = getattr(vm, "is_preload", False)
146147
for prop in vm_properties:
147148
if not hasattr(vm, prop):
148149
continue
149150
try:
150151
is_prop_default = vm.property_is_default(prop)
151152
except qubesadmin.exc.QubesPropertyAccessError:
152153
is_prop_default = False
153-
if reference_vm == getattr(vm, prop, None) and not is_prop_default:
154+
if (
155+
reference_vm == getattr(vm, prop, None)
156+
and not is_prop_default
157+
and not (
158+
is_preload
159+
and prop == "template"
160+
or (
161+
prop == "default_dispvm"
162+
and getattr(vm, "template", None) == vm
163+
)
164+
)
165+
):
154166
result.append((vm, prop))
155167

156168
return result

0 commit comments

Comments
 (0)