Merge "libvirt: Add firmware auto-configuration support"
This commit is contained in:
commit
dc6667c211
|
@ -2451,22 +2451,55 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest):
|
|||
obj.vcpus = 1
|
||||
obj.name = "uefi"
|
||||
obj.uuid = "f01cf68d-515c-4daf-b85f-ef1424d93bfc"
|
||||
obj.os_type = "x86_64"
|
||||
obj.os_loader = '/tmp/OVMF_CODE.fd'
|
||||
obj.os_type = "hvm"
|
||||
obj.os_mach_type = "pc-q35-5.1"
|
||||
obj.os_loader = '/tmp/OVMF_CODE.secboot.fd'
|
||||
obj.os_loader_type = 'pflash'
|
||||
obj.os_loader_secure = True
|
||||
xml = obj.to_xml()
|
||||
|
||||
self.assertXmlEqual(xml, """
|
||||
self.assertXmlEqual(
|
||||
xml,
|
||||
"""
|
||||
<domain type="kvm">
|
||||
<uuid>f01cf68d-515c-4daf-b85f-ef1424d93bfc</uuid>
|
||||
<name>uefi</name>
|
||||
<memory>104857600</memory>
|
||||
<vcpu>1</vcpu>
|
||||
<os>
|
||||
<type>x86_64</type>
|
||||
<loader readonly='yes' type='pflash'>/tmp/OVMF_CODE.fd</loader>
|
||||
<type machine="pc-q35-5.1">hvm</type>
|
||||
<loader secure='yes' readonly='yes' type='pflash'>/tmp/OVMF_CODE.secboot.fd</loader>
|
||||
</os>
|
||||
</domain>""")
|
||||
</domain>""", # noqa: E501
|
||||
)
|
||||
|
||||
def test_config_uefi_autoconfigure(self):
|
||||
obj = config.LibvirtConfigGuest()
|
||||
obj.virt_type = "kvm"
|
||||
obj.memory = 100 * units.Mi
|
||||
obj.vcpus = 1
|
||||
obj.name = "uefi"
|
||||
obj.uuid = "f01cf68d-515c-4daf-b85f-ef1424d93bfc"
|
||||
obj.os_type = "hvm"
|
||||
obj.os_firmware = "efi"
|
||||
obj.os_mach_type = "pc-q35-5.1"
|
||||
obj.os_loader_secure = True
|
||||
xml = obj.to_xml()
|
||||
|
||||
self.assertXmlEqual(
|
||||
xml,
|
||||
"""
|
||||
<domain type="kvm">
|
||||
<uuid>f01cf68d-515c-4daf-b85f-ef1424d93bfc</uuid>
|
||||
<name>uefi</name>
|
||||
<memory>104857600</memory>
|
||||
<vcpu>1</vcpu>
|
||||
<os firmware="efi">
|
||||
<type machine="pc-q35-5.1">hvm</type>
|
||||
<loader secure='yes'/>
|
||||
</os>
|
||||
</domain>""",
|
||||
)
|
||||
|
||||
def test_config_boot_menu(self):
|
||||
obj = config.LibvirtConfigGuest()
|
||||
|
@ -2475,7 +2508,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest):
|
|||
obj.vcpus = 2
|
||||
obj.name = "bootmenu"
|
||||
obj.uuid = "f01cf68d-515c-4daf-b85f-ef1424d93bfc"
|
||||
obj.os_type = "fake"
|
||||
obj.os_type = "hvm"
|
||||
obj.os_bootmenu = True
|
||||
xml = obj.to_xml()
|
||||
|
||||
|
@ -2486,7 +2519,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest):
|
|||
<memory>104857600</memory>
|
||||
<vcpu>2</vcpu>
|
||||
<os>
|
||||
<type>fake</type>
|
||||
<type>hvm</type>
|
||||
<bootmenu enable="yes"/>
|
||||
</os>
|
||||
</domain>""")
|
||||
|
@ -2498,7 +2531,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest):
|
|||
obj.vcpus = 2
|
||||
obj.name = "perf"
|
||||
obj.uuid = "f01cf68d-515c-4daf-b85f-ef1424d93bfc"
|
||||
obj.os_type = "fake"
|
||||
obj.os_type = "hvm"
|
||||
obj.perf_events = ['cmt', 'mbml']
|
||||
xml = obj.to_xml()
|
||||
|
||||
|
@ -2509,7 +2542,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest):
|
|||
<memory>104857600</memory>
|
||||
<vcpu>2</vcpu>
|
||||
<os>
|
||||
<type>fake</type>
|
||||
<type>hvm</type>
|
||||
</os>
|
||||
<perf>
|
||||
<event enabled="yes" name="cmt"/>
|
||||
|
@ -2641,7 +2674,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest):
|
|||
xmldoc = """
|
||||
<domain>
|
||||
<os>
|
||||
<type>x86_64</type>
|
||||
<type>hvm</type>
|
||||
<loader readonly='yes' type='pflash'>/tmp/OVMF_CODE.fd</loader>
|
||||
</os>
|
||||
</domain>
|
||||
|
@ -2650,7 +2683,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest):
|
|||
obj.parse_str(xmldoc)
|
||||
|
||||
self.assertIsNone(obj.virt_type)
|
||||
self.assertEqual('x86_64', obj.os_type)
|
||||
self.assertEqual('hvm', obj.os_type)
|
||||
self.assertIsNone(obj.os_mach_type)
|
||||
self.assertIsNone(obj.os_kernel)
|
||||
self.assertEqual('/tmp/OVMF_CODE.fd', obj.os_loader)
|
||||
|
|
|
@ -27714,6 +27714,7 @@ class LibvirtPMEMNamespaceTests(test.NoDBTestCase):
|
|||
guest.name = 'name'
|
||||
guest.uuid = 'uuid'
|
||||
guest.memory = 1024
|
||||
guest.os_type = fields.VMMode.HVM
|
||||
vpmems = [self.vpmem_0]
|
||||
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
|
||||
drvr._guest_add_vpmems(guest, vpmems)
|
||||
|
@ -27725,7 +27726,7 @@ class LibvirtPMEMNamespaceTests(test.NoDBTestCase):
|
|||
<maxMemory slots="1">4193280</maxMemory>
|
||||
<vcpu>1</vcpu>
|
||||
<os>
|
||||
<type>None</type>
|
||||
<type>hvm</type>
|
||||
</os>
|
||||
<devices>
|
||||
<memory model="nvdimm" access="shared">
|
||||
|
|
|
@ -59,9 +59,13 @@ class LibvirtConfigObject(object):
|
|||
|
||||
def _text_node(self, node_name, value, **kwargs):
|
||||
child = self._new_node(node_name, **kwargs)
|
||||
child.text = str(value)
|
||||
if value is not None:
|
||||
child.text = str(value)
|
||||
return child
|
||||
|
||||
def get_yes_no_str(self, value):
|
||||
return 'yes' if value else 'no'
|
||||
|
||||
def format_dom(self):
|
||||
return self._new_node(self.root_name)
|
||||
|
||||
|
@ -682,10 +686,7 @@ class LibvirtConfigGuestTimer(LibvirtConfigObject):
|
|||
if self.tickpolicy is not None:
|
||||
tm.set("tickpolicy", self.tickpolicy)
|
||||
if self.present is not None:
|
||||
if self.present:
|
||||
tm.set("present", "yes")
|
||||
else:
|
||||
tm.set("present", "no")
|
||||
tm.set("present", self.get_yes_no_str(self.present))
|
||||
|
||||
return tm
|
||||
|
||||
|
@ -2016,10 +2017,7 @@ class LibvirtConfigGuestGraphics(LibvirtConfigGuestDevice):
|
|||
dev = super(LibvirtConfigGuestGraphics, self).format_dom()
|
||||
|
||||
dev.set("type", self.type)
|
||||
if self.autoport:
|
||||
dev.set("autoport", "yes")
|
||||
else:
|
||||
dev.set("autoport", "no")
|
||||
dev.set("autoport", self.get_yes_no_str(self.autoport))
|
||||
if self.keymap:
|
||||
dev.set("keymap", self.keymap)
|
||||
if self.listen:
|
||||
|
@ -2783,7 +2781,9 @@ class LibvirtConfigGuest(LibvirtConfigObject):
|
|||
self.sysinfo = None
|
||||
self.os_type = None
|
||||
self.os_loader = None
|
||||
self.os_firmware = None
|
||||
self.os_loader_type = None
|
||||
self.os_loader_secure = None
|
||||
self.os_kernel = None
|
||||
self.os_initrd = None
|
||||
self.os_cmdline = None
|
||||
|
@ -2829,21 +2829,32 @@ class LibvirtConfigGuest(LibvirtConfigObject):
|
|||
|
||||
def _format_os(self, root):
|
||||
os = etree.Element("os")
|
||||
|
||||
if self.os_firmware is not None:
|
||||
os.set("firmware", self.os_firmware)
|
||||
|
||||
type_node = self._text_node("type", self.os_type)
|
||||
if self.os_mach_type is not None:
|
||||
type_node.set("machine", self.os_mach_type)
|
||||
os.append(type_node)
|
||||
|
||||
if self.os_kernel is not None:
|
||||
os.append(self._text_node("kernel", self.os_kernel))
|
||||
if self.os_loader is not None:
|
||||
# Generate XML nodes for UEFI boot.
|
||||
if self.os_loader_type == "pflash":
|
||||
loader = self._text_node("loader", self.os_loader)
|
||||
|
||||
# Generate XML nodes for UEFI boot.
|
||||
if (
|
||||
self.os_loader_type is not None or
|
||||
self.os_loader_secure is not None
|
||||
):
|
||||
loader = self._text_node("loader", self.os_loader)
|
||||
if self.os_loader_type is not None:
|
||||
loader.set("type", "pflash")
|
||||
loader.set("readonly", "yes")
|
||||
os.append(loader)
|
||||
else:
|
||||
os.append(self._text_node("loader", self.os_loader))
|
||||
if self.os_loader_secure is not None:
|
||||
loader.set(
|
||||
"secure", self.get_yes_no_str(self.os_loader_secure))
|
||||
os.append(loader)
|
||||
|
||||
if self.os_initrd is not None:
|
||||
os.append(self._text_node("initrd", self.os_initrd))
|
||||
if self.os_cmdline is not None:
|
||||
|
@ -2950,6 +2961,9 @@ class LibvirtConfigGuest(LibvirtConfigObject):
|
|||
self.cpuset = hardware.parse_cpu_spec(xmldoc.get('cpuset'))
|
||||
|
||||
def _parse_os(self, xmldoc):
|
||||
if xmldoc.get('firmware'):
|
||||
self.os_firmware = xmldoc.get('firmware')
|
||||
|
||||
# smbios is skipped just because LibvirtConfigGuestSMBIOS
|
||||
# does not implement parse_dom method
|
||||
for c in xmldoc:
|
||||
|
@ -3379,11 +3393,6 @@ class LibvirtConfigSecret(LibvirtConfigObject):
|
|||
self.usage_type = None
|
||||
self.usage_id = None
|
||||
|
||||
def get_yes_no_str(self, value):
|
||||
if value:
|
||||
return 'yes'
|
||||
return 'no'
|
||||
|
||||
def format_dom(self):
|
||||
root = super(LibvirtConfigSecret, self).format_dom()
|
||||
root.set("ephemeral", self.get_yes_no_str(self.ephemeral))
|
||||
|
|
Loading…
Reference in New Issue