tests: libvirt xml rendering unit test

This commit is contained in:
Marek Marczykowski-Górecki 2017-07-17 12:28:24 +02:00
parent 9ba84ecdad
commit ef756eb05d
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724
3 changed files with 122 additions and 5 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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))