Skip to content

Commit 5f4fbaf

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 5f4fbaf

2 files changed

Lines changed: 15 additions & 3 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: 9 additions & 3 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,
@@ -1487,6 +1490,9 @@ def setup_expected_calls(self, parsed_qubes_xml, templates_map=None):
14871490
[orig_admin_vm_list] + \
14881491
[orig_admin_vm_list + b''.join(extra_vm_list_lines)] * \
14891492
len(extra_vm_list_lines)
1493+
self.app.expected_calls[('dom0', 'admin.label.List', None, None)] = (
1494+
b'0\0red\norange\nyellow\ngreen\ngray\nblue\npurple\nblack\n'
1495+
)
14901496

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

0 commit comments

Comments
 (0)