libvirt: Skip unsupported firmware types
Ignore (1) stateless mode firmware and (2) memory device firmware which do not include a few core keys such as nvram-template. This is a temporal (and backportable) workaround until firmware detection using libvirt's internal feature is implemented by [1] [1] https://blueprints.launchpad.net/nova/+spec/libvirt-firmware-auto-selection Closes-Bug: #2122288 Change-Id: I99bc36fdd5df816c9ae374db71e4734fb7fc467b Signed-off-by: Takashi Kajinami <kajinamit@oss.nttdata.com>
This commit is contained in:
@@ -2035,6 +2035,7 @@ Active: 8381604 kB
|
||||
'interface-types': ['uefi'],
|
||||
'mapping': {
|
||||
'device': 'flash',
|
||||
'mode': 'split',
|
||||
'executable': {
|
||||
'filename': '/usr/share/edk2/ovmf/OVMF_CODE.fd',
|
||||
'format': 'raw',
|
||||
@@ -2053,6 +2054,44 @@ Active: 8381604 kB
|
||||
'features': ['acpi-s3', 'amd-sev', 'verbose-dynamic'],
|
||||
'tags': [],
|
||||
},
|
||||
# NOTE(tkajinam): The following loaders are not supported and
|
||||
# should be ignored. https://bugs.launchpad.net/nova/+bug/2122288
|
||||
{
|
||||
'description': 'Sample descriptor for stateless mode',
|
||||
'interface-types': ['uefi'],
|
||||
'mapping': {
|
||||
'device': 'flash',
|
||||
'mode': 'stateless',
|
||||
'executable': {
|
||||
'filename': '/usr/share/edk2/ovmf/OVMF_CODE_SL.fd',
|
||||
'format': 'raw'
|
||||
}
|
||||
},
|
||||
'targets': [
|
||||
{
|
||||
'architecture': 'x86_64',
|
||||
'machines': ['pc-q35-*'],
|
||||
},
|
||||
],
|
||||
'features': ['amd-sev', 'verbose-dynamic'],
|
||||
'tags': [],
|
||||
},
|
||||
{
|
||||
'description': 'Sample descriptor for memory device',
|
||||
'interface-types': ['uefi'],
|
||||
'mapping': {
|
||||
'device': 'memory',
|
||||
'filename': '/usr/share/edk2/ovmf/OVMF_MEM.fd'
|
||||
},
|
||||
'targets': [
|
||||
{
|
||||
'architecture': 'x86_64',
|
||||
'machines': ['pc-q35-*'],
|
||||
}
|
||||
],
|
||||
'features': ['amd-sev', 'verbose-dynamic'],
|
||||
'tags': [],
|
||||
},
|
||||
]
|
||||
|
||||
def fake_get_mtype(arch, machine):
|
||||
|
||||
@@ -2094,31 +2094,37 @@ class Host(object):
|
||||
machine = self.get_canonical_machine_type(arch, machine)
|
||||
|
||||
for loader in self.loaders:
|
||||
for target in loader['targets']:
|
||||
if arch != target['architecture']:
|
||||
continue
|
||||
try:
|
||||
for target in loader['targets']:
|
||||
if arch != target['architecture']:
|
||||
continue
|
||||
|
||||
for machine_glob in target['machines']:
|
||||
# the 'machines' attribute supports glob patterns (e.g.
|
||||
# 'pc-q35-*') so we need to resolve these
|
||||
if fnmatch.fnmatch(machine, machine_glob):
|
||||
break
|
||||
for machine_glob in target['machines']:
|
||||
# the 'machines' attribute supports glob patterns (e.g.
|
||||
# 'pc-q35-*') so we need to resolve these
|
||||
if fnmatch.fnmatch(machine, machine_glob):
|
||||
break
|
||||
else:
|
||||
continue
|
||||
|
||||
# if we've got this far, we have a match on the target
|
||||
break
|
||||
else:
|
||||
continue
|
||||
|
||||
# if we've got this far, we have a match on the target
|
||||
break
|
||||
else:
|
||||
continue
|
||||
# if we request secure boot then we should get it and vice
|
||||
# versa
|
||||
if has_secure_boot != ('secure-boot' in loader['features']):
|
||||
continue
|
||||
|
||||
# if we request secure boot then we should get it and vice versa
|
||||
if has_secure_boot != ('secure-boot' in loader['features']):
|
||||
return (
|
||||
loader['mapping']['executable']['filename'],
|
||||
loader['mapping']['nvram-template']['filename'],
|
||||
'requires-smm' in loader['features'],
|
||||
)
|
||||
except KeyError:
|
||||
# This indicates that the description structure is new and nova
|
||||
# does not how to handle it
|
||||
continue
|
||||
|
||||
return (
|
||||
loader['mapping']['executable']['filename'],
|
||||
loader['mapping']['nvram-template']['filename'],
|
||||
'requires-smm' in loader['features'],
|
||||
)
|
||||
|
||||
raise exception.UEFINotSupported()
|
||||
|
||||
10
releasenotes/notes/bug-2133416-80522b523ee74835.yaml
Normal file
10
releasenotes/notes/bug-2133416-80522b523ee74835.yaml
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
fixes:
|
||||
- |
|
||||
[`bug 2133416 <https://bugs.launchpad.net/nova/+bug/2133416>`_] Libvirt
|
||||
virt driver now ignores the OVMF firmware files of the following types.
|
||||
Previously nova failed to start instances with UEFI boot when it attempts
|
||||
to check such firmware files.
|
||||
|
||||
- stateless mode
|
||||
- memory device
|
||||
Reference in New Issue
Block a user