[Libguestfs] [virt-v2v PATCH 3/3] lib/create_ovf: populate "actual size" attributes again

Richard W.M. Jones rjones at redhat.com
Wed Dec 8 15:22:55 UTC 2021


On Wed, Dec 08, 2021 at 01:20:50PM +0100, Laszlo Ersek wrote:
> Commit 255722cbf39a ("v2v: Modular virt-v2v", 2021-09-07) removed the
> following attributes from the OVF output:
> 
> - ovf:Envelope/References/File/@ovf:size
> - ovf:Envelope/Section[@xsi:type='ovf:DiskSection_Type']/Disk/@ovf:actual_size
> 
> Unfortunately, ovirt-engine considers the second one mandatory; without
> it, ovirt-engine refuses to import the OVF.
> 
> Restore both attributes, using the utility functions added to the Nbdkit
> module previously.
> 
> (If we do not have the information necessary to fill in @ovf:actual_size,
> we still have to generate the attribute, only with empty contents.
> Ovirt-engine does cope with that.)
> 
> Fixes: 255722cbf39afc0b012e2ac00d16fa6ba2f8c21f
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2027598
> Signed-off-by: Laszlo Ersek <lersek at redhat.com>
> ---
>  lib/create_ovf.mli                         |  2 +-
>  lib/create_ovf.ml                          | 33 +++++++++-----------
>  output/output_rhv.ml                       |  2 +-
>  output/output_rhv_upload.ml                |  2 +-
>  output/output_vdsm.ml                      |  1 +
>  tests/test-v2v-o-rhv.ovf.expected          |  4 +--
>  tests/test-v2v-o-vdsm-options.ovf.expected |  4 +--
>  7 files changed, 23 insertions(+), 25 deletions(-)
> 
> diff --git a/lib/create_ovf.mli b/lib/create_ovf.mli
> index 701152d93dd2..0d1cc5a9311a 100644
> --- a/lib/create_ovf.mli
> +++ b/lib/create_ovf.mli
> @@ -46,7 +46,7 @@ val ovf_flavour_to_string : ovf_flavour -> string
>  val create_ovf : Types.source -> Types.inspect ->
>                   Types.target_meta -> int64 list ->
>                   Types.output_allocation -> string -> string -> string list ->
> -                 string list -> string ->  ovf_flavour -> DOM.doc
> +                 string list -> string -> string -> ovf_flavour -> DOM.doc
>  (** Create the OVF file.
>  
>      Actually a {!DOM} document is created, not a file.  It can be written
> diff --git a/lib/create_ovf.ml b/lib/create_ovf.ml
> index c9f14635363e..7bc15b74662a 100644
> --- a/lib/create_ovf.ml
> +++ b/lib/create_ovf.ml
> @@ -531,7 +531,7 @@ let rec create_ovf source inspect
>            { output_name; guestcaps; target_firmware; target_nics }
>            sizes
>            output_alloc output_format
> -          sd_uuid image_uuids vol_uuids vm_uuid ovf_flavour =
> +          sd_uuid image_uuids vol_uuids dir vm_uuid ovf_flavour =
>    assert (List.length sizes = List.length vol_uuids);
>  
>    let memsize_mb = source.s_memory /^ 1024L /^ 1024L in
> @@ -745,7 +745,7 @@ let rec create_ovf source inspect
>  
>    (* Add disks to the OVF XML. *)
>    add_disks sizes guestcaps output_alloc output_format
> -    sd_uuid image_uuids vol_uuids ovf_flavour ovf;
> +    sd_uuid image_uuids vol_uuids dir ovf_flavour ovf;
>  
>    (* Old virt-v2v ignored removable media. XXX *)
>  
> @@ -791,7 +791,7 @@ and get_flavoured_section ovf ovirt_path rhv_path rhv_path_attr = function
>  
>  (* This modifies the OVF DOM, adding a section for each disk. *)
>  and add_disks sizes guestcaps output_alloc output_format
> -    sd_uuid image_uuids vol_uuids ovf_flavour ovf =
> +    sd_uuid image_uuids vol_uuids dir ovf_flavour ovf =
>    let references =
>      let nodes = path_to_nodes ovf ["ovf:Envelope"; "References"] in
>      match nodes with
> @@ -839,13 +839,7 @@ and add_disks sizes guestcaps output_alloc output_format
>          b /^ 1073741824L
>        in
>        let size_gb = bytes_to_gb size in
> -      (* virt-v2v 1.4x used to try to collect the actual size of the
> -       * sparse disk.  It would be possible to get this information
> -       * accurately now by reading the extent map of the output disk
> -       * (this function is called during finalization), but we don't
> -       * yet do that. XXX
> -       *)
> -      let actual_size_gb = None in
> +      let actual_size = Nbdkit.get_disk_allocated ~dir ~disknr:i in
>  
>        let format_for_rhv =
>          match output_format with
> @@ -867,13 +861,11 @@ and add_disks sizes guestcaps output_alloc output_format
>            "ovf:id", vol_uuid;
>            "ovf:description", generated_by;
>          ] in
> -        (* See note above about actual_size_gb
> -        (match t.target_overlay.ov_stats.target_actual_size with
> +        (match actual_size with
>           | None -> ()
>           | Some actual_size ->
>              List.push_back attrs ("ovf:size", Int64.to_string actual_size)
>          );
> -        *)
>          e "File" !attrs [] in
>        append_child disk references;
>  
> @@ -899,11 +891,16 @@ and add_disks sizes guestcaps output_alloc output_format
>            "ovf:disk-type", "System"; (* RHBZ#744538 *)
>            "ovf:boot", if is_bootable_drive then "True" else "False";
>          ] in
> -        (match actual_size_gb with
> -         | None -> ()
> -         | Some actual_size_gb ->
> -            List.push_back attrs ("ovf:actual_size", Int64.to_string actual_size_gb)
> -        );
> +        (* Ovirt-engine considers the "ovf:actual_size" attribute mandatory. If
> +         * we don't know the actual size, we must create the attribute with
> +         * empty contents.
> +         *)
> +        List.push_back attrs
> +          ("ovf:actual_size",
> +           match actual_size with
> +            | None -> ""
> +            | Some actual_size -> Int64.to_string (bytes_to_gb actual_size)
> +          );
>          e "Disk" !attrs [] in
>        append_child disk disk_section;
>  
> diff --git a/output/output_rhv.ml b/output/output_rhv.ml
> index 4550dc4f306f..b902a7ee4619 100644
> --- a/output/output_rhv.ml
> +++ b/output/output_rhv.ml
> @@ -183,7 +183,7 @@ and rhv_finalize dir source inspect target_meta
>    (* Create the metadata. *)
>    let ovf =
>      Create_ovf.create_ovf source inspect target_meta sizes
> -      output_alloc output_format esd_uuid image_uuids vol_uuids vm_uuid
> +      output_alloc output_format esd_uuid image_uuids vol_uuids dir vm_uuid
>        Create_ovf.RHVExportStorageDomain in
>  
>    (* Write it to the metadata file. *)
> diff --git a/output/output_rhv_upload.ml b/output/output_rhv_upload.ml
> index 64b88b67793c..89ff350be567 100644
> --- a/output/output_rhv_upload.ml
> +++ b/output/output_rhv_upload.ml
> @@ -420,7 +420,7 @@ and rhv_upload_finalize dir source inspect target_meta
>    (* Create the metadata. *)
>    let ovf =
>      Create_ovf.create_ovf source inspect target_meta disk_sizes
> -      Sparse output_format sd_uuid disk_uuids vol_uuids vm_uuid
> +      Sparse output_format sd_uuid disk_uuids vol_uuids dir vm_uuid
>        OVirt in
>    let ovf = DOM.doc_to_string ovf in
>  
> diff --git a/output/output_vdsm.ml b/output/output_vdsm.ml
> index c9b552805ccd..ce0d5b5e4b2a 100644
> --- a/output/output_vdsm.ml
> +++ b/output/output_vdsm.ml
> @@ -201,6 +201,7 @@ and vdsm_finalize dir source inspect target_meta
>                output_alloc output_format dd_uuid
>                image_uuids
>                vol_uuids
> +              dir
>                vm_uuid
>                ovf_flavour in
>  
> diff --git a/tests/test-v2v-o-rhv.ovf.expected b/tests/test-v2v-o-rhv.ovf.expected
> index 5fda41c9488e..25e492fdbabc 100644
> --- a/tests/test-v2v-o-rhv.ovf.expected
> +++ b/tests/test-v2v-o-rhv.ovf.expected
> @@ -2,7 +2,7 @@
>  <ovf:Envelope xmlns:rasd='http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData' xmlns:vssd='http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:ovf='http://schemas.dmtf.org/ovf/envelope/1/' xmlns:ovirt='http://www.ovirt.org/ovf' ovf:version='0.9'>
>    <!-- generated by virt-v2v -->
>    <References>
> -    <File ovf:href='#DISK_ID#/#VOL_ID#' ovf:id='#VOL_ID#' ovf:description='generated by virt-v2v'/>
> +    <File ovf:href='#DISK_ID#/#VOL_ID#' ovf:id='#VOL_ID#' ovf:description='generated by virt-v2v' ovf:size='#SIZE#'/>
>    </References>
>    <Section xsi:type='ovf:NetworkSection_Type'>
>      <Info>List of networks</Info>
> @@ -10,7 +10,7 @@
>    </Section>
>    <Section xsi:type='ovf:DiskSection_Type'>
>      <Info>List of Virtual Disks</Info>
> -    <Disk ovf:diskId='#VOL_ID#' ovf:size='1' ovf:capacity='536870912' ovf:fileRef='#DISK_ID#/#VOL_ID#' ovf:parentRef='' ovf:vm_snapshot_id='#UUID#' ovf:volume-format='RAW' ovf:volume-type='Sparse' ovf:format='http://en.wikipedia.org/wiki/Byte' ovf:disk-interface='VirtIO' ovf:disk-type='System' ovf:boot='True'/>
> +    <Disk ovf:diskId='#VOL_ID#' ovf:size='1' ovf:capacity='536870912' ovf:fileRef='#DISK_ID#/#VOL_ID#' ovf:parentRef='' ovf:vm_snapshot_id='#UUID#' ovf:volume-format='RAW' ovf:volume-type='Sparse' ovf:format='http://en.wikipedia.org/wiki/Byte' ovf:disk-interface='VirtIO' ovf:disk-type='System' ovf:boot='True' ovf:actual_size='1'/>
>    </Section>
>    <Content ovf:id='out' xsi:type='ovf:VirtualSystem_Type'>
>      <Name>windows</Name>
> diff --git a/tests/test-v2v-o-vdsm-options.ovf.expected b/tests/test-v2v-o-vdsm-options.ovf.expected
> index 23ca180f4c2f..bd5b5e7d38ec 100644
> --- a/tests/test-v2v-o-vdsm-options.ovf.expected
> +++ b/tests/test-v2v-o-vdsm-options.ovf.expected
> @@ -2,7 +2,7 @@
>  <ovf:Envelope xmlns:rasd='http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData' xmlns:vssd='http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:ovf='http://schemas.dmtf.org/ovf/envelope/1/' xmlns:ovirt='http://www.ovirt.org/ovf' ovf:version='0.9'>
>    <!-- generated by virt-v2v -->
>    <References>
> -    <File ovf:href='VOL' ovf:id='VOL' ovf:description='generated by virt-v2v'/>
> +    <File ovf:href='VOL' ovf:id='VOL' ovf:description='generated by virt-v2v' ovf:size='#SIZE#'/>
>    </References>
>    <NetworkSection>
>      <Info>List of networks</Info>
> @@ -10,7 +10,7 @@
>    </NetworkSection>
>    <DiskSection>
>      <Info>List of Virtual Disks</Info>
> -    <Disk ovf:diskId='IMAGE' ovf:size='1' ovf:capacity='536870912' ovf:fileRef='VOL' ovf:parentRef='' ovf:vm_snapshot_id='#UUID#' ovf:volume-format='COW' ovf:volume-type='Sparse' ovf:format='http://en.wikipedia.org/wiki/Byte' ovf:disk-interface='VirtIO' ovf:disk-type='System' ovf:boot='True'/>
> +    <Disk ovf:diskId='IMAGE' ovf:size='1' ovf:capacity='536870912' ovf:fileRef='VOL' ovf:parentRef='' ovf:vm_snapshot_id='#UUID#' ovf:volume-format='COW' ovf:volume-type='Sparse' ovf:format='http://en.wikipedia.org/wiki/Byte' ovf:disk-interface='VirtIO' ovf:disk-type='System' ovf:boot='True' ovf:actual_size='1'/>
>    </DiskSection>
>    <VirtualSystem ovf:id='VM'>
>      <Name>windows</Name>
> -- 
> 2.19.1.3.g30247aa5d201

This patch looks fine.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top




More information about the Libguestfs mailing list