[Libguestfs] [PATCH] RFC: v2v: use RHV Setup Tools ISO if available

Pino Toscano ptoscano at redhat.com
Fri May 18 15:42:15 UTC 2018


If the RHV Setup Tools ISO is installed, open it, and copy RHEV APT from
there, instead of using (if available) the executable located in the
virt-tools data directory.

This way, RHV conversion hosts with the RHV Setup Tools ISO installed
will always install the latest version when convering Windows guests,
no matter which version is (eventually) shipped as virt-tools.
---
 v2v/convert_windows.ml | 57 ++++++++++++++++++++++++++++++++++++------
 v2v/virt-v2v.pod       | 18 +++++++++++++
 2 files changed, 67 insertions(+), 8 deletions(-)

diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
index 163319545..21dafe4f4 100644
--- a/v2v/convert_windows.ml
+++ b/v2v/convert_windows.ml
@@ -27,6 +27,10 @@ open Types
 
 module G = Guestfs
 
+type tool_location =
+  | Local_path of string (* path of file *)
+  | ISO of string * string (* path of ISO, path to look for inside the ISO *)
+
 (* Convert Windows guests.
  *
  * This only does a "pre-conversion", the steps needed to get the
@@ -239,12 +243,15 @@ let convert (g : G.guestfs) inspect source output rcaps =
 
     (* Install RHEV-APT only if appropriate for the output hypervisor. *)
     if output#install_rhev_apt then (
-      let tool_path = virt_tools_data_dir () // "rhev-apt.exe" in
-      if Sys.file_exists tool_path then
-        configure_rhev_apt tool_path
-      else
-        warning (f_"%s is missing, but the output hypervisor is oVirt or RHV.  Installing RHEV-APT in the guest would mean the guest is automatically updated with new drivers etc.  You may wish to install RHEV-APT manually after conversion.")
-                tool_path
+      let rhev_apt =
+        let iso = virt_tools_data_dir () // "rhv-guest-tools-iso" // "rhv-tools-setup.iso" in
+        if is_regular_file iso then
+          ISO (iso, "/RHEV-Application Provisioning Tool.exe")
+        else
+          Local_path (virt_tools_data_dir () // "rhev-apt.exe") in
+
+      if copy_rhev_apt rhev_apt then
+        configure_rhev_apt ()
     );
 
     (* Install VMDP unconditionally, if available, but don't
@@ -330,12 +337,46 @@ echo Wait for PnP to complete
     (* add_firstboot_script has created the path already. *)
     g#upload tool_path (g#case_sensitive_path pnp_wait_path)
 
-  and configure_rhev_apt tool_path =
+  and copy_rhev_apt tool_location =
     (* Configure RHEV-APT (the RHV guest agent).  However if it doesn't
      * exist just warn about it and continue.
      *)
-    g#upload tool_path "/rhev-apt.exe"; (* XXX *)
+    let ret = ref false in
+    let target = "/rhev-apt.exe" (* XXX *) in
+    (match tool_location with
+    | Local_path path ->
+       debug "windows: copy_rhev_apt: source file %s" path;
+       if Sys.file_exists path then (
+         g#upload path target;
+         ret := true
+       )
+       else
+         warning (f_"%s is missing, but the output hypervisor is oVirt or RHV.  Installing RHEV-APT in the guest would mean the guest is automatically updated with new drivers etc.  You may wish to install RHEV-APT manually after conversion.")
+                 path
+    | ISO (iso, path) ->
+       debug "windows: copy_rhev_apt: source ISO %s, path %s" iso path;
+       try
+         let g2 = open_guestfs ~identifier:"rhev_apt" () in
+         g2#add_drive_opts iso ~readonly:true;
+         g2#launch ();
+         g2#mount_ro "/dev/sda" "/";
+         if g2#is_file path ~followsymlinks:true then (
+           debug "copying rhev-apt: '%s:%s' -> '%s'"
+                 iso path target;
 
+           g#write target (g2#read_file path);
+           ret := true
+         )
+         else
+           warning (f_"%s is missing in %s, but the output hypervisor is oVirt or RHV.  Installing RHEV-APT in the guest would mean the guest is automatically updated with new drivers etc.  You may wish to install RHEV-APT manually after conversion.")
+                   path iso;
+         g2#close()
+       with Guestfs.Error msg ->
+         error (f_"%s: cannot open RHEV Tools ISO file: %s") iso msg
+    );
+    !ret
+
+  and configure_rhev_apt () =
     let fb_script = "\
 @echo off
 
diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod
index 859d68fc5..3d153f1b3 100644
--- a/v2v/virt-v2v.pod
+++ b/v2v/virt-v2v.pod
@@ -2464,6 +2464,20 @@ option at all.  The option was added when virt-v2v was rewritten in 2014.
 
 =over 4
 
+=item F</usr/share/rhv-guest-tools-iso/rhv-tools-setup.iso>
+
+(Optional)
+
+If this file is present, then virt-v2v assumes that it is a RHV Tools
+ISO, containing F</RHEV-Application Provisioning Tool.exe> as the
+RHV Application Provisioning Tool (RHEV APT).  The RHEV APT will be
+installed in the Windows guest during conversion.  This tool is a
+guest agent which ensures that the virtio drivers remain up to date
+when the guest is running on Red Hat Virtualization (RHV).
+
+This ISO comes from Red Hat Virtualization (RHV), and is not
+distributed with virt-v2v.
+
 =item F</usr/share/virtio-win>
 
 (Optional)
@@ -2522,6 +2536,10 @@ conversion.  This tool is a guest agent which ensures that the virtio
 drivers remain up to date when the guest is running on Red Hat
 Virtualization (RHV).
 
+Note this file is not used if
+F</usr/share/rhv-guest-tools-iso/rhv-tools-setup.iso> is already
+present.
+
 This file comes from Red Hat Virtualization (RHV), and is not
 distributed with virt-v2v.
 
-- 
2.17.0




More information about the Libguestfs mailing list