[Libguestfs] [PATCH] v2v: Support <listen type='socket'> and <listen type='none'> (RHBZ#1378022).

Richard W.M. Jones rjones at redhat.com
Wed Sep 21 13:03:43 UTC 2016


Since libvirt 2.0.0, these two new <listen/> types have been
supported: https://libvirt.org/formatdomain.html#elementsGraphics

This change just copies that configuration over from the source to the
destination if the destination is also libvirt.

Since we previously used 'LNone' to mean "no parseable <listen/>
element" I also had to change previous uses of 'LNone' to 'LNoListen',
so we can use 'LNone' to mean "<listen type='none'>".

Thanks: Ming Xie.
---
 v2v/input_disk.ml       |  2 +-
 v2v/input_libvirtxml.ml | 17 ++++++++++++-----
 v2v/output_libvirt.ml   |  9 ++++++++-
 v2v/types.ml            |  8 ++++++--
 v2v/types.mli           |  4 +++-
 5 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/v2v/input_disk.ml b/v2v/input_disk.ml
index e07222f..2852ce9 100644
--- a/v2v/input_disk.ml
+++ b/v2v/input_disk.ml
@@ -84,7 +84,7 @@ class input_disk input_format disk = object
       s_firmware = UnknownFirmware;       (* causes virt-v2v to autodetect *)
       s_display =
         Some { s_display_type = Window; s_keymap = None; s_password = None;
-               s_listen = LNone; s_port = None };
+               s_listen = LNoListen; s_port = None };
       s_video = None;
       s_sound = None;
       s_disks = [disk];
diff --git a/v2v/input_libvirtxml.ml b/v2v/input_libvirtxml.ml
index 33e878e..d94591f 100644
--- a/v2v/input_libvirtxml.ml
+++ b/v2v/input_libvirtxml.ml
@@ -96,24 +96,31 @@ let parse_libvirt_xml ?conn xml =
         let nr_nodes = Xml.xpathobj_nr_nodes obj in
         if nr_nodes < 1 then (
           match xpath_string "@listen" with
-          | None -> LNone | Some a -> LAddress a
+          | None -> LNoListen | Some a -> LAddress a
         ) else (
           (* Use only the first <listen> configuration. *)
           match xpath_string "listen[1]/@type" with
-          | None -> LNone
+          | None -> LNoListen
           | Some "address" ->
             (match xpath_string "listen[1]/@address" with
-            | None -> LNone
+            | None -> LNoListen
             | Some a -> LAddress a
             )
           | Some "network" ->
             (match xpath_string "listen[1]/@network" with
-            | None -> LNone
+            | None -> LNoListen
             | Some n -> LNetwork n
             )
+          | Some "socket" ->
+            (match xpath_string "listen[1]/@socket" with
+            | None -> LNoListen
+            | Some n -> LSocket n
+            )
+          | Some "none" ->
+            LNone
           | Some t ->
             warning (f_"<listen type='%s'> in the input libvirt XML was ignored") t;
-            LNone
+            LNoListen
         ) in
       let port =
         match xpath_string "@autoport" with
diff --git a/v2v/output_libvirt.ml b/v2v/output_libvirt.ml
index e934335..ac91922 100644
--- a/v2v/output_libvirt.ml
+++ b/v2v/output_libvirt.ml
@@ -281,13 +281,20 @@ let create_libvirt_xml ?pool source target_buses guestcaps
   (match source.s_display with
    | Some { s_listen = listen } ->
       (match listen with
+       | LNoListen -> ()
        | LAddress a ->
           let sub = e "listen" [ "type", "address"; "address", a ] [] in
           append_child sub graphics
        | LNetwork n ->
           let sub = e "listen" [ "type", "network"; "network", n ] [] in
           append_child sub graphics
-       | LNone -> ())
+       | LSocket s ->
+          let sub = e "listen" [ "type", "socket"; "socket", s ] [] in
+          append_child sub graphics
+       | LNone ->
+          let sub = e "listen" [ "type", "none" ] [] in
+          append_child sub graphics
+      )
    | None -> ());
   (match source.s_display with
    | Some { s_port = Some p } ->
diff --git a/v2v/types.ml b/v2v/types.ml
index c43db24..bf4365c 100644
--- a/v2v/types.ml
+++ b/v2v/types.ml
@@ -82,9 +82,11 @@ and source_display = {
 }
 and s_display_type = Window | VNC | Spice
 and s_display_listen =
-  | LNone
+  | LNoListen
   | LAddress of string
   | LNetwork of string
+  | LSocket of string
+  | LNone
 
 and source_video = Source_other_video of string |
                    Source_Cirrus | Source_QXL
@@ -227,9 +229,11 @@ and string_of_source_display { s_display_type = typ;
     (match keymap with None -> "" | Some km -> " " ^ km)
     (match password with None -> "" | Some _ -> " with password")
     (match listen with
-    | LNone -> ""
+    | LNoListen -> ""
     | LAddress a -> sprintf " listening on address %s" a
     | LNetwork n -> sprintf " listening on network %s" n
+    | LSocket s -> sprintf " listening on Unix domain socket %s" s
+    | LNone -> " listening on private fd"
     )
 
 and string_of_source_video = function
diff --git a/v2v/types.mli b/v2v/types.mli
index 2727383..514565c 100644
--- a/v2v/types.mli
+++ b/v2v/types.mli
@@ -139,9 +139,11 @@ and source_display = {
 }
 and s_display_type = Window | VNC | Spice
 and s_display_listen =
-  | LNone
+  | LNoListen                      (** No parseable <listen/> element. *)
   | LAddress of string             (** Listen address. *)
   | LNetwork of string             (** Listen network. *)
+  | LSocket of string              (** Listen Unix domain socket. *)
+  | LNone                          (** <listen type='none'> *)
 
 (** Video adapter model. *)
 and source_video = Source_other_video of string |
-- 
2.9.3




More information about the Libguestfs mailing list