From c4940bec6fd56d92602bd6279d81dcc693cac5ea Mon Sep 17 00:00:00 2001 From: Ali Mirjamali Date: Mon, 17 Feb 2025 13:39:13 +0330 Subject: [PATCH] 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: https://github.com/QubesOS/qubes-issues/issues/9781 --- qubesadmin/backup/restore.py | 8 ++++++ .../tests/backup/backupcompatibility.py | 28 +++++++++++++++++-- qubesadmin/tests/backup/v4-qubes.xml | 3 +- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/qubesadmin/backup/restore.py b/qubesadmin/backup/restore.py index 54288d72..b8c72737 100644 --- a/qubesadmin/backup/restore.py +++ b/qubesadmin/backup/restore.py @@ -2029,6 +2029,14 @@ def _restore_vms_metadata(self, restore_info): label=vm.label, pool=self.options.override_pool, **kwargs) + except qubesadmin.exc.QubesLabelNotFoundError: + # do not fail if label is not present. revert to red label + new_vm = self.app.add_new_vm( + vm.klass, + name=vm_name, + label='red', + pool=self.options.override_pool, + **kwargs) except Exception as err: # pylint: disable=broad-except self.log.error('Error restoring VM %s, skipping: %s', vm.name, err) diff --git a/qubesadmin/tests/backup/backupcompatibility.py b/qubesadmin/tests/backup/backupcompatibility.py index d6b325f0..61ba6df0 100644 --- a/qubesadmin/tests/backup/backupcompatibility.py +++ b/qubesadmin/tests/backup/backupcompatibility.py @@ -695,7 +695,7 @@ }, 'test-net': { 'klass': 'AppVM', - 'label': 'red', + 'label': 'scarlet', 'properties': { 'maxmem': '300', 'memory': '300', @@ -1357,7 +1357,31 @@ def setup_expected_calls(self, parsed_qubes_xml, templates_map=None): if name == 'dom0': continue - if self.storage_pool: + if self.storage_pool and vm['label'] == 'scarlet': + self.app.expected_calls[ + ('dom0', 'admin.vm.CreateInPool.' + vm['klass'], + templates_map.get(vm['template'], vm['template']), + 'name={} label={} pool={}'.format( + name, 'scarlet', self.storage_pool).encode())] = \ + b'2\0QubesLabelNotFoundError\0\0No such label\0' + self.app.expected_calls[ + ('dom0', 'admin.vm.CreateInPool.' + vm['klass'], + templates_map.get(vm['template'], vm['template']), + 'name={} label={} pool={}'.format( + name, 'red', self.storage_pool).encode())] = \ + b'0\0' + elif vm['label'] == 'scarlet': + self.app.expected_calls[ + ('dom0', 'admin.vm.Create.' + vm['klass'], + templates_map.get(vm['template'], vm['template']), + 'name={} label={}'.format(name, 'scarlet').encode())] =\ + b'2\0QubesLabelNotFoundError\0\0No such label\0' + self.app.expected_calls[ + ('dom0', 'admin.vm.Create.' + vm['klass'], + templates_map.get(vm['template'], vm['template']), + 'name={} label={}'.format(name, 'red').encode())] =\ + b'0\0' + elif self.storage_pool: self.app.expected_calls[ ('dom0', 'admin.vm.CreateInPool.' + vm['klass'], templates_map.get(vm['template'], vm['template']), diff --git a/qubesadmin/tests/backup/v4-qubes.xml b/qubesadmin/tests/backup/v4-qubes.xml index 951258c1..76dda7cb 100644 --- a/qubesadmin/tests/backup/v4-qubes.xml +++ b/qubesadmin/tests/backup/v4-qubes.xml @@ -8,6 +8,7 @@ + @@ -392,7 +393,7 @@ - label-1 + label-9 300 test-net