[Libguestfs] [PATCH 07/11] v2v: add support for SUSE VMDP drivers

Richard W.M. Jones rjones at redhat.com
Thu May 12 14:03:50 UTC 2016


On Thu, May 12, 2016 at 03:29:15PM +0200, Cédric Bosdonnat wrote:
> +  (* Check if either RHEV-APT or VMDP exists.  This is optional. *)
> +  let tools = ["rhev-apt.exe"; "vmdp.exe"] in

Strong typing FTW ...

  let tools = [ `RhevApt, "rhev-apt.exe"; `VmdpExe, "vmdp.exe" ] in

> +  let installer =
>      try
> -      let chan = open_in rhev_apt_exe in
> -      close_in chan;
> -      Some rhev_apt_exe
> -    with
> -      Sys_error msg ->
> -        warning (f_"'%s' is missing.  Unable to install RHEV-APT (RHEV guest agent).  Original error: %s")
> -          rhev_apt_exe msg;
> -        None in
> +      let tool = List.find (
> +        fun item ->

  let t, tool = List.find (
    fun (_, tool) ->

> +          try (
> +            let exe_path = virt_tools_data_dir // item in

      let exe_path = virt_tools_data_dir // tool in

> +            let chan = open_in exe_path in
> +            close_in chan;
> +            true
> +          ) with _ ->
> +            false
> +      ) tools in
> +      Some (virt_tools_data_dir // tool)

  Some (t, virt_tools_data_dir // tool)

> +    with Not_found -> (
> +      warning (f_"Neither rhev-apt.exe nor vmdp.exe can be found.  Unable to install one of them.");
> +      None
> +    ) in
>  
>    (* Get the Windows %systemroot%. *)
>    let systemroot = g#inspect_get_windows_systemroot inspect.i_root in
> @@ -211,7 +218,14 @@ let convert ~keep_serial_console (g : G.guestfs) inspect source rcaps =
>    (* Perform the conversion of the Windows guest. *)
>  
>    let rec configure_firstboot () =
> -    configure_rhev_apt ();
> +    match installer with
> +    | None -> info (f_"No firstboot installer to configure")

No need to print anything here.  We've already printed a
warning earlier.

> +    | Some installer_path ->
> +       let installer_name = Filename.basename installer_path in
> +       match installer_name with
> +        | "rhev-apt.exe" -> configure_rhev_apt ()
> +        | "vmdp.exe" -> configure_vmdp ()
> +        | _ -> info (f_"No setup function for installer '%s'") installer_path;

   | Some (`RhevApt, tool_path) ->
       configure_rhev_apt tool_path
   | Some (`VmdpExe, tool_path) ->
       configure_vmdp tool_path

You'll have to make the obvious adjustments to configure_rhev_apt and
configure_vmdp.

> diff --git a/v2v/windows_virtio.ml b/v2v/windows_virtio.ml
> index 7e9f735..a878a3e 100644
> --- a/v2v/windows_virtio.ml
> +++ b/v2v/windows_virtio.ml
> @@ -66,11 +66,19 @@ let rec install_drivers g inspect systemroot root current_cs rcaps =
>    else (
>      (* Can we install the block driver? *)
>      let block : guestcaps_block_type =
> -      let has_viostor = g#exists (driverdir // "viostor.inf") in
> +      let filenames = ["virtio_blk"; "vrtioblk"; "viostor"] in
> +      let driver_name = try (
> +        List.find (
> +          fun driver_file ->
> +            let source = driverdir // (driver_file ^ ".sys") in

You don't need the extra parens here     ^                    ^ .

> +            g#exists source
> +        ) filenames
> +      ) with Not_found -> "" in
> +      let has_viostor = not (driver_name = "") in
>        let has_vioscsi = g#exists (driverdir // "vioscsi.inf") in
>        match rcaps.rcaps_block_bus, has_viostor, has_vioscsi with
>        | Some Virtio_blk, false, _ ->
> -        error (f_"there is no viostor (virtio block device) driver for this version of Windows (%d.%d %s).  virt-v2v looks for this driver in %s\n\nThe guest will be configured to use a slower emulated device.")
> +        error (f_"there is no virtio block device driver for this version of Windows (%d.%d %s).  virt-v2v looks for this driver in %s\n\nThe guest will be configured to use a slower emulated device.")
>                inspect.i_major_version inspect.i_minor_version
>                inspect.i_arch virtio_win
>  
> @@ -79,8 +87,9 @@ let rec install_drivers g inspect systemroot root current_cs rcaps =
>                inspect.i_major_version inspect.i_minor_version
>                inspect.i_arch virtio_win
>  
> +

Seem to have added a blank line here.

>        | None, false, _ ->
> -        warning (f_"there is no viostor (virtio block device) driver for this version of Windows (%d.%d %s).  virt-v2v looks for this driver in %s\n\nThe guest will be configured to use a slower emulated device.")
> +        warning (f_"there is no virtio block device driver for this version of Windows (%d.%d %s).  virt-v2v looks for this driver in %s\n\nThe guest will be configured to use a slower emulated device.")
>                  inspect.i_major_version inspect.i_minor_version
>                  inspect.i_arch virtio_win;
>          IDE
> @@ -88,11 +97,12 @@ let rec install_drivers g inspect systemroot root current_cs rcaps =
>        | (Some Virtio_blk | None), true, _ ->
>          (* Block driver needs tweaks to allow booting; the rest is set up by PnP
>           * manager *)
> -        let source = driverdir // "viostor.sys" in
> -        let target = sprintf "%s/system32/drivers/viostor.sys" systemroot in
> +        let source = driverdir // (driver_name ^ ".sys") in
> +        let targetdir = systemroot ^ "/system32/drivers/" in
> +        let target = targetdir // (driver_name ^ ".sys") in

What was wrong with using sprintf to construct the target?

>          let target = g#case_sensitive_path target in
>          g#cp source target;
> -        add_guestor_to_registry g root current_cs "viostor"
> +        add_guestor_to_registry g root current_cs driver_name
>                                  viostor_pciid;
>          Virtio_blk
>  
> @@ -112,7 +122,8 @@ let rec install_drivers g inspect systemroot root current_cs rcaps =
>  
>      (* Can we install the virtio-net driver? *)
>      let net : guestcaps_net_type =
> -      let has_netkvm = g#exists (driverdir // "netkvm.inf") in
> +      let filenames = ["virtio_net.inf"; "netkvm.inf"] in
> +      let has_netkvm = List.exists (fun driver_file -> g#exists (driverdir // driver_file)) filenames in

This line is a bit too long.

>        match rcaps.rcaps_net_bus, has_netkvm with
>        | Some Virtio_net, false ->
>          error (f_"there is no virtio network driver for this version of Windows (%d.%d %s).  virt-v2v looks for this driver in %s")
> -- 
> 2.6.6

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine.  Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/




More information about the Libguestfs mailing list