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 <[email protected]> Fixes: a2a4f7a09996a5e66d027d0d9692e083eb0a8128 Reported-by: Nir Soffer <[email protected]> Suggested-by: Richard W.M. Jones <[email protected]> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2034240 Signed-off-by: Laszlo Ersek <[email protected]> --- 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 _______________________________________________ Libguestfs mailing list [email protected] https://listman.redhat.com/mailman/listinfo/libguestfs
