[Libguestfs] [PATCH v3] v2v: don't fail when virtio-win does not have qemu-ga packages

Richard W.M. Jones rjones at redhat.com
Wed Dec 5 11:48:22 UTC 2018


From: Tomáš Golembiovský <tgolembi at 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 at 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




More information about the Libguestfs mailing list