Skip to content

Commit 41ddf2f

Browse files
committed
Revert to red label while restoring on missing labels
If we allow users to create custom labels and they backup such qubes, restore operation will fail on new systems without those custom labels. Fix this by reverting to red label and allow users to restore their backup. fixes: QubesOS/qubes-issues#9781
1 parent c3759ad commit 41ddf2f

3 files changed

Lines changed: 20 additions & 6 deletions

File tree

qubesadmin/backup/restore.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2020,6 +2020,12 @@ def _restore_vms_metadata(self, restore_info):
20202020
# can't create vm, but need backup info
20212021
new_vm = self.backup_app.domains[vm_name]
20222022
else:
2023+
# do not fail if VM had a custom label. revert to red label
2024+
if not vm.label in self.app.labels:
2025+
self.log.warning(
2026+
'Reverting to red label while restoring %s ' \
2027+
'since %s label does not exist', vm.name, vm.label)
2028+
vm.label = "red"
20232029
try:
20242030
# first only create VMs, later setting may require other VMs
20252031
# be already created

qubesadmin/tests/backup/backupcompatibility.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@
695695
},
696696
'test-net': {
697697
'klass': 'AppVM',
698-
'label': 'red',
698+
'label': 'scarlet',
699699
'properties': {
700700
'maxmem': '300',
701701
'memory': '300',
@@ -749,8 +749,11 @@ def assertCorrectlyConverted(self, backup_app, expected_data):
749749
expected_data['domains'][vm]['template'], vm)
750750
self.assertEqual(backup_app.domains[vm].klass,
751751
expected_data['domains'][vm]['klass'], vm)
752-
self.assertEqual(backup_app.domains[vm].label,
753-
expected_data['domains'][vm]['label'], vm)
752+
if expected_data['domains'][vm]['label'] == 'scarlet':
753+
self.assertEqual(backup_app.domains[vm].label, 'red', vm)
754+
else:
755+
self.assertEqual(backup_app.domains[vm].label,
756+
expected_data['domains'][vm]['label'], vm)
754757
self.assertEqual(backup_app.domains[vm].backup_path,
755758
expected_data['domains'][vm]['backup_path'], vm)
756759
self.assertEqual(backup_app.domains[vm].included_in_backup,
@@ -1357,18 +1360,19 @@ def setup_expected_calls(self, parsed_qubes_xml, templates_map=None):
13571360
if name == 'dom0':
13581361
continue
13591362

1363+
label = 'red' if vm['label'] == 'scarlet' else vm['label']
13601364
if self.storage_pool:
13611365
self.app.expected_calls[
13621366
('dom0', 'admin.vm.CreateInPool.' + vm['klass'],
13631367
templates_map.get(vm['template'], vm['template']),
13641368
'name={} label={} pool={}'.format(
1365-
name, vm['label'], self.storage_pool).encode())] = \
1369+
name, label, self.storage_pool).encode())] = \
13661370
b'0\0'
13671371
else:
13681372
self.app.expected_calls[
13691373
('dom0', 'admin.vm.Create.' + vm['klass'],
13701374
templates_map.get(vm['template'], vm['template']),
1371-
'name={} label={}'.format(name, vm['label']).encode())] =\
1375+
'name={} label={}'.format(name, label).encode())] =\
13721376
b'0\0'
13731377
extra_vm_list_lines.append(
13741378
'{} class={} state=Halted\n'.format(name, vm['klass']).encode())
@@ -1487,6 +1491,9 @@ def setup_expected_calls(self, parsed_qubes_xml, templates_map=None):
14871491
[orig_admin_vm_list] + \
14881492
[orig_admin_vm_list + b''.join(extra_vm_list_lines)] * \
14891493
len(extra_vm_list_lines)
1494+
self.app.expected_calls[('dom0', 'admin.label.List', None, None)] = (
1495+
b'0\0red\norange\nyellow\ngreen\ngray\nblue\npurple\nblack\n'
1496+
)
14901497

14911498
def mock_appmenus(self, queue, vm, stream):
14921499
queue.put((vm.name, 'appmenus', None, stream.read()))

qubesadmin/tests/backup/v4-qubes.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<label color="0x3465a4" id="label-6">blue</label>
99
<label color="0x75507b" id="label-7">purple</label>
1010
<label color="0x000000" id="label-8">black</label>
11+
<label color="0xff2400" id="label-9">scarlet</label>
1112
</labels>
1213
<pools>
1314
<pool driver="lvm_thin" name="lvm" thin_pool="pool3" volume_group="core3"/>
@@ -392,7 +393,7 @@
392393
</domain>
393394
<domain id="domain-6" class="AppVM">
394395
<properties>
395-
<property name="label">label-1</property>
396+
<property name="label">label-9</property>
396397
<property name="maxmem">300</property>
397398
<property name="name">test-net</property>
398399
<property name="netvm"></property>

0 commit comments

Comments
 (0)