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)
|
||||
|
||||
|
||||
def assertXMLEqual(self, xml1, xml2):
|
||||
def assertXMLEqual(self, xml1, xml2, msg=''):
|
||||
'''Check for equality of two XML objects.
|
||||
|
||||
:param xml1: first element
|
||||
:param xml2: second element
|
||||
:type xml1: :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.text, xml2.text)
|
||||
self.assertCountEqual(xml1.keys(), xml2.keys())
|
||||
msg += '/' + str(xml1.tag)
|
||||
|
||||
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():
|
||||
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):
|
||||
self.assertEqual(devices1.keys(), devices2.keys(), msg)
|
||||
|
@ -20,6 +20,7 @@
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
import jinja2
|
||||
|
||||
import qubes.tests
|
||||
|
||||
@ -60,3 +61,11 @@ class TestApp(qubes.tests.TestEmitter):
|
||||
self.host = TestHost()
|
||||
self.pools = {}
|
||||
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 datetime
|
||||
import lxml.etree
|
||||
import unittest.mock
|
||||
|
||||
import qubes
|
||||
import qubes.exc
|
||||
@ -500,3 +501,101 @@ class TC_90_QubesVM(QubesVMTestsMixin, qubes.tests.QubesTestCase):
|
||||
self.assertEqual(vm.virt_mode, 'pv')
|
||||
with self.assertRaises(AttributeError):
|
||||
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