Richard W.M. Jones
2018-Dec-05 11:48 UTC
[Libguestfs] [PATCH v3] v2v: don't fail when virtio-win does not have qemu-ga
Sorry, there was a small mistake in v2 of the patch. The difference between v2 & v3 is below. All my other comments in the cover letter of v2 also apply here. Rich. --- a/v2v/windows_virtio.ml +++ b/v2v/windows_virtio.ml @@ -293,8 +293,7 @@ and copy_drivers g inspect driverdir [] <> copy_from_virtio_win g inspect "/" driverdir virtio_iso_path_matches_guest_os (fun () -> - error "driver directory ‘%s’ is missing from the virtio-win directory or ISO.\n\nThis should not happen and may indicate that virtio-win or virt-v2v is broken in some way. Please report this as a bug with a full debug log." - driverdir) + error "root directory ‘/’ is missing from the virtio-win directory or ISO.\n\nThis should not happen and may indicate that virtio-win or virt-v2v is broken in some way. Please report this as a bug with a full debug log.") (* Copy all files from virtio_win directory/ISO located in [srcdir] * subdirectory and all its subdirectories to the [destdir]. The directory
Richard W.M. Jones
2018-Dec-05 11:48 UTC
[Libguestfs] [PATCH v3] v2v: don't fail when virtio-win does not have qemu-ga packages
From: Tomáš Golembiovský <tgolembi@redhat.com> It should not be error to use virtio-win ISO that does not have Linux packages of QEMU Guest Agent. Only oVirt/RHV guest tools ISO has such packages now. Regular virtio-win ISO does not have them and maybe never will. Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com> --- v2v/windows_virtio.ml | 76 ++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/v2v/windows_virtio.ml b/v2v/windows_virtio.ml index 0b9bdfff3..54eb57ab0 100644 --- a/v2v/windows_virtio.ml +++ b/v2v/windows_virtio.ml @@ -204,8 +204,12 @@ and install_linux_tools g inspect let src_path = "linux" // os in let dst_path = "/var/tmp" in debug "locating packages in %s" src_path; - let packages = copy_from_virtio_win g inspect src_path dst_path - (fun _ _ -> true) in + let packages + copy_from_virtio_win g inspect src_path dst_path + (fun _ _ -> true) + (fun () -> + warning "guest tools directory ‘%s’ is missing from the virtio-win directory or ISO.\n\nGuest tools are only provided in the RHV Guest Tools ISO, so this can happen if you are using the version of virtio-win which contains just the virtio drivers. In this case only virtio drivers can be installed in the guest, and installation of Guest Tools will be skipped." + src_path) in debug "done copying %d files" (List.length packages); let packages = List.map ((//) dst_path) packages in try @@ -286,36 +290,45 @@ and ddb_regedits inspect drv_name drv_pciid * been copied. *) and copy_drivers g inspect driverdir - [] <> copy_from_virtio_win g inspect "/" driverdir virtio_iso_path_matches_guest_os + [] <> copy_from_virtio_win g inspect "/" driverdir + virtio_iso_path_matches_guest_os + (fun () -> + error "root directory ‘/’ is missing from the virtio-win directory or ISO.\n\nThis should not happen and may indicate that virtio-win or virt-v2v is broken in some way. Please report this as a bug with a full debug log.") (* Copy all files from virtio_win directory/ISO located in [srcdir] * subdirectory and all its subdirectories to the [destdir]. The directory * hierarchy is not preserved, meaning all files will be directly in [destdir]. * The file list is filtered based on [filter] function. * + * If [srcdir] is missing from the ISO then [missing ()] is called + * which might give a warning or error. + * * Returns list of copied files. *) -and copy_from_virtio_win g inspect srcdir destdir filter +and copy_from_virtio_win g inspect srcdir destdir filter missing let ret = ref [] in if is_directory virtio_win then ( let dir = virtio_win // srcdir in debug "windows: copy_from_virtio_win: guest tools source directory %s" dir; - let cmd = sprintf "cd %s && find -L -type f" (quote dir) in - let paths = external_command cmd in - List.iter ( - fun path -> - if filter path inspect then ( - let source = dir // path in - let target_name = String.lowercase_ascii (Filename.basename path) in - let target = destdir // target_name in - debug "windows: copying guest tools bits: 'host:%s' -> '%s'" - source target; + if not (is_directory srcdir) then missing () + else ( + let cmd = sprintf "cd %s && find -L -type f" (quote dir) in + let paths = external_command cmd in + List.iter ( + fun path -> + if filter path inspect then ( + let source = dir // path in + let target_name = String.lowercase_ascii (Filename.basename path) in + let target = destdir // target_name in + debug "windows: copying guest tools bits: 'host:%s' -> '%s'" + source target; - g#write target (read_whole_file source); - List.push_front target_name ret - ) + g#write target (read_whole_file source); + List.push_front target_name ret + ) ) paths + ) ) else if is_regular_file virtio_win then ( debug "windows: copy_from_virtio_win: guest tools source ISO %s" virtio_win; @@ -327,21 +340,24 @@ and copy_from_virtio_win g inspect srcdir destdir filter let vio_root = "/" in g2#mount_ro "/dev/sda" vio_root; let srcdir = vio_root ^ "/" ^ srcdir in - let paths = g2#find srcdir in - Array.iter ( - fun path -> - let source = srcdir ^ "/" ^ path in - if g2#is_file source ~followsymlinks:false && - filter path inspect then ( - let target_name = String.lowercase_ascii (Filename.basename path) in - let target = destdir ^ "/" ^ target_name in - debug "windows: copying guest tools bits: '%s:%s' -> '%s'" - virtio_win path target; + if not (g2#is_dir srcdir) then missing () + else ( + let paths = g2#find srcdir in + Array.iter ( + fun path -> + let source = srcdir ^ "/" ^ path in + if g2#is_file source ~followsymlinks:false && + filter path inspect then ( + let target_name = String.lowercase_ascii (Filename.basename path) in + let target = destdir ^ "/" ^ target_name in + debug "windows: copying guest tools bits: '%s:%s' -> '%s'" + virtio_win path target; - g#write target (g2#read_file source); - List.push_front target_name ret - ) + g#write target (g2#read_file source); + List.push_front target_name ret + ) ) paths; + ); g2#close() with Guestfs.Error msg -> error (f_"%s: cannot open virtio-win ISO file: %s") virtio_win msg -- 2.19.0.rc0
Reasonably Related Threads
- [PATCH v2] v2v: don't fail when virtio-win does not have qemu-ga
- [PATCH v4] v2v: don't fail when virtio-win does not have qemu-ga
- [PATCH v5 0/3] Install QEMU-GA from oVirt guest tools ISO on Linux
- [PATCH v2 0/3] Install QEMU-GA from oVirt guest tools ISO on Linux
- [PATCH v3 0/3] Install QEMU-GA from oVirt guest tools ISO on Linux