tests: libvirt xml rendering unit test
This commit is contained in:
parent
9ba84ecdad
commit
ef756eb05d
@ -417,20 +417,29 @@ class QubesTestCase(unittest.TestCase):
|
|||||||
callableObj(*args, **kwargs)
|
callableObj(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def assertXMLEqual(self, xml1, xml2):
|
def assertXMLEqual(self, xml1, xml2, msg=''):
|
||||||
'''Check for equality of two XML objects.
|
'''Check for equality of two XML objects.
|
||||||
|
|
||||||
:param xml1: first element
|
:param xml1: first element
|
||||||
:param xml2: second element
|
:param xml2: second element
|
||||||
:type xml1: :py:class:`lxml.etree._Element`
|
:type xml1: :py:class:`lxml.etree._Element`
|
||||||
:type xml2: :py:class:`lxml.etree._Element`
|
:type xml2: :py:class:`lxml.etree._Element`
|
||||||
''' # pylint: disable=invalid-name
|
'''
|
||||||
|
|
||||||
self.assertEqual(xml1.tag, xml2.tag)
|
self.assertEqual(xml1.tag, xml2.tag)
|
||||||
self.assertEqual(xml1.text, xml2.text)
|
msg += '/' + str(xml1.tag)
|
||||||
self.assertCountEqual(xml1.keys(), xml2.keys())
|
|
||||||
|
if xml1.text is not None and xml2.text is not None:
|
||||||
|
self.assertEqual(xml1.text.strip(), xml2.text.strip(), msg)
|
||||||
|
else:
|
||||||
|
self.assertEqual(xml1.text, xml2.text, msg)
|
||||||
|
self.assertCountEqual(xml1.keys(), xml2.keys(), msg)
|
||||||
for key in xml1.keys():
|
for key in xml1.keys():
|
||||||
self.assertEqual(xml1.get(key), xml2.get(key))
|
self.assertEqual(xml1.get(key), xml2.get(key), msg)
|
||||||
|
|
||||||
|
self.assertEqual(len(xml1), len(xml2), msg + ' children count')
|
||||||
|
for child1, child2 in zip(xml1, xml2):
|
||||||
|
self.assertXMLEqual(child1, child2, msg=msg)
|
||||||
|
|
||||||
def assertDevicesEqual(self, devices1, devices2, msg=None):
|
def assertDevicesEqual(self, devices1, devices2, msg=None):
|
||||||
self.assertEqual(devices1.keys(), devices2.keys(), msg)
|
self.assertEqual(devices1.keys(), devices2.keys(), msg)
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
#
|
#
|
||||||
|
import jinja2
|
||||||
|
|
||||||
import qubes.tests
|
import qubes.tests
|
||||||
|
|
||||||
@ -60,3 +61,11 @@ class TestApp(qubes.tests.TestEmitter):
|
|||||||
self.host = TestHost()
|
self.host = TestHost()
|
||||||
self.pools = {}
|
self.pools = {}
|
||||||
self.domains = {}
|
self.domains = {}
|
||||||
|
#: jinja2 environment for libvirt XML templates
|
||||||
|
self.env = jinja2.Environment(
|
||||||
|
loader=jinja2.FileSystemLoader([
|
||||||
|
'templates',
|
||||||
|
'/etc/qubes/templates',
|
||||||
|
'/usr/share/qubes/templates',
|
||||||
|
]),
|
||||||
|
undefined=jinja2.StrictUndefined)
|
||||||
|
@ -27,6 +27,7 @@ import unittest
|
|||||||
import uuid
|
import uuid
|
||||||
import datetime
|
import datetime
|
||||||
import lxml.etree
|
import lxml.etree
|
||||||
|
import unittest.mock
|
||||||
|
|
||||||
import qubes
|
import qubes
|
||||||
import qubes.exc
|
import qubes.exc
|
||||||
@ -500,3 +501,101 @@ class TC_90_QubesVM(QubesVMTestsMixin, qubes.tests.QubesTestCase):
|
|||||||
self.assertEqual(vm.virt_mode, 'pv')
|
self.assertEqual(vm.virt_mode, 'pv')
|
||||||
with self.assertRaises(AttributeError):
|
with self.assertRaises(AttributeError):
|
||||||
vm.hvm
|
vm.hvm
|
||||||
|
|
||||||
|
def test_600_libvirt_xml_pv(self):
|
||||||
|
expected = '''<domain type="xen">
|
||||||
|
<name>test-inst-test</name>
|
||||||
|
<uuid>7db78950-c467-4863-94d1-af59806384ea</uuid>
|
||||||
|
<memory unit="MiB">500</memory>
|
||||||
|
<currentMemory unit="MiB">400</currentMemory>
|
||||||
|
<vcpu placement="static">4</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch="x86_64" machine="xenpv">linux</type>
|
||||||
|
<kernel>/tmp/kernel/vmlinuz</kernel>
|
||||||
|
<initrd>/tmp/kernel/initramfs</initrd>
|
||||||
|
<cmdline>root=/dev/mapper/dmroot ro nomodeset console=hvc0 rd_NO_PLYMOUTH rd.plymouth.enable=0 plymouth.enable=0 nopat</cmdline>
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
</features>
|
||||||
|
<clock offset='utc' adjustment='reset'>
|
||||||
|
<timer name="tsc" mode="native"/>
|
||||||
|
</clock>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>destroy</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<disk type="block" device="disk">
|
||||||
|
<driver name="phy" />
|
||||||
|
<source dev="/tmp/kernel/modules.img" />
|
||||||
|
<target dev="xvdd" />
|
||||||
|
<backenddomain name="dom0" />
|
||||||
|
</disk>
|
||||||
|
<console type="pty">
|
||||||
|
<target type="xen" port="0"/>
|
||||||
|
</console>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
||||||
|
'''
|
||||||
|
my_uuid = '7db78950-c467-4863-94d1-af59806384ea'
|
||||||
|
vm = self.get_vm(uuid=my_uuid)
|
||||||
|
vm.netvm = None
|
||||||
|
vm.virt_mode = 'pv'
|
||||||
|
# tests for storage are later
|
||||||
|
vm.volumes['kernel'] = unittest.mock.Mock(**{
|
||||||
|
'kernels_dir': '/tmp/kernel',
|
||||||
|
'block_device.return_value.domain': 'dom0',
|
||||||
|
'block_device.return_value.script': None,
|
||||||
|
'block_device.return_value.path': '/tmp/kernel/modules.img',
|
||||||
|
'block_device.return_value.devtype': 'disk',
|
||||||
|
'block_device.return_value.name': 'kernel',
|
||||||
|
})
|
||||||
|
libvirt_xml = vm.create_config_file()
|
||||||
|
self.assertXMLEqual(lxml.etree.XML(libvirt_xml),
|
||||||
|
lxml.etree.XML(expected))
|
||||||
|
|
||||||
|
def test_600_libvirt_xml_hvm(self):
|
||||||
|
expected = '''<domain type="xen">
|
||||||
|
<name>test-inst-test</name>
|
||||||
|
<uuid>7db78950-c467-4863-94d1-af59806384ea</uuid>
|
||||||
|
<memory unit="MiB">500</memory>
|
||||||
|
<currentMemory unit="MiB">400</currentMemory>
|
||||||
|
<vcpu placement="static">4</vcpu>
|
||||||
|
<cpu mode='host-passthrough'>
|
||||||
|
<!-- disable nested HVM -->
|
||||||
|
<feature name='vmx' policy='disable'/>
|
||||||
|
<feature name='svm' policy='disable'/>
|
||||||
|
<!-- disable SMAP inside VM, because of Linux bug -->
|
||||||
|
<feature name='smap' policy='disable'/>
|
||||||
|
</cpu>
|
||||||
|
<os>
|
||||||
|
<type arch="x86_64" machine="xenfv">hvm</type>
|
||||||
|
<loader>hvmloader</loader>
|
||||||
|
<boot dev="cdrom" />
|
||||||
|
<boot dev="hd" />
|
||||||
|
<!-- server_ip is the address of stubdomain. It hosts it's own DNS server. -->
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
<pae/>
|
||||||
|
<acpi/>
|
||||||
|
<apic/>
|
||||||
|
<viridian/>
|
||||||
|
</features>
|
||||||
|
<clock offset="variable" adjustment="0" basis="localtime" />
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>destroy</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator type="stubdom-linux" />
|
||||||
|
<input type="tablet" bus="usb"/>
|
||||||
|
<video type="cirrus"/>
|
||||||
|
<graphics type="qubes"/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
||||||
|
'''
|
||||||
|
my_uuid = '7db78950-c467-4863-94d1-af59806384ea'
|
||||||
|
vm = self.get_vm(uuid=my_uuid)
|
||||||
|
vm.netvm = None
|
||||||
|
vm.virt_mode = 'hvm'
|
||||||
|
libvirt_xml = vm.create_config_file()
|
||||||
|
self.assertXMLEqual(lxml.etree.XML(libvirt_xml),
|
||||||
|
lxml.etree.XML(expected))
|
||||||
|
Loading…
Reference in New Issue
Block a user