Merge "libvirt: Add firmware auto-configuration support"

This commit is contained in:
Zuul 2021-03-08 15:55:56 +00:00 committed by Gerrit Code Review
commit dc6667c211
3 changed files with 77 additions and 34 deletions

View File

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

View File

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

View File

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