@@ -48,6 +48,13 @@ class TestProp(object):
48
48
# pylint: disable=too-few-public-methods
49
49
__name__ = 'testprop'
50
50
51
+ class TestDeviceCollection (object ):
52
+ def __init__ (self ):
53
+ self ._list = []
54
+
55
+ def persistent (self ):
56
+ return self ._list
57
+
51
58
class TestVM (object ):
52
59
# pylint: disable=too-few-public-methods
53
60
app = TestApp ()
@@ -57,6 +64,7 @@ def __init__(self, **kwargs):
57
64
self .installed_by_rpm = False
58
65
for k , v in kwargs .items ():
59
66
setattr (self , k , v )
67
+ self .devices = {'pci' : TestDeviceCollection ()}
60
68
61
69
def is_running (self ):
62
70
return self .running
@@ -109,6 +117,12 @@ def test_040_setter_virt_mode(self):
109
117
self .assertEqual (
110
118
qubes .vm .qubesvm ._setter_virt_mode (self .vm , self .prop , 'PV' ),
111
119
'pv' )
120
+ self .assertEqual (
121
+ qubes .vm .qubesvm ._setter_virt_mode (self .vm , self .prop , 'pvh' ),
122
+ 'pvh' )
123
+ self .vm .devices ['pci' ]._list .append (object ())
124
+ with self .assertRaises (ValueError ):
125
+ qubes .vm .qubesvm ._setter_virt_mode (self .vm , self .prop , 'pvh' )
112
126
with self .assertRaises (ValueError ):
113
127
qubes .vm .qubesvm ._setter_virt_mode (self .vm , self .prop , 'True' )
114
128
@@ -608,3 +622,66 @@ def test_600_libvirt_xml_hvm(self):
608
622
libvirt_xml = vm .create_config_file ()
609
623
self .assertXMLEqual (lxml .etree .XML (libvirt_xml ),
610
624
lxml .etree .XML (expected ))
625
+
626
+ def test_600_libvirt_xml_pvh (self ):
627
+ expected = '''<domain type="xen">
628
+ <name>test-inst-test</name>
629
+ <uuid>7db78950-c467-4863-94d1-af59806384ea</uuid>
630
+ <memory unit="MiB">500</memory>
631
+ <currentMemory unit="MiB">400</currentMemory>
632
+ <vcpu placement="static">2</vcpu>
633
+ <cpu mode='host-passthrough'>
634
+ <!-- disable nested HVM -->
635
+ <feature name='vmx' policy='disable'/>
636
+ <feature name='svm' policy='disable'/>
637
+ <!-- disable SMAP inside VM, because of Linux bug -->
638
+ <feature name='smap' policy='disable'/>
639
+ </cpu>
640
+ <os>
641
+ <type arch="x86_64" machine="xenfv">hvm</type>
642
+ <kernel>/tmp/kernel/vmlinuz</kernel>
643
+ <initrd>/tmp/kernel/initramfs</initrd>
644
+ <cmdline>root=/dev/mapper/dmroot ro nomodeset console=hvc0 rd_NO_PLYMOUTH rd.plymouth.enable=0 plymouth.enable=0 nopat</cmdline>
645
+ </os>
646
+ <features>
647
+ <pae/>
648
+ <acpi/>
649
+ <apic/>
650
+ <viridian/>
651
+ </features>
652
+ <clock offset='utc' adjustment='reset'>
653
+ <timer name="tsc" mode="native"/>
654
+ </clock>
655
+ <on_poweroff>destroy</on_poweroff>
656
+ <on_reboot>destroy</on_reboot>
657
+ <on_crash>destroy</on_crash>
658
+ <devices>
659
+ <disk type="block" device="disk">
660
+ <driver name="phy" />
661
+ <source dev="/tmp/kernel/modules.img" />
662
+ <target dev="xvdd" />
663
+ <backenddomain name="dom0" />
664
+ </disk>
665
+ <emulator type="none" />
666
+ <console type="pty">
667
+ <target type="xen" port="0"/>
668
+ </console>
669
+ </devices>
670
+ </domain>
671
+ '''
672
+ my_uuid = '7db78950-c467-4863-94d1-af59806384ea'
673
+ vm = self .get_vm (uuid = my_uuid )
674
+ vm .netvm = None
675
+ vm .virt_mode = 'pvh'
676
+ # tests for storage are later
677
+ vm .volumes ['kernel' ] = unittest .mock .Mock (** {
678
+ 'kernels_dir' : '/tmp/kernel' ,
679
+ 'block_device.return_value.domain' : 'dom0' ,
680
+ 'block_device.return_value.script' : None ,
681
+ 'block_device.return_value.path' : '/tmp/kernel/modules.img' ,
682
+ 'block_device.return_value.devtype' : 'disk' ,
683
+ 'block_device.return_value.name' : 'kernel' ,
684
+ })
685
+ libvirt_xml = vm .create_config_file ()
686
+ self .assertXMLEqual (lxml .etree .XML (libvirt_xml ),
687
+ lxml .etree .XML (expected ))
0 commit comments