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

Laszlo Ersek lersek at redhat.com
Wed Dec 8 12:20:50 UTC 2021


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



More information about the Libguestfs mailing list