[Libguestfs] [v2v PATCH] output_rhv: restrict block status collection to the old RHV output

Laszlo Ersek lersek at redhat.com
Mon Dec 20 13:56:40 UTC 2021


Nir reports that, despite the comment we removed in commit a2a4f7a09996,
we generally cannot access the output NBD servers in the finalization
stage. In particular, in the "rhv_upload_finalize" function
[output/output_rhv_upload.ml], the output disks are disconnected before
"create_ovf" is called.

Consequently, the "get_disk_allocated" call in the "create_ovf" ->
"add_disks" -> "get_disk_allocated" chain fails.

Rich suggests that we explicitly restrict the "get_disk_allocated" call
with a new optional boolean parameter to the one output plugin that really
needs it, namely the old RHV one.

Accordingly, revert the VDSM test case to its state at (a2a4f7a09996^).

Cc: Nir Soffer <nsoffer at redhat.com>
Fixes: a2a4f7a09996a5e66d027d0d9692e083eb0a8128
Reported-by: Nir Soffer <nsoffer at redhat.com>
Suggested-by: Richard W.M. Jones <rjones at redhat.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2034240
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
 lib/create_ovf.mli                         |  3 +-
 lib/create_ovf.ml                          | 35 +++++++++++++---------
 output/output_rhv.ml                       |  4 +--
 tests/test-v2v-o-vdsm-options.ovf.expected |  4 +--
 4 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/lib/create_ovf.mli b/lib/create_ovf.mli
index 0d1cc5a9311a..d6d4e62eeb86 100644
--- a/lib/create_ovf.mli
+++ b/lib/create_ovf.mli
@@ -46,7 +46,8 @@ 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 -> string -> ovf_flavour -> DOM.doc
+                 string list -> ?need_actual_sizes:bool -> 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 dbac3405989b..678d29942abe 100644
--- a/lib/create_ovf.ml
+++ b/lib/create_ovf.ml
@@ -531,7 +531,8 @@ let rec create_ovf source inspect
           { output_name; guestcaps; target_firmware; target_nics }
           sizes
           output_alloc output_format
-          sd_uuid image_uuids vol_uuids dir vm_uuid ovf_flavour =
+          sd_uuid image_uuids vol_uuids ?(need_actual_sizes = false) dir
+          vm_uuid ovf_flavour =
   assert (List.length sizes = List.length vol_uuids);
 
   let memsize_mb = source.s_memory /^ 1024L /^ 1024L in
@@ -745,7 +746,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 dir ovf_flavour ovf;
+    sd_uuid image_uuids vol_uuids need_actual_sizes dir ovf_flavour ovf;
 
   (* Old virt-v2v ignored removable media. XXX *)
 
@@ -791,7 +792,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 dir ovf_flavour ovf =
+    sd_uuid image_uuids vol_uuids need_actual_sizes dir ovf_flavour ovf =
   let references =
     let nodes = path_to_nodes ovf ["ovf:Envelope"; "References"] in
     match nodes with
@@ -839,7 +840,12 @@ and add_disks sizes guestcaps output_alloc output_format
         b /^ 1073741824L
       in
       let size_gb = bytes_to_gb size in
-      let actual_size = get_disk_allocated ~dir ~disknr:i in
+      let actual_size =
+        if need_actual_sizes then
+          get_disk_allocated ~dir ~disknr:i
+        else
+          None
+      in
 
       let format_for_rhv =
         match output_format with
@@ -891,16 +897,17 @@ 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
-        (* 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)
-          );
+        if (need_actual_sizes) then
+          (* 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 b902a7ee4619..6a67b7aa152b 100644
--- a/output/output_rhv.ml
+++ b/output/output_rhv.ml
@@ -183,8 +183,8 @@ 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 dir vm_uuid
-      Create_ovf.RHVExportStorageDomain in
+      output_alloc output_format esd_uuid image_uuids vol_uuids
+      ~need_actual_sizes:true dir vm_uuid Create_ovf.RHVExportStorageDomain in
 
   (* Write it to the metadata file. *)
   let dir = esd_mp // esd_uuid // "master" // "vms" // vm_uuid in
diff --git a/tests/test-v2v-o-vdsm-options.ovf.expected b/tests/test-v2v-o-vdsm-options.ovf.expected
index bd5b5e7d38ec..23ca180f4c2f 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' ovf:size='#SIZE#'/>
+    <File ovf:href='VOL' ovf:id='VOL' ovf:description='generated by virt-v2v'/>
   </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' ovf:actual_size='1'/>
+    <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'/>
   </DiskSection>
   <VirtualSystem ovf:id='VM'>
     <Name>windows</Name>
-- 
2.19.1.3.g30247aa5d201



More information about the Libguestfs mailing list