On 12/16/22 19:26, Andrey Drobyshev wrote:
> On 12/15/22 21:25, Richard W.M. Jones wrote:
>> On Thu, Dec 15, 2022 at 08:11:15PM +0200, Andrey Drobyshev wrote:
>>> According to [1], there're different ways to specify which firmware is
>>> to be used by a libvirt-driven VM.  Namely, there's an automatic
>>> firmware selection, e.g.:
>>>
>>>     ...
>>>     <os firmware='(bios|efi)'>
>>>     ...
>>>
>>> and a manual one, e.g.:
>>>
>>>     ...
>>>     <os>
>>>         <loader readonly='yes' 
>>> type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
>>>         ...
>>>     </os>
>>>     ...
>>>
>>> with the latter being a way to specify UEFI firmware.  So let's add this
>>> search path as well when parsing source VM's libvirt xml.
>>>
>>> [1] https://libvirt.org/formatdomain.html#bios-bootloader
>>>
>>> Signed-off-by: Andrey Drobyshev <andrey.drobys...@virtuozzo.com>
>>> Originally-by: Denis Plotnikov <dplotni...@virtuozzo.com>
>>> ---
>>>  input/parse_libvirt_xml.ml | 21 +++++++++++++++++++--
>>>  1 file changed, 19 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/input/parse_libvirt_xml.ml b/input/parse_libvirt_xml.ml
>>> index 1e98ce1a..0fecde33 100644
>>> --- a/input/parse_libvirt_xml.ml
>>> +++ b/input/parse_libvirt_xml.ml
>>> @@ -27,6 +27,9 @@ open Xpath_helpers
>>>  open Types
>>>  open Utils
>>>  
>>> +(* Detect that "/domain/os/loader" node contains path to UEFI firmware. *)
>>> +let loader_contains_ovmf_re = PCRE.compile "/OVMF_CODE"
>>> +
>>>  type disk = {
>>>    d_format : string option;     (* Disk format from XML if known. *)
>>>    d_type : disk_type;           (* Disk type and extra information. *)
>>> @@ -446,12 +449,26 @@ let parse_libvirt_xml ?conn xml =
>>>      done;
>>>      List.rev !nics in
>>>  
>>> -  (* Firmware. *)
>>> +  (* Firmware.
>>> +   * If "/domain/os" node doesn't contain "firmware" attribute (automatic
>>> +   * firmware), we look for the presence of "OVMF_CODE" in 
>>> "/domain/os/loader"
>>> +   * node (manual firmware).
>>> +   * See https://libvirt.org/formatdomain.html#bios-bootloader
>>> +   *)
>>>    let firmware =
>>>      match xpath_string "/domain/os/@firmware" with
>>>      | Some "bios" -> BIOS
>>>      | Some "efi" -> UEFI
>>> -    | None | Some _ -> UnknownFirmware in
>>> +    | None | Some _ -> (
>>> +      let loader = xpath_string "/domain/os/loader" in
>>> +        match loader with
>>> +        | None -> UnknownFirmware
>>> +        | _ -> (
>>> +          let loader = Option.default "" loader in
>>> +          if PCRE.matches loader_contains_ovmf_re loader then UEFI
>>> +          else UnknownFirmware
>>> +        )
>>> +    ) in
>>>  
>>>    (* Check for hostdev devices. (RHBZ#1472719) *)
>>>    let () =
>>
>> It seems fine to me, just want to see what Laszlo thinks first.
>>
>> Rich.
>>
> 
> BTW speaking of the regexps, I think we might as well not use them at
> all (either PCRE or any other kind).  Libvirt wouldn't allow any
> modifications (letter case, spaces etc.) for the attribute value,
> meaning that if the attribute is present, it MUST be exactly "pflash".
> So in this case I'd go with straighforward string pattern matching.
> 

Sounds good to me.
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to