From 9ba84ecdad0414a2c78533b4330a58f01210c5ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Mon, 17 Jul 2017 12:27:17 +0200 Subject: [PATCH] Add code and test for migrating vm.hvm into vm.virt_mode This will allow to load old qubes.xml - otherwise previous change render the system unusable (until manual qubes.xml edit). QubesOS/qubes-issues#2912 --- qubes/tests/vm/qubesvm.py | 24 ++++++++++++++++++++++++ qubes/vm/qubesvm.py | 10 ++++++++++ 2 files changed, 34 insertions(+) diff --git a/qubes/tests/vm/qubesvm.py b/qubes/tests/vm/qubesvm.py index 2ca799d9..23da01c0 100644 --- a/qubes/tests/vm/qubesvm.py +++ b/qubes/tests/vm/qubesvm.py @@ -26,6 +26,7 @@ import os import unittest import uuid import datetime +import lxml.etree import qubes import qubes.exc @@ -476,3 +477,26 @@ class TC_90_QubesVM(QubesVMTestsMixin, qubes.tests.QubesTestCase): vm = self.get_vm() self.assertPropertyInvalidValue(vm, 'backup_timestamp', 'xxx') self.assertPropertyInvalidValue(vm, 'backup_timestamp', None) + + def test_500_property_migrate_virt_mode(self): + xml_template = ''' + + + 1 + testvm + + {hvm_value} + + + ''' + xml = lxml.etree.XML(xml_template.format(hvm_value='True')) + vm = qubes.vm.qubesvm.QubesVM(self.app, xml) + self.assertEqual(vm.virt_mode, 'hvm') + with self.assertRaises(AttributeError): + vm.hvm + + xml = lxml.etree.XML(xml_template.format(hvm_value='False')) + vm = qubes.vm.qubesvm.QubesVM(self.app, xml) + self.assertEqual(vm.virt_mode, 'pv') + with self.assertRaises(AttributeError): + vm.hvm diff --git a/qubes/vm/qubesvm.py b/qubes/vm/qubesvm.py index 53795632..7847b39a 100644 --- a/qubes/vm/qubesvm.py +++ b/qubes/vm/qubesvm.py @@ -621,6 +621,16 @@ class QubesVM(qubes.vm.mix.net.NetVMMixin, qubes.vm.BaseVM): # def __init__(self, app, xml, volume_config=None, **kwargs): + # migrate renamed properties + if xml is not None: + node_hvm = xml.find('./properties/property[@name=\'hvm\']') + if node_hvm is not None: + if qubes.property.bool(None, None, node_hvm.text): + kwargs['virt_mode'] = 'hvm' + else: + kwargs['virt_mode'] = 'pv' + node_hvm.getparent().remove(node_hvm) + super(QubesVM, self).__init__(app, xml, **kwargs) if volume_config is None: