Skip to content

Commit 1913e2b

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 581531c commit 1913e2b

2 files changed

Lines changed: 21 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: 15 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,
@@ -1511,6 +1514,9 @@ def test_210_r2(self):
15111514
b'fedora-25 class=TemplateVM state=Halted\n'
15121515
b'testvm class=AppVM state=Running\n'
15131516
)
1517+
self.app.expected_calls[('dom0', 'admin.label.List', None, None)] = (
1518+
b'0\0red\norange\nyellow\ngreen\ngray\nblue\npurple\nblack\n'
1519+
)
15141520
self.app.expected_calls[
15151521
('dom0', 'admin.property.Get', 'default_template', None)] = \
15161522
b'0\0default=no type=vm fedora-25'
@@ -1579,6 +1585,9 @@ def test_220_r2_encrypted(self):
15791585
b'fedora-25 class=TemplateVM state=Halted\n'
15801586
b'testvm class=AppVM state=Running\n'
15811587
)
1588+
self.app.expected_calls[('dom0', 'admin.label.List', None, None)] = (
1589+
b'0\0red\norange\nyellow\ngreen\ngray\nblue\npurple\nblack\n'
1590+
)
15821591
self.app.expected_calls[
15831592
('dom0', 'admin.property.Get', 'default_template', None)] = \
15841593
b'0\0default=no type=vm fedora-25'
@@ -1647,6 +1656,9 @@ def test_230_r2_uncompressed(self):
16471656
b'fedora-25 class=TemplateVM state=Halted\n'
16481657
b'testvm class=AppVM state=Running\n'
16491658
)
1659+
self.app.expected_calls[('dom0', 'admin.label.List', None, None)] = (
1660+
b'0\0red\norange\nyellow\ngreen\ngray\nblue\npurple\nblack\n'
1661+
)
16501662
self.app.expected_calls[
16511663
('dom0', 'admin.property.Get', 'default_template', None)] = \
16521664
b'0\0default=no type=vm fedora-25'

0 commit comments

Comments
 (0)