From d0ea73303305ba5d9f2a876bed9104546d918f9d Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: May 07 2019 03:44:26 +0000 Subject: import libguestfs-1.38.4-10.module+el8+2709+40ed2f2c --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cc30818 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +SOURCES/RHEV-Application-Provisioning-Tool.exe_4.42 +SOURCES/libguestfs-1.38.4.tar.gz +SOURCES/libguestfs.keyring +SOURCES/rhsrvany.exe diff --git a/.libguestfs.metadata b/.libguestfs.metadata new file mode 100644 index 0000000..df79589 --- /dev/null +++ b/.libguestfs.metadata @@ -0,0 +1,4 @@ +c44dcbd8c9b390e151c16821ff093e4dc408be66 SOURCES/RHEV-Application-Provisioning-Tool.exe_4.42 +15c8f487ee163374cb7be9436fb1bb697cef7d9e SOURCES/libguestfs-1.38.4.tar.gz +1bbc40f501a7fef9eef2a39b701a71aee2fea7c4 SOURCES/libguestfs.keyring +2bd96e478fc004cd323b5bd754c856641877dac6 SOURCES/rhsrvany.exe diff --git a/SOURCES/0001-Switch-from-YAJL-to-Jansson.patch b/SOURCES/0001-Switch-from-YAJL-to-Jansson.patch new file mode 100644 index 0000000..4d20339 --- /dev/null +++ b/SOURCES/0001-Switch-from-YAJL-to-Jansson.patch @@ -0,0 +1,973 @@ +From 21f0a22072f0543c416c440665bcf75ae09e6233 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Mon, 12 Feb 2018 11:24:06 +0100 +Subject: [PATCH] Switch from YAJL to Jansson + +While YAJL mostly works fine, it did not see any active development in +the last 3 years. OTOH, Jansson is another JSON C implementation, with +a very liberal license, and a much nicer API. + +Hence, switch all of libguestfs from YAJL to Jansson: +- configure checks, and buildsystem in general +- packages pulled in the appliance +- actual implementations +- contrib scripts +- documentation + +This also makes use of the better APIs available (e.g. json_object_get, +json_array_foreach, and json_object_foreach). This does not change the +API of our OCaml Yajl module. + +(cherry picked from commit bd1c5c9f4dcf38458099db8a0bf4659a07ef055d) +--- + appliance/packagelist.in | 13 ++-- + builder/Makefile.am | 4 +- + builder/yajl-c.c | 66 ++++++++-------- + contrib/p2v/aux-scripts/do-build.sh | 8 +- + contrib/p2v/build-p2v-iso.sh | 3 +- + daemon/Makefile.am | 4 +- + daemon/ldm.c | 113 ++++++++++++---------------- + docs/guestfs-building.pod | 2 +- + lib/Makefile.am | 4 +- + lib/info.c | 113 +++++++++++----------------- + lib/qemu.c | 64 ++++++---------- + m4/guestfs-libraries.m4 | 4 +- + 12 files changed, 168 insertions(+), 230 deletions(-) + +diff --git a/appliance/packagelist.in b/appliance/packagelist.in +index 8ded2588a..f92a6ce95 100644 +--- a/appliance/packagelist.in ++++ b/appliance/packagelist.in +@@ -35,6 +35,7 @@ ifelse(REDHAT,1, + hivex + iproute + iputils ++ jansson + kernel + libcap + libldm +@@ -51,7 +52,6 @@ ifelse(REDHAT,1, + systemd dnl for /sbin/reboot and udevd + vim-minimal + xz +- yajl + yara + zfs-fuse + ) +@@ -82,12 +82,12 @@ dnl iproute has been renamed to iproute2 + libc-bin + libcap2 + libhivex0 ++ libjansson4 + libpcre3 + libsystemd0 + libsystemd-id128-0 + libsystemd-journal0 + libtirpc1 +- libyajl2 + libyara3 + linux-image + dnl syslinux 'suggests' mtools, but in reality it's a hard dependency: +@@ -116,6 +116,7 @@ ifelse(ARCHLINUX,1, + hivex + iproute2 + iputils ++ jansson + libcap + libtirpc + linux +@@ -131,7 +132,6 @@ ifelse(ARCHLINUX,1, + systemd + vim + xz +- yajl + yara + ) + +@@ -153,9 +153,9 @@ ifelse(SUSE,1, + iputils + libcap2 + libhivex0 ++ libjansson4 + libselinux1 + libtirpc3 +- libyajl2 + libyara3 + mkisofs + ntfsprogs +@@ -177,6 +177,7 @@ ifelse(FRUGALWARE,1, + hfsplus + iproute2 + iputils ++ jansson + kernel + libcap + libtirpc +@@ -188,7 +189,6 @@ ifelse(FRUGALWARE,1, + systemd + vim + xz +- yajl + xfsprogs-acl + xfsprogs-attr + gptfdisk +@@ -209,9 +209,9 @@ ifelse(MAGEIA,1, + iproute2 + iputils + libcap ++ libjansson4 + libldm + libtirpc +- libyajl + dnl syslinux uses mtools without depending on it + mtools + nilfs-utils +@@ -224,7 +224,6 @@ ifelse(MAGEIA,1, + systemd /* for /sbin/reboot and udevd */ + vim-minimal + xz +- yajl + ) + + acl +diff --git a/builder/Makefile.am b/builder/Makefile.am +index e5872bdd9..c7b50778a 100644 +--- a/builder/Makefile.am ++++ b/builder/Makefile.am +@@ -157,7 +157,7 @@ virt_builder_CFLAGS = \ + $(LIBLZMA_CFLAGS) \ + $(LIBTINFO_CFLAGS) \ + $(LIBXML2_CFLAGS) \ +- $(YAJL_CFLAGS) ++ $(JANSSON_CFLAGS) + + BOBJECTS = $(SOURCES_ML:.ml=.cmo) + XOBJECTS = $(BOBJECTS:.cmo=.cmx) +@@ -211,7 +211,7 @@ OCAMLCLIBS = \ + $(LIBCRYPT_LIBS) \ + $(LIBLZMA_LIBS) \ + $(LIBXML2_LIBS) \ +- $(YAJL_LIBS) \ ++ $(JANSSON_LIBS) \ + $(LIBINTL) \ + -lgnu + +diff --git a/builder/yajl-c.c b/builder/yajl-c.c +index 3c2402e42..e53755f55 100644 +--- a/builder/yajl-c.c ++++ b/builder/yajl-c.c +@@ -23,24 +23,17 @@ + #include + #include + +-#include ++#include + + #include + #include + +-/* GCC can't work out that the YAJL_IS_ test is sufficient to +- * ensure that YAJL_GET_ later doesn't return NULL. +- */ +-#if defined(__GNUC__) && __GNUC__ >= 6 /* gcc >= 6 */ +-#pragma GCC diagnostic ignored "-Wnull-dereference" +-#endif +- + #define Val_none (Val_int (0)) + + value virt_builder_yajl_tree_parse (value stringv); + + static value +-convert_yajl_value (yajl_val val, int level) ++convert_json_t (json_t *val, int level) + { + CAMLparam0 (); + CAMLlocal4 (rv, lv, v, sv); +@@ -48,46 +41,51 @@ convert_yajl_value (yajl_val val, int level) + if (level > 20) + caml_invalid_argument ("too many levels of object/array nesting"); + +- if (YAJL_IS_OBJECT (val)) { +- const size_t len = YAJL_GET_OBJECT(val)->len; ++ if (json_is_object (val)) { ++ const size_t len = json_object_size (val); + size_t i; ++ const char *key; ++ json_t *jvalue; + rv = caml_alloc (1, 3); + lv = caml_alloc_tuple (len); +- for (i = 0; i < len; ++i) { ++ i = 0; ++ json_object_foreach (val, key, jvalue) { + v = caml_alloc_tuple (2); +- sv = caml_copy_string (YAJL_GET_OBJECT(val)->keys[i]); ++ sv = caml_copy_string (key); + Store_field (v, 0, sv); +- sv = convert_yajl_value (YAJL_GET_OBJECT(val)->values[i], level + 1); ++ sv = convert_json_t (jvalue, level + 1); + Store_field (v, 1, sv); + Store_field (lv, i, v); ++ ++i; + } + Store_field (rv, 0, lv); +- } else if (YAJL_IS_ARRAY (val)) { +- const size_t len = YAJL_GET_ARRAY(val)->len; ++ } else if (json_is_array (val)) { ++ const size_t len = json_array_size (val); + size_t i; ++ json_t *jvalue; + rv = caml_alloc (1, 4); + lv = caml_alloc_tuple (len); +- for (i = 0; i < len; ++i) { +- v = convert_yajl_value (YAJL_GET_ARRAY(val)->values[i], level + 1); ++ json_array_foreach (val, i, jvalue) { ++ v = convert_json_t (jvalue, level + 1); + Store_field (lv, i, v); + } + Store_field (rv, 0, lv); +- } else if (YAJL_IS_STRING (val)) { ++ } else if (json_is_string (val)) { + rv = caml_alloc (1, 0); +- v = caml_copy_string (YAJL_GET_STRING(val)); ++ v = caml_copy_string (json_string_value (val)); + Store_field (rv, 0, v); +- } else if (YAJL_IS_DOUBLE (val)) { ++ } else if (json_is_real (val)) { + rv = caml_alloc (1, 2); +- v = caml_copy_double (YAJL_GET_DOUBLE(val)); ++ v = caml_copy_double (json_real_value (val)); + Store_field (rv, 0, v); +- } else if (YAJL_IS_INTEGER (val)) { ++ } else if (json_is_integer (val)) { + rv = caml_alloc (1, 1); +- v = caml_copy_int64 (YAJL_GET_INTEGER(val)); ++ v = caml_copy_int64 (json_integer_value (val)); + Store_field (rv, 0, v); +- } else if (YAJL_IS_TRUE (val)) { ++ } else if (json_is_true (val)) { + rv = caml_alloc (1, 5); + Store_field (rv, 0, Val_true); +- } else if (YAJL_IS_FALSE (val)) { ++ } else if (json_is_false (val)) { + rv = caml_alloc (1, 5); + Store_field (rv, 0, Val_false); + } else +@@ -101,21 +99,21 @@ virt_builder_yajl_tree_parse (value stringv) + { + CAMLparam1 (stringv); + CAMLlocal1 (rv); +- yajl_val tree; +- char error_buf[256]; ++ json_t *tree; ++ json_error_t err; + +- tree = yajl_tree_parse (String_val (stringv), error_buf, sizeof error_buf); ++ tree = json_loads (String_val (stringv), JSON_DECODE_ANY, &err); + if (tree == NULL) { +- char buf[256 + sizeof error_buf]; +- if (strlen (error_buf) > 0) +- snprintf (buf, sizeof buf, "JSON parse error: %s", error_buf); ++ char buf[256 + JSON_ERROR_TEXT_LENGTH]; ++ if (strlen (err.text) > 0) ++ snprintf (buf, sizeof buf, "JSON parse error: %s", err.text); + else + snprintf (buf, sizeof buf, "unknown JSON parse error"); + caml_invalid_argument (buf); + } + +- rv = convert_yajl_value (tree, 1); +- yajl_tree_free (tree); ++ rv = convert_json_t (tree, 1); ++ json_decref (tree); + + CAMLreturn (rv); + } +diff --git a/contrib/p2v/aux-scripts/do-build.sh b/contrib/p2v/aux-scripts/do-build.sh +index 5edb53d0e..dd6424bb4 100644 +--- a/contrib/p2v/aux-scripts/do-build.sh ++++ b/contrib/p2v/aux-scripts/do-build.sh +@@ -53,8 +53,8 @@ case $osversion in + # This just forces configure to ignore these missing dependencies. + export LIBTINFO_CFLAGS=-D_GNU_SOURCE + export LIBTINFO_LIBS=-lncurses +- export YAJL_CFLAGS=-D_GNU_SOURCE +- export YAJL_LIBS=-lyajl ++ export JANSSON_CFLAGS=-D_GNU_SOURCE ++ export JANSSON_LIBS=-ljansson + # Remove some unsupported flags that the configure script hard codes. + sed -i -e 's/-fno-strict-overflow//' configure + sed -i -e 's/-Wno-strict-overflow//' configure +@@ -66,8 +66,8 @@ case $osversion in + # This just forces configure to ignore these missing dependencies. + export LIBTINFO_CFLAGS=-D_GNU_SOURCE + export LIBTINFO_LIBS=-lncurses +- export YAJL_CFLAGS=-D_GNU_SOURCE +- export YAJL_LIBS=-lyajl ++ export JANSSON_CFLAGS=-D_GNU_SOURCE ++ export JANSSON_LIBS=-ljansson + ;; + esac + +diff --git a/contrib/p2v/build-p2v-iso.sh b/contrib/p2v/build-p2v-iso.sh +index c80a1b134..ae25cebc8 100755 +--- a/contrib/p2v/build-p2v-iso.sh ++++ b/contrib/p2v/build-p2v-iso.sh +@@ -86,7 +86,6 @@ done + # Various hacks for different versions of RHEL. + if=virtio + netdev=virtio-net-pci +-pkgs="$pkgs,yajl-devel" + declare -a epel + case $osversion in + rhel-5.*|centos-5.*) +@@ -105,10 +104,12 @@ case $osversion in + rhel-6.*|centos-6.*) + epel[0]="--run-command" + epel[1]="yum install -y --nogpgcheck https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm" ++ pkgs="$pkgs,jansson-devel" + ;; + rhel-7.*|centos-7.*) + epel[0]="--run-command" + epel[1]="yum install -y --nogpgcheck https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm" ++ pkgs="$pkgs,jansson-devel" + ;; + esac + +diff --git a/daemon/Makefile.am b/daemon/Makefile.am +index 6240f517d..d9ed5625e 100644 +--- a/daemon/Makefile.am ++++ b/daemon/Makefile.am +@@ -218,7 +218,7 @@ guestfsd_LDADD = \ + camldaemon.o \ + $(ACL_LIBS) \ + $(CAP_LIBS) \ +- $(YAJL_LIBS) \ ++ $(JANSSON_LIBS) \ + $(SELINUX_LIBS) \ + $(AUGEAS_LIBS) \ + $(HIVEX_LIBS) \ +@@ -256,7 +256,7 @@ guestfsd_CFLAGS = \ + $(AUGEAS_CFLAGS) \ + $(HIVEX_CFLAGS) \ + $(SD_JOURNAL_CFLAGS) \ +- $(YAJL_CFLAGS) \ ++ $(JANSSON_CFLAGS) \ + $(PCRE_CFLAGS) + + # Parts of the daemon are written in OCaml. These are linked into a +diff --git a/daemon/ldm.c b/daemon/ldm.c +index 2f4d2aef3..be4fb9701 100644 +--- a/daemon/ldm.c ++++ b/daemon/ldm.c +@@ -25,19 +25,12 @@ + #include + #include + +-#include ++#include + + #include "daemon.h" + #include "actions.h" + #include "optgroups.h" + +-/* GCC can't work out that the YAJL_IS_ test is sufficient to +- * ensure that YAJL_GET_ later doesn't return NULL. +- */ +-#if defined(__GNUC__) && GUESTFS_GCC_VERSION >= 60000 /* gcc >= 6 */ +-#pragma GCC diagnostic ignored "-Wnull-dereference" +-#endif +- + int + optgroup_ldm_available (void) + { +@@ -72,44 +65,42 @@ do_ldmtool_remove_all (void) + return 0; + } + +-static yajl_val ++static json_t * + parse_json (const char *json, const char *func) + { +- yajl_val tree; +- char parse_error[1024]; ++ json_t *tree; ++ json_error_t err; + + if (verbose) + fprintf (stderr, "%s: parsing json: %s\n", func, json); + +- tree = yajl_tree_parse (json, parse_error, sizeof parse_error); ++ tree = json_loads (json, 0, &err); + if (tree == NULL) { + reply_with_error ("parse error: %s", +- strlen (parse_error) ? parse_error : "unknown error"); ++ strlen (err.text) ? err.text : "unknown error"); + return NULL; + } + +- /* Caller should free this by doing 'yajl_tree_free (tree);'. */ ++ /* Caller should free this by doing 'json_decref (tree);'. */ + return tree; + } + + #define TYPE_ERROR ((char **) -1) + + static char ** +-json_value_to_string_list (yajl_val node) ++json_value_to_string_list (json_t *node) + { + CLEANUP_FREE_STRINGSBUF DECLARE_STRINGSBUF (strs); +- yajl_val n; +- size_t i, len; ++ json_t *n; ++ size_t i; + +- if (! YAJL_IS_ARRAY (node)) ++ if (!json_is_array (node)) + return TYPE_ERROR; + +- len = YAJL_GET_ARRAY (node)->len; +- for (i = 0; i < len; ++i) { +- n = YAJL_GET_ARRAY (node)->values[i]; +- if (! YAJL_IS_STRING (n)) ++ json_array_foreach (node, i, n) { ++ if (!json_is_string (n)) + return TYPE_ERROR; +- if (add_string (&strs, YAJL_GET_STRING (n)) == -1) ++ if (add_string (&strs, json_string_value (n)) == -1) + return NULL; + } + if (end_stringsbuf (&strs) == -1) +@@ -123,14 +114,14 @@ parse_json_get_string_list (const char *json, + const char *func, const char *cmd) + { + char **ret; +- yajl_val tree = NULL; ++ json_t *tree = NULL; + + tree = parse_json (json, func); + if (tree == NULL) + return NULL; + + ret = json_value_to_string_list (tree); +- yajl_tree_free (tree); ++ json_decref (tree); + if (ret == TYPE_ERROR) { + reply_with_error ("output of '%s' was not a JSON array of strings", cmd); + return NULL; +@@ -144,43 +135,40 @@ static char * + parse_json_get_object_string (const char *json, const char *key, int flags, + const char *func, const char *cmd) + { +- char *str, *ret; +- yajl_val tree = NULL, node; +- size_t i, len; ++ const char *str; ++ char *ret; ++ json_t *tree = NULL, *node; + + tree = parse_json (json, func); + if (tree == NULL) + return NULL; + +- if (! YAJL_IS_OBJECT (tree)) ++ if (!json_is_object (tree)) + goto bad_type; + +- len = YAJL_GET_OBJECT (tree)->len; +- for (i = 0; i < len; ++i) { +- if (STREQ (YAJL_GET_OBJECT (tree)->keys[i], key)) { +- node = YAJL_GET_OBJECT (tree)->values[i]; +- +- if ((flags & GET_STRING_NULL_TO_EMPTY) && YAJL_IS_NULL (node)) +- ret = strdup (""); +- else { +- str = YAJL_GET_STRING (node); +- if (str == NULL) +- goto bad_type; +- ret = strdup (str); +- } +- if (ret == NULL) +- reply_with_perror ("strdup"); +- +- yajl_tree_free (tree); ++ node = json_object_get (tree, key); ++ if (node == NULL) ++ goto bad_type; + +- return ret; +- } ++ if ((flags & GET_STRING_NULL_TO_EMPTY) && json_is_null (node)) ++ ret = strdup (""); ++ else { ++ str = json_string_value (node); ++ if (str == NULL) ++ goto bad_type; ++ ret = strndup (str, json_string_length (node)); + } ++ if (ret == NULL) ++ reply_with_perror ("strdup"); ++ ++ json_decref (tree); ++ ++ return ret; + + bad_type: + reply_with_error ("output of '%s' was not a JSON object " + "containing a key '%s' of type string", cmd, key); +- yajl_tree_free (tree); ++ json_decref (tree); + return NULL; + } + +@@ -189,33 +177,30 @@ parse_json_get_object_string_list (const char *json, const char *key, + const char *func, const char *cmd) + { + char **ret; +- yajl_val tree, node; +- size_t i, len; ++ json_t *tree, *node; + + tree = parse_json (json, func); + if (tree == NULL) + return NULL; + +- if (! YAJL_IS_OBJECT (tree)) ++ if (!json_is_object (tree)) + goto bad_type; + +- len = YAJL_GET_OBJECT (tree)->len; +- for (i = 0; i < len; ++i) { +- if (STREQ (YAJL_GET_OBJECT (tree)->keys[i], key)) { +- node = YAJL_GET_OBJECT (tree)->values[i]; +- ret = json_value_to_string_list (node); +- if (ret == TYPE_ERROR) +- goto bad_type; +- yajl_tree_free (tree); +- return ret; +- } +- } ++ node = json_object_get (tree, key); ++ if (node == NULL) ++ goto bad_type; ++ ++ ret = json_value_to_string_list (node); ++ if (ret == TYPE_ERROR) ++ goto bad_type; ++ json_decref (tree); ++ return ret; + + bad_type: + reply_with_error ("output of '%s' was not a JSON object " + "containing a key '%s' of type array of strings", + cmd, key); +- yajl_tree_free (tree); ++ json_decref (tree); + return NULL; + } + +diff --git a/docs/guestfs-building.pod b/docs/guestfs-building.pod +index d350b1d73..2029429fd 100644 +--- a/docs/guestfs-building.pod ++++ b/docs/guestfs-building.pod +@@ -172,7 +172,7 @@ I. + + I. + +-=item yajl E 2.0.4 ++=item Jansson + + I. + +diff --git a/lib/Makefile.am b/lib/Makefile.am +index 91c4e0a2e..d075174d9 100644 +--- a/lib/Makefile.am ++++ b/lib/Makefile.am +@@ -141,7 +141,7 @@ libguestfs_la_CFLAGS = \ + $(PCRE_CFLAGS) \ + $(LIBVIRT_CFLAGS) \ + $(LIBXML2_CFLAGS) \ +- $(YAJL_CFLAGS) ++ $(JANSSON_CFLAGS) + + libguestfs_la_LIBADD = \ + ../common/errnostring/liberrnostring.la \ +@@ -152,7 +152,7 @@ libguestfs_la_LIBADD = \ + $(PCRE_LIBS) \ + $(LIBVIRT_LIBS) $(LIBXML2_LIBS) \ + $(SELINUX_LIBS) \ +- $(YAJL_LIBS) \ ++ $(JANSSON_LIBS) \ + ../gnulib/lib/libgnu.la \ + $(GETADDRINFO_LIB) \ + $(HOSTENT_LIB) \ +diff --git a/lib/info.c b/lib/info.c +index 93fadcd39..2eadc1c11 100644 +--- a/lib/info.c ++++ b/lib/info.c +@@ -37,53 +37,46 @@ + #include + #endif + +-#include ++#include + + #include "guestfs.h" + #include "guestfs-internal.h" + #include "guestfs-internal-actions.h" + + #ifdef HAVE_ATTRIBUTE_CLEANUP +-#define CLEANUP_YAJL_TREE_FREE __attribute__((cleanup(cleanup_yajl_tree_free))) ++#define CLEANUP_JSON_T_DECREF __attribute__((cleanup(cleanup_json_t_decref))) + + static void +-cleanup_yajl_tree_free (void *ptr) ++cleanup_json_t_decref (void *ptr) + { +- yajl_tree_free (* (yajl_val *) ptr); ++ json_decref (* (json_t **) ptr); + } + + #else +-#define CLEANUP_YAJL_TREE_FREE ++#define CLEANUP_JSON_T_DECREF + #endif + +-static yajl_val get_json_output (guestfs_h *g, const char *filename); ++static json_t *get_json_output (guestfs_h *g, const char *filename); + static void set_child_rlimits (struct command *); + + char * + guestfs_impl_disk_format (guestfs_h *g, const char *filename) + { +- size_t i, len; +- CLEANUP_YAJL_TREE_FREE yajl_val tree = get_json_output (g, filename); ++ CLEANUP_JSON_T_DECREF json_t *tree = get_json_output (g, filename); ++ json_t *node; + + if (tree == NULL) + return NULL; + +- if (! YAJL_IS_OBJECT (tree)) ++ if (!json_is_object (tree)) + goto bad_type; + +- len = YAJL_GET_OBJECT(tree)->len; +- for (i = 0; i < len; ++i) { +- if (STREQ (YAJL_GET_OBJECT(tree)->keys[i], "format")) { +- const char *str; +- yajl_val node = YAJL_GET_OBJECT(tree)->values[i]; +- if (YAJL_IS_NULL (node)) +- goto bad_type; +- str = YAJL_GET_STRING (node); +- if (str == NULL) +- goto bad_type; +- return safe_strdup (g, str); /* caller frees */ +- } +- } ++ node = json_object_get (tree, "format"); ++ if (!json_is_string (node)) ++ goto bad_type; ++ ++ return safe_strndup (g, json_string_value (node), ++ json_string_length (node)); /* caller frees */ + + bad_type: + error (g, _("qemu-img info: JSON output did not contain ‘format’ key")); +@@ -93,30 +86,20 @@ guestfs_impl_disk_format (guestfs_h *g, const char *filename) + int64_t + guestfs_impl_disk_virtual_size (guestfs_h *g, const char *filename) + { +- size_t i, len; +- CLEANUP_YAJL_TREE_FREE yajl_val tree = get_json_output (g, filename); ++ CLEANUP_JSON_T_DECREF json_t *tree = get_json_output (g, filename); ++ json_t *node; + + if (tree == NULL) + return -1; + +- if (! YAJL_IS_OBJECT (tree)) ++ if (!json_is_object (tree)) + goto bad_type; + +- len = YAJL_GET_OBJECT(tree)->len; +- for (i = 0; i < len; ++i) { +- if (STREQ (YAJL_GET_OBJECT(tree)->keys[i], "virtual-size")) { +- yajl_val node = YAJL_GET_OBJECT(tree)->values[i]; +- if (YAJL_IS_NULL (node)) +- goto bad_type; +- if (! YAJL_IS_NUMBER (node)) +- goto bad_type; +- if (! YAJL_IS_INTEGER (node)) { +- error (g, _("qemu-img info: ‘virtual-size’ is not representable as a 64 bit integer")); +- return -1; +- } +- return YAJL_GET_INTEGER (node); +- } +- } ++ node = json_object_get (tree, "virtual-size"); ++ if (!json_is_integer (node)) ++ goto bad_type; ++ ++ return json_integer_value (node); + + bad_type: + error (g, _("qemu-img info: JSON output did not contain ‘virtual-size’ key")); +@@ -126,29 +109,25 @@ guestfs_impl_disk_virtual_size (guestfs_h *g, const char *filename) + int + guestfs_impl_disk_has_backing_file (guestfs_h *g, const char *filename) + { +- size_t i, len; +- CLEANUP_YAJL_TREE_FREE yajl_val tree = get_json_output (g, filename); ++ CLEANUP_JSON_T_DECREF json_t *tree = get_json_output (g, filename); ++ json_t *node; + + if (tree == NULL) + return -1; + +- if (! YAJL_IS_OBJECT (tree)) ++ if (!json_is_object (tree)) + goto bad_type; + +- len = YAJL_GET_OBJECT(tree)->len; +- for (i = 0; i < len; ++i) { +- if (STREQ (YAJL_GET_OBJECT(tree)->keys[i], "backing-filename")) { +- yajl_val node = YAJL_GET_OBJECT(tree)->values[i]; +- /* Work on the assumption that if this field is null, it means +- * no backing file, rather than being an error. +- */ +- if (YAJL_IS_NULL (node)) +- return 0; +- return 1; +- } +- } ++ node = json_object_get (tree, "backing-filename"); ++ if (node == NULL) ++ return 0; /* no backing-filename key means no backing file */ + +- return 0; /* no backing-filename key means no backing file */ ++ /* Work on the assumption that if this field is null, it means ++ * no backing file, rather than being an error. ++ */ ++ if (json_is_null (node)) ++ return 0; ++ return 1; + + bad_type: + error (g, _("qemu-img info: JSON output was not an object")); +@@ -161,12 +140,12 @@ guestfs_impl_disk_has_backing_file (guestfs_h *g, const char *filename) + static void parse_json (guestfs_h *g, void *treevp, const char *input, size_t len); + #define PARSE_JSON_NO_OUTPUT ((void *) -1) + +-static yajl_val ++static json_t * + get_json_output (guestfs_h *g, const char *filename) + { + CLEANUP_CMD_CLOSE struct command *cmd = guestfs_int_new_command (g); + int r; +- yajl_val tree = NULL; ++ json_t *tree = NULL; + + guestfs_int_cmd_add_arg (cmd, "qemu-img"); + guestfs_int_cmd_add_arg (cmd, "info"); +@@ -196,16 +175,15 @@ get_json_output (guestfs_h *g, const char *filename) + return NULL; + } + +- return tree; /* caller must call yajl_tree_free (tree) */ ++ return tree; /* caller must call json_decref (tree) */ + } + + /* Parse the JSON document printed by qemu-img info --output json. */ + static void + parse_json (guestfs_h *g, void *treevp, const char *input, size_t len) + { +- yajl_val *tree_ret = treevp; +- CLEANUP_FREE char *input_copy = NULL; +- char parse_error[256]; ++ json_t **tree_ret = treevp; ++ json_error_t err; + + assert (*tree_ret == NULL); + +@@ -218,15 +196,12 @@ parse_json (guestfs_h *g, void *treevp, const char *input, size_t len) + return; + } + +- /* 'input' is not \0-terminated; we have to make it so. */ +- input_copy = safe_strndup (g, input, len); ++ debug (g, "%s: qemu-img info JSON output:\n%.*s\n", __func__, (int) len, input); + +- debug (g, "%s: qemu-img info JSON output:\n%s\n", __func__, input_copy); +- +- *tree_ret = yajl_tree_parse (input_copy, parse_error, sizeof parse_error); ++ *tree_ret = json_loadb (input, len, 0, &err); + if (*tree_ret == NULL) { +- if (strlen (parse_error) > 0) +- error (g, _("qemu-img info: JSON parse error: %s"), parse_error); ++ if (strlen (err.text) > 0) ++ error (g, _("qemu-img info: JSON parse error: %s"), err.text); + else + error (g, _("qemu-img info: unknown JSON parse error")); + } +diff --git a/lib/qemu.c b/lib/qemu.c +index 6159b5a52..a50eca988 100644 +--- a/lib/qemu.c ++++ b/lib/qemu.c +@@ -37,7 +37,7 @@ + + #include + +-#include ++#include + + #include "full-write.h" + #include "ignore-value.h" +@@ -57,7 +57,7 @@ struct qemu_data { + + /* The following fields are derived from the fields above. */ + struct version qemu_version; /* Parsed qemu version number. */ +- yajl_val qmp_schema_tree; /* qmp_schema parsed into a JSON tree */ ++ json_t *qmp_schema_tree; /* qmp_schema parsed into a JSON tree */ + }; + + static char *cache_filename (guestfs_h *g, const char *cachedir, const struct stat *, const char *suffix); +@@ -73,7 +73,7 @@ static int write_cache_qmp_schema (guestfs_h *g, const struct qemu_data *data, c + static int read_cache_qemu_stat (guestfs_h *g, struct qemu_data *data, const char *filename); + static int write_cache_qemu_stat (guestfs_h *g, const struct qemu_data *data, const char *filename); + static void parse_qemu_version (guestfs_h *g, const char *, struct version *qemu_version); +-static void parse_json (guestfs_h *g, const char *, yajl_val *); ++static void parse_json (guestfs_h *g, const char *, json_t **); + static void read_all (guestfs_h *g, void *retv, const char *buf, size_t len); + static int generic_read_cache (guestfs_h *g, const char *filename, char **strp); + static int generic_write_cache (guestfs_h *g, const char *filename, const char *str); +@@ -405,17 +405,17 @@ parse_qemu_version (guestfs_h *g, const char *qemu_help, + * is not possible. + */ + static void +-parse_json (guestfs_h *g, const char *json, yajl_val *treep) ++parse_json (guestfs_h *g, const char *json, json_t **treep) + { +- char parse_error[256] = ""; ++ json_error_t err; + + if (!json) + return; + +- *treep = yajl_tree_parse (json, parse_error, sizeof parse_error); ++ *treep = json_loads (json, 0, &err); + if (*treep == NULL) { +- if (strlen (parse_error) > 0) +- debug (g, "QMP parse error: %s (ignored)", parse_error); ++ if (strlen (err.text) > 0) ++ debug (g, "QMP parse error: %s (ignored)", err.text); + else + debug (g, "QMP unknown parse error (ignored)"); + } +@@ -580,17 +580,6 @@ guestfs_int_qemu_supports_device (guestfs_h *g, + return strstr (data->qemu_devices, device_name) != NULL; + } + +-/* GCC can't work out that the YAJL_IS_ test is sufficient to +- * ensure that YAJL_GET_ later doesn't return NULL. +- */ +-#pragma GCC diagnostic push +-#if defined(__GNUC__) && __GNUC__ >= 6 /* gcc >= 6 */ +-#pragma GCC diagnostic ignored "-Wnull-dereference" +-#endif +-#if defined(__GNUC__) && GUESTFS_GCC_VERSION >= 40800 /* gcc >= 4.8.0 */ +-#pragma GCC diagnostic ignored "-Wnonnull" +-#endif +- + /** + * Test if the qemu binary uses mandatory file locking, added in + * QEMU >= 2.10 (but sometimes disabled). +@@ -599,11 +588,7 @@ int + guestfs_int_qemu_mandatory_locking (guestfs_h *g, + const struct qemu_data *data) + { +- const char *return_path[] = { "return", NULL }; +- const char *meta_type_path[] = { "meta-type", NULL }; +- const char *members_path[] = { "members", NULL }; +- const char *name_path[] = { "name", NULL }; +- yajl_val schema, v, meta_type, members, m, name; ++ json_t *schema, *v, *meta_type, *members, *m, *name; + size_t i, j; + + /* If there's no QMP schema, fall back to checking the version. */ +@@ -616,27 +601,24 @@ guestfs_int_qemu_mandatory_locking (guestfs_h *g, + * Extract the schema from the wrapper. Note the returned ‘schema’ + * will be an array. + */ +- schema = yajl_tree_get (data->qmp_schema_tree, return_path, yajl_t_array); +- if (schema == NULL) ++ schema = json_object_get (data->qmp_schema_tree, "return"); ++ if (!json_is_array (schema)) + goto fallback; +- assert (YAJL_IS_ARRAY(schema)); + + /* Now look for any member of the array which has: + * { "meta-type": "object", + * "members": [ ... { "name": "locking", ... } ... ] ... } + */ +- for (i = 0; i < YAJL_GET_ARRAY(schema)->len; ++i) { +- v = YAJL_GET_ARRAY(schema)->values[i]; +- meta_type = yajl_tree_get (v, meta_type_path, yajl_t_string); +- if (meta_type && YAJL_IS_STRING (meta_type) && +- STREQ (YAJL_GET_STRING (meta_type), "object")) { +- members = yajl_tree_get (v, members_path, yajl_t_array); +- if (members) { +- for (j = 0; j < YAJL_GET_ARRAY(members)->len; ++j) { +- m = YAJL_GET_ARRAY(members)->values[j]; +- name = yajl_tree_get (m, name_path, yajl_t_string); +- if (name && YAJL_IS_STRING (name) && +- STREQ (YAJL_GET_STRING (name), "locking")) ++ json_array_foreach (schema, i, v) { ++ meta_type = json_object_get (v, "meta-type"); ++ if (json_is_string (meta_type) && ++ STREQ (json_string_value (meta_type), "object")) { ++ members = json_object_get (v, "members"); ++ if (json_is_array (members)) { ++ json_array_foreach (members, j, m) { ++ name = json_object_get (v, "name"); ++ if (json_is_string (name) && ++ STREQ (json_string_value (name), "locking")) + return 1; + } + } +@@ -646,8 +628,6 @@ guestfs_int_qemu_mandatory_locking (guestfs_h *g, + return 0; + } + +-#pragma GCC diagnostic pop +- + /** + * Escape a qemu parameter. + * +@@ -996,7 +976,7 @@ guestfs_int_free_qemu_data (struct qemu_data *data) + free (data->qemu_help); + free (data->qemu_devices); + free (data->qmp_schema); +- yajl_tree_free (data->qmp_schema_tree); ++ json_decref (data->qmp_schema_tree); + free (data); + } + } +diff --git a/m4/guestfs-libraries.m4 b/m4/guestfs-libraries.m4 +index 78a9e792f..2fdbd9669 100644 +--- a/m4/guestfs-libraries.m4 ++++ b/m4/guestfs-libraries.m4 +@@ -299,8 +299,8 @@ LIBS="$LIBS $LIBXML2_LIBS" + AC_CHECK_FUNCS([xmlBufferDetach]) + LIBS="$old_LIBS" + +-dnl Check for yajl JSON library (required). +-PKG_CHECK_MODULES([YAJL], [yajl >= 2.0.4]) ++dnl Check for Jansson JSON library (required). ++PKG_CHECK_MODULES([JANSSON], [jansson]) + + dnl Check for C++ (optional, we just use this to test the header works). + AC_PROG_CXX +-- +2.20.1 + diff --git a/SOURCES/0002-qemu-Fix-transcription-error-in-conversion-of-yajl-t.patch b/SOURCES/0002-qemu-Fix-transcription-error-in-conversion-of-yajl-t.patch new file mode 100644 index 0000000..50411a8 --- /dev/null +++ b/SOURCES/0002-qemu-Fix-transcription-error-in-conversion-of-yajl-t.patch @@ -0,0 +1,31 @@ +From 898e6c1e39deb130566220a11a2eaf2dcb2cb733 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 29 Mar 2018 20:18:34 +0100 +Subject: [PATCH] qemu: Fix transcription error in conversion of yajl to + jansson. + +This broke qemu mandatory locking detection. + +Fixes commit bd1c5c9f4dcf38458099db8a0bf4659a07ef055d. + +(cherry picked from commit e79286f71738d9385157d9e87211be02645722c3) +--- + lib/qemu.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/qemu.c b/lib/qemu.c +index a50eca988..3e7f15946 100644 +--- a/lib/qemu.c ++++ b/lib/qemu.c +@@ -616,7 +616,7 @@ guestfs_int_qemu_mandatory_locking (guestfs_h *g, + members = json_object_get (v, "members"); + if (json_is_array (members)) { + json_array_foreach (members, j, m) { +- name = json_object_get (v, "name"); ++ name = json_object_get (m, "name"); + if (json_is_string (name) && + STREQ (json_string_value (name), "locking")) + return 1; +-- +2.20.1 + diff --git a/SOURCES/0003-v2v-ovf-Create-OVF-more-aligned-with-the-standard.patch b/SOURCES/0003-v2v-ovf-Create-OVF-more-aligned-with-the-standard.patch new file mode 100644 index 0000000..b605340 --- /dev/null +++ b/SOURCES/0003-v2v-ovf-Create-OVF-more-aligned-with-the-standard.patch @@ -0,0 +1,342 @@ +From d330b210b7d62ccd9f73909215251f4ce68cd6c9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= +Date: Thu, 22 Feb 2018 11:41:07 +0100 +Subject: [PATCH] v2v: ovf: Create OVF more aligned with the standard +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +For historical reasons the OVF used in RHV export domain contains some +deviations from the OVF standard. The format used in -o rhv has to +remain fixed but for -o vdsm and we could produce much nicer OVF. This +patch serves as a preparatory step to this. + +The main reason for creating different OVF is that it can be used to +create VM by oVirt REST API. The RHV export domain flavor cannot be used +that way. + +For now the virt-v2v behavior is unchanged. The modified output will be +enabled in some later patch. + +Signed-off-by: Tomáš Golembiovský +(cherry picked from commit a52ed4b4454396eb13d2cdf5762292bff3104f66) +--- + v2v/create_ovf.ml | 152 ++++++++++++++++++++++++++++++++------------- + v2v/create_ovf.mli | 12 +++- + v2v/output_rhv.ml | 3 +- + v2v/output_vdsm.ml | 3 +- + 4 files changed, 121 insertions(+), 49 deletions(-) + +diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml +index e9d569dc1..0ec0a088c 100644 +--- a/v2v/create_ovf.ml ++++ b/v2v/create_ovf.ml +@@ -29,6 +29,10 @@ open Types + open Utils + open DOM + ++type ovf_flavour = ++ | OVirt ++ | RHVExportStorageDomain ++ + (* We set the creation time to be the same for all dates in + * all metadata files. All dates in OVF are UTC. + *) +@@ -295,7 +299,7 @@ let create_meta_files output_alloc sd_uuid image_uuids targets = + + (* Create the OVF file. *) + let rec create_ovf source targets guestcaps inspect +- output_alloc sd_uuid image_uuids vol_uuids vm_uuid = ++ output_alloc sd_uuid image_uuids vol_uuids vm_uuid ovf_flavour = + assert (List.length targets = List.length vol_uuids); + + let memsize_mb = source.s_memory /^ 1024L /^ 1024L in +@@ -314,12 +318,26 @@ let rec create_ovf source targets guestcaps inspect + ] [ + Comment generated_by; + e "References" [] []; +- e "Section" ["xsi:type", "ovf:NetworkSection_Type"] [ +- e "Info" [] [PCData "List of networks"] +- ]; +- e "Section" ["xsi:type", "ovf:DiskSection_Type"] [ +- e "Info" [] [PCData "List of Virtual Disks"] +- ]; ++ (match ovf_flavour with ++ | OVirt -> ++ e "NetworkSection" [] [ ++ e "Info" [] [PCData "List of networks"] ++ ] ++ | RHVExportStorageDomain -> ++ e "Section" ["xsi:type", "ovf:NetworkSection_Type"] [ ++ e "Info" [] [PCData "List of networks"] ++ ] ++ ); ++ (match ovf_flavour with ++ | OVirt -> ++ e "DiskSection" [] [ ++ e "Info" [] [PCData "List of Virtual Disks"] ++ ] ++ | RHVExportStorageDomain -> ++ e "Section" ["xsi:type", "ovf:DiskSection_Type"] [ ++ e "Info" [] [PCData "List of Virtual Disks"] ++ ] ++ ); + + let content_subnodes = ref [ + e "Name" [] [PCData source.s_name]; +@@ -352,11 +370,20 @@ let rec create_ovf source targets guestcaps inspect + ); + + List.push_back content_subnodes ( +- e "Section" ["ovf:id", vm_uuid; "ovf:required", "false"; +- "xsi:type", "ovf:OperatingSystemSection_Type"] [ ++ let osinfo_subnodes = [ + e "Info" [] [PCData inspect.i_product_name]; + e "Description" [] [PCData ostype]; +- ] ++ ] in ++ (match ovf_flavour with ++ | OVirt -> ++ e "OperatingSystemSection" ["ovf:id", vm_uuid; ++ "ovf:required", "false"] ++ osinfo_subnodes ++ | RHVExportStorageDomain -> ++ e "Section" ["ovf:id", vm_uuid; "ovf:required", "false"; ++ "xsi:type", "ovf:OperatingSystemSection_Type"] ++ osinfo_subnodes ++ ) + ); + + let virtual_hardware_section_items = ref [ +@@ -444,24 +471,34 @@ let rec create_ovf source targets guestcaps inspect + ); + + List.push_back content_subnodes ( +- e "Section" ["xsi:type", "ovf:VirtualHardwareSection_Type"] +- !virtual_hardware_section_items ++ match ovf_flavour with ++ | OVirt -> ++ e "VirtualHardwareSection" [] !virtual_hardware_section_items ++ | RHVExportStorageDomain -> ++ e "Section" ["xsi:type", "ovf:VirtualHardwareSection_Type"] ++ !virtual_hardware_section_items + ); + +- e "Content" ["ovf:id", "out"; "xsi:type", "ovf:VirtualSystem_Type"] +- !content_subnodes ++ (match ovf_flavour with ++ | OVirt -> ++ e "VirtualSystem" ["ovf:id", "out"] !content_subnodes ++ | RHVExportStorageDomain -> ++ e "Content" ["ovf:id", "out"; "xsi:type", "ovf:VirtualSystem_Type"] ++ !content_subnodes ++ ) + ] in + + (* Add disks to the OVF XML. *) +- add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ovf; ++ add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ++ ovf_flavour ovf; + + (* Old virt-v2v ignored removable media. XXX *) + + (* Add networks to the OVF XML. *) +- add_networks source.s_nics guestcaps ovf; ++ add_networks source.s_nics guestcaps ovf_flavour ovf; + + (* Add sound card to the OVF XML. *) +- add_sound_card source.s_sound ovf; ++ add_sound_card source.s_sound ovf_flavour ovf; + + (* Old virt-v2v didn't really look at the video and display + * metadata, instead just adding a single standard display (see +@@ -481,21 +518,42 @@ let rec create_ovf source targets guestcaps inspect + (* Return the OVF document. *) + ovf + ++(* Find appropriate section depending on the OVF flavour being generated. ++ * ++ * For example normal disk section is in node whereas in case of ++ * RHV export storage domain it is
. ++ *) ++and get_flavoured_section ovf ovf_flavour ovirt_path rhv_path rhv_path_attr = ++ let nodes = ++ match ovf_flavour with ++ | OVirt -> ++ let nodes = path_to_nodes ovf ovirt_path in ++ (match nodes with ++ | [node] -> node ++ | [] | _::_::_ -> assert false) ++ | RHVExportStorageDomain -> ++ let nodes = path_to_nodes ovf rhv_path in ++ try find_node_by_attr nodes rhv_path_attr ++ with Not_found -> assert false ++ in ++ nodes ++ + (* This modifies the OVF DOM, adding a section for each disk. *) +-and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ovf = ++and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ++ ovf_flavour ovf = + let references = + let nodes = path_to_nodes ovf ["ovf:Envelope"; "References"] in + match nodes with + | [] | _::_::_ -> assert false + | [node] -> node in +- let disk_section = +- let sections = path_to_nodes ovf ["ovf:Envelope"; "Section"] in +- try find_node_by_attr sections ("xsi:type", "ovf:DiskSection_Type") +- with Not_found -> assert false in +- let virtualhardware_section = +- let sections = path_to_nodes ovf ["ovf:Envelope"; "Content"; "Section"] in +- try find_node_by_attr sections ("xsi:type", "ovf:VirtualHardwareSection_Type") +- with Not_found -> assert false in ++ let disk_section = get_flavoured_section ovf ovf_flavour ++ ["ovf:Envelope"; "DiskSection"] ++ ["ovf:Envelope"; "Section"] ++ ("xsi:type", "ovf:DiskSection_Type") in ++ let virtualhardware_section = get_flavoured_section ovf ovf_flavour ++ ["ovf:Envelope"; "VirtualSystem"; "VirtualHardwareSection"] ++ ["ovf:Envelope"; "Content"; "Section"] ++ ("xsi:type", "ovf:VirtualHardwareSection_Type") in + + (* Iterate over the disks, adding them to the OVF document. *) + List.iteri ( +@@ -509,7 +567,12 @@ and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ovf = + let is_bootable_drive = i == 0 in + let boot_order = i+1 in + +- let fileref = sprintf "%s/%s" image_uuid vol_uuid in ++ let fileref = ++ match ovf_flavour with ++ | OVirt -> ++ vol_uuid ++ | RHVExportStorageDomain -> ++ sprintf "%s/%s" image_uuid vol_uuid in + + (* ovf:size and ovf:actual_size fields are integer GBs. If you + * use floating point numbers then RHV will fail to parse them. +@@ -560,7 +623,10 @@ and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ovf = + (* Add disk to DiskSection. *) + let disk = + let attrs = ref [ +- "ovf:diskId", vol_uuid; ++ "ovf:diskId", ++ (match ovf_flavour with ++ | OVirt -> image_uuid ++ | RHVExportStorageDomain -> vol_uuid); + "ovf:size", Int64.to_string size_gb; + "ovf:capacity", Int64.to_string ov.ov_virtual_size; + "ovf:fileRef", fileref; +@@ -619,15 +685,15 @@ and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ovf = + ) (List.combine3 targets image_uuids vol_uuids) + + (* This modifies the OVF DOM, adding a section for each NIC. *) +-and add_networks nics guestcaps ovf = +- let network_section = +- let sections = path_to_nodes ovf ["ovf:Envelope"; "Section"] in +- try find_node_by_attr sections ("xsi:type", "ovf:NetworkSection_Type") +- with Not_found -> assert false in +- let virtualhardware_section = +- let sections = path_to_nodes ovf ["ovf:Envelope"; "Content"; "Section"] in +- try find_node_by_attr sections ("xsi:type", "ovf:VirtualHardwareSection_Type") +- with Not_found -> assert false in ++and add_networks nics guestcaps ovf_flavour ovf = ++ let network_section = get_flavoured_section ovf ovf_flavour ++ ["ovf:Envelope"; "NetworkSection"] ++ ["ovf:Envelope"; "Section"] ++ ("xsi:type", "ovf:NetworkSection_Type") in ++ let virtualhardware_section = get_flavoured_section ovf ovf_flavour ++ ["ovf:Envelope"; "VirtualSystem"; "VirtualHardwareSection"] ++ ["ovf:Envelope"; "Content"; "Section"] ++ ("xsi:type", "ovf:VirtualHardwareSection_Type") in + + (* Iterate over the NICs, adding them to the OVF document. *) + List.iteri ( +@@ -675,7 +741,7 @@ and add_networks nics guestcaps ovf = + ) nics + + (* This modifies the OVF DOM, adding a sound card, if oVirt can emulate it. *) +-and add_sound_card sound ovf = ++and add_sound_card sound ovf_flavour ovf = + let device = + match sound with + | None -> None +@@ -688,12 +754,10 @@ and add_sound_card sound ovf = + + match device with + | Some device -> +- let virtualhardware_section = +- let sections = +- path_to_nodes ovf ["ovf:Envelope"; "Content"; "Section"] in +- try find_node_by_attr sections +- ("xsi:type", "ovf:VirtualHardwareSection_Type") +- with Not_found -> assert false in ++ let virtualhardware_section = get_flavoured_section ovf ovf_flavour ++ ["ovf:Envelope"; "VirtualSystem"; "VirtualHardwareSection"] ++ ["ovf:Envelope"; "Content"; "Section"] ++ ("xsi:type", "ovf:VirtualHardwareSection_Type") in + + let item = + e "Item" [] [ +diff --git a/v2v/create_ovf.mli b/v2v/create_ovf.mli +index 07e8af6a0..8a8c7dd12 100644 +--- a/v2v/create_ovf.mli ++++ b/v2v/create_ovf.mli +@@ -16,16 +16,22 @@ + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + *) + ++type ovf_flavour = ++ | OVirt ++ | RHVExportStorageDomain ++ + (** Create OVF and related files for RHV. + +- The format is described in +- http://www.ovirt.org/images/8/86/Ovirt_ovf_format.odt ++ The format for RHV export storage domain is described in: ++ http://resources.ovirt.org/old-site-files/Ovirt_ovf_format.odt ++ ++ The format understood by oVirt has no known documentation. + + OVF isn't a real standard, so it's likely that if we ever had to + create OVF for another target management system then we would need + to heavily modify or even duplicate this code. *) + +-val create_ovf : Types.source -> Types.target list -> Types.guestcaps -> Types.inspect -> Types.output_allocation -> string -> string list -> string list -> string -> DOM.doc ++val create_ovf : Types.source -> Types.target list -> Types.guestcaps -> Types.inspect -> Types.output_allocation -> string -> string list -> string list -> string -> ovf_flavour -> DOM.doc + (** Create the OVF file. + + Actually a {!DOM} document is created, not a file. It can be written +diff --git a/v2v/output_rhv.ml b/v2v/output_rhv.ml +index 0b732e4cf..5260ab030 100644 +--- a/v2v/output_rhv.ml ++++ b/v2v/output_rhv.ml +@@ -275,7 +275,8 @@ object + + (* Create the metadata. *) + let ovf = Create_ovf.create_ovf source targets guestcaps inspect +- output_alloc esd_uuid image_uuids vol_uuids vm_uuid in ++ output_alloc esd_uuid image_uuids vol_uuids vm_uuid ++ Create_ovf.RHVExportStorageDomain in + + (* Write it to the metadata file. *) + let dir = esd_mp // esd_uuid // "master" // "vms" // vm_uuid in +diff --git a/v2v/output_vdsm.ml b/v2v/output_vdsm.ml +index c5e904ba1..ce286d327 100644 +--- a/v2v/output_vdsm.ml ++++ b/v2v/output_vdsm.ml +@@ -175,7 +175,8 @@ object + output_alloc dd_uuid + vdsm_options.image_uuids + vdsm_options.vol_uuids +- vdsm_options.vm_uuid in ++ vdsm_options.vm_uuid ++ Create_ovf.RHVExportStorageDomain in + + (* Write it to the metadata file. *) + let file = vdsm_options.ovf_output // vdsm_options.vm_uuid ^ ".ovf" in +-- +2.20.1 + diff --git a/SOURCES/0004-v2v-vdsm-add-vdsm-fixed-ovf-option.patch b/SOURCES/0004-v2v-vdsm-add-vdsm-fixed-ovf-option.patch new file mode 100644 index 0000000..67dc38e --- /dev/null +++ b/SOURCES/0004-v2v-vdsm-add-vdsm-fixed-ovf-option.patch @@ -0,0 +1,213 @@ +From 14cfe80643a7df4ddf412aebdf39543344c1cf6e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= +Date: Thu, 22 Feb 2018 11:41:08 +0100 +Subject: [PATCH] v2v: vdsm: add --vdsm-fixed-ovf option +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add option for -o vdsm that enables output of the modified OVF. oVirt +engine should already be able to consume the OVF, but let's not take any +chances and enable it only by command line argument. It can be made +default later when it receives proper testing. + +Signed-off-by: Tomáš Golembiovský +(cherry picked from commit 285014b290507865fd2020e44ea453af0262b624) +--- + v2v/cmdline.ml | 10 ++++++++++ + v2v/create_ovf.ml | 7 +++++++ + v2v/create_ovf.mli | 9 +++++++++ + v2v/output_vdsm.ml | 9 +++++++-- + v2v/output_vdsm.mli | 1 + + v2v/test-v2v-o-vdsm-options.sh | 3 ++- + v2v/virt-v2v.pod | 20 ++++++++++++++++++++ + 7 files changed, 56 insertions(+), 3 deletions(-) + +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index d88d0a579..75909ee77 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -79,6 +79,11 @@ let parse_cmdline () = + let vdsm_compat = ref "0.10" in + let set_vdsm_compat s = vdsm_compat := s in + ++ let vdsm_ovf_flavour = ref Create_ovf.RHVExportStorageDomain in ++ let ovf_flavours_str = String.concat "|" Create_ovf.ovf_flavours in ++ let set_vdsm_ovf_flavour arg = ++ vdsm_ovf_flavour := Create_ovf.ovf_flavour_of_string arg in ++ + let set_string_option_once optname optref arg = + match !optref with + | Some _ -> +@@ -251,6 +256,8 @@ let parse_cmdline () = + s_"Output VM UUID"; + [ L"vdsm-ovf-output" ], Getopt.String ("-", set_string_option_once "--vdsm-ovf-output" vdsm_ovf_output), + s_"Output OVF file"; ++ [ L"vdsm-ovf-flavour" ], Getopt.Symbol (ovf_flavours_str, Create_ovf.ovf_flavours, set_vdsm_ovf_flavour), ++ s_"Set the type of generated OVF (default rhvexp)"; + [ L"vmtype" ], Getopt.String ("-", vmtype_warning), + s_"Ignored for backwards compatibility"; + ] in +@@ -327,6 +334,7 @@ read the man page virt-v2v(1). + let vdsm_vol_uuids = List.rev !vdsm_vol_uuids in + let vdsm_vm_uuid = !vdsm_vm_uuid in + let vdsm_ovf_output = Option.default "." !vdsm_ovf_output in ++ let vdsm_ovf_flavour = !vdsm_ovf_flavour in + + (* No arguments and machine-readable mode? Print out some facts + * about what this binary supports. +@@ -343,6 +351,7 @@ read the man page virt-v2v(1). + List.iter (printf "input:%s\n") (Modules_list.input_modules ()); + List.iter (printf "output:%s\n") (Modules_list.output_modules ()); + List.iter (printf "convert:%s\n") (Modules_list.convert_modules ()); ++ List.iter (printf "ovf:%s\n") Create_ovf.ovf_flavours; + exit 0 + ); + +@@ -542,6 +551,7 @@ read the man page virt-v2v(1). + vm_uuid = vdsm_vm_uuid; + ovf_output = vdsm_ovf_output; + compat = vdsm_compat; ++ ovf_flavour = vdsm_ovf_flavour; + } in + Output_vdsm.output_vdsm os vdsm_options output_alloc, + output_format, output_alloc in +diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml +index 0ec0a088c..d0735afce 100644 +--- a/v2v/create_ovf.ml ++++ b/v2v/create_ovf.ml +@@ -33,6 +33,13 @@ type ovf_flavour = + | OVirt + | RHVExportStorageDomain + ++let ovf_flavours = ["ovirt"; "rhvexp"] ++ ++let ovf_flavour_of_string = function ++ | "ovirt" -> OVirt ++ | "rhvexp" -> RHVExportStorageDomain ++ | flav -> invalid_arg flav ++ + (* We set the creation time to be the same for all dates in + * all metadata files. All dates in OVF are UTC. + *) +diff --git a/v2v/create_ovf.mli b/v2v/create_ovf.mli +index 8a8c7dd12..2d80660e3 100644 +--- a/v2v/create_ovf.mli ++++ b/v2v/create_ovf.mli +@@ -20,6 +20,15 @@ type ovf_flavour = + | OVirt + | RHVExportStorageDomain + ++(** The string representation of available OVF flavours. *) ++val ovf_flavours : string list ++ ++(** Convert from a string to the corresponding OVF flavour. ++ ++ Throw [Invalid_argument] if the string does not match any ++ valid flavour. *) ++val ovf_flavour_of_string : string -> ovf_flavour ++ + (** Create OVF and related files for RHV. + + The format for RHV export storage domain is described in: +diff --git a/v2v/output_vdsm.ml b/v2v/output_vdsm.ml +index ce286d327..b76a2e930 100644 +--- a/v2v/output_vdsm.ml ++++ b/v2v/output_vdsm.ml +@@ -32,6 +32,7 @@ type vdsm_options = { + vm_uuid : string; + ovf_output : string; + compat : string; ++ ovf_flavour : Create_ovf.ovf_flavour; + } + + class output_vdsm os vdsm_options output_alloc = +@@ -39,7 +40,7 @@ object + inherit output + + method as_options = +- sprintf "-o vdsm -os %s%s%s --vdsm-vm-uuid %s --vdsm-ovf-output %s%s" os ++ sprintf "-o vdsm -os %s%s%s --vdsm-vm-uuid %s --vdsm-ovf-output %s%s%s" os + (String.concat "" + (List.map (sprintf " --vdsm-image-uuid %s") vdsm_options.image_uuids)) + (String.concat "" +@@ -49,6 +50,10 @@ object + (match vdsm_options.compat with + | "0.10" -> "" (* currently this is the default, so don't print it *) + | s -> sprintf " --vdsm-compat=%s" s) ++ (match vdsm_options.ovf_flavour with ++ | Create_ovf.OVirt -> "--vdsm-ovf-flavour=ovf" ++ (* currently this is the default, so don't print it *) ++ | Create_ovf.RHVExportStorageDomain -> "") + + method supported_firmware = [ TargetBIOS ] + +@@ -176,7 +181,7 @@ object + vdsm_options.image_uuids + vdsm_options.vol_uuids + vdsm_options.vm_uuid +- Create_ovf.RHVExportStorageDomain in ++ vdsm_options.ovf_flavour in + + (* Write it to the metadata file. *) + let file = vdsm_options.ovf_output // vdsm_options.vm_uuid ^ ".ovf" in +diff --git a/v2v/output_vdsm.mli b/v2v/output_vdsm.mli +index 401a71ec4..6ed684638 100644 +--- a/v2v/output_vdsm.mli ++++ b/v2v/output_vdsm.mli +@@ -24,6 +24,7 @@ type vdsm_options = { + vm_uuid : string; (* --vdsm-vm-uuid *) + ovf_output : string; (* --vdsm-ovf-output *) + compat : string; (* --vdsm-compat=0.10|1.1 *) ++ ovf_flavour : Create_ovf.ovf_flavour; + } + (** Miscellaneous extra command line parameters used by VDSM. *) + +diff --git a/v2v/test-v2v-o-vdsm-options.sh b/v2v/test-v2v-o-vdsm-options.sh +index 753efc4e7..4ad5d4aad 100755 +--- a/v2v/test-v2v-o-vdsm-options.sh ++++ b/v2v/test-v2v-o-vdsm-options.sh +@@ -55,7 +55,8 @@ $VG virt-v2v --debug-gc \ + --vdsm-vol-uuid VOL \ + --vdsm-vm-uuid VM \ + --vdsm-ovf-output $d/12345678-1234-1234-1234-123456789abc/master/vms/VM \ +- --vdsm-compat=1.1 ++ --vdsm-compat=1.1 \ ++ --vdsm-ovf-flavour=ovirt + + # Test the OVF metadata was created. + test -f $d/12345678-1234-1234-1234-123456789abc/master/vms/VM/VM.ovf +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index cced114f3..0ea5fa97f 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -759,6 +759,26 @@ hex digit can be C<0-9> or C), conforming to S. + + These options can only be used with I<-o vdsm>. + ++=item B<--vdsm-ovf-flavour> flavour ++ ++This option controls the format of the OVF generated at the end of conversion. ++Currently there are two possible flavours: ++ ++=over 4 ++ ++=item rhevexp ++ ++The OVF format used in RHV export storage domain. ++ ++=item ovirt ++ ++The OVF format understood by oVirt REST API. ++ ++=back ++ ++For backward compatibility the default is I, but this may change in ++the future. ++ + =item B<-v> + + =item B<--verbose> +-- +2.20.1 + diff --git a/SOURCES/0005-v2v-OVF-Code-formatting.patch b/SOURCES/0005-v2v-OVF-Code-formatting.patch new file mode 100644 index 0000000..bad357f --- /dev/null +++ b/SOURCES/0005-v2v-OVF-Code-formatting.patch @@ -0,0 +1,124 @@ +From 00ed208050cdb2178ac58878cb126504ebc7b311 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 22 Feb 2018 14:22:12 +0000 +Subject: [PATCH] v2v: OVF: Code formatting. + +Updates commit a52ed4b4454396eb13d2cdf5762292bff3104f66 +("v2v: ovf: Create OVF more aligned with the standard") with some +small code refactoring and formatting. + +(cherry picked from commit 9e83f3a2ccef4e91b0b3275b712df8b16e233cff) +--- + v2v/create_ovf.ml | 73 ++++++++++++++++++++++++++--------------------- + 1 file changed, 41 insertions(+), 32 deletions(-) + +diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml +index d0735afce..0e07afea8 100644 +--- a/v2v/create_ovf.ml ++++ b/v2v/create_ovf.ml +@@ -530,20 +530,16 @@ let rec create_ovf source targets guestcaps inspect + * For example normal disk section is in node whereas in case of + * RHV export storage domain it is
. + *) +-and get_flavoured_section ovf ovf_flavour ovirt_path rhv_path rhv_path_attr = +- let nodes = +- match ovf_flavour with +- | OVirt -> +- let nodes = path_to_nodes ovf ovirt_path in +- (match nodes with ++and get_flavoured_section ovf ovirt_path rhv_path rhv_path_attr = function ++ | OVirt -> ++ let nodes = path_to_nodes ovf ovirt_path in ++ (match nodes with + | [node] -> node + | [] | _::_::_ -> assert false) +- | RHVExportStorageDomain -> +- let nodes = path_to_nodes ovf rhv_path in +- try find_node_by_attr nodes rhv_path_attr +- with Not_found -> assert false +- in +- nodes ++ | RHVExportStorageDomain -> ++ let nodes = path_to_nodes ovf rhv_path in ++ try find_node_by_attr nodes rhv_path_attr ++ with Not_found -> assert false + + (* This modifies the OVF DOM, adding a section for each disk. *) + and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids +@@ -553,14 +549,19 @@ and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids + match nodes with + | [] | _::_::_ -> assert false + | [node] -> node in +- let disk_section = get_flavoured_section ovf ovf_flavour +- ["ovf:Envelope"; "DiskSection"] +- ["ovf:Envelope"; "Section"] +- ("xsi:type", "ovf:DiskSection_Type") in +- let virtualhardware_section = get_flavoured_section ovf ovf_flavour +- ["ovf:Envelope"; "VirtualSystem"; "VirtualHardwareSection"] +- ["ovf:Envelope"; "Content"; "Section"] +- ("xsi:type", "ovf:VirtualHardwareSection_Type") in ++ let disk_section = ++ get_flavoured_section ovf ++ ["ovf:Envelope"; "DiskSection"] ++ ["ovf:Envelope"; "Section"] ++ ("xsi:type", "ovf:DiskSection_Type") ++ ovf_flavour in ++ let virtualhardware_section = ++ get_flavoured_section ovf ++ ["ovf:Envelope"; "VirtualSystem"; ++ "VirtualHardwareSection"] ++ ["ovf:Envelope"; "Content"; "Section"] ++ ("xsi:type", "ovf:VirtualHardwareSection_Type") ++ ovf_flavour in + + (* Iterate over the disks, adding them to the OVF document. *) + List.iteri ( +@@ -693,14 +694,19 @@ and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids + + (* This modifies the OVF DOM, adding a section for each NIC. *) + and add_networks nics guestcaps ovf_flavour ovf = +- let network_section = get_flavoured_section ovf ovf_flavour +- ["ovf:Envelope"; "NetworkSection"] +- ["ovf:Envelope"; "Section"] +- ("xsi:type", "ovf:NetworkSection_Type") in +- let virtualhardware_section = get_flavoured_section ovf ovf_flavour +- ["ovf:Envelope"; "VirtualSystem"; "VirtualHardwareSection"] +- ["ovf:Envelope"; "Content"; "Section"] +- ("xsi:type", "ovf:VirtualHardwareSection_Type") in ++ let network_section = ++ get_flavoured_section ovf ++ ["ovf:Envelope"; "NetworkSection"] ++ ["ovf:Envelope"; "Section"] ++ ("xsi:type", "ovf:NetworkSection_Type") ++ ovf_flavour in ++ let virtualhardware_section = ++ get_flavoured_section ovf ++ ["ovf:Envelope"; "VirtualSystem"; ++ "VirtualHardwareSection"] ++ ["ovf:Envelope"; "Content"; "Section"] ++ ("xsi:type", "ovf:VirtualHardwareSection_Type") ++ ovf_flavour in + + (* Iterate over the NICs, adding them to the OVF document. *) + List.iteri ( +@@ -761,10 +767,13 @@ and add_sound_card sound ovf_flavour ovf = + + match device with + | Some device -> +- let virtualhardware_section = get_flavoured_section ovf ovf_flavour +- ["ovf:Envelope"; "VirtualSystem"; "VirtualHardwareSection"] +- ["ovf:Envelope"; "Content"; "Section"] +- ("xsi:type", "ovf:VirtualHardwareSection_Type") in ++ let virtualhardware_section = ++ get_flavoured_section ovf ++ ["ovf:Envelope"; "VirtualSystem"; ++ "VirtualHardwareSection"] ++ ["ovf:Envelope"; "Content"; "Section"] ++ ("xsi:type", "ovf:VirtualHardwareSection_Type") ++ ovf_flavour in + + let item = + e "Item" [] [ +-- +2.20.1 + diff --git a/SOURCES/0006-v2v-DOM-Add-doc_to_string-function.patch b/SOURCES/0006-v2v-DOM-Add-doc_to_string-function.patch new file mode 100644 index 0000000..8461c8f --- /dev/null +++ b/SOURCES/0006-v2v-DOM-Add-doc_to_string-function.patch @@ -0,0 +1,127 @@ +From 83b5f589231da2ab6d04680f42c37dc6058cbe6e Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 20 Feb 2018 15:21:48 +0000 +Subject: [PATCH] v2v: DOM: Add doc_to_string function. + +Convert a document to an in-memory string. + +(cherry picked from commit 802c8635cc2537a7d4b7af8981c670e2fdbb2675) +--- + v2v/DOM.ml | 61 +++++++++++++++++++++++++++++++++-------------------- + v2v/DOM.mli | 3 +++ + 2 files changed, 41 insertions(+), 23 deletions(-) + +diff --git a/v2v/DOM.ml b/v2v/DOM.ml +index 7f66e0920..8b106224b 100644 +--- a/v2v/DOM.ml ++++ b/v2v/DOM.ml +@@ -46,43 +46,48 @@ let e name attrs children = + * we will be writing, ie. libvirt XML and OVF metadata, where + * whitespace is generally not significant, but readability is useful. + *) +-let rec node_to_chan ?(indent = 0) chan = function +- | PCData str -> output_string chan (xml_quote_pcdata str) ++let rec node_to_buf ?(indent = 0) buf = function ++ | PCData str -> ++ Buffer.add_string buf (xml_quote_pcdata str) + | Comment str -> +- output_spaces chan indent; +- fprintf chan "" (xml_quote_pcdata str) +- | Element e -> element_to_chan ~indent chan e +-and element_to_chan ?(indent = 0) chan ++ buffer_add_spaces buf indent; ++ bprintf buf "" (xml_quote_pcdata str) ++ | Element e -> ++ element_to_buf ~indent buf e ++and element_to_buf ?(indent = 0) buf + { e_name = name; e_attrs = attrs; e_children = children } = +- output_spaces chan indent; +- fprintf chan "<%s" name; +- List.iter (fun (n, v) -> fprintf chan " %s='%s'" n (xml_quote_attr v)) attrs; ++ buffer_add_spaces buf indent; ++ bprintf buf "<%s" name; ++ List.iter (fun (n, v) -> bprintf buf " %s='%s'" n (xml_quote_attr v)) attrs; + if children <> [] then ( +- output_string chan ">"; ++ Buffer.add_string buf ">"; + let last_child_was_element = ref false in + List.iter ( + function + | Element _ as child -> + last_child_was_element := true; +- output_char chan '\n'; +- node_to_chan ~indent:(indent+2) chan child; ++ Buffer.add_char buf '\n'; ++ node_to_buf ~indent:(indent+2) buf child; + | PCData _ as child -> + last_child_was_element := false; +- node_to_chan ~indent:(indent+2) chan child; ++ node_to_buf ~indent:(indent+2) buf child; + | Comment _ as child -> + last_child_was_element := true; +- output_char chan '\n'; +- node_to_chan ~indent:(indent+2) chan child; ++ Buffer.add_char buf '\n'; ++ node_to_buf ~indent:(indent+2) buf child; + ) children; + if !last_child_was_element then ( +- output_char chan '\n'; +- output_spaces chan indent ++ Buffer.add_char buf '\n'; ++ buffer_add_spaces buf indent + ); +- fprintf chan "" name ++ bprintf buf "" name + ) else ( +- output_string chan "/>" ++ Buffer.add_string buf "/>" + ) + ++and buffer_add_spaces buf n = ++ Buffer.add_string buf (String.spaces n) ++ + (* Quote XML content. Note you must use single + * quotes around the attribute. + *) +@@ -99,10 +104,20 @@ and xml_quote_pcdata str = + let str = String.replace str ">" ">" in + str + +-let doc_to_chan chan (Doc doc) = +- fprintf chan "\n"; +- element_to_chan chan doc; +- fprintf chan "\n" ++let doc_to_buf buf (Doc doc) = ++ bprintf buf "\n"; ++ element_to_buf buf doc; ++ bprintf buf "\n" ++ ++let doc_to_string doc = ++ let buf = Buffer.create 4096 in ++ doc_to_buf buf doc; ++ Buffer.contents buf ++ ++let doc_to_chan chan doc = ++ let buf = Buffer.create 4096 in ++ doc_to_buf buf doc; ++ Buffer.output_buffer chan buf + + let path_to_nodes (Doc doc) path = + match path with +diff --git a/v2v/DOM.mli b/v2v/DOM.mli +index 1aa89b7e7..99223c389 100644 +--- a/v2v/DOM.mli ++++ b/v2v/DOM.mli +@@ -60,6 +60,9 @@ v} + v} + *) + ++val doc_to_string : doc -> string ++(** Convert a document to a string representation. *) ++ + val doc_to_chan : out_channel -> doc -> unit + (** Write the XML document to an output channel. *) + +-- +2.20.1 + diff --git a/SOURCES/0007-v2v-Add-op-output-password-file-option.patch b/SOURCES/0007-v2v-Add-op-output-password-file-option.patch new file mode 100644 index 0000000..cf6f959 --- /dev/null +++ b/SOURCES/0007-v2v-Add-op-output-password-file-option.patch @@ -0,0 +1,138 @@ +From ae2d0a507af53563d0b70d28654c9c60a857fd10 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 22 Feb 2018 11:43:33 +0000 +Subject: [PATCH] v2v: Add -op (output password file) option. + +Currently unused, in a future commit this will allow you to pass in a +password to be used when connecting to the target hypervisor. + +(cherry picked from commit a4e181137a38f5767dd1bf05dc482959cb7283be) +--- + v2v/cmdline.ml | 18 ++++++++++++++++++ + v2v/test-v2v-docs.sh | 2 +- + v2v/virt-v2v.pod | 7 +++++++ + 3 files changed, 26 insertions(+), 1 deletion(-) + +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index 75909ee77..2a067741e 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -62,6 +62,7 @@ let parse_cmdline () = + let output_conn = ref None in + let output_format = ref None in + let output_name = ref None in ++ let output_password = ref None in + let output_storage = ref None in + let password_file = ref None in + let vddk_config = ref None in +@@ -219,6 +220,8 @@ let parse_cmdline () = + s_"Set output format"; + [ M"on" ], Getopt.String ("name", set_string_option_once "-on" output_name), + s_"Rename guest when converting"; ++ [ M"op" ], Getopt.String ("filename", set_string_option_once "-op" output_password), ++ s_"Use password from file to connect to output hypervisor"; + [ M"os" ], Getopt.String ("storage", set_string_option_once "-os" output_storage), + s_"Set output storage location"; + [ L"password-file" ], Getopt.String ("file", set_string_option_once "--password-file" password_file), +@@ -314,6 +317,7 @@ read the man page virt-v2v(1). + let output_format = !output_format in + let output_mode = !output_mode in + let output_name = !output_name in ++ let output_password = !output_password in + let output_storage = !output_storage in + let password_file = !password_file in + let print_source = !print_source in +@@ -461,6 +465,8 @@ read the man page virt-v2v(1). + | `Glance -> + if output_conn <> None then + error_option_cannot_be_used_in_output_mode "glance" "-oc"; ++ if output_password <> None then ++ error_option_cannot_be_used_in_output_mode "glance" "-op"; + if output_storage <> None then + error_option_cannot_be_used_in_output_mode "glance" "-os"; + if qemu_boot then +@@ -472,6 +478,8 @@ read the man page virt-v2v(1). + + | `Not_set + | `Libvirt -> ++ if output_password <> None then ++ error_option_cannot_be_used_in_output_mode "libvirt" "-op"; + let output_storage = Option.default "default" output_storage in + if qemu_boot then + error_option_cannot_be_used_in_output_mode "libvirt" "--qemu-boot"; +@@ -481,6 +489,8 @@ read the man page virt-v2v(1). + output_format, output_alloc + + | `Local -> ++ if output_password <> None then ++ error_option_cannot_be_used_in_output_mode "local" "-op"; + let os = + match output_storage with + | None -> +@@ -500,6 +510,8 @@ read the man page virt-v2v(1). + error_option_cannot_be_used_in_output_mode "null" "-oc"; + if output_format <> None then + error_option_cannot_be_used_in_output_mode "null" "-of"; ++ if output_password <> None then ++ error_option_cannot_be_used_in_output_mode "null" "-op"; + if output_storage <> None then + error_option_cannot_be_used_in_output_mode "null" "-os"; + if qemu_boot then +@@ -509,6 +521,8 @@ read the man page virt-v2v(1). + Some "raw", Sparse + + | `QEmu -> ++ if output_password <> None then ++ error_option_cannot_be_used_in_output_mode "qemu" "-op"; + let os = + match output_storage with + | None -> +@@ -520,6 +534,8 @@ read the man page virt-v2v(1). + output_format, output_alloc + + | `RHV -> ++ if output_password <> None then ++ error_option_cannot_be_used_in_output_mode "rhv" "-op"; + let os = + match output_storage with + | None -> +@@ -531,6 +547,8 @@ read the man page virt-v2v(1). + output_format, output_alloc + + | `VDSM -> ++ if output_password <> None then ++ error_option_cannot_be_used_in_output_mode "vdsm" "-op"; + let os = + match output_storage with + | None -> +diff --git a/v2v/test-v2v-docs.sh b/v2v/test-v2v-docs.sh +index 5d034c465..0e3bd916a 100755 +--- a/v2v/test-v2v-docs.sh ++++ b/v2v/test-v2v-docs.sh +@@ -22,4 +22,4 @@ $TEST_FUNCTIONS + skip_if_skipped + + $top_srcdir/podcheck.pl virt-v2v.pod virt-v2v \ +- --ignore=--debug-overlay,--ic,--if,--it,--no-trim,--oa,--oc,--of,--on,--os,--vmtype ++ --ignore=--debug-overlay,--ic,--if,--it,--no-trim,--oa,--oc,--of,--on,--op,--os,--vmtype +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 0ea5fa97f..00ba45555 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -569,6 +569,13 @@ If not specified, then the input format is used. + Rename the guest when converting it. If this option is not used then + the output name is the same as the input name. + ++=item B<-op> file ++ ++Supply a file containing a password to be used when connecting to the ++target hypervisor. Note the file should contain the whole password, ++B, and for security the file should have ++mode C<0600> so that others cannot read it. ++ + =item B<-os> storage + + The location of the storage for the converted guest. +-- +2.20.1 + diff --git a/SOURCES/0008-v2v-cmdline-Move-definition-to-before-its-only-use.patch b/SOURCES/0008-v2v-cmdline-Move-definition-to-before-its-only-use.patch new file mode 100644 index 0000000..7de5647 --- /dev/null +++ b/SOURCES/0008-v2v-cmdline-Move-definition-to-before-its-only-use.patch @@ -0,0 +1,35 @@ +From 311d8dff12b8079b7eb9d6d2d917a9c6883928a4 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 22 Mar 2018 10:28:36 +0000 +Subject: [PATCH] v2v: cmdline: Move definition to before its only use. + +(cherry picked from commit 3167ce1f91667de4c4fe1885bb33c06ee6fa38c5) +--- + v2v/cmdline.ml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index 2a067741e..a83fcbae0 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -81,7 +81,6 @@ let parse_cmdline () = + let set_vdsm_compat s = vdsm_compat := s in + + let vdsm_ovf_flavour = ref Create_ovf.RHVExportStorageDomain in +- let ovf_flavours_str = String.concat "|" Create_ovf.ovf_flavours in + let set_vdsm_ovf_flavour arg = + vdsm_ovf_flavour := Create_ovf.ovf_flavour_of_string arg in + +@@ -183,7 +182,8 @@ let parse_cmdline () = + let i_options = + String.concat "|" (Modules_list.input_modules ()) + and o_options = +- String.concat "|" (Modules_list.output_modules ()) in ++ String.concat "|" (Modules_list.output_modules ()) ++ and ovf_flavours_str = String.concat "|" Create_ovf.ovf_flavours in + + let argspec = [ + [ S 'b'; L"bridge" ], Getopt.String ("in:out", add_bridge), +-- +2.20.1 + diff --git a/SOURCES/0009-v2v-Add-general-mechanism-for-input-and-output-optio.patch b/SOURCES/0009-v2v-Add-general-mechanism-for-input-and-output-optio.patch new file mode 100644 index 0000000..1a4b8dc --- /dev/null +++ b/SOURCES/0009-v2v-Add-general-mechanism-for-input-and-output-optio.patch @@ -0,0 +1,1268 @@ +From 5198d704e964fa896773d250624858e865c30082 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 22 Mar 2018 10:29:23 +0000 +Subject: [PATCH] v2v: Add general mechanism for input and output options + (-io/-oo). + +Currently we have a bunch of ad hoc options like --vddk* and --vdsm* +(and proposed to add --rhv*) to handle extra parameters for input and +output modes/transports. This complicates the command line parsing +and also the clarity of the command line (becauseit's not very obvious +which options apply to which side of the conversion). + +Replace these with a general mechanism for handling input and output +options. + +Thus (for example): + + --vddk-thumbprint=... becomes -io vddk-thumbprint=... + --vdsm-compat=0.10 -oo vdsm-compat=0.10 + +The responsibility for parsing input and output options moves into the +input and output drivers. + +This improves error checking so it's harder now for wrong flags to be +included on the command line when they don't apply to the current mode. + +The old option names are preserved for compatibility. + +(cherry picked from commit 6327e716cdd2f161bc639733f216a3a29d26ad3c) +--- + v2v/Makefile.am | 4 + + v2v/cmdline.ml | 229 ++++++++++++++------------- + v2v/input_libvirt.ml | 4 +- + v2v/input_libvirt.mli | 4 +- + v2v/input_libvirt_vddk.ml | 112 +++++++++----- + v2v/input_libvirt_vddk.mli | 16 +- + v2v/output_vdsm.ml | 79 +++++++++- + v2v/output_vdsm.mli | 13 +- + v2v/test-v2v-docs.sh | 31 +++- + v2v/test-v2v-it-vddk-io-query.sh | 38 +++++ + v2v/test-v2v-o-vdsm-oo-query.sh | 38 +++++ + v2v/test-v2v-o-vdsm-options.sh | 16 +- + v2v/virt-v2v.pod | 258 ++++++++++++++++--------------- + 13 files changed, 530 insertions(+), 312 deletions(-) + create mode 100755 v2v/test-v2v-it-vddk-io-query.sh + create mode 100755 v2v/test-v2v-o-vdsm-oo-query.sh + +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index 0c3224b24..482ba58e5 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -307,6 +307,8 @@ TESTS = \ + test-v2v-i-ova-tar.sh \ + test-v2v-i-ova-two-disks.sh \ + test-v2v-i-vmx.sh \ ++ test-v2v-it-vddk-io-query.sh \ ++ test-v2v-o-vdsm-oo-query.sh \ + test-v2v-bad-networks-and-bridges.sh + + if HAVE_LIBVIRT +@@ -470,6 +472,7 @@ EXTRA_DIST += \ + test-v2v-i-vmx-4.vmx \ + test-v2v-i-vmx-5.vmx \ + test-v2v-in-place.sh \ ++ test-v2v-it-vddk-io-query.sh \ + test-v2v-machine-readable.sh \ + test-v2v-networks-and-bridges-expected.xml \ + test-v2v-networks-and-bridges.sh \ +@@ -480,6 +483,7 @@ EXTRA_DIST += \ + test-v2v-o-null.sh \ + test-v2v-o-qemu.sh \ + test-v2v-o-rhv.sh \ ++ test-v2v-o-vdsm-oo-query.sh \ + test-v2v-o-vdsm-options.sh \ + test-v2v-oa-option.sh \ + test-v2v-of-option.sh \ +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index a83fcbae0..5b8f686a8 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -65,24 +65,6 @@ let parse_cmdline () = + let output_password = ref None in + let output_storage = ref None in + let password_file = ref None in +- let vddk_config = ref None in +- let vddk_cookie = ref None in +- let vddk_libdir = ref None in +- let vddk_nfchostport = ref None in +- let vddk_port = ref None in +- let vddk_snapshot = ref None in +- let vddk_thumbprint = ref None in +- let vddk_transports = ref None in +- let vddk_vimapiver = ref None in +- let vdsm_vm_uuid = ref None in +- let vdsm_ovf_output = ref None in (* default "." *) +- +- let vdsm_compat = ref "0.10" in +- let set_vdsm_compat s = vdsm_compat := s in +- +- let vdsm_ovf_flavour = ref Create_ovf.RHVExportStorageDomain in +- let set_vdsm_ovf_flavour arg = +- vdsm_ovf_flavour := Create_ovf.ovf_flavour_of_string arg in + + let set_string_option_once optname optref arg = + match !optref with +@@ -106,6 +88,15 @@ let parse_cmdline () = + error (f_"unknown -i option: %s") s + in + ++ let input_options = ref [] in ++ let set_input_option_compat k v = ++ input_options := (k, v) :: !input_options ++ in ++ let set_input_option option = ++ let k, v = String.split "=" option in ++ set_input_option_compat k v ++ in ++ + let network_map = ref NetworkMap.empty in + let add_network, add_bridge = + let add flag name t str = +@@ -159,6 +150,15 @@ let parse_cmdline () = + error (f_"unknown -oa option: %s") s + in + ++ let output_options = ref [] in ++ let set_output_option_compat k v = ++ output_options := (k, v) :: !output_options ++ in ++ let set_output_option option = ++ let k, v = String.split "=" option in ++ set_output_option_compat k v ++ in ++ + let root_choice = ref AskRoot in + let set_root_choice = function + | "ask" -> root_choice := AskRoot +@@ -169,12 +169,6 @@ let parse_cmdline () = + error (f_"unknown --root option: %s") s + in + +- let vdsm_image_uuids = ref [] in +- let add_vdsm_image_uuid s = List.push_front s vdsm_image_uuids in +- +- let vdsm_vol_uuids = ref [] in +- let add_vdsm_vol_uuid s = List.push_front s vdsm_vol_uuids in +- + let vmtype_warning _ = + warning (f_"the --vmtype option has been removed and now does nothing") + in +@@ -198,6 +192,8 @@ let parse_cmdline () = + s_"Libvirt URI"; + [ M"if" ], Getopt.String ("format", set_string_option_once "-if" input_format), + s_"Input format (for -i disk)"; ++ [ M"io" ], Getopt.String ("option[=value]", set_input_option), ++ s_"Set option for input mode"; + [ M"it" ], Getopt.String ("transport", set_string_option_once "-it" input_transport), + s_"Input transport"; + [ L"in-place" ], Getopt.Set in_place, +@@ -220,6 +216,8 @@ let parse_cmdline () = + s_"Set output format"; + [ M"on" ], Getopt.String ("name", set_string_option_once "-on" output_name), + s_"Rename guest when converting"; ++ [ M"oo" ], Getopt.String ("option[=value]", set_output_option), ++ s_"Set option for output mode"; + [ M"op" ], Getopt.String ("filename", set_string_option_once "-op" output_password), + s_"Use password from file to connect to output hypervisor"; + [ M"os" ], Getopt.String ("storage", set_string_option_once "-os" output_storage), +@@ -231,36 +229,36 @@ let parse_cmdline () = + [ L"qemu-boot" ], Getopt.Set qemu_boot, s_"Boot in qemu (-o qemu only)"; + [ L"root" ], Getopt.String ("ask|... ", set_root_choice), + s_"How to choose root filesystem"; +- [ L"vddk-config" ], Getopt.String ("filename", set_string_option_once "--vddk-config" vddk_config), +- s_"Set VDDK config file"; +- [ L"vddk-cookie" ], Getopt.String ("cookie", set_string_option_once "--vddk-cookie" vddk_cookie), +- s_"Set VDDK cookie"; +- [ L"vddk-libdir" ], Getopt.String ("libdir", set_string_option_once "--vddk-libdir" vddk_libdir), +- s_"Set VDDK library parent directory"; +- [ L"vddk-nfchostport" ], Getopt.String ("nfchostport", set_string_option_once "--vddk-nfchostport" vddk_nfchostport), +- s_"Set VDDK nfchostport"; +- [ L"vddk-port" ], Getopt.String ("port", set_string_option_once "--vddk-port" vddk_port), +- s_"Set VDDK port"; +- [ L"vddk-snapshot" ], Getopt.String ("snapshot-moref", set_string_option_once "--vddk-snapshot" vddk_snapshot), +- s_"Set VDDK snapshot"; +- [ L"vddk-thumbprint" ], Getopt.String ("thumbprint", set_string_option_once "--vddk-thumbprint" vddk_thumbprint), +- s_"Set VDDK thumbprint"; +- [ L"vddk-transports" ], Getopt.String ("transports", set_string_option_once "--vddk-transports" vddk_transports), +- s_"Set VDDK transports"; +- [ L"vddk-vimapiver" ], Getopt.String ("apiver", set_string_option_once "--vddk-vimapiver" vddk_vimapiver), +- s_"Set VDDK vimapiver"; +- [ L"vdsm-compat" ], Getopt.Symbol ("0.10|1.1", ["0.10"; "1.1"], set_vdsm_compat), +- s_"Write qcow2 with compat=0.10|1.1"; +- [ L"vdsm-image-uuid" ], Getopt.String ("uuid", add_vdsm_image_uuid), +- s_"Output image UUID(s)"; +- [ L"vdsm-vol-uuid" ], Getopt.String ("uuid", add_vdsm_vol_uuid), +- s_"Output vol UUID(s)"; +- [ L"vdsm-vm-uuid" ], Getopt.String ("uuid", set_string_option_once "--vdsm-vm-uuid" vdsm_vm_uuid), +- s_"Output VM UUID"; +- [ L"vdsm-ovf-output" ], Getopt.String ("-", set_string_option_once "--vdsm-ovf-output" vdsm_ovf_output), +- s_"Output OVF file"; +- [ L"vdsm-ovf-flavour" ], Getopt.Symbol (ovf_flavours_str, Create_ovf.ovf_flavours, set_vdsm_ovf_flavour), +- s_"Set the type of generated OVF (default rhvexp)"; ++ [ L"vddk-config" ], Getopt.String ("filename", set_input_option_compat "vddk-config"), ++ s_"Same as ‘-io vddk-config=filename’"; ++ [ L"vddk-cookie" ], Getopt.String ("cookie", set_input_option_compat "vddk-cookie"), ++ s_"Same as ‘-io vddk-cookie=filename’"; ++ [ L"vddk-libdir" ], Getopt.String ("libdir", set_input_option_compat "vddk-libdir"), ++ s_"Same as ‘-io vddk-libdir=libdir’"; ++ [ L"vddk-nfchostport" ], Getopt.String ("nfchostport", set_input_option_compat "vddk-nfchostport"), ++ s_"Same as ‘-io vddk-nfchostport=nfchostport’"; ++ [ L"vddk-port" ], Getopt.String ("port", set_input_option_compat "vddk-port"), ++ s_"Same as ‘-io vddk-port=port’"; ++ [ L"vddk-snapshot" ], Getopt.String ("snapshot-moref", set_input_option_compat "vddk-snapshot"), ++ s_"Same as ‘-io vddk-snapshot=snapshot-moref’"; ++ [ L"vddk-thumbprint" ], Getopt.String ("thumbprint", set_input_option_compat "vddk-thumbprint"), ++ s_"Same as ‘-io vddk-thumbprint=thumbprint’"; ++ [ L"vddk-transports" ], Getopt.String ("transports", set_input_option_compat "vddk-transports"), ++ s_"Same as ‘-io vddk-transports=transports’"; ++ [ L"vddk-vimapiver" ], Getopt.String ("apiver", set_input_option_compat "vddk-vimapiver"), ++ s_"Same as ‘-io vddk-vimapiver=apiver’"; ++ [ L"vdsm-compat" ], Getopt.String ("0.10|1.1", set_output_option_compat "vdsm-compat"), ++ s_"Same as ‘-oo vdsm-compat=0.10|1.1’"; ++ [ L"vdsm-image-uuid" ], Getopt.String ("uuid", set_output_option_compat "vdsm-image-uuid"), ++ s_"Same as ‘-oo vdsm-image-uuid=uuid’"; ++ [ L"vdsm-vol-uuid" ], Getopt.String ("uuid", set_output_option_compat "vdsm-vol-uuid"), ++ s_"Same as ‘-oo vdsm-vol-uuid=uuid’"; ++ [ L"vdsm-vm-uuid" ], Getopt.String ("uuid", set_output_option_compat "vdsm-vm-uuid"), ++ s_"Same as ‘-oo vdsm-vm-uuid=uuid’"; ++ [ L"vdsm-ovf-output" ], Getopt.String ("dir", set_output_option_compat "vdsm-ovf-output"), ++ s_"Same as ‘-oo vdsm-ovf-output=dir’"; ++ [ L"vdsm-ovf-flavour" ], Getopt.String (ovf_flavours_str, set_output_option_compat "vdsm-ovf-flavour"), ++ s_"Same as ‘-oo vdsm-ovf-flavour=flavour’"; + [ L"vmtype" ], Getopt.String ("-", vmtype_warning), + s_"Ignored for backwards compatibility"; + ] in +@@ -299,6 +297,7 @@ read the man page virt-v2v(1). + let input_conn = !input_conn in + let input_format = !input_format in + let input_mode = !input_mode in ++ let input_options = List.rev !input_options in + let input_transport = + match !input_transport with + | None -> None +@@ -317,28 +316,13 @@ read the man page virt-v2v(1). + let output_format = !output_format in + let output_mode = !output_mode in + let output_name = !output_name in ++ let output_options = List.rev !output_options in + let output_password = !output_password in + let output_storage = !output_storage in + let password_file = !password_file in + let print_source = !print_source in + let qemu_boot = !qemu_boot in + let root_choice = !root_choice in +- let vddk_options = +- { Input_libvirt_vddk.vddk_config = !vddk_config; +- vddk_cookie = !vddk_cookie; +- vddk_libdir = !vddk_libdir; +- vddk_nfchostport = !vddk_nfchostport; +- vddk_port = !vddk_port; +- vddk_snapshot = !vddk_snapshot; +- vddk_thumbprint = !vddk_thumbprint; +- vddk_transports = !vddk_transports; +- vddk_vimapiver = !vddk_vimapiver } in +- let vdsm_compat = !vdsm_compat in +- let vdsm_image_uuids = List.rev !vdsm_image_uuids in +- let vdsm_vol_uuids = List.rev !vdsm_vol_uuids in +- let vdsm_vm_uuid = !vdsm_vm_uuid in +- let vdsm_ovf_output = Option.default "." !vdsm_ovf_output in +- let vdsm_ovf_flavour = !vdsm_ovf_flavour in + + (* No arguments and machine-readable mode? Print out some facts + * about what this binary supports. +@@ -352,6 +336,7 @@ read the man page virt-v2v(1). + printf "colours-option\n"; + printf "vdsm-compat-option\n"; + printf "in-place\n"; ++ printf "io/oo\n"; + List.iter (printf "input:%s\n") (Modules_list.input_modules ()); + List.iter (printf "output:%s\n") (Modules_list.output_modules ()); + List.iter (printf "convert:%s\n") (Modules_list.convert_modules ()); +@@ -359,6 +344,65 @@ read the man page virt-v2v(1). + exit 0 + ); + ++ (* Input transport affects whether some input options should or ++ * should not be used. ++ *) ++ let input_transport = ++ let is_query = input_options = ["?", ""] in ++ let no_options () = ++ if is_query then ( ++ printf (f_"No -io (input options) are supported with this input transport.\n"); ++ exit 0 ++ ) ++ else if input_options <> [] then ++ error (f_"no -io (input options) are allowed here"); ++ in ++ match input_transport with ++ | None -> no_options (); None ++ | Some `SSH -> no_options (); Some `SSH ++ | Some `VDDK -> ++ if is_query then ( ++ Input_libvirt_vddk.print_input_options (); ++ exit 0 ++ ) ++ else ( ++ let vddk_options = ++ Input_libvirt_vddk.parse_input_options input_options in ++ Some (`VDDK vddk_options) ++ ) in ++ ++ (* Output mode affects whether some output options should or ++ * should not be used. ++ *) ++ let output_mode = ++ let is_query = output_options = ["?", ""] in ++ let no_options () = ++ if is_query then ( ++ printf (f_"No -oo (output options) are supported in this output mode.\n"); ++ exit 0 ++ ) ++ else if output_options <> [] then ++ error (f_"no -oo (output options) are allowed here"); ++ in ++ match output_mode with ++ | `Not_set -> no_options (); `Not_set ++ | `Glance -> no_options (); `Glance ++ | `Libvirt -> no_options (); `Libvirt ++ | `Local -> no_options (); `Local ++ | `Null -> no_options (); `Null ++ | `RHV -> no_options (); `RHV ++ | `QEmu -> no_options (); `QEmu ++ | `VDSM -> ++ if is_query then ( ++ Output_vdsm.print_output_options (); ++ exit 0 ++ ) ++ else ( ++ let vdsm_options = ++ Output_vdsm.parse_output_options output_options in ++ `VDSM vdsm_options ++ ) in ++ + (* Parse out the password from the password file. *) + let password = + match password_file with +@@ -367,27 +411,6 @@ read the man page virt-v2v(1). + let password = read_first_line_from_file filename in + Some password in + +- (* Input transport affects whether some parameters should or +- * should not be used. +- *) +- (match input_transport with +- | None +- | Some `SSH -> +- if !vddk_config <> None || +- !vddk_cookie <> None || +- !vddk_libdir <> None || +- !vddk_nfchostport <> None || +- !vddk_port <> None || +- !vddk_snapshot <> None || +- !vddk_thumbprint <> None || +- !vddk_transports <> None || +- !vddk_vimapiver <> None then +- error (f_"‘--vddk-*’ options should only be used when conversion via the nbdkit VDDK plugin has been enabled, ie. using ‘-it vddk’.") +- | Some `VDDK -> +- if !vddk_thumbprint = None then +- error (f_"‘--vddk-thumbprint’ is required when using ‘-it vddk’.") +- ); +- + (* Parsing of the argument(s) depends on the input mode. *) + let input = + match input_mode with +@@ -413,11 +436,10 @@ read the man page virt-v2v(1). + let input_transport = + match input_transport with + | None -> None +- | Some `VDDK -> Some `VDDK ++ | (Some (`VDDK _) as vddk) -> vddk + | Some `SSH -> + error (f_"only ‘-it vddk’ can be used here") in +- Input_libvirt.input_libvirt vddk_options password +- input_conn input_transport guest ++ Input_libvirt.input_libvirt password input_conn input_transport guest + + | `LibvirtXML -> + (* -i libvirtxml: Expecting a filename (XML file). *) +@@ -448,7 +470,7 @@ read the man page virt-v2v(1). + match input_transport with + | None -> None + | Some `SSH -> Some `SSH +- | Some `VDDK -> ++ | Some (`VDDK _) -> + error (f_"only ‘-it ssh’ can be used here") in + Input_vmx.input_vmx input_transport arg in + +@@ -546,7 +568,7 @@ read the man page virt-v2v(1). + Output_rhv.output_rhv os output_alloc, + output_format, output_alloc + +- | `VDSM -> ++ | `VDSM vdsm_options -> + if output_password <> None then + error_option_cannot_be_used_in_output_mode "vdsm" "-op"; + let os = +@@ -556,21 +578,6 @@ read the man page virt-v2v(1). + | Some d -> d in + if qemu_boot then + error_option_cannot_be_used_in_output_mode "vdsm" "--qemu-boot"; +- let vdsm_vm_uuid = +- match vdsm_vm_uuid with +- | None -> +- error (f_"-o vdsm: --vdsm-image-uuid was not specified") +- | Some s -> s in +- if vdsm_image_uuids = [] || vdsm_vol_uuids = [] then +- error (f_"-o vdsm: either --vdsm-vol-uuid or --vdsm-vm-uuid was not specified"); +- let vdsm_options = { +- Output_vdsm.image_uuids = vdsm_image_uuids; +- vol_uuids = vdsm_vol_uuids; +- vm_uuid = vdsm_vm_uuid; +- ovf_output = vdsm_ovf_output; +- compat = vdsm_compat; +- ovf_flavour = vdsm_ovf_flavour; +- } in + Output_vdsm.output_vdsm os vdsm_options output_alloc, + output_format, output_alloc in + +diff --git a/v2v/input_libvirt.ml b/v2v/input_libvirt.ml +index 25c81b924..377257dc2 100644 +--- a/v2v/input_libvirt.ml ++++ b/v2v/input_libvirt.ml +@@ -27,7 +27,7 @@ open Types + open Utils + + (* Choose the right subclass based on the URI. *) +-let input_libvirt vddk_options password libvirt_uri input_transport guest = ++let input_libvirt password libvirt_uri input_transport guest = + match libvirt_uri with + | None -> + Input_libvirt_other.input_libvirt_other password libvirt_uri guest +@@ -53,7 +53,7 @@ let input_libvirt vddk_options password libvirt_uri input_transport guest = + password libvirt_uri parsed_uri server guest + + (* vCenter or ESXi using nbdkit vddk plugin *) +- | Some server, Some ("esx"|"gsx"|"vpx"), Some `VDDK -> ++ | Some server, Some ("esx"|"gsx"|"vpx"), Some (`VDDK vddk_options) -> + Input_libvirt_vddk.input_libvirt_vddk vddk_options password + libvirt_uri parsed_uri guest + +diff --git a/v2v/input_libvirt.mli b/v2v/input_libvirt.mli +index 6f9162482..08824bb67 100644 +--- a/v2v/input_libvirt.mli ++++ b/v2v/input_libvirt.mli +@@ -18,7 +18,7 @@ + + (** [-i libvirt] source. *) + +-val input_libvirt : Input_libvirt_vddk.vddk_options -> string option -> string option -> [`VDDK] option -> string -> Types.input +-(** [input_libvirt vddk_options password libvirt_uri input_transport guest] ++val input_libvirt : string option -> string option -> [`VDDK of Input_libvirt_vddk.vddk_options] option -> string -> Types.input ++(** [input_libvirt password libvirt_uri input_transport guest] + creates and returns a new {!Types.input} object specialized for reading + input from libvirt sources. *) +diff --git a/v2v/input_libvirt_vddk.ml b/v2v/input_libvirt_vddk.ml +index a53f3e71d..0b3ed7af9 100644 +--- a/v2v/input_libvirt_vddk.ml ++++ b/v2v/input_libvirt_vddk.ml +@@ -33,22 +33,73 @@ open Xpath_helpers + + open Printf + +-type vddk_options = { +- vddk_config : string option; +- vddk_cookie : string option; +- vddk_libdir : string option; +- vddk_nfchostport : string option; +- vddk_port : string option; +- vddk_snapshot : string option; +- vddk_thumbprint : string option; +- vddk_transports : string option; +- vddk_vimapiver : string option; +-} ++type vddk_options = (string * string) list ++ ++(* List of vddk-* input options. *) ++let vddk_option_keys = ++ [ "config"; ++ "cookie"; ++ "libdir"; ++ "nfchostport"; ++ "port"; ++ "snapshot"; ++ "thumbprint"; ++ "transports"; ++ "vimapiver" ] ++ ++let print_input_options () = ++ printf (f_"Input options (-io) which can be used with -it vddk: ++ ++ -io vddk-thumbprint=xx:xx:xx:... ++ VDDK server thumbprint (required) ++ ++All other settings are optional: ++ ++ -io vddk-config=FILE VDDK configuration file ++ -io vddk-cookie=COOKIE VDDK cookie ++ -io vddk-libdir=LIBDIR VDDK library parent directory ++ -io vddk-nfchostport=PORT VDDK nfchostport ++ -io vddk-port=PORT VDDK port ++ -io vddk-snapshot=SNAPSHOT-MOREF ++ VDDK snapshot moref ++ -io vddk-transports=MODE:MODE:.. ++ VDDK transports ++ -io vddk-vimapiver=APIVER VDDK vimapiver ++ ++Refer to nbdkit-vddk-plugin(1) and the VDDK documentation for further ++information on these settings. ++") ++ ++let parse_input_options options = ++ (* Check there are no options we don't understand. Also removes ++ * the "vddk-" prefix from the internal list. ++ *) ++ let options = ++ List.map ( ++ fun (key, value) -> ++ let error_invalid_key () = ++ error (f_"-it vddk: ‘-io %s’ is not a valid input option") key ++ in ++ if not (String.is_prefix key "vddk-") then error_invalid_key (); ++ let key = String.sub key 5 (String.length key-5) in ++ if not (List.mem key vddk_option_keys) then error_invalid_key (); ++ ++ (key, value) ++ ) options in ++ ++ (* Check no option appears twice. *) ++ let keys = List.map fst options in ++ if List.length keys <> List.length (List.sort_uniq keys) then ++ error (f_"-it vddk: duplicate -io options on the command line"); ++ ++ options + + (* Subclass specialized for handling VMware via nbdkit vddk plugin. *) + class input_libvirt_vddk vddk_options password libvirt_uri parsed_uri guest = + (* The VDDK path. *) +- let libdir = vddk_options.vddk_libdir in ++ let libdir = ++ try Some (List.assoc "libdir" vddk_options) ++ with Not_found -> None in + + (* VDDK libraries are located under lib32/ or lib64/ relative to the + * libdir. Note this is unrelated to Linux multilib or multiarch. +@@ -68,7 +119,7 @@ class input_libvirt_vddk vddk_options password libvirt_uri parsed_uri guest = + | None -> () + | Some libdir -> + if not (is_directory libdir) then +- error (f_"‘--vddk-libdir %s’ does not point to a directory. See \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") libdir ++ error (f_"‘-io vddk-libdir=%s’ does not point to a directory. See \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") libdir + ); + + (match library_path with +@@ -122,15 +173,15 @@ See also \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") + else + error (f_"nbdkit VDDK plugin is not installed or not working. It is required if you want to use VDDK. + +-It looks like you did not set the right path in the ‘--vddk-libdir’ option, or your copy of the VDDK directory is incomplete. There should be a library called ’/%s/libvixDiskLib.so.?’. ++It looks like you did not set the right path in the ‘-io vddk-libdir’ option, or your copy of the VDDK directory is incomplete. There should be a library called ’/%s/libvixDiskLib.so.?’. + + See also \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") libNN + ) + in + + let error_unless_thumbprint () = +- if vddk_options.vddk_thumbprint = None then +- error (f_"You must pass the ‘--vddk-thumbprint’ option with the SSL thumbprint of the VMware server. To find the thumbprint, see the nbdkit-vddk-plugin(1) manual. See also \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") ++ if not (List.mem_assoc "thumbprint" vddk_options) then ++ error (f_"You must pass the ‘-io vddk-thumbprint’ option with the SSL thumbprint of the VMware server. To find the thumbprint, see the nbdkit-vddk-plugin(1) manual. See also \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") + in + + (* Check that nbdkit was compiled with SELinux support (for the +@@ -147,18 +198,6 @@ See also \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") libNN + error (f_"nbdkit was compiled without SELinux support. You will have to recompile nbdkit with libselinux-devel installed, or else set SELinux to Permissive mode while doing the conversion.") + in + +- (* List of passthrough parameters. *) +- let vddk_passthrus = +- [ "config", (fun { vddk_config } -> vddk_config); +- "cookie", (fun { vddk_cookie } -> vddk_cookie); +- "libdir", (fun { vddk_libdir } -> vddk_libdir); +- "nfchostport", (fun { vddk_nfchostport } -> vddk_nfchostport); +- "port", (fun { vddk_port } -> vddk_port); +- "snapshot", (fun { vddk_snapshot } -> vddk_snapshot); +- "thumbprint", (fun { vddk_thumbprint } -> vddk_thumbprint); +- "transports", (fun { vddk_transports } -> vddk_transports); +- "vimapiver", (fun { vddk_vimapiver } -> vddk_vimapiver) ] in +- + object + inherit input_libvirt password libvirt_uri guest as super + +@@ -172,14 +211,9 @@ object + + method as_options = + let pt_options = +- String.concat "" ( +- List.map ( +- fun (name, get_field) -> +- match get_field vddk_options with +- | None -> "" +- | Some field -> sprintf " --vddk-%s %s" name field +- ) vddk_passthrus +- ) in ++ String.concat "" ++ (List.map (fun (k, v) -> ++ sprintf " -io vddk-%s=%s" k v) vddk_options) in + sprintf "%s -it vddk %s" + super#as_options (* superclass prints "-i libvirt etc" *) + pt_options +@@ -284,11 +318,7 @@ object + add_arg (sprintf "vm=moref=%s" moref); + + (* The passthrough parameters. *) +- List.iter ( +- fun (name, get_field) -> +- Option.may (fun field -> add_arg (sprintf "%s=%s" name field)) +- (get_field vddk_options) +- ) vddk_passthrus; ++ List.iter (fun (k, v) -> add_arg (sprintf "%s=%s" k v)) vddk_options; + + get_args () in + +diff --git a/v2v/input_libvirt_vddk.mli b/v2v/input_libvirt_vddk.mli +index c8606c72a..1cebba506 100644 +--- a/v2v/input_libvirt_vddk.mli ++++ b/v2v/input_libvirt_vddk.mli +@@ -18,19 +18,13 @@ + + (** [-i libvirt] when the source is VMware via nbdkit vddk plugin *) + +-type vddk_options = { +- vddk_config : string option; +- vddk_cookie : string option; +- vddk_libdir : string option; +- vddk_nfchostport : string option; +- vddk_port : string option; +- vddk_snapshot : string option; +- vddk_thumbprint : string option; +- vddk_transports : string option; +- vddk_vimapiver : string option; +-} ++type vddk_options + (** Various options passed through to the nbdkit vddk plugin unmodified. *) + ++val print_input_options : unit -> unit ++val parse_input_options : (string * string) list -> vddk_options ++(** Print and parse vddk -io options. *) ++ + val input_libvirt_vddk : vddk_options -> string option -> string option -> Xml.uri -> string -> Types.input + (** [input_libvirt_vddk vddk_options password libvirt_uri parsed_uri guest] + creates and returns a {!Types.input} object specialized for reading +diff --git a/v2v/output_vdsm.ml b/v2v/output_vdsm.ml +index b76a2e930..92b3fd122 100644 +--- a/v2v/output_vdsm.ml ++++ b/v2v/output_vdsm.ml +@@ -35,23 +35,90 @@ type vdsm_options = { + ovf_flavour : Create_ovf.ovf_flavour; + } + ++let ovf_flavours_str = String.concat "|" Create_ovf.ovf_flavours ++ ++let print_output_options () = ++ printf (f_"Output options (-oo) which can be used with -o vdsm: ++ ++ -oo vdsm-compat=0.10|1.1 Write qcow2 with compat=0.10|1.1 ++ (default: 0.10) ++ -oo vdsm-vm-uuid=UUID VM UUID (required) ++ -oo vdsm-ovf-output=DIR OVF metadata directory (required) ++ -oo vdsm-ovf-flavour=%s ++ Set the type of generated OVF (default: rhvexp) ++ ++For each disk you must supply one of each of these options: ++ ++ -oo vdsm-image-uuid=UUID Image directory UUID ++ -oo vdsm-vol-uuid=UUID Disk volume UUID ++") ovf_flavours_str ++ ++let parse_output_options options = ++ let vm_uuid = ref None in ++ let ovf_output = ref None in (* default "." *) ++ let compat = ref "0.10" in ++ let ovf_flavour = ref Create_ovf.RHVExportStorageDomain in ++ let image_uuids = ref [] in ++ let vol_uuids = ref [] in ++ ++ List.iter ( ++ function ++ | "vdsm-compat", "0.10" -> compat := "0.10" ++ | "vdsm-compat", "1.1" -> compat := "1.1" ++ | "vdsm-compat", v -> ++ error (f_"-o vdsm: unknown vdsm-compat level ‘%s’") v ++ | "vdsm-vm-uuid", v -> ++ if !vm_uuid <> None then ++ error (f_"-o vdsm: -oo vdsm-vm-uuid set twice"); ++ vm_uuid := Some v; ++ | "vdsm-ovf-output", v -> ++ if !ovf_output <> None then ++ error (f_"-o vdsm: -oo vdsm-ovf-output set twice"); ++ ovf_output := Some v; ++ | "vdsm-ovf-flavour", v -> ++ ovf_flavour := Create_ovf.ovf_flavour_of_string v ++ | "vdsm-image-uuid", v -> ++ List.push_front v image_uuids ++ | "vdsm-vol-uuid", v -> ++ List.push_front v vol_uuids ++ | k, _ -> ++ error (f_"-o vdsm: unknown output option ‘-oo %s’") k ++ ) options; ++ ++ let compat = !compat in ++ let image_uuids = List.rev !image_uuids in ++ let vol_uuids = List.rev !vol_uuids in ++ if image_uuids = [] || vol_uuids = [] then ++ error (f_"-o vdsm: either -oo vdsm-vol-uuid or -oo vdsm-vm-uuid was not specified"); ++ let vm_uuid = ++ match !vm_uuid with ++ | None -> ++ error (f_"-o vdsm: -oo vdsm-image-uuid was not specified") ++ | Some uuid -> uuid in ++ let ovf_output = Option.default "." !ovf_output in ++ let ovf_flavour = !ovf_flavour in ++ ++ { image_uuids; vol_uuids; vm_uuid; ovf_output; compat; ovf_flavour } ++ + class output_vdsm os vdsm_options output_alloc = + object + inherit output + + method as_options = +- sprintf "-o vdsm -os %s%s%s --vdsm-vm-uuid %s --vdsm-ovf-output %s%s%s" os ++ sprintf "-o vdsm -os %s%s%s -oo vdsm-vm-uuid=%s -oo vdsm-ovf-output=%s%s%s" os + (String.concat "" +- (List.map (sprintf " --vdsm-image-uuid %s") vdsm_options.image_uuids)) ++ (List.map (sprintf " -oo vdsm-image-uuid=%s") ++ vdsm_options.image_uuids)) + (String.concat "" +- (List.map (sprintf " --vdsm-vol-uuid %s") vdsm_options.vol_uuids)) ++ (List.map (sprintf " -oo vdsm-vol-uuid=%s") ++ vdsm_options.vol_uuids)) + vdsm_options.vm_uuid + vdsm_options.ovf_output + (match vdsm_options.compat with + | "0.10" -> "" (* currently this is the default, so don't print it *) +- | s -> sprintf " --vdsm-compat=%s" s) ++ | s -> sprintf " -oo vdsm-compat=%s" s) + (match vdsm_options.ovf_flavour with +- | Create_ovf.OVirt -> "--vdsm-ovf-flavour=ovf" ++ | Create_ovf.OVirt -> "-oo vdsm-ovf-flavour=ovf" + (* currently this is the default, so don't print it *) + | Create_ovf.RHVExportStorageDomain -> "") + +@@ -84,7 +151,7 @@ object + method prepare_targets _ targets = + if List.length vdsm_options.image_uuids <> List.length targets || + List.length vdsm_options.vol_uuids <> List.length targets then +- error (f_"the number of ‘--vdsm-image-uuid’ and ‘--vdsm-vol-uuid’ parameters passed on the command line has to match the number of guest disk images (for this guest: %d)") ++ error (f_"the number of ‘-oo vdsm-image-uuid’ and ‘-oo vdsm-vol-uuid’ parameters passed on the command line has to match the number of guest disk images (for this guest: %d)") + (List.length targets); + + let mp, uuid = +diff --git a/v2v/output_vdsm.mli b/v2v/output_vdsm.mli +index 6ed684638..36f327900 100644 +--- a/v2v/output_vdsm.mli ++++ b/v2v/output_vdsm.mli +@@ -18,16 +18,13 @@ + + (** [-o vdsm] target. *) + +-type vdsm_options = { +- image_uuids : string list; (* --vdsm-image-uuid (multiple) *) +- vol_uuids : string list; (* --vdsm-vol-uuid (multiple) *) +- vm_uuid : string; (* --vdsm-vm-uuid *) +- ovf_output : string; (* --vdsm-ovf-output *) +- compat : string; (* --vdsm-compat=0.10|1.1 *) +- ovf_flavour : Create_ovf.ovf_flavour; +-} ++type vdsm_options + (** Miscellaneous extra command line parameters used by VDSM. *) + ++val print_output_options : unit -> unit ++val parse_output_options : (string * string) list -> vdsm_options ++(** Print and parse vdsm -oo options. *) ++ + val output_vdsm : string -> vdsm_options -> Types.output_allocation -> Types.output + (** [output_vdsm os vdsm_options output_alloc] creates and + returns a new {!Types.output} object specialized for writing +diff --git a/v2v/test-v2v-docs.sh b/v2v/test-v2v-docs.sh +index 0e3bd916a..e1e22b599 100755 +--- a/v2v/test-v2v-docs.sh ++++ b/v2v/test-v2v-docs.sh +@@ -22,4 +22,33 @@ $TEST_FUNCTIONS + skip_if_skipped + + $top_srcdir/podcheck.pl virt-v2v.pod virt-v2v \ +- --ignore=--debug-overlay,--ic,--if,--it,--no-trim,--oa,--oc,--of,--on,--op,--os,--vmtype ++ --ignore=\ ++--debug-overlay,\ ++--ic,\ ++--if,\ ++--io,\ ++--it,\ ++--no-trim,\ ++--oa,\ ++--oc,\ ++--of,\ ++--on,\ ++--oo,\ ++--op,\ ++--os,\ ++--vddk-config,\ ++--vddk-cookie,\ ++--vddk-libdir,\ ++--vddk-nfchostport,\ ++--vddk-port,\ ++--vddk-snapshot,\ ++--vddk-thumbprint,\ ++--vddk-transports,\ ++--vddk-vimapiver,\ ++--vdsm-compat,\ ++--vdsm-image-uuid,\ ++--vdsm-ovf-flavour,\ ++--vdsm-ovf-output,\ ++--vdsm-vm-uuid,\ ++--vdsm-vol-uuid,\ ++--vmtype +diff --git a/v2v/test-v2v-it-vddk-io-query.sh b/v2v/test-v2v-it-vddk-io-query.sh +new file mode 100755 +index 000000000..014e30207 +--- /dev/null ++++ b/v2v/test-v2v-it-vddk-io-query.sh +@@ -0,0 +1,38 @@ ++#!/bin/bash - ++# libguestfs virt-v2v test script ++# Copyright (C) 2018 Red Hat Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++# Test -io "?" option. ++ ++set -e ++ ++$TEST_FUNCTIONS ++skip_if_skipped ++ ++export VIRT_TOOLS_DATA_DIR="$top_srcdir/test-data/fake-virt-tools" ++export VIRTIO_WIN="$top_srcdir/test-data/fake-virtio-win" ++ ++f=test-v2v-it-vddk-io-query.actual ++rm -f $f ++ ++$VG virt-v2v --debug-gc \ ++ -it vddk -io "?" > $f ++ ++grep -- "-io vddk-config" $f ++grep -- "-io vddk-thumbprint" $f ++ ++rm $f +diff --git a/v2v/test-v2v-o-vdsm-oo-query.sh b/v2v/test-v2v-o-vdsm-oo-query.sh +new file mode 100755 +index 000000000..5691446ea +--- /dev/null ++++ b/v2v/test-v2v-o-vdsm-oo-query.sh +@@ -0,0 +1,38 @@ ++#!/bin/bash - ++# libguestfs virt-v2v test script ++# Copyright (C) 2018 Red Hat Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++# Test -oo "?" option. ++ ++set -e ++ ++$TEST_FUNCTIONS ++skip_if_skipped ++ ++export VIRT_TOOLS_DATA_DIR="$top_srcdir/test-data/fake-virt-tools" ++export VIRTIO_WIN="$top_srcdir/test-data/fake-virtio-win" ++ ++f=test-v2v-o-vdsm-oo-query.actual ++rm -f $f ++ ++$VG virt-v2v --debug-gc \ ++ -o vdsm -oo "?" > $f ++ ++grep -- "-oo vdsm-compat" $f ++grep -- "-oo vdsm-image-uuid" $f ++ ++rm $f +diff --git a/v2v/test-v2v-o-vdsm-options.sh b/v2v/test-v2v-o-vdsm-options.sh +index 4ad5d4aad..65ce1234e 100755 +--- a/v2v/test-v2v-o-vdsm-options.sh ++++ b/v2v/test-v2v-o-vdsm-options.sh +@@ -16,7 +16,7 @@ + # along with this program; if not, write to the Free Software + # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +-# Test -o vdsm options --vdsm-*-uuid ++# Test -o vdsm options -oo vdsm-*-uuid + + set -e + set -x +@@ -44,19 +44,19 @@ mkdir $d/12345678-1234-1234-1234-123456789abc/master + mkdir $d/12345678-1234-1234-1234-123456789abc/master/vms + mkdir $d/12345678-1234-1234-1234-123456789abc/master/vms/VM + +-# The --vdsm-*-uuid options don't actually check that the ++# The -oo vdsm-*-uuid options don't actually check that the + # parameter is a UUID, which is useful here. + + $VG virt-v2v --debug-gc \ + -i libvirt -ic "$libvirt_uri" windows \ + -o vdsm -os $d/12345678-1234-1234-1234-123456789abc \ + -of qcow2 \ +- --vdsm-image-uuid IMAGE \ +- --vdsm-vol-uuid VOL \ +- --vdsm-vm-uuid VM \ +- --vdsm-ovf-output $d/12345678-1234-1234-1234-123456789abc/master/vms/VM \ +- --vdsm-compat=1.1 \ +- --vdsm-ovf-flavour=ovirt ++ -oo vdsm-image-uuid=IMAGE \ ++ -oo vdsm-vol-uuid=VOL \ ++ -oo vdsm-vm-uuid=VM \ ++ -oo vdsm-ovf-output=$d/12345678-1234-1234-1234-123456789abc/master/vms/VM \ ++ -oo vdsm-compat=1.1 \ ++ -oo vdsm-ovf-flavour=ovirt + + # Test the OVF metadata was created. + test -f $d/12345678-1234-1234-1234-123456789abc/master/vms/VM/VM.ovf +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 00ba45555..69ca23dfd 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -397,6 +397,47 @@ See L below. + + Conflicts with all I<-o *> options. + ++=item B<-io> OPTION=VALUE ++ ++Set input option(s) related to the current input mode or transport. ++To display short help on what options are available you can use: ++ ++ virt-v2v -it vddk -io "?" ++ ++=item B<-io vddk-libdir=>LIBDIR ++ ++Set the VDDK library directory. This directory should I ++subdirectories called F, F etc., but do not include ++F actually in the parameter. ++ ++In most cases this parameter is required when using the I<-it vddk> ++(VDDK) transport. See L below for details. ++ ++=item B<-io vddk-thumbprint=>xx:xx:xx:... ++ ++Set the thumbprint of the remote VMware server. ++ ++This parameter is required when using the I<-it vddk> (VDDK) transport. ++See L below for details. ++ ++=item B<-io vddk-config=>FILENAME ++ ++=item B<-io vddk-cookie=>COOKIE ++ ++=item B<-io vddk-nfchostport=>PORT ++ ++=item B<-io vddk-port=>PORT ++ ++=item B<-io vddk-snapshot=>SNAPSHOT-MOREF ++ ++=item B<-io vddk-transports=>MODE:MODE:... ++ ++=item B<-io vddk-vimapiver=>APIVER ++ ++When using VDDK mode, these options are passed unmodified to the ++L VDDK plugin. Please refer to L. ++These are all optional. ++ + =item B<-it> B + + When using I<-i vmx>, this enables the ssh transport. +@@ -406,7 +447,7 @@ See L below. + + Use VMware VDDK as a transport to copy the input disks. See + L below. If you use this parameter then you may +-need to use other I<--vddk*> options to specify how to connect through ++need to use other I<-io vddk*> options to specify how to connect through + VDDK. + + =item B<--keys-from-stdin> +@@ -569,6 +610,95 @@ If not specified, then the input format is used. + Rename the guest when converting it. If this option is not used then + the output name is the same as the input name. + ++=item B<-oo> OPTION=VALUE ++ ++Set output option(s) related to the current output mode. ++To display short help on what options are available you can use: ++ ++ virt-v2v -o vdsm -oo "?" ++ ++=item B<-oo vdsm-compat=0.10> ++ ++=item B<-oo vdsm-compat=1.1> ++ ++If I<-o vdsm> and the output format is qcow2, then we add the qcow2 ++I option to the output file for compatibility with RHEL 6 ++(see L). ++ ++If I<-oo vdsm-compat=1.1> is used then modern qcow2 (I) ++files are generated instead. ++ ++Currently I<-oo vdsm-compat=0.10> is the default, but this will change ++to I<-oo vdsm-compat=1.1> in a future version of virt-v2v (when we can ++assume that everyone is using a modern version of qemu). ++ ++B output>. All other output ++modes (including I<-o rhv>) generate modern qcow2 I ++files, always. ++ ++If this option is available, then C will appear in ++the I<--machine-readable> output. ++ ++=item B<-oo vdsm-image-uuid=>UUID ++ ++=item B<-oo vdsm-vol-uuid=>UUID ++ ++=item B<-oo vdsm-vm-uuid=>UUID ++ ++=item B<-oo vdsm-ovf-output=>DIR ++ ++Normally the RHV output mode chooses random UUIDs for the target ++guest. However VDSM needs to control the UUIDs and passes these ++parameters when virt-v2v runs under VDSM control. The parameters ++control: ++ ++=over 4 ++ ++=item * ++ ++the image directory of each guest disk (I<-oo vdsm-image-uuid>) (this ++option is passed once for each guest disk) ++ ++=item * ++ ++UUIDs for each guest disk (I<-oo vdsm-vol-uuid>) (this option ++is passed once for each guest disk) ++ ++=item * ++ ++the OVF file name (I<-oo vdsm-vm-uuid>). ++ ++=item * ++ ++the OVF output directory (default current directory) (I<-oo vdsm-ovf-output>). ++ ++=back ++ ++The format of UUIDs is: C<12345678-1234-1234-1234-123456789abc> (each ++hex digit can be C<0-9> or C), conforming to S. ++ ++These options can only be used with I<-o vdsm>. ++ ++=item B<-oo vdsm-ovf-flavour=>flavour ++ ++This option controls the format of the OVF generated at the end of conversion. ++Currently there are two possible flavours: ++ ++=over 4 ++ ++=item rhevexp ++ ++The OVF format used in RHV export storage domain. ++ ++=item ovirt ++ ++The OVF format understood by oVirt REST API. ++ ++=back ++ ++For backward compatibility the default is I, but this may change in ++the future. ++ + =item B<-op> file + + Supply a file containing a password to be used when connecting to the +@@ -670,122 +800,6 @@ boot an operating system from the first virtio disk. Specifically, + F must be on the first virtio disk, and it cannot chainload an + OS which is not in the first virtio disk. + +-=item B<--vddk-libdir> LIBDIR +- +-Set the VDDK library directory. This directory should I +-subdirectories called F, F etc., but do not include +-F actually in the parameter. +- +-In most cases this parameter is required when using the I<-it vddk> +-(VDDK) transport. See L below for details. +- +-=item B<--vddk-thumbprint> xx:xx:xx:... +- +-Set the thumbprint of the remote VMware server. +- +-This parameter is required when using the I<-it vddk> (VDDK) transport. +-See L below for details. +- +-=item B<--vddk-config> FILENAME +- +-=item B<--vddk-cookie> COOKIE +- +-=item B<--vddk-nfchostport> PORT +- +-=item B<--vddk-port> PORT +- +-=item B<--vddk-snapshot> SNAPSHOT-MOREF +- +-=item B<--vddk-transports> MODE:MODE:... +- +-=item B<--vddk-vimapiver> APIVER +- +-When using VDDK mode, these options are passed unmodified to the +-L VDDK plugin. Please refer to L. +-These are all optional. +- +-=item B<--vdsm-compat=0.10> +- +-=item B<--vdsm-compat=1.1> +- +-If I<-o vdsm> and the output format is qcow2, then we add the qcow2 +-I option to the output file for compatibility with RHEL 6 +-(see L). +- +-If I<--vdsm-compat=1.1> is used then modern qcow2 (I) +-files are generated instead. +- +-Currently I<--vdsm-compat=0.10> is the default, but this will change +-to I<--vdsm-compat=1.1> in a future version of virt-v2v (when we can +-assume that everyone is using a modern version of qemu). +- +-B output>. All other output +-modes (including I<-o rhv>) generate modern qcow2 I +-files, always. +- +-If this option is available, then C will appear in +-the I<--machine-readable> output. +- +-=item B<--vdsm-image-uuid> UUID +- +-=item B<--vdsm-vol-uuid> UUID +- +-=item B<--vdsm-vm-uuid> UUID +- +-=item B<--vdsm-ovf-output> +- +-Normally the RHV output mode chooses random UUIDs for the target +-guest. However VDSM needs to control the UUIDs and passes these +-parameters when virt-v2v runs under VDSM control. The parameters +-control: +- +-=over 4 +- +-=item * +- +-the image directory of each guest disk (I<--vdsm-image-uuid>) (this +-option is passed once for each guest disk) +- +-=item * +- +-UUIDs for each guest disk (I<--vdsm-vol-uuid>) (this option +-is passed once for each guest disk) +- +-=item * +- +-the OVF file name (I<--vdsm-vm-uuid>). +- +-=item * +- +-the OVF output directory (default current directory) (I<--vdsm-ovf-output>). +- +-=back +- +-The format of UUIDs is: C<12345678-1234-1234-1234-123456789abc> (each +-hex digit can be C<0-9> or C), conforming to S. +- +-These options can only be used with I<-o vdsm>. +- +-=item B<--vdsm-ovf-flavour> flavour +- +-This option controls the format of the OVF generated at the end of conversion. +-Currently there are two possible flavours: +- +-=over 4 +- +-=item rhevexp +- +-The OVF format used in RHV export storage domain. +- +-=item ovirt +- +-The OVF format understood by oVirt REST API. +- +-=back +- +-For backward compatibility the default is I, but this may change in +-the future. +- + =item B<-v> + + =item B<--verbose> +@@ -1679,15 +1693,15 @@ SSL thumbprint: + $ virt-v2v \ + -ic 'vpx://root@vcenter.example.com/Datacenter/esxi?no_verify=1' \ + -it vddk \ +- --vddk-libdir /path/to/vmware-vix-disklib-distrib \ +- --vddk-thumbprint xx:xx:xx:... \ ++ -io vddk-libdir=/path/to/vmware-vix-disklib-distrib \ ++ -io vddk-thumbprint=xx:xx:xx:... \ + "Windows 2003" \ + -o local -os /var/tmp + + Other options that you might need to add in rare circumstances include +-I<--vddk-config>, I<--vddk-cookie>, I<--vddk-nfchostport>, +-I<--vddk-port>, I<--vddk-snapshot>, I<--vddk-transports> and +-I<--vddk-vimapiver>, which are all explained in the ++I<-io vddk-config>, I<-io vddk-cookie>, I<-io vddk-nfchostport>, ++I<-io vddk-port>, I<-io vddk-snapshot>, I<-io vddk-transports> and ++I<-io vddk-vimapiver>, which are all explained in the + L documentation. + + =head2 VDDK: DEBUGGING VDDK FAILURES +-- +2.20.1 + diff --git a/SOURCES/0010-v2v-OVF-write-ovirt-id-attribute-for-the-OS-in-OVirt.patch b/SOURCES/0010-v2v-OVF-write-ovirt-id-attribute-for-the-OS-in-OVirt.patch new file mode 100644 index 0000000..bb98e90 --- /dev/null +++ b/SOURCES/0010-v2v-OVF-write-ovirt-id-attribute-for-the-OS-in-OVirt.patch @@ -0,0 +1,247 @@ +From 1b4c00a3ec7c0618e8557e1e71d5782527a94828 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Wed, 4 Apr 2018 18:18:32 +0200 +Subject: [PATCH] v2v: OVF: write ovirt:id attribute for the OS in OVirt + flavour + +When writing the OVF in OVirt flavour, add a ovirt:id attribute to the +OperatingSystemSection tag: this attribute represents the numeric value +of the ostype ID, which is ignored by oVirt when parsing OVFs in API +mode. + +(cherry picked from commit 593a19cc86cfa8f24c66518c8ba21222550b066a) +--- + v2v/create_ovf.ml | 202 +++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 201 insertions(+), 1 deletion(-) + +diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml +index 0e07afea8..730ab64b4 100644 +--- a/v2v/create_ovf.ml ++++ b/v2v/create_ovf.ml +@@ -242,6 +242,203 @@ and get_ostype = function + typ distro major minor arch product; + "Unassigned" + ++(* Determine the ovirt:id attribute from libguestfs inspection. ++ * See ovirt-engine sources, file: ++ * packaging/conf/osinfo-defaults.properties ++ * and also: ++ * https://bugzilla.redhat.com/show_bug.cgi?id=1219857#c9 ++ *) ++and get_ovirt_osid = function ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 3; ++ i_arch = "i386" } -> ++ 9 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 3; ++ i_arch = "x86_64" } -> ++ 15 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 4; ++ i_arch = "i386" } -> ++ 8 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 4; ++ i_arch = "x86_64" } -> ++ 14 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 5; ++ i_arch = "i386" } -> ++ 7 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 5; ++ i_arch = "x86_64" } -> ++ 13 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 6; ++ i_arch = "i386" } -> ++ 18 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 6; ++ i_arch = "x86_64" } -> ++ 19 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 6; ++ i_minor_version = min; i_arch = ("ppc64"|"ppc64le") } when min >= 9 -> ++ 1007 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 6; ++ i_arch = ("ppc64"|"ppc64le") } -> ++ 1003 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 7; ++ i_arch = "x86_64" } -> ++ 24 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 7; ++ i_arch = ("ppc64"|"ppc64le") } -> ++ 1006 ++ ++ | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 7; ++ i_arch = "s390x" } -> ++ 2003 ++ ++ | { i_type = "linux"; i_distro = "sles"; i_major_version = maj; ++ i_arch = "x86_64" } when maj >= 11 -> ++ 1193 ++ ++ | { i_type = "linux"; i_distro = "sles"; i_major_version = maj; ++ i_arch = ("ppc64"|"ppc64le") } when maj >= 11 -> ++ 1004 ++ ++ | { i_type = "linux"; i_distro = "sles"; i_major_version = maj; ++ i_arch = "s390x" } when maj >= 12 -> ++ 2004 ++ ++ (* Only Debian 7 is available, so use it for any 7+ version. *) ++ | { i_type = "linux"; i_distro = "debian"; i_major_version = v } ++ when v >= 7 -> ++ 1300 ++ ++ (* Only Ubuntu 12.04 to 14.04 are available, so use them starting ++ * from 12.04, and 14.04 for anything after it. ++ *) ++ | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = v; ++ i_arch = ("ppc64"|"ppc64le") } when v >= 14 -> ++ 1005 ++ ++ | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = v; ++ i_arch = "s390x" } when v >= 16 -> ++ 2005 ++ ++ | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = v } ++ when v >= 14 -> ++ 1256 ++ ++ | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = 12; ++ i_minor_version = 4 } -> ++ 1252 ++ ++ | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = 12; ++ i_minor_version = 10 } -> ++ 1253 ++ ++ | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = 13; ++ i_minor_version = 4 } -> ++ 1254 ++ ++ | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = 13; ++ i_minor_version = 10 } -> ++ 1255 ++ ++ | { i_type = "linux"; i_arch = ("ppc64"|"ppc64le") } -> ++ 1002 ++ ++ | { i_type = "linux"; i_arch = "s390x" } -> ++ 2002 ++ ++ | { i_type = "linux" } -> ++ 5 ++ ++ | { i_type = "windows"; i_major_version = 5; i_minor_version = 1 } -> ++ 1 (* no architecture differentiation of XP on RHV *) ++ ++ | { i_type = "windows"; i_major_version = 5; i_minor_version = 2; ++ i_product_name = product } when String.find product "XP" >= 0 -> ++ 1 (* no architecture differentiation of XP on RHV *) ++ ++ | { i_type = "windows"; i_major_version = 5; i_minor_version = 2; ++ i_arch = "i386" } -> ++ 3 ++ ++ | { i_type = "windows"; i_major_version = 5; i_minor_version = 2; ++ i_arch = "x86_64" } -> ++ 10 ++ ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 0; ++ i_arch = "i386" } -> ++ 4 ++ ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 0; ++ i_arch = "x86_64" } -> ++ 16 ++ ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 1; ++ i_arch = "i386" } -> ++ 11 ++ ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 1; ++ i_arch = "x86_64"; i_product_variant = "Client" } -> ++ 12 ++ ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 1; ++ i_arch = "x86_64" } -> ++ 17 ++ ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 2; ++ i_arch = "i386" } -> ++ 20 ++ ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 2; ++ i_arch = "x86_64"; i_product_variant = "Client" } -> ++ 21 ++ ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 2; ++ i_arch = "x86_64" } -> ++ 23 ++ ++ (* Treat Windows 8.1 client like Windows 8. See: ++ * https://bugzilla.redhat.com/show_bug.cgi?id=1309580#c4 ++ *) ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 3; ++ i_arch = "i386"; i_product_variant = "Client" } -> ++ 20 ++ ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 3; ++ i_arch = "x86_64"; i_product_variant = "Client" } -> ++ 21 ++ ++ | { i_type = "windows"; i_major_version = 6; i_minor_version = 3; ++ i_arch = "x86_64" } -> ++ 23 ++ ++ | { i_type = "windows"; i_major_version = 10; i_minor_version = 0; ++ i_arch = "i386" } -> ++ 26 ++ ++ | { i_type = "windows"; i_major_version = 10; i_minor_version = 0; ++ i_arch = "x86_64"; i_product_variant = "Client" } -> ++ 27 ++ ++ | { i_type = "windows"; i_major_version = 10; i_minor_version = 0; ++ i_arch = "x86_64" } -> ++ 29 ++ ++ | { i_type = typ; i_distro = distro; ++ i_major_version = major; i_minor_version = minor; i_arch = arch; ++ i_product_name = product } -> ++ warning (f_"unknown guest operating system: %s %s %d.%d %s (%s)") ++ typ distro major minor arch product; ++ 0 ++ + (* Set the element based on the source hypervisor. + * https://bugzilla.redhat.com/show_bug.cgi?id=1342398#c6 + * https://gerrit.ovirt.org/#/c/59147/ +@@ -321,6 +518,7 @@ let rec create_ovf source targets guestcaps inspect + "xmlns:vssd", "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData"; + "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"; + "xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1/"; ++ "xmlns:ovirt", "http://www.ovirt.org/ovf"; + "ovf:version", "0.9" + ] [ + Comment generated_by; +@@ -383,8 +581,10 @@ let rec create_ovf source targets guestcaps inspect + ] in + (match ovf_flavour with + | OVirt -> ++ let ovirt_osid = get_ovirt_osid inspect in + e "OperatingSystemSection" ["ovf:id", vm_uuid; +- "ovf:required", "false"] ++ "ovf:required", "false"; ++ "ovirt:id", string_of_int ovirt_osid] + osinfo_subnodes + | RHVExportStorageDomain -> + e "Section" ["ovf:id", vm_uuid; "ovf:required", "false"; +-- +2.20.1 + diff --git a/SOURCES/0011-v2v-OVF-fix-ovf-id-for-VirtualSystem-in-OVirt-flavou.patch b/SOURCES/0011-v2v-OVF-fix-ovf-id-for-VirtualSystem-in-OVirt-flavou.patch new file mode 100644 index 0000000..7410ec6 --- /dev/null +++ b/SOURCES/0011-v2v-OVF-fix-ovf-id-for-VirtualSystem-in-OVirt-flavou.patch @@ -0,0 +1,32 @@ +From b96a2119b20f204661fa2165aea3c6c2b84e23de Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 5 Apr 2018 10:28:17 +0200 +Subject: [PATCH] v2v: OVF: fix ovf:id for VirtualSystem in OVirt flavour + +When writing the OVF in OVirt flavour, write the actual UUID of the +VM as ovf:id attribute for , instead of a dummy value. + +Suggested by Arik Hadas in +https://www.redhat.com/archives/libguestfs/2018-April/msg00005.html + +(cherry picked from commit 9dce43931a19510be1b6d21ce67d14a4136ce241) +--- + v2v/create_ovf.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml +index 730ab64b4..b1ab8df3f 100644 +--- a/v2v/create_ovf.ml ++++ b/v2v/create_ovf.ml +@@ -688,7 +688,7 @@ let rec create_ovf source targets guestcaps inspect + + (match ovf_flavour with + | OVirt -> +- e "VirtualSystem" ["ovf:id", "out"] !content_subnodes ++ e "VirtualSystem" ["ovf:id", vm_uuid] !content_subnodes + | RHVExportStorageDomain -> + e "Content" ["ovf:id", "out"; "xsi:type", "ovf:VirtualSystem_Type"] + !content_subnodes +-- +2.20.1 + diff --git a/SOURCES/0012-v2v-Add-o-rhv-upload-output-mode-RHBZ-1557273.patch b/SOURCES/0012-v2v-Add-o-rhv-upload-output-mode-RHBZ-1557273.patch new file mode 100644 index 0000000..82216b4 --- /dev/null +++ b/SOURCES/0012-v2v-Add-o-rhv-upload-output-mode-RHBZ-1557273.patch @@ -0,0 +1,1764 @@ +From 79aa92b800800592551f1389db0a059b3f111f33 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 12 Feb 2018 16:45:02 +0000 +Subject: [PATCH] v2v: Add -o rhv-upload output mode (RHBZ#1557273). +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This adds a new output mode to virt-v2v. virt-v2v -o rhv-upload +streams images directly to an oVirt or RHV >= 4 Data Domain using the +oVirt SDK v4. It is more efficient than -o rhv because it does not +need to go via the Export Storage Domain, and is possible for humans +to use unlike -o vdsm. + +The implementation uses the Python SDK (‘ovirtsdk4’ module). An +nbdkit Python 3 plugin translates NBD calls from qemu into HTTPS +requests to oVirt via the SDK. + +(cherry picked from commit cc04573927cca97de60d544d37467e67c25867a7) +--- + .gitignore | 3 + + TODO | 27 ++ + v2v/Makefile.am | 30 +- + v2v/cmdline.ml | 41 ++ + v2v/embed.sh | 48 +++ + v2v/output_rhv_upload.ml | 401 +++++++++++++++++++ + v2v/output_rhv_upload.mli | 33 ++ + v2v/output_rhv_upload_createvm_source.mli | 19 + + v2v/output_rhv_upload_plugin_source.mli | 19 + + v2v/output_rhv_upload_precheck_source.mli | 19 + + v2v/rhv-upload-createvm.py | 86 +++++ + v2v/rhv-upload-plugin.py | 445 ++++++++++++++++++++++ + v2v/rhv-upload-precheck.py | 73 ++++ + v2v/test-v2v-o-rhv-upload-oo-query.sh | 38 ++ + v2v/test-v2v-python-syntax.sh | 45 +++ + v2v/virt-v2v.pod | 138 ++++++- + 16 files changed, 1447 insertions(+), 18 deletions(-) + create mode 100755 v2v/embed.sh + create mode 100644 v2v/output_rhv_upload.ml + create mode 100644 v2v/output_rhv_upload.mli + create mode 100644 v2v/output_rhv_upload_createvm_source.mli + create mode 100644 v2v/output_rhv_upload_plugin_source.mli + create mode 100644 v2v/output_rhv_upload_precheck_source.mli + create mode 100644 v2v/rhv-upload-createvm.py + create mode 100644 v2v/rhv-upload-plugin.py + create mode 100644 v2v/rhv-upload-precheck.py + create mode 100755 v2v/test-v2v-o-rhv-upload-oo-query.sh + create mode 100755 v2v/test-v2v-python-syntax.sh + +diff --git a/.gitignore b/.gitignore +index 8101a2d9b..af80e36d1 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -672,6 +672,9 @@ Makefile.in + /utils/qemu-speed-test/qemu-speed-test + /v2v/.depend + /v2v/oUnit-* ++/v2v/output_rhv_upload_createvm_source.ml ++/v2v/output_rhv_upload_plugin_source.ml ++/v2v/output_rhv_upload_precheck_source.ml + /v2v/real-*.d/ + /v2v/real-*.img + /v2v/real-*.xml +diff --git a/TODO b/TODO +index 2e37ce67c..d196a3f6b 100644 +--- a/TODO ++++ b/TODO +@@ -570,3 +570,30 @@ Subsecond handling in virt-diff, virt-ls + + Handle nanoseconds properly. You should be able to specify them on + the command line and display them. ++ ++virt-v2v -o rhv-upload ++---------------------- ++ ++* Set or disable the ticket timeout. The default is going to be ++ increased (from current 60 seconds), so maybe we won't have to ++ set it. See also: ++ https://bugzilla.redhat.com/show_bug.cgi?id=1563278 ++ ++* qcow2 cannot be supported yet because there is not yet any ++ concept in imageio of read+write handles. ++ https://bugzilla.redhat.com/show_bug.cgi?id=1563299 ++ ++* preallocated cannot be supported yet because imageio doesn't ++ know how to zero the image efficiently, instead it runs an ++ fallocate process which writes to every block and that takes ++ many minutes. ++ ++* Really check what insecure/rhv_cafile do and implement it correctly. ++ ++* Measure and resolve performance problems. ++ ++* Allocated image size is unknown for v2v uploads, but imageio needs ++ to know it. We pass initial_size == provisioned_size == virtual size. ++ That can't be fixed from the v2v side. ++ ++* There are unresolved issues about how to clean up disks on failure. +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index 482ba58e5..694a64573 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -22,12 +22,19 @@ generator_built = \ + uefi.mli + + BUILT_SOURCES = \ +- $(generator_built) ++ $(generator_built) \ ++ output_rhv_upload_createvm_source.ml \ ++ output_rhv_upload_plugin_source.ml \ ++ output_rhv_upload_precheck_source.ml + + EXTRA_DIST = \ + $(SOURCES_MLI) $(SOURCES_ML) $(SOURCES_C) \ + copy_to_local.ml \ + copy_to_local.mli \ ++ embed-code.sh \ ++ rhv-upload-createvm.py \ ++ rhv-upload-plugin.py \ ++ rhv-upload-precheck.py \ + v2v_unit_tests.ml \ + virt-v2v.pod \ + virt-v2v-copy-to-local.pod +@@ -62,6 +69,10 @@ SOURCES_MLI = \ + output_null.mli \ + output_qemu.mli \ + output_rhv.mli \ ++ output_rhv_upload.mli \ ++ output_rhv_upload_createvm_source.mli \ ++ output_rhv_upload_plugin_source.mli \ ++ output_rhv_upload_precheck_source.mli \ + output_vdsm.mli \ + parse_ova.mli \ + parse_ovf_from_ova.mli \ +@@ -116,6 +127,10 @@ SOURCES_ML = \ + output_local.ml \ + output_qemu.ml \ + output_rhv.ml \ ++ output_rhv_upload_createvm_source.ml \ ++ output_rhv_upload_plugin_source.ml \ ++ output_rhv_upload_precheck_source.ml \ ++ output_rhv_upload.ml \ + output_vdsm.ml \ + inspect_source.ml \ + target_bus_assignment.ml \ +@@ -126,6 +141,15 @@ SOURCES_C = \ + libvirt_utils-c.c \ + qemuopts-c.c + ++# These files are generated and contain rhv-upload-*.py embedded as an ++# OCaml string. ++output_rhv_upload_createvm_source.ml: rhv-upload-createvm.py ++ ./embed.sh code $^ $@ ++output_rhv_upload_plugin_source.ml: rhv-upload-plugin.py ++ ./embed.sh code $^ $@ ++output_rhv_upload_precheck_source.ml: rhv-upload-precheck.py ++ ./embed.sh code $^ $@ ++ + if HAVE_OCAML + + bin_PROGRAMS = virt-v2v virt-v2v-copy-to-local +@@ -295,6 +319,7 @@ TESTS_ENVIRONMENT = $(top_builddir)/run --test + + TESTS = \ + test-v2v-docs.sh \ ++ test-v2v-python-syntax.sh \ + test-v2v-i-ova-bad-sha1.sh \ + test-v2v-i-ova-bad-sha256.sh \ + test-v2v-i-ova-formats.sh \ +@@ -308,6 +333,7 @@ TESTS = \ + test-v2v-i-ova-two-disks.sh \ + test-v2v-i-vmx.sh \ + test-v2v-it-vddk-io-query.sh \ ++ test-v2v-o-rhv-upload-oo-query.sh \ + test-v2v-o-vdsm-oo-query.sh \ + test-v2v-bad-networks-and-bridges.sh + +@@ -483,6 +509,7 @@ EXTRA_DIST += \ + test-v2v-o-null.sh \ + test-v2v-o-qemu.sh \ + test-v2v-o-rhv.sh \ ++ test-v2v-o-rhv-upload-oo-query.sh \ + test-v2v-o-vdsm-oo-query.sh \ + test-v2v-o-vdsm-options.sh \ + test-v2v-oa-option.sh \ +@@ -491,6 +518,7 @@ EXTRA_DIST += \ + test-v2v-print-source.expected \ + test-v2v-print-source.sh \ + test-v2v-print-source.xml \ ++ test-v2v-python-syntax.sh \ + test-v2v-conversion-of.sh \ + test-v2v-sound.sh \ + test-v2v-sound.xml \ +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index 5b8f686a8..9b1348c37 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -133,6 +133,8 @@ let parse_cmdline () = + | "disk" | "local" -> output_mode := `Local + | "null" -> output_mode := `Null + | "ovirt" | "rhv" | "rhev" -> output_mode := `RHV ++ | "ovirt-upload" | "ovirt_upload" | "rhv-upload" | "rhv_upload" -> ++ output_mode := `RHV_Upload + | "qemu" -> output_mode := `QEmu + | "vdsm" -> output_mode := `VDSM + | s -> +@@ -392,6 +394,16 @@ read the man page virt-v2v(1). + | `Null -> no_options (); `Null + | `RHV -> no_options (); `RHV + | `QEmu -> no_options (); `QEmu ++ | `RHV_Upload -> ++ if is_query then ( ++ Output_rhv_upload.print_output_options (); ++ exit 0 ++ ) ++ else ( ++ let rhv_options = ++ Output_rhv_upload.parse_output_options output_options in ++ `RHV_Upload rhv_options ++ ) + | `VDSM -> + if is_query then ( + Output_vdsm.print_output_options (); +@@ -568,6 +580,35 @@ read the man page virt-v2v(1). + Output_rhv.output_rhv os output_alloc, + output_format, output_alloc + ++ | `RHV_Upload rhv_options -> ++ let output_conn = ++ match output_conn with ++ | None -> ++ error (f_"-o rhv-upload: use ‘-oc’ to point to the oVirt or RHV server REST API URL, which is usually https://servername/ovirt-engine/api") ++ | Some oc -> oc in ++ (* Output format / sparse must currently be raw+sparse. We can ++ * change this in future. See TODO file for details. XXX ++ *) ++ if output_alloc <> Sparse || output_format <> Some "raw" then ++ error (f_"-o rhv-upload: currently you must use ‘-of raw’ and you cannot use ‘-oa preallocated’ with this output mode. These restrictions will be loosened in a future version."); ++ (* In theory we could make the password optional in future. *) ++ let output_password = ++ match output_password with ++ | None -> ++ error (f_"-o rhv-upload: output password file was not specified, use ‘-op’ to point to a file which contains the password used to connect to the oVirt or RHV server") ++ | Some op -> op in ++ let os = ++ match output_storage with ++ | None -> ++ error (f_"-o rhv-upload: output storage was not specified, use ‘-os’"); ++ | Some os -> os in ++ if qemu_boot then ++ error_option_cannot_be_used_in_output_mode "rhv-upload" "--qemu-boot"; ++ Output_rhv_upload.output_rhv_upload output_alloc output_conn ++ output_password os ++ rhv_options, ++ output_format, output_alloc ++ + | `VDSM vdsm_options -> + if output_password <> None then + error_option_cannot_be_used_in_output_mode "vdsm" "-op"; +diff --git a/v2v/embed.sh b/v2v/embed.sh +new file mode 100755 +index 000000000..363d7e2b0 +--- /dev/null ++++ b/v2v/embed.sh +@@ -0,0 +1,48 @@ ++#!/bin/bash - ++# Embed code or other content into an OCaml file. ++# Copyright (C) 2018 Red Hat Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++# Embed code or other content into an OCaml file. ++# ++# It is embedded into a string. As OCaml string literals have virtually ++# no restrictions on length or content we only have to escape double ++# quotes for backslash characters. ++ ++if [ $# -ne 3 ]; then ++ echo "embed.sh identifier input output" ++ exit 1 ++fi ++ ++set -e ++set -u ++ ++ident="$1" ++input="$2" ++output="$3" ++ ++rm -f "$output" "$output"-t ++ ++exec >"$output"-t ++ ++echo "(* Generated by embed.sh from $input *)" ++echo ++echo let "$ident" = '"' ++sed -e 's/\(["\]\)/\\\1/g' < "$input" ++echo '"' ++ ++chmod -w "$output"-t ++mv "$output"-t "$output" +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +new file mode 100644 +index 000000000..129461242 +--- /dev/null ++++ b/v2v/output_rhv_upload.ml +@@ -0,0 +1,401 @@ ++(* virt-v2v ++ * Copyright (C) 2009-2018 Red Hat Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ *) ++ ++open Printf ++open Unix ++ ++open Std_utils ++open Tools_utils ++open Unix_utils ++open Common_gettext.Gettext ++ ++open Types ++open Utils ++ ++type rhv_options = { ++ rhv_cafile : string; ++ rhv_cluster : string option; ++ rhv_direct : bool; ++ rhv_verifypeer : bool; ++} ++ ++let print_output_options () = ++ printf (f_"Output options (-oo) which can be used with -o rhv-upload: ++ ++ -oo rhv-cafile=CA.PEM Set ‘ca.pem’ certificate bundle filename. ++ -oo rhv-cluster=CLUSTERNAME Set RHV cluster name. ++ -oo rhv-direct[=true|false] Use direct transfer mode (default: false). ++ -oo rhv-verifypeer[=true|false] Verify server identity (default: false). ++") ++ ++let parse_output_options options = ++ let rhv_cafile = ref None in ++ let rhv_cluster = ref None in ++ let rhv_direct = ref false in ++ let rhv_verifypeer = ref false in ++ ++ List.iter ( ++ function ++ | "rhv-cafile", v -> ++ if !rhv_cafile <> None then ++ error (f_"-o rhv-upload: -oo rhv-cafile set twice"); ++ rhv_cafile := Some v ++ | "rhv-cluster", v -> ++ if !rhv_cluster <> None then ++ error (f_"-o rhv-upload: -oo rhv-cluster set twice"); ++ rhv_cluster := Some v ++ | "rhv-direct", "" -> rhv_direct := true ++ | "rhv-direct", v -> rhv_direct := bool_of_string v ++ | "rhv-verifypeer", "" -> rhv_verifypeer := true ++ | "rhv-verifypeer", v -> rhv_verifypeer := bool_of_string v ++ | k, _ -> ++ error (f_"-o rhv-upload: unknown output option ‘-oo %s’") k ++ ) options; ++ ++ let rhv_cafile = ++ match !rhv_cafile with ++ | Some s -> s ++ | None -> ++ error (f_"-o rhv-upload: must use ‘-oo rhv-cafile’ to supply the path to the oVirt or RHV user’s ‘ca.pem’ file") in ++ let rhv_cluster = !rhv_cluster in ++ let rhv_direct = !rhv_direct in ++ let rhv_verifypeer = !rhv_verifypeer in ++ ++ { rhv_cafile; rhv_cluster; rhv_direct; rhv_verifypeer } ++ ++let python3 = "python3" (* Defined by PEP 394 *) ++let pidfile_timeout = 30 ++let finalization_timeout = 5*60 ++ ++class output_rhv_upload output_alloc output_conn ++ output_password output_storage ++ rhv_options = ++ (* Create a temporary directory which will be deleted on exit. *) ++ let tmpdir = ++ let base_dir = (open_guestfs ())#get_cachedir () in ++ let t = Mkdtemp.temp_dir ~base_dir "rhvupload." in ++ rmdir_on_exit t; ++ t in ++ ++ let diskid_file_of_id id = tmpdir // sprintf "diskid.%d" id in ++ ++ (* Write the Python precheck, plugin and create VM to a temporary file. *) ++ let precheck = ++ let precheck = tmpdir // "rhv-upload-precheck.py" in ++ with_open_out ++ precheck ++ (fun chan -> output_string chan Output_rhv_upload_precheck_source.code); ++ precheck in ++ let plugin = ++ let plugin = tmpdir // "rhv-upload-plugin.py" in ++ with_open_out ++ plugin ++ (fun chan -> output_string chan Output_rhv_upload_plugin_source.code); ++ plugin in ++ let createvm = ++ let createvm = tmpdir // "rhv-upload-createvm.py" in ++ with_open_out ++ createvm ++ (fun chan -> output_string chan Output_rhv_upload_createvm_source.code); ++ createvm in ++ ++ (* Is SELinux enabled and enforcing on the host? *) ++ let have_selinux = ++ 0 = Sys.command "getenforce 2>/dev/null | grep -isq Enforcing" in ++ ++ (* Check that the Python binary is available. *) ++ let error_unless_python_binary_on_path () = ++ try ignore (which python3) ++ with Executable_not_found _ -> ++ error (f_"no python binary called ‘%s’ can be found on the $PATH") ++ python3 ++ in ++ ++ (* Check that nbdkit is available and new enough. *) ++ let error_unless_nbdkit_working () = ++ if 0 <> Sys.command "nbdkit --version >/dev/null" then ++ error (f_"nbdkit is not installed or not working. It is required to use ‘-o rhv-upload’. See \"OUTPUT TO RHV\" in the virt-v2v(1) manual."); ++ ++ (* Check it's a new enough version. The latest features we ++ * require are ‘--exit-with-parent’ and ‘--selinux-label’, both ++ * added in 1.1.14. (We use 1.1.16 as the minimum here because ++ * it also adds the selinux=yes|no flag in --dump-config). ++ *) ++ let lines = external_command "nbdkit --help" in ++ let lines = String.concat " " lines in ++ if String.find lines "exit-with-parent" == -1 || ++ String.find lines "selinux-label" == -1 then ++ error (f_"nbdkit is not new enough, you need to upgrade to nbdkit ≥ 1.1.16") ++ in ++ ++ (* Check that the python3 plugin is installed and working ++ * and can load the plugin script. ++ *) ++ let error_unless_nbdkit_python3_working () = ++ let cmd = sprintf "nbdkit %s %s --dump-plugin >/dev/null" ++ python3 (quote plugin) in ++ if Sys.command cmd <> 0 then ++ error (f_"nbdkit Python 3 plugin is not installed or not working. It is required if you want to use ‘-o rhv-upload’. ++ ++See also \"OUTPUT TO RHV\" in the virt-v2v(1) manual.") ++ in ++ ++ (* Check that nbdkit was compiled with SELinux support (for the ++ * --selinux-label option). ++ *) ++ let error_unless_nbdkit_compiled_with_selinux () = ++ let lines = external_command "nbdkit --dump-config" in ++ (* In nbdkit <= 1.1.15 the selinux attribute was not present ++ * at all in --dump-config output so there was no way to tell. ++ * Ignore this case because there will be an error later when ++ * we try to use the --selinux-label parameter. ++ *) ++ if List.mem "selinux=no" (List.map String.trim lines) then ++ error (f_"nbdkit was compiled without SELinux support. You will have to recompile nbdkit with libselinux-devel installed, or else set SELinux to Permissive mode while doing the conversion.") ++ in ++ ++ (* JSON parameters which are invariant between disks. *) ++ let json_params = [ ++ "verbose", JSON.Bool (verbose ()); ++ ++ "output_conn", JSON.String output_conn; ++ "output_password", JSON.String output_password; ++ "output_storage", JSON.String output_storage; ++ "output_sparse", JSON.Bool (match output_alloc with ++ | Sparse -> true ++ | Preallocated -> false); ++ "rhv_cafile", JSON.String rhv_options.rhv_cafile; ++ "rhv_cluster", ++ JSON.String (Option.default "Default" rhv_options.rhv_cluster); ++ "rhv_direct", JSON.Bool rhv_options.rhv_direct; ++ ++ (* The 'Insecure' flag seems to be a number with various possible ++ * meanings, however we just set it to True/False. ++ * ++ * https://github.com/oVirt/ovirt-engine-sdk/blob/19aa7070b80e60a4cfd910448287aecf9083acbe/sdk/lib/ovirtsdk4/__init__.py#L395 ++ *) ++ "insecure", JSON.Bool (not rhv_options.rhv_verifypeer); ++ ] in ++ ++ (* nbdkit command line args which are invariant between disks. *) ++ let nbdkit_args = ++ let args = [ ++ "nbdkit"; ++ ++ "--foreground"; (* run in foreground *) ++ "--exit-with-parent"; (* exit when virt-v2v exits *) ++ "--newstyle"; (* use newstyle NBD protocol *) ++ "--exportname"; "/"; ++ ++ "python3"; (* use the nbdkit Python 3 plugin *) ++ plugin; (* Python plugin script *) ++ ] in ++ let args = if verbose () then args @ ["--verbose"] else args in ++ let args = ++ (* label the socket so qemu can open it *) ++ if have_selinux then ++ args @ ["--selinux-label"; "system_u:object_r:svirt_t:s0"] ++ else args in ++ args in ++ ++object ++ inherit output ++ ++ method precheck () = ++ error_unless_python_binary_on_path (); ++ error_unless_nbdkit_working (); ++ error_unless_nbdkit_python3_working (); ++ if have_selinux then ++ error_unless_nbdkit_compiled_with_selinux () ++ ++ method as_options = ++ "-o rhv-upload" ^ ++ (match output_alloc with ++ | Sparse -> "" (* default, don't need to print it *) ++ | Preallocated -> " -oa preallocated") ^ ++ sprintf " -oc %s -op %s -os %s" ++ output_conn output_password output_storage ++ ++ method supported_firmware = [ TargetBIOS ] ++ ++ method prepare_targets source targets = ++ let output_name = source.s_name in ++ let json_params = ++ ("output_name", JSON.String output_name) :: json_params in ++ ++ (* Python code prechecks. These can't run in #precheck because ++ * we need to know the name of the virtual machine. ++ *) ++ let json_param_file = tmpdir // "params.json" in ++ with_open_out ++ json_param_file ++ (fun chan -> output_string chan (JSON.string_of_doc json_params)); ++ if run_command [ python3; precheck; json_param_file ] <> 0 then ++ error (f_"failed server prechecks, see earlier errors"); ++ ++ (* Create an nbdkit instance for each disk and set the ++ * target URI to point to the NBD socket. ++ *) ++ List.map ( ++ fun t -> ++ let id = t.target_overlay.ov_source.s_disk_id in ++ let disk_name = sprintf "%s-%03d" output_name id in ++ let json_params = ++ ("disk_name", JSON.String disk_name) :: json_params in ++ ++ let disk_format = ++ match t.target_format with ++ | ("raw" | "qcow2") as fmt -> fmt ++ | _ -> ++ error (f_"rhv-upload: -of %s: Only output format ‘raw’ or ‘qcow2’ is supported. If the input is in a different format then force one of these output formats by adding either ‘-of raw’ or ‘-of qcow2’ on the command line.") ++ t.target_format in ++ let json_params = ++ ("disk_format", JSON.String disk_format) :: json_params in ++ ++ let disk_size = t.target_overlay.ov_virtual_size in ++ let json_params = ++ ("disk_size", JSON.Int64 disk_size) :: json_params in ++ ++ (* Ask the plugin to write the disk ID to a special file. *) ++ let diskid_file = diskid_file_of_id id in ++ let json_params = ++ ("diskid_file", JSON.String diskid_file) :: json_params in ++ ++ (* Write the JSON parameters to a file. *) ++ let json_param_file = tmpdir // sprintf "params%d.json" id in ++ with_open_out ++ json_param_file ++ (fun chan -> output_string chan (JSON.string_of_doc json_params)); ++ ++ let sock = tmpdir // sprintf "nbdkit%d.sock" id in ++ let pidfile = tmpdir // sprintf "nbdkit%d.pid" id in ++ ++ (* Add common arguments to per-target arguments. *) ++ let args = ++ nbdkit_args @ [ "--pidfile"; pidfile; ++ "--unix"; sock; ++ sprintf "params=%s" json_param_file ] in ++ ++ (* Print the full command we are about to run when debugging. *) ++ if verbose () then ( ++ eprintf "running nbdkit:\n"; ++ List.iter (fun arg -> eprintf " %s" (quote arg)) args; ++ prerr_newline () ++ ); ++ ++ (* Start an nbdkit instance in the background. By using ++ * --exit-with-parent we don't have to worry about clean-up. ++ *) ++ let args = Array.of_list args in ++ let pid = fork () in ++ if pid = 0 then ( ++ (* Child process (nbdkit). *) ++ execvp "nbdkit" args ++ ); ++ ++ (* Wait for the pidfile to appear so we know that nbdkit ++ * is listening for requests. ++ *) ++ if not (wait_for_file pidfile pidfile_timeout) then ( ++ if verbose () then ++ error (f_"nbdkit did not start up. See previous debugging messages for problems.") ++ else ++ error (f_"nbdkit did not start up. There may be errors printed by nbdkit above. ++ ++If the messages above are not sufficient to diagnose the problem then add the ‘virt-v2v -v -x’ options and examine the debugging output carefully.") ++ ); ++ ++ if have_selinux then ( ++ (* Note that Unix domain sockets have both a file label and ++ * a socket/process label. Using --selinux-label above ++ * only set the socket label, but we must also set the file ++ * label. ++ *) ++ ignore ( ++ run_command ["chcon"; "system_u:object_r:svirt_image_t:s0"; ++ sock] ++ ); ++ ); ++ (* ... and the regular Unix permissions, in case qemu is ++ * running as another user. ++ *) ++ chmod sock 0o777; ++ ++ (* Tell ‘qemu-img convert’ to write to the nbd socket which is ++ * connected to nbdkit. ++ *) ++ let json_params = [ ++ "file.driver", JSON.String "nbd"; ++ "file.path", JSON.String sock; ++ "file.export", JSON.String "/"; ++ ] in ++ let target_file = ++ TargetURI ("json:" ^ JSON.string_of_doc json_params) in ++ { t with target_file } ++ ) targets ++ ++ method create_metadata source targets _ guestcaps inspect target_firmware = ++ (* Get the UUIDs of each disk image. These files are written ++ * out by the nbdkit plugins on successful finalization of the ++ * transfer. ++ *) ++ let nr_disks = List.length targets in ++ let image_uuids = ++ List.map ( ++ fun t -> ++ let id = t.target_overlay.ov_source.s_disk_id in ++ let diskid_file = diskid_file_of_id id in ++ if not (wait_for_file diskid_file finalization_timeout) then ++ error (f_"transfer of disk %d/%d failed, see earlier error messages") ++ (id+1) nr_disks; ++ let diskid = read_whole_file diskid_file in ++ diskid ++ ) targets in ++ ++ (* We don't have the storage domain UUID, but instead we write ++ * in a magic value which the Python code (which can get it) ++ * will substitute. ++ *) ++ let sd_uuid = "@SD_UUID@" in ++ ++ (* The volume and VM UUIDs are made up. *) ++ let vol_uuids = List.map (fun _ -> uuidgen ()) targets ++ and vm_uuid = uuidgen () in ++ ++ (* Create the metadata. *) ++ let ovf = ++ Create_ovf.create_ovf source targets guestcaps inspect ++ output_alloc ++ sd_uuid image_uuids vol_uuids vm_uuid ++ OVirt in ++ let ovf = DOM.doc_to_string ovf in ++ ++ let json_param_file = tmpdir // "params.json" in ++ with_open_out ++ json_param_file ++ (fun chan -> output_string chan (JSON.string_of_doc json_params)); ++ ++ let ovf_file = tmpdir // "vm.ovf" in ++ with_open_out ovf_file (fun chan -> output_string chan ovf); ++ if run_command [ python3; createvm; json_param_file; ovf_file ] <> 0 then ++ error (f_"failed to create virtual machine, see earlier errors") ++ ++end ++ ++let output_rhv_upload = new output_rhv_upload ++let () = Modules_list.register_output_module "rhv-upload" +diff --git a/v2v/output_rhv_upload.mli b/v2v/output_rhv_upload.mli +new file mode 100644 +index 000000000..f6cd69a61 +--- /dev/null ++++ b/v2v/output_rhv_upload.mli +@@ -0,0 +1,33 @@ ++(* virt-v2v ++ * Copyright (C) 2009-2018 Red Hat Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ *) ++ ++(** [-o rhv-upload] target. *) ++ ++type rhv_options ++(** Miscellaneous extra command line parameters used by rhv-upload. *) ++ ++val print_output_options : unit -> unit ++val parse_output_options : (string * string) list -> rhv_options ++(** Print and parse rhv-upload -oo options. *) ++ ++val output_rhv_upload : Types.output_allocation -> string -> string -> ++ string -> rhv_options -> Types.output ++(** [output_rhv_upload output_alloc output_conn output_password output_storage ++ rhv_options] ++ creates and returns a new {!Types.output} object specialized for writing ++ output to oVirt or RHV directly via RHV APIs. *) +diff --git a/v2v/output_rhv_upload_createvm_source.mli b/v2v/output_rhv_upload_createvm_source.mli +new file mode 100644 +index 000000000..c1bafa15b +--- /dev/null ++++ b/v2v/output_rhv_upload_createvm_source.mli +@@ -0,0 +1,19 @@ ++(* virt-v2v ++ * Copyright (C) 2018 Red Hat Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ *) ++ ++val code : string +diff --git a/v2v/output_rhv_upload_plugin_source.mli b/v2v/output_rhv_upload_plugin_source.mli +new file mode 100644 +index 000000000..c1bafa15b +--- /dev/null ++++ b/v2v/output_rhv_upload_plugin_source.mli +@@ -0,0 +1,19 @@ ++(* virt-v2v ++ * Copyright (C) 2018 Red Hat Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ *) ++ ++val code : string +diff --git a/v2v/output_rhv_upload_precheck_source.mli b/v2v/output_rhv_upload_precheck_source.mli +new file mode 100644 +index 000000000..c1bafa15b +--- /dev/null ++++ b/v2v/output_rhv_upload_precheck_source.mli +@@ -0,0 +1,19 @@ ++(* virt-v2v ++ * Copyright (C) 2018 Red Hat Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ *) ++ ++val code : string +diff --git a/v2v/rhv-upload-createvm.py b/v2v/rhv-upload-createvm.py +new file mode 100644 +index 000000000..a34627ec8 +--- /dev/null ++++ b/v2v/rhv-upload-createvm.py +@@ -0,0 +1,86 @@ ++# -*- python -*- ++# oVirt or RHV upload create VM used by ‘virt-v2v -o rhv-upload’ ++# Copyright (C) 2018 Red Hat Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program; if not, write to the Free Software Foundation, Inc., ++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++import json ++import logging ++import sys ++import time ++ ++from http.client import HTTPSConnection ++from urllib.parse import urlparse ++ ++import ovirtsdk4 as sdk ++import ovirtsdk4.types as types ++ ++# Parameters are passed in via a JSON doc from the OCaml code. ++# Because this Python code ships embedded inside virt-v2v there ++# is no formal API here. ++params = None ++ovf = None # OVF file ++ ++if len(sys.argv) != 3: ++ raise RuntimeError("incorrect number of parameters") ++ ++# Parameters are passed in via a JSON document. ++with open(sys.argv[1], 'r') as fp: ++ params = json.load(fp) ++ ++# What is passed in is a password file, read the actual password. ++with open(params['output_password'], 'r') as fp: ++ output_password = fp.read() ++output_password = output_password.rstrip() ++ ++# Read the OVF document. ++with open(sys.argv[2], 'r') as fp: ++ ovf = fp.read() ++ ++# Parse out the username from the output_conn URL. ++parsed = urlparse(params['output_conn']) ++username = parsed.username or "admin@internal" ++ ++# Connect to the server. ++connection = sdk.Connection( ++ url = params['output_conn'], ++ username = username, ++ password = output_password, ++ ca_file = params['rhv_cafile'], ++ log = logging.getLogger(), ++ insecure = params['insecure'], ++) ++ ++system_service = connection.system_service() ++ ++# Get the storage domain UUID and substitute it into the OVF doc. ++sds_service = system_service.storage_domains_service() ++sd = sds_service.list(search=("name=%s" % params['output_storage']))[0] ++sd_uuid = sd.id ++ ++ovf.replace("@SD_UUID@", sd_uuid) ++ ++vms_service = system_service.vms_service() ++vm = vms_service.add( ++ types.Vm( ++ cluster=types.Cluster(name = params['rhv_cluster']), ++ initialization=types.Initialization( ++ configuration = types.Configuration( ++ type = types.ConfigurationType.OVA, ++ data = ovf, ++ ) ++ ) ++ ) ++) +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +new file mode 100644 +index 000000000..791c9e7d2 +--- /dev/null ++++ b/v2v/rhv-upload-plugin.py +@@ -0,0 +1,445 @@ ++# -*- python -*- ++# oVirt or RHV upload nbdkit plugin used by ‘virt-v2v -o rhv-upload’ ++# Copyright (C) 2018 Red Hat Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program; if not, write to the Free Software Foundation, Inc., ++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++import builtins ++import json ++import logging ++import ssl ++import sys ++import time ++ ++from http.client import HTTPSConnection ++from urllib.parse import urlparse ++ ++import ovirtsdk4 as sdk ++import ovirtsdk4.types as types ++ ++# Timeout to wait for oVirt disks to change status, or the transfer ++# object to finish initializing [seconds]. ++timeout = 5*60 ++ ++# Parameters are passed in via a JSON doc from the OCaml code. ++# Because this Python code ships embedded inside virt-v2v there ++# is no formal API here. ++params = None ++ ++def config(key, value): ++ global params ++ ++ if key == "params": ++ with builtins.open(value, 'r') as fp: ++ params = json.load(fp) ++ else: ++ raise RuntimeError("unknown configuration key '%s'" % key) ++ ++def config_complete(): ++ if params is None: ++ raise RuntimeError("missing configuration parameters") ++ ++def debug(s): ++ if params['verbose']: ++ print(s, file=sys.stderr) ++ sys.stderr.flush() ++ ++def open(readonly): ++ # Parse out the username from the output_conn URL. ++ parsed = urlparse(params['output_conn']) ++ username = parsed.username or "admin@internal" ++ ++ # Read the password from file. ++ with builtins.open(params['output_password'], 'r') as fp: ++ password = fp.read() ++ password = password.rstrip() ++ ++ # Connect to the server. ++ connection = sdk.Connection( ++ url = params['output_conn'], ++ username = username, ++ password = password, ++ ca_file = params['rhv_cafile'], ++ log = logging.getLogger(), ++ insecure = params['insecure'], ++ ) ++ ++ system_service = connection.system_service() ++ ++ # Create the disk. ++ disks_service = system_service.disks_service() ++ if params['disk_format'] == "raw": ++ disk_format = types.DiskFormat.RAW ++ else: ++ disk_format = types.DiskFormat.COW ++ disk = disks_service.add( ++ disk = types.Disk( ++ name = params['disk_name'], ++ description = "Uploaded by virt-v2v", ++ format = disk_format, ++ initial_size = params['disk_size'], ++ provisioned_size = params['disk_size'], ++ # XXX Ignores params['output_sparse']. ++ # Handling this properly will be complex, see: ++ # https://www.redhat.com/archives/libguestfs/2018-March/msg00177.html ++ sparse = True, ++ storage_domains = [ ++ types.StorageDomain( ++ name = params['output_storage'], ++ ) ++ ], ++ ) ++ ) ++ ++ # Wait till the disk is up, as the transfer can't start if the ++ # disk is locked: ++ disk_service = disks_service.disk_service(disk.id) ++ debug("disk.id = %r" % disk.id) ++ ++ endt = time.time() + timeout ++ while True: ++ time.sleep(5) ++ disk = disk_service.get() ++ if disk.status == types.DiskStatus.OK: ++ break ++ if time.time() > endt: ++ raise RuntimeError("timed out waiting for disk to become unlocked") ++ ++ # Get a reference to the transfer service. ++ transfers_service = system_service.image_transfers_service() ++ ++ # Create a new image transfer. ++ transfer = transfers_service.add( ++ types.ImageTransfer( ++ image = types.Image( ++ id = disk.id ++ ) ++ ) ++ ) ++ debug("transfer.id = %r" % transfer.id) ++ ++ # Get a reference to the created transfer service. ++ transfer_service = transfers_service.image_transfer_service(transfer.id) ++ ++ # After adding a new transfer for the disk, the transfer's status ++ # will be INITIALIZING. Wait until the init phase is over. The ++ # actual transfer can start when its status is "Transferring". ++ endt = time.time() + timeout ++ while True: ++ time.sleep(5) ++ transfer = transfer_service.get() ++ if transfer.phase != types.ImageTransferPhase.INITIALIZING: ++ break ++ if time.time() > endt: ++ raise RuntimeError("timed out waiting for transfer status " + ++ "!= INITIALIZING") ++ ++ # Now we have permission to start the transfer. ++ if params['rhv_direct']: ++ if transfer.transfer_url is None: ++ raise RuntimeError("direct upload to host not supported, " + ++ "requires ovirt-engine >= 4.2 and only works " + ++ "when virt-v2v is run within the oVirt/RHV " + ++ "environment, eg. on an oVirt node.") ++ destination_url = urlparse(transfer.transfer_url) ++ else: ++ destination_url = urlparse(transfer.proxy_url) ++ ++ context = ssl.create_default_context() ++ context.load_verify_locations(cafile = params['rhv_cafile']) ++ ++ http = HTTPSConnection( ++ destination_url.hostname, ++ destination_url.port, ++ context = context ++ ) ++ ++ # Save everything we need to make requests in the handle. ++ return { ++ 'can_flush': False, ++ 'can_trim': False, ++ 'can_zero': False, ++ 'connection': connection, ++ 'disk': disk, ++ 'disk_service': disk_service, ++ 'failed': False, ++ 'got_options': False, ++ 'highestwrite': 0, ++ 'http': http, ++ 'needs_auth': not params['rhv_direct'], ++ 'path': destination_url.path, ++ 'transfer': transfer, ++ 'transfer_service': transfer_service, ++ } ++ ++# Can we issue zero, trim or flush requests? ++def get_options(h): ++ if h['got_options']: ++ return ++ h['got_options'] = True ++ ++ http = h['http'] ++ transfer = h['transfer'] ++ ++ http.putrequest("OPTIONS", h['path']) ++ http.putheader("Authorization", transfer.signed_ticket) ++ http.endheaders() ++ ++ r = http.getresponse() ++ if r.status == 200: ++ # New imageio never needs authentication. ++ h['needs_auth'] = False ++ ++ j = json.loads(r.read()) ++ h['can_zero'] = "zero" in j['features'] ++ h['can_trim'] = "trim" in j['features'] ++ h['can_flush'] = "flush" in j['features'] ++ ++ # Old imageio servers returned either 405 Method Not Allowed or ++ # 204 No Content (with an empty body). If we see that we leave ++ # all the features as False and they will be emulated. ++ elif r.status == 405 or r.status == 204: ++ pass ++ ++ else: ++ raise RuntimeError("could not use OPTIONS request: %d: %s" % ++ (r.status, r.reason)) ++ ++def can_trim(h): ++ get_options(h) ++ return h['can_trim'] ++ ++def can_flush(h): ++ get_options(h) ++ return h['can_flush'] ++ ++def get_size(h): ++ return params['disk_size'] ++ ++# For documentation see: ++# https://github.com/oVirt/ovirt-imageio/blob/master/docs/random-io.md ++# For examples of working code to read/write from the server, see: ++# https://github.com/oVirt/ovirt-imageio/blob/master/daemon/test/server_test.py ++ ++def pread(h, count, offset): ++ http = h['http'] ++ transfer = h['transfer'] ++ transfer_service = h['transfer_service'] ++ ++ http.putrequest("GET", h['path']) ++ # Authorization is only needed for old imageio. ++ if h['needs_auth']: ++ http.putheader("Authorization", transfer.signed_ticket) ++ http.putheader("Range", "bytes=%d-%d" % (offset, offset+count-1)) ++ http.endheaders() ++ ++ r = http.getresponse() ++ # 206 = HTTP Partial Content. ++ if r.status != 206: ++ h['transfer_service'].pause() ++ h['failed'] = True ++ raise RuntimeError("could not read sector (%d, %d): %d: %s" % ++ (offset, count, r.status, r.reason)) ++ return r.read() ++ ++def pwrite(h, buf, offset): ++ http = h['http'] ++ transfer = h['transfer'] ++ transfer_service = h['transfer_service'] ++ ++ count = len(buf) ++ h['highestwrite'] = max(h['highestwrite'], offset+count) ++ ++ http.putrequest("PUT", h['path'] + "?flush=n") ++ # Authorization is only needed for old imageio. ++ if h['needs_auth']: ++ http.putheader("Authorization", transfer.signed_ticket) ++ # The oVirt server only uses the first part of the range, and the ++ # content-length. ++ http.putheader("Content-Range", "bytes %d-%d/*" % (offset, offset+count-1)) ++ http.putheader("Content-Length", str(count)) ++ http.endheaders() ++ http.send(buf) ++ ++ r = http.getresponse() ++ if r.status != 200: ++ transfer_service.pause() ++ h['failed'] = True ++ raise RuntimeError("could not write sector (%d, %d): %d: %s" % ++ (offset, count, r.status, r.reason)) ++ ++def zero(h, count, offset, may_trim): ++ http = h['http'] ++ transfer = h['transfer'] ++ transfer_service = h['transfer_service'] ++ ++ # Unlike the trim and flush calls, there is no 'can_zero' method ++ # so nbdkit could call this even if the server doesn't support ++ # zeroing. If this is the case we must emulate. ++ if not h['can_zero']: ++ emulate_zero(h, count, offset) ++ return ++ ++ # Construct the JSON request for zeroing. ++ buf = json.dumps({'op': "zero", ++ 'offset': offset, ++ 'size': count, ++ 'flush': False}).encode() ++ ++ http.putrequest("PATCH", h['path']) ++ http.putheader("Content-Type", "application/json") ++ http.putheader("Content-Length", len(buf)) ++ http.endheaders() ++ http.send(buf) ++ ++ r = http.getresponse() ++ if r.status != 200: ++ transfer_service.pause() ++ h['failed'] = True ++ raise RuntimeError("could not zero sector (%d, %d): %d: %s" % ++ (offset, count, r.status, r.reason)) ++ ++def emulate_zero(h, count, offset): ++ # qemu-img convert starts by trying to zero/trim the whole device. ++ # Since we've just created a new disk it's safe to ignore these ++ # requests as long as they are smaller than the highest write seen. ++ # After that we must emulate them with writes. ++ if offset+count < h['highestwrite']: ++ http.putrequest("PUT", h['path']) ++ # Authorization is only needed for old imageio. ++ if h['needs_auth']: ++ http.putheader("Authorization", transfer.signed_ticket) ++ http.putheader("Content-Range", ++ "bytes %d-%d/*" % (offset, offset+count-1)) ++ http.putheader("Content-Length", str(count)) ++ http.endheaders() ++ ++ buf = bytearray(128*1024) ++ while count > len(buf): ++ http.send(buf) ++ count -= len(buf) ++ http.send(buffer(buf, 0, count)) ++ ++ r = http.getresponse() ++ if r.status != 200: ++ transfer_service.pause() ++ h['failed'] = True ++ raise RuntimeError("could not write zeroes (%d, %d): %d: %s" % ++ (offset, count, r.status, r.reason)) ++ ++def trim(h, count, offset): ++ http = h['http'] ++ transfer = h['transfer'] ++ transfer_service = h['transfer_service'] ++ ++ # Construct the JSON request for trimming. ++ buf = json.dumps({'op': "trim", ++ 'offset': offset, ++ 'size': count, ++ 'flush': False}).encode() ++ ++ http.putrequest("PATCH", h['path']) ++ http.putheader("Content-Type", "application/json") ++ http.putheader("Content-Length", len(buf)) ++ http.endheaders() ++ http.send(buf) ++ ++ r = http.getresponse() ++ if r.status != 200: ++ transfer_service.pause() ++ h['failed'] = True ++ raise RuntimeError("could not trim sector (%d, %d): %d: %s" % ++ (offset, count, r.status, r.reason)) ++ ++def flush(h): ++ http = h['http'] ++ transfer = h['transfer'] ++ transfer_service = h['transfer_service'] ++ ++ # Construct the JSON request for flushing. ++ buf = json.dumps({'op': "flush"}).encode() ++ ++ http.putrequest("PATCH", h['path']) ++ http.putheader("Content-Type", "application/json") ++ http.putheader("Content-Length", len(buf)) ++ http.endheaders() ++ http.send(buf) ++ ++ r = http.getresponse() ++ if r.status != 200: ++ transfer_service.pause() ++ h['failed'] = True ++ raise RuntimeError("could not flush: %d: %s" % (r.status, r.reason)) ++ ++def delete_disk_on_failure(h): ++ disk_service = h['disk_service'] ++ disk_service.remove() ++ ++def close(h): ++ http = h['http'] ++ connection = h['connection'] ++ ++ # This is sometimes necessary because python doesn't set up ++ # sys.stderr to be line buffered and so debug, errors or ++ # exceptions printed previously might not be emitted before the ++ # plugin exits. ++ sys.stderr.flush() ++ ++ # If the connection failed earlier ensure we clean up the disk. ++ if h['failed']: ++ delete_disk_on_failure(h) ++ connection.close() ++ return ++ ++ try: ++ # Issue a flush request on close so that the data is written to ++ # persistent store before we create the VM. ++ if h['can_flush']: ++ flush(h) ++ ++ http.close() ++ ++ disk = h['disk'] ++ transfer_service = h['transfer_service'] ++ ++ transfer_service.finalize() ++ ++ # Wait until the transfer disk job is completed since ++ # only then we can be sure the disk is unlocked. As this ++ # code is not very clear, what's happening is that we are ++ # waiting for the transfer object to cease to exist, which ++ # falls through to the exception case and then we can ++ # continue. ++ endt = time.time() + timeout ++ try: ++ while True: ++ time.sleep(1) ++ tmp = transfer_service.get() ++ if time.time() > endt: ++ raise RuntimeError("timed out waiting for transfer " + ++ "to finalize") ++ except sdk.NotFoundError: ++ pass ++ ++ # Write the disk ID file. Only do this on successful completion. ++ with builtins.open(params['diskid_file'], 'w') as fp: ++ fp.write(disk.id) ++ ++ except: ++ # Otherwise on any failure we must clean up the disk. ++ delete_disk_on_failure(h) ++ raise ++ ++ connection.close() +diff --git a/v2v/rhv-upload-precheck.py b/v2v/rhv-upload-precheck.py +new file mode 100644 +index 000000000..2798a29dd +--- /dev/null ++++ b/v2v/rhv-upload-precheck.py +@@ -0,0 +1,73 @@ ++# -*- python -*- ++# oVirt or RHV pre-upload checks used by ‘virt-v2v -o rhv-upload’ ++# Copyright (C) 2018 Red Hat Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program; if not, write to the Free Software Foundation, Inc., ++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++import json ++import logging ++import sys ++import time ++ ++from http.client import HTTPSConnection ++from urllib.parse import urlparse ++ ++import ovirtsdk4 as sdk ++import ovirtsdk4.types as types ++ ++# Parameters are passed in via a JSON doc from the OCaml code. ++# Because this Python code ships embedded inside virt-v2v there ++# is no formal API here. ++params = None ++ ++if len(sys.argv) != 2: ++ raise RuntimeError("incorrect number of parameters") ++ ++# Parameters are passed in via a JSON document. ++with open(sys.argv[1], 'r') as fp: ++ params = json.load(fp) ++ ++# What is passed in is a password file, read the actual password. ++with open(params['output_password'], 'r') as fp: ++ output_password = fp.read() ++output_password = output_password.rstrip() ++ ++# Parse out the username from the output_conn URL. ++parsed = urlparse(params['output_conn']) ++username = parsed.username or "admin@internal" ++ ++# Connect to the server. ++connection = sdk.Connection( ++ url = params['output_conn'], ++ username = username, ++ password = output_password, ++ ca_file = params['rhv_cafile'], ++ log = logging.getLogger(), ++ insecure = params['insecure'], ++) ++ ++system_service = connection.system_service() ++ ++# Find if a virtual machine already exists with that name. ++vms_service = system_service.vms_service() ++vms = vms_service.list( ++ search = ("name=%s" % params['output_name']), ++) ++if len(vms) > 0: ++ vm = vms[0] ++ raise RuntimeError("VM already exists with name ‘%s’, id ‘%s’" % ++ (params['output_name'], vm.id)) ++ ++# Otherwise everything is OK, exit with no error. +diff --git a/v2v/test-v2v-o-rhv-upload-oo-query.sh b/v2v/test-v2v-o-rhv-upload-oo-query.sh +new file mode 100755 +index 000000000..29d69e1c1 +--- /dev/null ++++ b/v2v/test-v2v-o-rhv-upload-oo-query.sh +@@ -0,0 +1,38 @@ ++#!/bin/bash - ++# libguestfs virt-v2v test script ++# Copyright (C) 2018 Red Hat Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++# Test -oo "?" option. ++ ++set -e ++ ++$TEST_FUNCTIONS ++skip_if_skipped ++ ++export VIRT_TOOLS_DATA_DIR="$top_srcdir/test-data/fake-virt-tools" ++export VIRTIO_WIN="$top_srcdir/test-data/fake-virtio-win" ++ ++f=test-v2v-o-rhv-upload-oo-query.actual ++rm -f $f ++ ++$VG virt-v2v --debug-gc \ ++ -o rhv-upload -oo "?" > $f ++ ++grep -- "-oo rhv-cafile" $f ++grep -- "-oo rhv-verifypeer" $f ++ ++rm $f +diff --git a/v2v/test-v2v-python-syntax.sh b/v2v/test-v2v-python-syntax.sh +new file mode 100755 +index 000000000..b167f4610 +--- /dev/null ++++ b/v2v/test-v2v-python-syntax.sh +@@ -0,0 +1,45 @@ ++#!/bin/bash - ++# libguestfs ++# Copyright (C) 2018 Red Hat Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++set -e ++ ++$TEST_FUNCTIONS ++skip_if_skipped ++ ++# Files to check. ++files="rhv-upload-createvm.py rhv-upload-plugin.py rhv-upload-precheck.py" ++ ++# Base version of Python. ++python=python3 ++ ++# Checks the files are syntactically correct, but not very much else. ++for f in $files; do ++ $python -m py_compile $f ++done ++ ++# Checks the files correspond to PEP8 coding style. ++# https://www.python.org/dev/peps/pep-0008/ ++if $python-pep8 --version >/dev/null 2>&1; then ++ for f in $files; do ++ # Ignore: ++ # E226 missing whitespace around arithmetic operator ++ # E251 unexpected spaces around keyword / parameter equals ++ # E302 expected 2 blank lines, found 1 ++ $python-pep8 --ignore=E226,E251,E302 $f ++ done ++fi +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 69ca23dfd..2d2f8cfd3 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -6,15 +6,18 @@ virt-v2v - Convert a guest to use KVM + + virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi vmware_guest + +- virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi vmware_guest \ +- -o rhv -os rhv.nfs:/export_domain --bridge ovirtmgmt +- + virt-v2v -i libvirtxml guest-domain.xml -o local -os /var/tmp + + virt-v2v -i disk disk.img -o local -os /var/tmp + + virt-v2v -i disk disk.img -o glance + ++ virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi vmware_guest \ ++ -o rhv-upload -oc https://ovirt-engine.example.com/ovirt-engine/api \ ++ -os ovirt-data -op /tmp/ovirt-admin-password -of raw \ ++ -oo rhv-cafile=/tmp/ca.pem -oo rhv-direct \ ++ --bridge ovirtmgmt ++ + virt-v2v -ic qemu:///system qemu_guest --in-place + + =head1 DESCRIPTION +@@ -52,20 +55,18 @@ For more information see L below. + =head2 Convert from VMware to RHV/oVirt + + This is the same as the previous example, except you want to send the +-guest to a RHV-M Export Storage Domain which is located remotely +-(over NFS) at C. If you are unclear about +-the location of the Export Storage Domain you should check the +-settings on your RHV-M management console. Guest network ++guest to a RHV Data Domain using the RHV REST API. Guest network + interface(s) are connected to the target network called C. + + virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi vmware_guest \ +- -o rhv -os rhv.nfs:/export_domain --bridge ovirtmgmt ++ -o rhv-upload -oc https://ovirt-engine.example.com/ovirt-engine/api \ ++ -os ovirt-data -op /tmp/ovirt-admin-password -of raw \ ++ -oo rhv-cafile=/tmp/ca.pem -oo rhv-direct \ ++ --bridge ovirtmgmt + + In this case the host running virt-v2v acts as a B. + +-Note that after conversion, the guest will appear in the RHV-M Export +-Storage Domain, from where you will need to import it using the RHV-M +-user interface. (See L). ++For more information see L below. + + =head2 Convert from ESXi hypervisor over SSH to local libvirt + +@@ -129,9 +130,9 @@ qemu, do: + Xen ───▶│ -i libvirt ──▶ │ │ │ (default) │ + ... ───▶│ (default) │ │ │ ──┐ └────────────┘ + └────────────┘ │ │ ─┐└──────▶ -o glance +- -i libvirtxml ─────────▶ │ │ ┐└─────────▶ -o rhv +- -i vmx ────────────────▶ │ │ └──────────▶ -o vdsm +- └────────────┘ ++ -i libvirtxml ─────────▶ │ │ ┐├─────────▶ -o rhv ++ -i vmx ────────────────▶ │ │ │└─────────▶ -o vdsm ++ └────────────┘ └──────────▶ -o rhv-upload + + Virt-v2v has a number of possible input and output modes, selected + using the I<-i> and I<-o> options. Only one input and output mode can +@@ -164,8 +165,9 @@ libvirt configuration file (mainly for testing). + I<-o qemu> writes to a local disk image with a shell script for + booting the guest directly in qemu (mainly for testing). + +-I<-o rhv> is used to write to a RHV / oVirt target. I<-o vdsm> +-is only used when virt-v2v runs under VDSM control. ++I<-o rhv-upload> is used to write to a RHV / oVirt target. I<-o rhv> ++is a legacy method to write to RHV / oVirt E 4.2. I<-o vdsm> is ++only used when virt-v2v runs under VDSM control. + + I<--in-place> instructs virt-v2v to customize the guest OS in the input + virtual machine, instead of creating a new VM in the target hypervisor. +@@ -550,6 +552,10 @@ written. + + This is the same as I<-o rhv>. + ++=item B<-o> B ++ ++This is the same as I<-o rhv-upload>. ++ + =item B<-o> B + + Set the output method to I. +@@ -574,6 +580,16 @@ I<-os> parameter must also be used to specify the location of the + Export Storage Domain. Note this does not actually import the guest + into RHV. You have to do that manually later using the UI. + ++See L below. ++ ++=item B<-o> B ++ ++Set the output method to I. ++ ++The converted guest is written directly to a RHV Data Domain. ++This is a faster method than I<-o rhv>, but requires oVirt ++or RHV E 4.2. ++ + See L below. + + =item B<-o> B +@@ -615,7 +631,33 @@ the output name is the same as the input name. + Set output option(s) related to the current output mode. + To display short help on what options are available you can use: + +- virt-v2v -o vdsm -oo "?" ++ virt-v2v -o rhv-upload -oo "?" ++ ++=item B<-oo rhv-cafile=>F ++ ++For I<-o rhv-upload> (L) only, the F file ++(Certificate Authority), copied from F ++on the oVirt engine. ++ ++=item B<-oo rhv-cluster=>C ++ ++For I<-o rhv-upload> (L) only, set the RHV Cluster ++Name. If not given it uses C. ++ ++=item B<-oo rhv-direct> ++ ++For I<-o rhv-upload> (L) only, if this option is given ++then virt-v2v will attempt to directly upload the disk to the oVirt ++node, otherwise it will proxy the upload through the oVirt engine. ++Direct upload requires that you have network access to the oVirt ++nodes. Non-direct upload is slightly slower but should work in all ++situations. ++ ++=item B<-oo rhv-verifypeer> ++ ++For I<-o rhv-upload> (L) only, verify the oVirt/RHV ++server’s identity by checking the server‘s certificate against the ++Certificate Authority. + + =item B<-oo vdsm-compat=0.10> + +@@ -1901,6 +1943,68 @@ Define the final guest in libvirt: + + =head1 OUTPUT TO RHV + ++This new method to upload guests to oVirt or RHV directly via the REST ++API requires oVirt/RHV E 4.2. ++ ++You need to specify I<-o rhv-upload> as well as the following extra ++parameters: ++ ++=over 4 ++ ++=item I<-oc> C ++ ++The URL of the REST API which is usually the server name with ++C appended, but might be different if you installed ++oVirt Engine on a different path. ++ ++You can optionally add a username and port number to the URL. If the ++username is not specified then virt-v2v defaults to using ++C which is the typical superuser account for oVirt ++instances. ++ ++=item I<-of raw> ++ ++Currently you must use I<-of raw> and you cannot use I<-oa preallocated>. ++ ++These restrictions will be loosened in a future version. ++ ++=item I<-op> F ++ ++A file containing a password to be used when connecting to the oVirt ++engine. Note the file should contain the whole password, B, and for security the file should have mode ++C<0600> so that others cannot read it. ++ ++=item I<-os> C ++ ++The storage domain. ++ ++=item I<-oo rhv-cafile=>F ++ ++The F file (Certificate Authority), copied from ++F on the oVirt engine. ++ ++=item I<-oo rhv-cluster=>C ++ ++Set the RHV Cluster Name. If not given it uses C. ++ ++=item I<-oo rhv-direct> ++ ++If this option is given then virt-v2v will attempt to directly upload ++the disk to the oVirt node, otherwise it will proxy the upload through ++the oVirt engine. Direct upload requires that you have network access ++to the oVirt nodes. Non-direct upload is slightly slower but should ++work in all situations. ++ ++=item I<-oo rhv-verifypeer> ++ ++Verify the oVirt/RHV server’s identity by checking the server‘s ++certificate against the Certificate Authority. ++ ++=back ++ ++=head1 OUTPUT TO RHV (OLD METHOD) ++ + This section only applies to the I<-o rhv> output mode. If you use + virt-v2v from the RHV-M user interface, then behind the scenes the + import is managed by VDSM using the I<-o vdsm> output mode (which end +-- +2.20.1 + diff --git a/SOURCES/0013-v2v-refer-to-the-right-embed-script-in-EXTRA_DIST.patch b/SOURCES/0013-v2v-refer-to-the-right-embed-script-in-EXTRA_DIST.patch new file mode 100644 index 0000000..293efd6 --- /dev/null +++ b/SOURCES/0013-v2v-refer-to-the-right-embed-script-in-EXTRA_DIST.patch @@ -0,0 +1,28 @@ +From 2648e807faaa94c080c33b8a0d70c078339c59f8 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 20 Apr 2018 13:00:56 +0200 +Subject: [PATCH] v2v: refer to the right embed script in EXTRA_DIST + +Fixes commit cc04573927cca97de60d544d37467e67c25867a7. + +(cherry picked from commit cf49fe100338aeac281c7cbcdfe743177ceb0606) +--- + v2v/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index 694a64573..3a0c80f44 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -31,7 +31,7 @@ EXTRA_DIST = \ + $(SOURCES_MLI) $(SOURCES_ML) $(SOURCES_C) \ + copy_to_local.ml \ + copy_to_local.mli \ +- embed-code.sh \ ++ embed.sh \ + rhv-upload-createvm.py \ + rhv-upload-plugin.py \ + rhv-upload-precheck.py \ +-- +2.20.1 + diff --git a/SOURCES/0014-v2v-o-rhv-upload-Don-t-require-of-raw-parameter.patch b/SOURCES/0014-v2v-o-rhv-upload-Don-t-require-of-raw-parameter.patch new file mode 100644 index 0000000..7bc509c --- /dev/null +++ b/SOURCES/0014-v2v-o-rhv-upload-Don-t-require-of-raw-parameter.patch @@ -0,0 +1,84 @@ +From 2e9cc6b2307668f330d11384bba63b70160d3e42 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 20 Apr 2018 11:48:47 +0100 +Subject: [PATCH] =?UTF-8?q?v2v:=20-o=20rhv-upload:=20Don't=20require=20?= + =?UTF-8?q?=E2=80=98-of=20raw=E2=80=99=20parameter.?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Because we checked the limitation of raw+sparse during command line +processing, it had the effect of forcing you to use ‘-of raw’ even if +the input was already in raw format. Move the checking to the output +mode to avoid this. + +Fixes commit cc04573927cca97de60d544d37467e67c25867a7. + +(cherry picked from commit b3769afaece360b8a2095e3d8a7a934d351c3ade) +--- + v2v/cmdline.ml | 5 ----- + v2v/output_rhv_upload.ml | 18 +++++++++++++++++- + 2 files changed, 17 insertions(+), 6 deletions(-) + +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index 9b1348c37..97d4f4377 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -586,11 +586,6 @@ read the man page virt-v2v(1). + | None -> + error (f_"-o rhv-upload: use ‘-oc’ to point to the oVirt or RHV server REST API URL, which is usually https://servername/ovirt-engine/api") + | Some oc -> oc in +- (* Output format / sparse must currently be raw+sparse. We can +- * change this in future. See TODO file for details. XXX +- *) +- if output_alloc <> Sparse || output_format <> Some "raw" then +- error (f_"-o rhv-upload: currently you must use ‘-of raw’ and you cannot use ‘-oa preallocated’ with this output mode. These restrictions will be loosened in a future version."); + (* In theory we could make the password optional in future. *) + let output_password = + match output_password with +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 129461242..dc0d96d53 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -169,6 +169,19 @@ See also \"OUTPUT TO RHV\" in the virt-v2v(1) manual.") + error (f_"nbdkit was compiled without SELinux support. You will have to recompile nbdkit with libselinux-devel installed, or else set SELinux to Permissive mode while doing the conversion.") + in + ++ (* Output format/sparse must be raw/sparse. We may be able to ++ * lift this limitation in future, but it requires changes on the ++ * RHV side. See TODO file for details. XXX ++ *) ++ let error_current_limitation required_param = ++ error (f_"rhv-upload: currently you must use ‘%s’. This restriction will be loosened in a future version.") required_param ++ in ++ ++ let error_unless_output_alloc_sparse () = ++ if output_alloc <> Sparse then ++ error_current_limitation "-oa sparse" ++ in ++ + (* JSON parameters which are invariant between disks. *) + let json_params = [ + "verbose", JSON.Bool (verbose ()); +@@ -220,6 +233,7 @@ object + error_unless_python_binary_on_path (); + error_unless_nbdkit_working (); + error_unless_nbdkit_python3_working (); ++ error_unless_output_alloc_sparse (); + if have_selinux then + error_unless_nbdkit_compiled_with_selinux () + +@@ -260,7 +274,9 @@ object + + let disk_format = + match t.target_format with +- | ("raw" | "qcow2") as fmt -> fmt ++ | "raw" as fmt -> fmt ++ | "qcow2" -> ++ error_current_limitation "-of raw" + | _ -> + error (f_"rhv-upload: -of %s: Only output format ‘raw’ or ‘qcow2’ is supported. If the input is in a different format then force one of these output formats by adding either ‘-of raw’ or ‘-of qcow2’ on the command line.") + t.target_format in +-- +2.20.1 + diff --git a/SOURCES/0015-v2v-o-rhv-upload-install-RHV-tools-RHBZ-1561828.patch b/SOURCES/0015-v2v-o-rhv-upload-install-RHV-tools-RHBZ-1561828.patch new file mode 100644 index 0000000..c5af50c --- /dev/null +++ b/SOURCES/0015-v2v-o-rhv-upload-install-RHV-tools-RHBZ-1561828.patch @@ -0,0 +1,31 @@ +From 1ddbe89dbc3877e6135e13413f97ee30a12c8e72 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= +Date: Sun, 22 Apr 2018 22:57:55 +0200 +Subject: [PATCH] v2v: -o rhv-upload: install RHV tools (RHBZ#1561828). +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Tomáš Golembiovský +(cherry picked from commit f3f00d3f9c6464aa31e3091bdee1191ef15512c6) +--- + v2v/output_rhv_upload.ml | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index dc0d96d53..0152b8d5a 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -247,6 +247,9 @@ object + + method supported_firmware = [ TargetBIOS ] + ++ (* rhev-apt.exe will be installed (if available). *) ++ method install_rhev_apt = true ++ + method prepare_targets source targets = + let output_name = source.s_name in + let json_params = +-- +2.20.1 + diff --git a/SOURCES/0016-v2v-Map-Windows-Server-2012-R2-x86-64-to-ovirt-ID-25.patch b/SOURCES/0016-v2v-Map-Windows-Server-2012-R2-x86-64-to-ovirt-ID-25.patch new file mode 100644 index 0000000..1bcdd9e --- /dev/null +++ b/SOURCES/0016-v2v-Map-Windows-Server-2012-R2-x86-64-to-ovirt-ID-25.patch @@ -0,0 +1,30 @@ +From c2570c81e8c3dffadbcfa5c857a38ae858745f9e Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 1 May 2018 11:30:11 +0100 +Subject: [PATCH] v2v: Map Windows Server 2012 R2 x86-64 to ovirt ID 25. + +Thanks: Michal Skrivanek + +Fixes commit 593a19cc86cfa8f24c66518c8ba21222550b066a. + +(cherry picked from commit c6e89299299f1f620437ac3d05a1f0f12de0f208) +--- + v2v/create_ovf.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml +index b1ab8df3f..b3beb1eba 100644 +--- a/v2v/create_ovf.ml ++++ b/v2v/create_ovf.ml +@@ -418,7 +418,7 @@ and get_ovirt_osid = function + + | { i_type = "windows"; i_major_version = 6; i_minor_version = 3; + i_arch = "x86_64" } -> +- 23 ++ 25 + + | { i_type = "windows"; i_major_version = 10; i_minor_version = 0; + i_arch = "i386" } -> +-- +2.20.1 + diff --git a/SOURCES/0017-v2v-fix-build-rules-for-output_rhv_upload_-_source.m.patch b/SOURCES/0017-v2v-fix-build-rules-for-output_rhv_upload_-_source.m.patch new file mode 100644 index 0000000..60d632e --- /dev/null +++ b/SOURCES/0017-v2v-fix-build-rules-for-output_rhv_upload_-_source.m.patch @@ -0,0 +1,54 @@ +From b31fcaf9879b9f4fe36a19e439895a867a1fbc72 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 22 May 2018 17:24:18 +0200 +Subject: [PATCH] v2v: fix build rules for output_rhv_upload_*_source.ml files + +Use the $(srcdir) variable where needed, to make sure it builds also +with srcdir != builddir. + +Furthermore, make sure that the OCaml dependencies calculation depend on +the generated output_rhv_upload_*_source.ml files, otherwise there will +be incomplete OCaml rules for them in the generated .depend. + +Fixes commit cc04573927cca97de60d544d37467e67c25867a7. + +(cherry picked from commit a4e3b7c0598370d8d068b21909da95b6031eb688) +--- + v2v/Makefile.am | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index 3a0c80f44..7de050b06 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -143,12 +143,12 @@ SOURCES_C = \ + + # These files are generated and contain rhv-upload-*.py embedded as an + # OCaml string. +-output_rhv_upload_createvm_source.ml: rhv-upload-createvm.py +- ./embed.sh code $^ $@ +-output_rhv_upload_plugin_source.ml: rhv-upload-plugin.py +- ./embed.sh code $^ $@ +-output_rhv_upload_precheck_source.ml: rhv-upload-precheck.py +- ./embed.sh code $^ $@ ++output_rhv_upload_createvm_source.ml: $(srcdir)/rhv-upload-createvm.py ++ $(srcdir)/embed.sh code $^ $@ ++output_rhv_upload_plugin_source.ml: $(srcdir)/rhv-upload-plugin.py ++ $(srcdir)/embed.sh code $^ $@ ++output_rhv_upload_precheck_source.ml: $(srcdir)/rhv-upload-precheck.py ++ $(srcdir)/embed.sh code $^ $@ + + if HAVE_OCAML + +@@ -575,7 +575,7 @@ v2v_unit_tests_LINK = \ + $(v2v_unit_tests_THEOBJECTS) -o $@ + + # Dependencies. +-.depend: $(srcdir)/*.mli $(srcdir)/*.ml ++.depend: $(srcdir)/*.mli $(srcdir)/*.ml output_rhv_upload_createvm_source.ml output_rhv_upload_plugin_source.ml output_rhv_upload_precheck_source.ml + $(top_builddir)/ocaml-dep.sh $^ + -include .depend + +-- +2.20.1 + diff --git a/SOURCES/0018-v2v-fix-rhevexp-typo-in-documentation.patch b/SOURCES/0018-v2v-fix-rhevexp-typo-in-documentation.patch new file mode 100644 index 0000000..ec30ca2 --- /dev/null +++ b/SOURCES/0018-v2v-fix-rhevexp-typo-in-documentation.patch @@ -0,0 +1,37 @@ +From bd2afb6e11b107aa7f158136ff6d4fb24732b2bf Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 29 May 2018 06:49:23 +0200 +Subject: [PATCH] v2v: fix "rhevexp" typo in documentation + +Spotted by Ming Xie. + +(cherry picked from commit c021ac5e64053052a392762aaff9c8ed73fc2082) +--- + v2v/virt-v2v.pod | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 2d2f8cfd3..f012ea533 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -728,7 +728,7 @@ Currently there are two possible flavours: + + =over 4 + +-=item rhevexp ++=item rhvexp + + The OVF format used in RHV export storage domain. + +@@ -738,7 +738,7 @@ The OVF format understood by oVirt REST API. + + =back + +-For backward compatibility the default is I, but this may change in ++For backward compatibility the default is I, but this may change in + the future. + + =item B<-op> file +-- +2.20.1 + diff --git a/SOURCES/0019-v2v-add-and-use-Create_ovf.ovf_flavour_to_string.patch b/SOURCES/0019-v2v-add-and-use-Create_ovf.ovf_flavour_to_string.patch new file mode 100644 index 0000000..df1dc44 --- /dev/null +++ b/SOURCES/0019-v2v-add-and-use-Create_ovf.ovf_flavour_to_string.patch @@ -0,0 +1,66 @@ +From 973810a232b2f2a33425d28287e0ec77c483279a Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 29 May 2018 07:04:50 +0200 +Subject: [PATCH] v2v: add and use Create_ovf.ovf_flavour_to_string + +Add an helper to convert an OVF flavour to string, and use it in +-o vdsm to print the actual value of the vdsm-ovf-flavour option. + +Thanks to Ming Xie. + +(cherry picked from commit c0da02f90d9b52413c24dd9dae61662ad033cc16) +--- + v2v/create_ovf.ml | 4 ++++ + v2v/create_ovf.mli | 3 +++ + v2v/output_vdsm.ml | 5 +++-- + 3 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml +index b3beb1eba..9e0c772fd 100644 +--- a/v2v/create_ovf.ml ++++ b/v2v/create_ovf.ml +@@ -40,6 +40,10 @@ let ovf_flavour_of_string = function + | "rhvexp" -> RHVExportStorageDomain + | flav -> invalid_arg flav + ++let ovf_flavour_to_string = function ++ | OVirt -> "ovirt" ++ | RHVExportStorageDomain -> "rhvexp" ++ + (* We set the creation time to be the same for all dates in + * all metadata files. All dates in OVF are UTC. + *) +diff --git a/v2v/create_ovf.mli b/v2v/create_ovf.mli +index 2d80660e3..8200b76f9 100644 +--- a/v2v/create_ovf.mli ++++ b/v2v/create_ovf.mli +@@ -29,6 +29,9 @@ val ovf_flavours : string list + valid flavour. *) + val ovf_flavour_of_string : string -> ovf_flavour + ++(** Convert an OVF flavour to its string representation. *) ++val ovf_flavour_to_string : ovf_flavour -> string ++ + (** Create OVF and related files for RHV. + + The format for RHV export storage domain is described in: +diff --git a/v2v/output_vdsm.ml b/v2v/output_vdsm.ml +index 92b3fd122..9a1b748bc 100644 +--- a/v2v/output_vdsm.ml ++++ b/v2v/output_vdsm.ml +@@ -118,9 +118,10 @@ object + | "0.10" -> "" (* currently this is the default, so don't print it *) + | s -> sprintf " -oo vdsm-compat=%s" s) + (match vdsm_options.ovf_flavour with +- | Create_ovf.OVirt -> "-oo vdsm-ovf-flavour=ovf" + (* currently this is the default, so don't print it *) +- | Create_ovf.RHVExportStorageDomain -> "") ++ | Create_ovf.RHVExportStorageDomain -> "" ++ | flav -> sprintf "-oo vdsm-ovf-flavour=%s" ++ (Create_ovf.ovf_flavour_to_string flav)) + + method supported_firmware = [ TargetBIOS ] + +-- +2.20.1 + diff --git a/SOURCES/0020-v2v-o-rhv-upload-Set-inactivity-timeout-RHBZ-1586198.patch b/SOURCES/0020-v2v-o-rhv-upload-Set-inactivity-timeout-RHBZ-1586198.patch new file mode 100644 index 0000000..f2b06af --- /dev/null +++ b/SOURCES/0020-v2v-o-rhv-upload-Set-inactivity-timeout-RHBZ-1586198.patch @@ -0,0 +1,42 @@ +From e61cbd740b84eb78a1ffc52223e4f1cc3202c978 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 5 Jun 2018 19:09:43 +0100 +Subject: [PATCH] v2v: -o rhv-upload: Set inactivity timeout (RHBZ#1586198). +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This increases the inactivity timeout for transfers from the default +(60 seconds in oVirt < 4.2.3, 600 seconds in >= 4.2.3), up to 1 hour, +so that we should never hit it for ordinary transfers. + +Note this requires oVirt >= 4.2.3. The corresponding oVirt fix was +https://bugzilla.redhat.com/1563278 + +I also replaced the deprecated ‘image’ parameter with ‘disk’. + +Thanks: Nir Soffer, Daniel Erez. +(cherry picked from commit f25404c65f8e078a3ca5bd5a1ab91343edd22506) +--- + v2v/rhv-upload-plugin.py | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 791c9e7d2..b4557b83c 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -123,9 +123,8 @@ def open(readonly): + # Create a new image transfer. + transfer = transfers_service.add( + types.ImageTransfer( +- image = types.Image( +- id = disk.id +- ) ++ disk = types.Disk(id = disk.id), ++ inactivity_timeout = 3600, + ) + ) + debug("transfer.id = %r" % transfer.id) +-- +2.20.1 + diff --git a/SOURCES/0021-New-API-inspect_get_osinfo.patch b/SOURCES/0021-New-API-inspect_get_osinfo.patch new file mode 100644 index 0000000..a5796d6 --- /dev/null +++ b/SOURCES/0021-New-API-inspect_get_osinfo.patch @@ -0,0 +1,136 @@ +From 24aef5baa9725e26efd37fa78b83f98629d77eba Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Wed, 21 Feb 2018 17:33:28 +0100 +Subject: [PATCH] New API: inspect_get_osinfo + +Try to guess the possible osinfo-db short ID for the specified OS. + +Related to: https://bugzilla.redhat.com/show_bug.cgi?id=1544842 + +(cherry picked from commit 286b88891c2288fb7f64c9538296599ece04bcb1) +--- + generator/actions_inspection.ml | 14 ++++++ + lib/Makefile.am | 1 + + lib/inspect-osinfo.c | 75 +++++++++++++++++++++++++++++++++ + 3 files changed, 90 insertions(+) + create mode 100644 lib/inspect-osinfo.c + +diff --git a/generator/actions_inspection.ml b/generator/actions_inspection.ml +index 0ac282435..ff5083114 100644 +--- a/generator/actions_inspection.ml ++++ b/generator/actions_inspection.ml +@@ -770,4 +770,18 @@ advice before using trademarks in applications. + + =back" }; + ++ { defaults with ++ name = "inspect_get_osinfo"; added = (1, 39, 1); ++ style = RString (RPlainString, "id"), [String (Mountable, "root")], []; ++ shortdesc = "get a possible osinfo short ID corresponding to this operating system"; ++ longdesc = "\ ++This function returns a possible short ID for libosinfo corresponding ++to the guest. ++ ++I The returned ID is only a guess by libguestfs, and nothing ++ensures that it actually exists in osinfo-db. ++ ++If no ID could not be determined, then the string C is ++returned." }; ++ + ] +diff --git a/lib/Makefile.am b/lib/Makefile.am +index d075174d9..742b182cc 100644 +--- a/lib/Makefile.am ++++ b/lib/Makefile.am +@@ -95,6 +95,7 @@ libguestfs_la_SOURCES = \ + info.c \ + inspect-apps.c \ + inspect-icon.c \ ++ inspect-osinfo.c \ + journal.c \ + launch.c \ + launch-direct.c \ +diff --git a/lib/inspect-osinfo.c b/lib/inspect-osinfo.c +new file mode 100644 +index 000000000..816d317f1 +--- /dev/null ++++ b/lib/inspect-osinfo.c +@@ -0,0 +1,75 @@ ++/* libguestfs ++ * Copyright (C) 2018 Red Hat Inc. ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include ++ ++#include "guestfs.h" ++#include "guestfs-internal.h" ++#include "guestfs-internal-actions.h" ++ ++char * ++guestfs_impl_inspect_get_osinfo (guestfs_h *g, const char *root) ++{ ++ CLEANUP_FREE char *type = NULL; ++ CLEANUP_FREE char *distro = NULL; ++ int major, minor; ++ ++ type = guestfs_inspect_get_type (g, root); ++ if (!type) ++ return NULL; ++ distro = guestfs_inspect_get_distro (g, root); ++ if (!distro) ++ return NULL; ++ major = guestfs_inspect_get_major_version (g, root); ++ minor = guestfs_inspect_get_minor_version (g, root); ++ ++ if (STREQ (type, "linux")) { ++ if (STREQ (distro, "centos")) { ++ if (major >= 7) ++ return safe_asprintf (g, "%s%d.0", distro, major); ++ else if (major == 6) ++ return safe_asprintf (g, "%s%d.%d", distro, major, minor); ++ } ++ else if (STREQ (distro, "debian")) { ++ if (major >= 4) ++ return safe_asprintf (g, "%s%d", distro, major); ++ } ++ else if (STREQ (distro, "fedora") || STREQ (distro, "mageia")) ++ return safe_asprintf (g, "%s%d", distro, major); ++ else if (STREQ (distro, "sles")) { ++ if (minor == 0) ++ return safe_asprintf (g, "%s%d", distro, major); ++ else ++ return safe_asprintf (g, "%s%dsp%d", distro, major, minor); ++ } ++ else if (STREQ (distro, "ubuntu")) ++ return safe_asprintf (g, "%s%d.%02d", distro, major, minor); ++ ++ if (major > 0 || minor > 0) ++ return safe_asprintf (g, "%s%d.%d", distro, major, minor); ++ } ++ else if (STREQ (type, "freebsd") || STREQ (type, "netbsd") || STREQ (type, "openbsd")) ++ return safe_asprintf (g, "%s%d.%d", distro, major, minor); ++ else if (STREQ (type, "dos")) { ++ if (STREQ (distro, "msdos")) ++ return safe_strdup (g, "msdos6.22"); ++ } ++ ++ /* No ID could be guessed, return "unknown". */ ++ return safe_strdup (g, "unknown"); ++} +-- +2.20.1 + diff --git a/SOURCES/0022-inspector-show-the-per-OS-osinfo-guess-RHBZ-1544842.patch b/SOURCES/0022-inspector-show-the-per-OS-osinfo-guess-RHBZ-1544842.patch new file mode 100644 index 0000000..ce63327 --- /dev/null +++ b/SOURCES/0022-inspector-show-the-per-OS-osinfo-guess-RHBZ-1544842.patch @@ -0,0 +1,99 @@ +From ee00f39eea1c97c5fcb9948b30586c9c106356d7 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Wed, 21 Feb 2018 17:37:30 +0100 +Subject: [PATCH] inspector: show the per-OS osinfo guess (RHBZ#1544842) + +Output also the osinfo guess for each OS in the generated XML output; +adapt the RNG schema, and the test data to it. + +(cherry picked from commit 2f8ec91fc1f3e81c8fb81d45849bc7462ee13642) +--- + inspector/expected-coreos.img.xml | 1 + + inspector/expected-debian.img.xml | 1 + + inspector/expected-fedora.img.xml | 1 + + inspector/expected-ubuntu.img.xml | 1 + + inspector/inspector.c | 7 +++++++ + inspector/virt-inspector.rng | 1 + + 6 files changed, 12 insertions(+) + +diff --git a/inspector/expected-coreos.img.xml b/inspector/expected-coreos.img.xml +index e4a5d1134..0cdfba6e6 100644 +--- a/inspector/expected-coreos.img.xml ++++ b/inspector/expected-coreos.img.xml +@@ -8,6 +8,7 @@ + 899 + 13 + coreos.invalid ++ coreos899.13 + + / + /usr +diff --git a/inspector/expected-debian.img.xml b/inspector/expected-debian.img.xml +index 37ecfa049..6583dc262 100644 +--- a/inspector/expected-debian.img.xml ++++ b/inspector/expected-debian.img.xml +@@ -11,6 +11,7 @@ + deb + apt + debian.invalid ++ debian5 + + / + /usr +diff --git a/inspector/expected-fedora.img.xml b/inspector/expected-fedora.img.xml +index 8d40e8cb7..df6060a73 100644 +--- a/inspector/expected-fedora.img.xml ++++ b/inspector/expected-fedora.img.xml +@@ -11,6 +11,7 @@ + rpm + yum + fedora.invalid ++ fedora14 + + / + /boot +diff --git a/inspector/expected-ubuntu.img.xml b/inspector/expected-ubuntu.img.xml +index c19c14cd5..4ebcd76d6 100644 +--- a/inspector/expected-ubuntu.img.xml ++++ b/inspector/expected-ubuntu.img.xml +@@ -11,6 +11,7 @@ + deb + apt + ubuntu.invalid ++ ubuntu10.10 + + / + /boot +diff --git a/inspector/inspector.c b/inspector/inspector.c +index d608b1b63..5075a8f04 100644 +--- a/inspector/inspector.c ++++ b/inspector/inspector.c +@@ -443,6 +443,13 @@ output_root (xmlTextWriterPtr xo, char *root) + BAD_CAST str)); + free (str); + ++ str = guestfs_inspect_get_osinfo (g, root); ++ if (!str) exit (EXIT_FAILURE); ++ if (STRNEQ (str, "unknown")) ++ XMLERROR (-1, ++ xmlTextWriterWriteElement (xo, BAD_CAST "osinfo", BAD_CAST str)); ++ free (str); ++ + output_mountpoints (xo, root); + + output_filesystems (xo, root); +diff --git a/inspector/virt-inspector.rng b/inspector/virt-inspector.rng +index 314785202..1e3a58af8 100644 +--- a/inspector/virt-inspector.rng ++++ b/inspector/virt-inspector.rng +@@ -38,6 +38,7 @@ + + + ++ + + + +-- +2.20.1 + diff --git a/SOURCES/0023-v2v-o-rhv-upload-Optimize-http-request-sending.patch b/SOURCES/0023-v2v-o-rhv-upload-Optimize-http-request-sending.patch new file mode 100644 index 0000000..0dcf716 --- /dev/null +++ b/SOURCES/0023-v2v-o-rhv-upload-Optimize-http-request-sending.patch @@ -0,0 +1,90 @@ +From 5917bdc15f3b2e0c96ba5a9860cd36f968a28ec2 Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Thu, 14 Jun 2018 21:16:01 +0300 +Subject: [PATCH] v2v: -o rhv-upload: Optimize http request sending + +When sending request with small or no payload, it is simpler and +possibly more efficient to use the high level HTTPSConnection.request(), +instead of the lower level APIs. + +The only reason to use the lower level APIs is to avoid copying the +payload, or on python 2, to use a bigger buffer size when streaming a +file-like object. + +(cherry picked from commit 77a412c0a1cd0e303a072fc5088c8f3bfed36583) +--- + v2v/rhv-upload-plugin.py | 35 ++++++++++++++++------------------- + 1 file changed, 16 insertions(+), 19 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index b4557b83c..9ad354b84 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -237,12 +237,12 @@ def pread(h, count, offset): + transfer = h['transfer'] + transfer_service = h['transfer_service'] + +- http.putrequest("GET", h['path']) ++ headers = {"Range", "bytes=%d-%d" % (offset, offset+count-1)} + # Authorization is only needed for old imageio. + if h['needs_auth']: +- http.putheader("Authorization", transfer.signed_ticket) +- http.putheader("Range", "bytes=%d-%d" % (offset, offset+count-1)) +- http.endheaders() ++ headers["Authorization"] = transfer.signed_ticket ++ ++ http.request("GET", h['path'], headers=headers) + + r = http.getresponse() + # 206 = HTTP Partial Content. +@@ -297,11 +297,10 @@ def zero(h, count, offset, may_trim): + 'size': count, + 'flush': False}).encode() + +- http.putrequest("PATCH", h['path']) +- http.putheader("Content-Type", "application/json") +- http.putheader("Content-Length", len(buf)) +- http.endheaders() +- http.send(buf) ++ headers = {"Content-Type": "application/json", ++ "Content-Length": str(len(buf))} ++ ++ http.request("PATCH", h['path'], body=buf, headers=headers) + + r = http.getresponse() + if r.status != 200: +@@ -349,11 +348,10 @@ def trim(h, count, offset): + 'size': count, + 'flush': False}).encode() + +- http.putrequest("PATCH", h['path']) +- http.putheader("Content-Type", "application/json") +- http.putheader("Content-Length", len(buf)) +- http.endheaders() +- http.send(buf) ++ headers = {"Content-Type": "application/json", ++ "Content-Length": str(len(buf))} ++ ++ http.request("PATCH", h['path'], body=buf, headers=headers) + + r = http.getresponse() + if r.status != 200: +@@ -370,11 +368,10 @@ def flush(h): + # Construct the JSON request for flushing. + buf = json.dumps({'op': "flush"}).encode() + +- http.putrequest("PATCH", h['path']) +- http.putheader("Content-Type", "application/json") +- http.putheader("Content-Length", len(buf)) +- http.endheaders() +- http.send(buf) ++ headers = {"Content-Type": "application/json", ++ "Content-Length": str(len(buf))} ++ ++ http.request("PATCH", h['path'], body=buf, headers=headers) + + r = http.getresponse() + if r.status != 200: +-- +2.20.1 + diff --git a/SOURCES/0024-v2v-o-rhv-upload-Log-full-imageio-response-on-failur.patch b/SOURCES/0024-v2v-o-rhv-upload-Log-full-imageio-response-on-failur.patch new file mode 100644 index 0000000..4bbc3fb --- /dev/null +++ b/SOURCES/0024-v2v-o-rhv-upload-Log-full-imageio-response-on-failur.patch @@ -0,0 +1,153 @@ +From c2ed35e2bc17bcacf333626b21cd6796d4d8d6cf Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 5 Jun 2018 13:27:43 +0100 +Subject: [PATCH] v2v: -o rhv-upload: Log full imageio response on failure. + +Thanks: Nir Soffer +(cherry picked from commit 831a75cd11c5a87e40fccdadcb62353f6a4d5a72) +--- + v2v/rhv-upload-plugin.py | 69 ++++++++++++++++++++++++---------------- + 1 file changed, 42 insertions(+), 27 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 9ad354b84..7c5084efd 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -227,6 +227,32 @@ def can_flush(h): + def get_size(h): + return params['disk_size'] + ++# Any unexpected HTTP response status from the server will end up ++# calling this function which logs the full error, pauses the ++# transfer, sets the failed state, and raises a RuntimeError ++# exception. ++def request_failed(h, r, msg): ++ # Setting the failed flag in the handle causes the disk to be ++ # cleaned up on close. ++ h['failed'] = True ++ h['transfer_service'].pause() ++ ++ status = r.status ++ reason = r.reason ++ try: ++ body = r.read() ++ except EnvironmentError as e: ++ body = "(Unable to read response body: %s)" % e ++ ++ # Log the full error if we're verbose. ++ debug("unexpected response from imageio server:") ++ debug(msg) ++ debug("%d: %s" % (status, reason)) ++ debug(body) ++ ++ # Only a short error is included in the exception. ++ raise RuntimeError("%s: %d %s: %r", msg, status, reason, body[:200]) ++ + # For documentation see: + # https://github.com/oVirt/ovirt-imageio/blob/master/docs/random-io.md + # For examples of working code to read/write from the server, see: +@@ -247,16 +273,14 @@ def pread(h, count, offset): + r = http.getresponse() + # 206 = HTTP Partial Content. + if r.status != 206: +- h['transfer_service'].pause() +- h['failed'] = True +- raise RuntimeError("could not read sector (%d, %d): %d: %s" % +- (offset, count, r.status, r.reason)) ++ request_failed(h, r, ++ "could not read sector offset %d size %d" % ++ (offset, count)) + return r.read() + + def pwrite(h, buf, offset): + http = h['http'] + transfer = h['transfer'] +- transfer_service = h['transfer_service'] + + count = len(buf) + h['highestwrite'] = max(h['highestwrite'], offset+count) +@@ -274,15 +298,13 @@ def pwrite(h, buf, offset): + + r = http.getresponse() + if r.status != 200: +- transfer_service.pause() +- h['failed'] = True +- raise RuntimeError("could not write sector (%d, %d): %d: %s" % +- (offset, count, r.status, r.reason)) ++ request_failed(h, r, ++ "could not write sector offset %d size %d" % ++ (offset, count)) + + def zero(h, count, offset, may_trim): + http = h['http'] + transfer = h['transfer'] +- transfer_service = h['transfer_service'] + + # Unlike the trim and flush calls, there is no 'can_zero' method + # so nbdkit could call this even if the server doesn't support +@@ -304,10 +326,9 @@ def zero(h, count, offset, may_trim): + + r = http.getresponse() + if r.status != 200: +- transfer_service.pause() +- h['failed'] = True +- raise RuntimeError("could not zero sector (%d, %d): %d: %s" % +- (offset, count, r.status, r.reason)) ++ request_failed(h, r, ++ "could not zero sector offset %d size %d" % ++ (offset, count)) + + def emulate_zero(h, count, offset): + # qemu-img convert starts by trying to zero/trim the whole device. +@@ -332,15 +353,13 @@ def emulate_zero(h, count, offset): + + r = http.getresponse() + if r.status != 200: +- transfer_service.pause() +- h['failed'] = True +- raise RuntimeError("could not write zeroes (%d, %d): %d: %s" % +- (offset, count, r.status, r.reason)) ++ request_failed(h, r, ++ "could not write zeroes offset %d size %d" % ++ (offset, count)) + + def trim(h, count, offset): + http = h['http'] + transfer = h['transfer'] +- transfer_service = h['transfer_service'] + + # Construct the JSON request for trimming. + buf = json.dumps({'op': "trim", +@@ -355,15 +374,13 @@ def trim(h, count, offset): + + r = http.getresponse() + if r.status != 200: +- transfer_service.pause() +- h['failed'] = True +- raise RuntimeError("could not trim sector (%d, %d): %d: %s" % +- (offset, count, r.status, r.reason)) ++ request_failed(h, r, ++ "could not trim sector offset %d size %d" % ++ (offset, count)) + + def flush(h): + http = h['http'] + transfer = h['transfer'] +- transfer_service = h['transfer_service'] + + # Construct the JSON request for flushing. + buf = json.dumps({'op': "flush"}).encode() +@@ -375,9 +392,7 @@ def flush(h): + + r = http.getresponse() + if r.status != 200: +- transfer_service.pause() +- h['failed'] = True +- raise RuntimeError("could not flush: %d: %s" % (r.status, r.reason)) ++ request_failed(h, r, "could not flush") + + def delete_disk_on_failure(h): + disk_service = h['disk_service'] +-- +2.20.1 + diff --git a/SOURCES/0025-v2v-rvh-upload-plugin-Always-read-the-response.patch b/SOURCES/0025-v2v-rvh-upload-plugin-Always-read-the-response.patch new file mode 100644 index 0000000..6ef3f33 --- /dev/null +++ b/SOURCES/0025-v2v-rvh-upload-plugin-Always-read-the-response.patch @@ -0,0 +1,112 @@ +From 6cd873ff9a6ba6fed0534a253148b4daf48f0190 Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Mon, 25 Jun 2018 19:22:13 +0300 +Subject: [PATCH] v2v: rvh-upload-plugin: Always read the response + +Python manual warns[1]: + + Note that you must have read the whole response before you can send + a new request to the server. + +The reason for this warning is exposed only when the server is using +keep alive connections. When the response is not read, sending a new +request will fail with: + + httplib.ResponseNotReady + +Even if Content-Length was 0 or the request has no content. The failure +looks like this when using --verbose: + +nbdkit: python[1]: debug: zero count=33554432 offset=0 may_trim=1 fua=0 +nbdkit: python[1]: debug: zero count=33554432 offset=33554432 may_trim=1 fua=0 +nbdkit: python[1]: error: /home/nsoffer/src/libguestfs/tmp/rhvupload.Au2B5I/rhv-upload-plugin.py: zero: error: Request-sent +nbdkit: python[1]: debug: sending error reply: Input/output error +qemu-img: error writing zeroes at offset 0: Input/output error + +Change all requests to read the whole response. + +Tested with imageio patch supporting keep alive connections: +https://gerrit.ovirt.org/#/c/92296/ + +[1] https://docs.python.org/3.8/library/http.client.html#http.client.HTTPConnection.getresponse + +(cherry picked from commit f4e0a8342dbeb2c779c76e1807a37b24a0c96feb) +--- + v2v/rhv-upload-plugin.py | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 7c5084efd..2eec375f7 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -197,11 +197,13 @@ def get_options(h): + http.endheaders() + + r = http.getresponse() ++ data = r.read() ++ + if r.status == 200: + # New imageio never needs authentication. + h['needs_auth'] = False + +- j = json.loads(r.read()) ++ j = json.loads(data) + h['can_zero'] = "zero" in j['features'] + h['can_trim'] = "trim" in j['features'] + h['can_flush'] = "flush" in j['features'] +@@ -276,6 +278,7 @@ def pread(h, count, offset): + request_failed(h, r, + "could not read sector offset %d size %d" % + (offset, count)) ++ + return r.read() + + def pwrite(h, buf, offset): +@@ -302,6 +305,8 @@ def pwrite(h, buf, offset): + "could not write sector offset %d size %d" % + (offset, count)) + ++ r.read() ++ + def zero(h, count, offset, may_trim): + http = h['http'] + transfer = h['transfer'] +@@ -330,6 +335,8 @@ def zero(h, count, offset, may_trim): + "could not zero sector offset %d size %d" % + (offset, count)) + ++ r.read() ++ + def emulate_zero(h, count, offset): + # qemu-img convert starts by trying to zero/trim the whole device. + # Since we've just created a new disk it's safe to ignore these +@@ -357,6 +364,8 @@ def emulate_zero(h, count, offset): + "could not write zeroes offset %d size %d" % + (offset, count)) + ++ r.read() ++ + def trim(h, count, offset): + http = h['http'] + transfer = h['transfer'] +@@ -378,6 +387,8 @@ def trim(h, count, offset): + "could not trim sector offset %d size %d" % + (offset, count)) + ++ r.read() ++ + def flush(h): + http = h['http'] + transfer = h['transfer'] +@@ -394,6 +405,8 @@ def flush(h): + if r.status != 200: + request_failed(h, r, "could not flush") + ++ r.read() ++ + def delete_disk_on_failure(h): + disk_service = h['disk_service'] + disk_service.remove() +-- +2.20.1 + diff --git a/SOURCES/0026-v2v-rhv-upload-plugin-Fix-name-error.patch b/SOURCES/0026-v2v-rhv-upload-plugin-Fix-name-error.patch new file mode 100644 index 0000000..a060ee6 --- /dev/null +++ b/SOURCES/0026-v2v-rhv-upload-plugin-Fix-name-error.patch @@ -0,0 +1,35 @@ +From 47fd85a883892e2070a2287cc9411896645ab3bf Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Mon, 25 Jun 2018 20:56:52 +0300 +Subject: [PATCH] v2v: rhv-upload-plugin: Fix name error + +"http" and "transfer" variables were missing in emulate_zero, so the +code would fail with NameError. This can happen only when communicating +with old imageio versions not supporting the "zero" feature. + +Testing with qemu-img 2.12 show that we never send emulated zero request +because of the highestwrite mechanism, but it can break with older +qemu-img-rhev used on RHEL. + +(cherry picked from commit 0ae61ce99c351f9cda598016fb55ccc50313df67) +--- + v2v/rhv-upload-plugin.py | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 2eec375f7..10887c031 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -338,6 +338,9 @@ def zero(h, count, offset, may_trim): + r.read() + + def emulate_zero(h, count, offset): ++ http = h['http'] ++ transfer = h['transfer'] ++ + # qemu-img convert starts by trying to zero/trim the whole device. + # Since we've just created a new disk it's safe to ignore these + # requests as long as they are smaller than the highest write seen. +-- +2.20.1 + diff --git a/SOURCES/0027-v2v-rhv-upload-plugin-Remove-unused-variables.patch b/SOURCES/0027-v2v-rhv-upload-plugin-Remove-unused-variables.patch new file mode 100644 index 0000000..6fe81d7 --- /dev/null +++ b/SOURCES/0027-v2v-rhv-upload-plugin-Remove-unused-variables.patch @@ -0,0 +1,52 @@ +From 6e683fa651864a04a1c4e2a326d84cfc9330d706 Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Tue, 26 Jun 2018 01:43:01 +0300 +Subject: [PATCH] v2v: rhv-upload-plugin: Remove unused variables + +Remove some instances of "transfer" and "transfer_service" that are not +used in current code. + +(cherry picked from commit 32ab53cecd78ee5c140f17e5792710698627d265) +--- + v2v/rhv-upload-plugin.py | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 10887c031..5c036c46a 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -263,7 +263,6 @@ def request_failed(h, r, msg): + def pread(h, count, offset): + http = h['http'] + transfer = h['transfer'] +- transfer_service = h['transfer_service'] + + headers = {"Range", "bytes=%d-%d" % (offset, offset+count-1)} + # Authorization is only needed for old imageio. +@@ -309,7 +308,6 @@ def pwrite(h, buf, offset): + + def zero(h, count, offset, may_trim): + http = h['http'] +- transfer = h['transfer'] + + # Unlike the trim and flush calls, there is no 'can_zero' method + # so nbdkit could call this even if the server doesn't support +@@ -371,7 +369,6 @@ def emulate_zero(h, count, offset): + + def trim(h, count, offset): + http = h['http'] +- transfer = h['transfer'] + + # Construct the JSON request for trimming. + buf = json.dumps({'op': "trim", +@@ -394,7 +391,6 @@ def trim(h, count, offset): + + def flush(h): + http = h['http'] +- transfer = h['transfer'] + + # Construct the JSON request for flushing. + buf = json.dumps({'op': "flush"}).encode() +-- +2.20.1 + diff --git a/SOURCES/0028-v2v-o-rhv-upload-Always-fetch-server-options-when-op.patch b/SOURCES/0028-v2v-o-rhv-upload-Always-fetch-server-options-when-op.patch new file mode 100644 index 0000000..5beb1d9 --- /dev/null +++ b/SOURCES/0028-v2v-o-rhv-upload-Always-fetch-server-options-when-op.patch @@ -0,0 +1,122 @@ +From 1d2058c08b9eff607127d199b574273100e9ba55 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 19 Jun 2018 18:02:21 +0100 +Subject: [PATCH] v2v: -o rhv-upload: Always fetch server options when opening + the connection. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Previously we lazily requested the server options in the can_* +callbacks. The can_* callbacks are always called by nbdkit straight +after open, so this just adds complexity for no benefit. This change +simply makes the code always fetch the server options during the open +callback. + +This is — functionally at least — mostly just refactoring. However I +also added a useful debug message so we can see what features the +imageio server is offering. + +(cherry picked from commit a1e1f6ec887c2a7973612d2edf7066fd3194ba0b) +--- + v2v/rhv-upload-plugin.py | 63 +++++++++++++++++++--------------------- + 1 file changed, 30 insertions(+), 33 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 5c036c46a..f215eaecf 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -165,34 +165,13 @@ def open(readonly): + context = context + ) + +- # Save everything we need to make requests in the handle. +- return { +- 'can_flush': False, +- 'can_trim': False, +- 'can_zero': False, +- 'connection': connection, +- 'disk': disk, +- 'disk_service': disk_service, +- 'failed': False, +- 'got_options': False, +- 'highestwrite': 0, +- 'http': http, +- 'needs_auth': not params['rhv_direct'], +- 'path': destination_url.path, +- 'transfer': transfer, +- 'transfer_service': transfer_service, +- } ++ # The first request is to fetch the features of the server. ++ needs_auth = not params['rhv_direct'] ++ can_flush = False ++ can_trim = False ++ can_zero = False + +-# Can we issue zero, trim or flush requests? +-def get_options(h): +- if h['got_options']: +- return +- h['got_options'] = True +- +- http = h['http'] +- transfer = h['transfer'] +- +- http.putrequest("OPTIONS", h['path']) ++ http.putrequest("OPTIONS", destination_url.path) + http.putheader("Authorization", transfer.signed_ticket) + http.endheaders() + +@@ -201,12 +180,12 @@ def get_options(h): + + if r.status == 200: + # New imageio never needs authentication. +- h['needs_auth'] = False ++ needs_auth = False + + j = json.loads(data) +- h['can_zero'] = "zero" in j['features'] +- h['can_trim'] = "trim" in j['features'] +- h['can_flush'] = "flush" in j['features'] ++ can_flush = "flush" in j['features'] ++ can_trim = "trim" in j['features'] ++ can_zero = "zero" in j['features'] + + # Old imageio servers returned either 405 Method Not Allowed or + # 204 No Content (with an empty body). If we see that we leave +@@ -218,12 +197,30 @@ def get_options(h): + raise RuntimeError("could not use OPTIONS request: %d: %s" % + (r.status, r.reason)) + ++ debug("imageio features: flush=%r trim=%r zero=%r" % ++ (can_flush, can_trim, can_zero)) ++ ++ # Save everything we need to make requests in the handle. ++ return { ++ 'can_flush': can_flush, ++ 'can_trim': can_trim, ++ 'can_zero': can_zero, ++ 'connection': connection, ++ 'disk': disk, ++ 'disk_service': disk_service, ++ 'failed': False, ++ 'highestwrite': 0, ++ 'http': http, ++ 'needs_auth': needs_auth, ++ 'path': destination_url.path, ++ 'transfer': transfer, ++ 'transfer_service': transfer_service, ++ } ++ + def can_trim(h): +- get_options(h) + return h['can_trim'] + + def can_flush(h): +- get_options(h) + return h['can_flush'] + + def get_size(h): +-- +2.20.1 + diff --git a/SOURCES/0029-v2v-o-rhv-upload-Use-Unix-domain-socket-to-access-im.patch b/SOURCES/0029-v2v-o-rhv-upload-Use-Unix-domain-socket-to-access-im.patch new file mode 100644 index 0000000..fcf9f43 --- /dev/null +++ b/SOURCES/0029-v2v-o-rhv-upload-Use-Unix-domain-socket-to-access-im.patch @@ -0,0 +1,141 @@ +From db7e06935bfd20e02110549371a5174e68a45cf0 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 18 Jun 2018 15:34:37 +0100 +Subject: [PATCH] v2v: -o rhv-upload: Use Unix domain socket to access imageio + (RHBZ#1588088). + +In the case where virt-v2v runs on the same server as the imageio +daemon that we are talking to, it may be possible to optimize access +using a Unix domain socket. + +This is only an optimization. If it fails or if we're not running on +the same server it will fall back to the usual HTTPS over TCP +connection. + +Thanks: Nir Soffer, Daniel Erez. +(cherry picked from commit b7a2e6270d53200d2df471c36a1fb2b46db8bbac) +--- + v2v/rhv-upload-plugin.py | 61 ++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 58 insertions(+), 3 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index f215eaecf..8805e3552 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -19,11 +19,12 @@ + import builtins + import json + import logging ++import socket + import ssl + import sys + import time + +-from http.client import HTTPSConnection ++from http.client import HTTPSConnection, HTTPConnection + from urllib.parse import urlparse + + import ovirtsdk4 as sdk +@@ -56,6 +57,28 @@ def debug(s): + print(s, file=sys.stderr) + sys.stderr.flush() + ++def find_host(connection): ++ """Return the current host object or None.""" ++ try: ++ with builtins.open("/etc/vdsm/vdsm.id") as f: ++ vdsm_id = f.readline().strip() ++ except Exception as e: ++ return None ++ debug("hw_id = %r" % vdsm_id) ++ ++ hosts_service = connection.system_service().hosts_service() ++ hosts = hosts_service.list( ++ search="hw_id=%s" % vdsm_id, ++ case_sensitive=False, ++ ) ++ if len(hosts) == 0: ++ return None ++ ++ host = hosts[0] ++ debug("host.id = %r" % host.id) ++ ++ return types.Host(id = host.id) ++ + def open(readonly): + # Parse out the username from the output_conn URL. + parsed = urlparse(params['output_conn']) +@@ -121,9 +144,11 @@ def open(readonly): + transfers_service = system_service.image_transfers_service() + + # Create a new image transfer. ++ host = find_host(connection) + transfer = transfers_service.add( + types.ImageTransfer( + disk = types.Disk(id = disk.id), ++ host = host, + inactivity_timeout = 3600, + ) + ) +@@ -170,6 +195,7 @@ def open(readonly): + can_flush = False + can_trim = False + can_zero = False ++ unix_socket = None + + http.putrequest("OPTIONS", destination_url.path) + http.putheader("Authorization", transfer.signed_ticket) +@@ -186,6 +212,7 @@ def open(readonly): + can_flush = "flush" in j['features'] + can_trim = "trim" in j['features'] + can_zero = "zero" in j['features'] ++ unix_socket = j.get('unix_socket') + + # Old imageio servers returned either 405 Method Not Allowed or + # 204 No Content (with an empty body). If we see that we leave +@@ -197,8 +224,17 @@ def open(readonly): + raise RuntimeError("could not use OPTIONS request: %d: %s" % + (r.status, r.reason)) + +- debug("imageio features: flush=%r trim=%r zero=%r" % +- (can_flush, can_trim, can_zero)) ++ debug("imageio features: flush=%r trim=%r zero=%r unix_socket=%r" % ++ (can_flush, can_trim, can_zero, unix_socket)) ++ ++ # If we are connected to imageio on the local host and the ++ # transfer features a unix_socket then we can reconnect to that. ++ if host is not None and unix_socket is not None: ++ try: ++ http = UnixHTTPConnection(unix_socket) ++ debug("optimizing connection using unix socket %r" % unix_socket) ++ except: ++ pass + + # Save everything we need to make requests in the handle. + return { +@@ -463,3 +499,22 @@ def close(h): + raise + + connection.close() ++ ++# Modify http.client.HTTPConnection to work over a Unix domain socket. ++# Derived from uhttplib written by Erik van Zijst under an MIT license. ++# (https://pypi.org/project/uhttplib/) ++# Ported to Python 3 by Irit Goihman. ++ ++class UnsupportedError(Exception): ++ pass ++ ++class UnixHTTPConnection(HTTPConnection): ++ def __init__(self, path, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): ++ self.path = path ++ HTTPConnection.__init__(self, "localhost", timeout=timeout) ++ ++ def connect(self): ++ self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) ++ if self.timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: ++ self.sock.settimeout(timeout) ++ self.sock.connect(self.path) +-- +2.20.1 + diff --git a/SOURCES/0030-v2v-improve-os-documentation-for-rhv-upload.patch b/SOURCES/0030-v2v-improve-os-documentation-for-rhv-upload.patch new file mode 100644 index 0000000..df374d6 --- /dev/null +++ b/SOURCES/0030-v2v-improve-os-documentation-for-rhv-upload.patch @@ -0,0 +1,29 @@ +From da504873e18fc1414d670f318c10d5fb512e05dd Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 29 Jun 2018 12:58:33 +0200 +Subject: [PATCH] v2v: improve -os documentation for rhv-upload + +Thanks to: Ming Xie + +(cherry picked from commit 8d33ff8ba415180dee8f1f91f3b4d16d72ec094e) +--- + v2v/virt-v2v.pod | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index f012ea533..893e47fb9 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -758,6 +758,9 @@ For I<-o libvirt>, this is a libvirt directory pool + For I<-o local> and I<-o qemu>, this is a directory name. The + directory must exist. + ++For I<-o rhv-upload>, this is the name of the destination Storage ++Domain. ++ + For I<-o rhv>, this can be an NFS path of the Export Storage Domain + of the form ChostE:EpathE>, eg: + +-- +2.20.1 + diff --git a/SOURCES/0031-v2v-rhv-upload-plugin-Remove-unneeded-auth.patch b/SOURCES/0031-v2v-rhv-upload-plugin-Remove-unneeded-auth.patch new file mode 100644 index 0000000..e7df93e --- /dev/null +++ b/SOURCES/0031-v2v-rhv-upload-plugin-Remove-unneeded-auth.patch @@ -0,0 +1,69 @@ +From a3e99c84e1aed2fc275be00292f86414c8d4432a Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Fri, 29 Jun 2018 17:41:10 +0300 +Subject: [PATCH] v2v: rhv-upload-plugin: Remove unneeded auth + +Old imageio proxy was using Authorization header for GET and PUT +requests. Remove unneeded authorization when sending OPTIONS request. + +Remove unneeded duplicated comments about authorization for old +imageio, and replace them with a comment when we set needs_auth. + +(cherry picked from commit d5f36bacf9bb6d4d244184551792989906f60896) +--- + v2v/rhv-upload-plugin.py | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 8805e3552..f404bd758 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -191,16 +191,17 @@ def open(readonly): + ) + + # The first request is to fetch the features of the server. ++ ++ # Authentication was needed only for GET and PUT requests when ++ # communicating with old imageio-proxy. + needs_auth = not params['rhv_direct'] ++ + can_flush = False + can_trim = False + can_zero = False + unix_socket = None + +- http.putrequest("OPTIONS", destination_url.path) +- http.putheader("Authorization", transfer.signed_ticket) +- http.endheaders() +- ++ http.request("OPTIONS", destination_url.path) + r = http.getresponse() + data = r.read() + +@@ -298,7 +299,6 @@ def pread(h, count, offset): + transfer = h['transfer'] + + headers = {"Range", "bytes=%d-%d" % (offset, offset+count-1)} +- # Authorization is only needed for old imageio. + if h['needs_auth']: + headers["Authorization"] = transfer.signed_ticket + +@@ -321,7 +321,6 @@ def pwrite(h, buf, offset): + h['highestwrite'] = max(h['highestwrite'], offset+count) + + http.putrequest("PUT", h['path'] + "?flush=n") +- # Authorization is only needed for old imageio. + if h['needs_auth']: + http.putheader("Authorization", transfer.signed_ticket) + # The oVirt server only uses the first part of the range, and the +@@ -378,7 +377,6 @@ def emulate_zero(h, count, offset): + # After that we must emulate them with writes. + if offset+count < h['highestwrite']: + http.putrequest("PUT", h['path']) +- # Authorization is only needed for old imageio. + if h['needs_auth']: + http.putheader("Authorization", transfer.signed_ticket) + http.putheader("Content-Range", +-- +2.20.1 + diff --git a/SOURCES/0032-v2v-rhv-upload-plugin-Improve-error-handling.patch b/SOURCES/0032-v2v-rhv-upload-plugin-Improve-error-handling.patch new file mode 100644 index 0000000..c86a08f --- /dev/null +++ b/SOURCES/0032-v2v-rhv-upload-plugin-Improve-error-handling.patch @@ -0,0 +1,66 @@ +From 8aaf7d89ef8b686840d3683fb27c4746624088a5 Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Sat, 30 Jun 2018 01:21:50 +0300 +Subject: [PATCH] v2v: rhv-upload-plugin: Improve error handling + +When optimizing the connection using unix socket, we handle these cases: + +- The local host is not an oVirt host (no /etc/vdsm/vdsm.id). +- The local host is an oVirt host, but is not registered with engine. +- Creating UnixHTTPConnection() fails. Unlikely and probably a bug in + the plugin, but we can recover by using the https connection. + +The current code handle these cases silently, making it harder to +understand why the unix socket optimization did no happen. Add debug +message to make this clear. + +Also comment in the error handler why we take this path instead of +failing the operation. + +(cherry picked from commit f5442d2f044b398efc992fb4d56c8d3096c781e6) +--- + v2v/rhv-upload-plugin.py | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index f404bd758..8e4052048 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -63,7 +63,10 @@ def find_host(connection): + with builtins.open("/etc/vdsm/vdsm.id") as f: + vdsm_id = f.readline().strip() + except Exception as e: ++ # This is most likely not an oVirt host. ++ debug("cannot read /etc/vdsm/vdsm.id, using any host: %s" % e) + return None ++ + debug("hw_id = %r" % vdsm_id) + + hosts_service = connection.system_service().hosts_service() +@@ -72,6 +75,8 @@ def find_host(connection): + case_sensitive=False, + ) + if len(hosts) == 0: ++ # This oVirt host is not registered with engine. ++ debug("cannot find host with hw_id=%r, using any host" % vdsm_id) + return None + + host = hosts[0] +@@ -233,9 +238,12 @@ def open(readonly): + if host is not None and unix_socket is not None: + try: + http = UnixHTTPConnection(unix_socket) ++ except Exception as e: ++ # Very unlikely failure, but we can recover by using the https ++ # connection. ++ debug("cannot create unix socket connection, using https: %s" % e) ++ else: + debug("optimizing connection using unix socket %r" % unix_socket) +- except: +- pass + + # Save everything we need to make requests in the handle. + return { +-- +2.20.1 + diff --git a/SOURCES/0033-v2v-rhv-upload-plugin-Optimize-only-direct-upload.patch b/SOURCES/0033-v2v-rhv-upload-plugin-Optimize-only-direct-upload.patch new file mode 100644 index 0000000..006b510 --- /dev/null +++ b/SOURCES/0033-v2v-rhv-upload-plugin-Optimize-only-direct-upload.patch @@ -0,0 +1,32 @@ +From 7b5ec5a6478276cec587c7d6a64b9a1ab26447b2 Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Sat, 30 Jun 2018 01:39:03 +0300 +Subject: [PATCH] v2v: rhv-upload-plugin: Optimize only direct upload + +The optimization to start the transfer on the local host makes sense +only when using the rhv-direct=true option. When using a proxy, let the +engine choose a host. + +(cherry picked from commit 891b5a0ec0f320acec0f06b64159eaf3dfbbfeaf) +--- + v2v/rhv-upload-plugin.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 8e4052048..da309e288 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -148,8 +148,8 @@ def open(readonly): + # Get a reference to the transfer service. + transfers_service = system_service.image_transfers_service() + +- # Create a new image transfer. +- host = find_host(connection) ++ # Create a new image transfer, using the local host is possible. ++ host = find_host(connection) if params['rhv_direct'] else None + transfer = transfers_service.add( + types.ImageTransfer( + disk = types.Disk(id = disk.id), +-- +2.20.1 + diff --git a/SOURCES/0034-v2v-rhv-plugin-find-suitable-host-RHBZ-1596810-RHBZ-.patch b/SOURCES/0034-v2v-rhv-plugin-find-suitable-host-RHBZ-1596810-RHBZ-.patch new file mode 100644 index 0000000..100554d --- /dev/null +++ b/SOURCES/0034-v2v-rhv-plugin-find-suitable-host-RHBZ-1596810-RHBZ-.patch @@ -0,0 +1,61 @@ +From e1401de974b6ac6d3e6e94e774f24a9b74f806f2 Mon Sep 17 00:00:00 2001 +From: Daniel Erez +Date: Thu, 5 Jul 2018 20:23:35 +0300 +Subject: [PATCH] v2v: rhv plugin - find suitable host (RHBZ#1596810) + (RHBZ#1596851) + +For direct upload, a suitable host must be in status 'Up' +and belong to the same datacenter as the created disk. +Added these criteria to the host search query. + +(cherry picked from commit 4ed1bc5a79a77ad3a620b339f9ac2ecc8df6fd03) +--- + v2v/rhv-upload-plugin.py | 28 ++++++++++++++++++++++++---- + 1 file changed, 24 insertions(+), 4 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index da309e288..931fcfaa2 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -69,14 +69,34 @@ def find_host(connection): + + debug("hw_id = %r" % vdsm_id) + +- hosts_service = connection.system_service().hosts_service() ++ system_service = connection.system_service() ++ storage_name = params['output_storage'] ++ data_centers = system_service.data_centers_service().list( ++ search='storage=%s' % storage_name, ++ case_sensitive=False, ++ ) ++ if len(data_centers) == 0: ++ # The storage domain is not attached to a datacenter ++ # (shouldn't happen, would fail on disk creation). ++ debug("storange domain (%s) is not attached to a DC" % storage_name) ++ return None ++ ++ datacenter = data_centers[0] ++ debug("datacenter = %s" % datacenter.name) ++ ++ hosts_service = system_service.hosts_service() + hosts = hosts_service.list( +- search="hw_id=%s" % vdsm_id, ++ search="hw_id=%s and datacenter=%s and status=Up" % (vdsm_id, datacenter.name), + case_sensitive=False, + ) + if len(hosts) == 0: +- # This oVirt host is not registered with engine. +- debug("cannot find host with hw_id=%r, using any host" % vdsm_id) ++ # Couldn't find a host that's fulfilling the following criteria: ++ # - 'hw_id' equals to 'vdsm_id' ++ # - Its status is 'Up' ++ # - Belongs to the storage domain's datacenter ++ debug("cannot find a running host with hw_id=%r, " \ ++ "that belongs to datacenter '%s', " \ ++ "using any host" % (vdsm_id, datacenter.name)) + return None + + host = hosts[0] +-- +2.20.1 + diff --git a/SOURCES/0035-v2v-change-QXL-ResourceType-in-OVirt-flavour-RHBZ-15.patch b/SOURCES/0035-v2v-change-QXL-ResourceType-in-OVirt-flavour-RHBZ-15.patch new file mode 100644 index 0000000..a384841 --- /dev/null +++ b/SOURCES/0035-v2v-change-QXL-ResourceType-in-OVirt-flavour-RHBZ-15.patch @@ -0,0 +1,41 @@ +From 77604b91ec01ddd7961e69b70727b8e8c6e4c50b Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 13 Jul 2018 13:24:07 +0200 +Subject: [PATCH] v2v: change QXL ResourceType in OVirt flavour (RHBZ#1598715) + +Due to a conflict with the IDs of the OVF standard, and the existing +implementation in ovirt-engine, the ID of QXL devices changed to a +different value. + +As a consequence, change the ResourceType of QXL devices, but only in +OVirt flavour to avoid breaking vdsm mode. + +See: https://bugzilla.redhat.com/show_bug.cgi?id=1598715#c5 +(cherry picked from commit aa9e18f6d1fd503822dfd2124b92a2c67704c4c1) +--- + v2v/create_ovf.ml | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml +index 9e0c772fd..5db239d66 100644 +--- a/v2v/create_ovf.ml ++++ b/v2v/create_ovf.ml +@@ -643,10 +643,14 @@ let rec create_ovf source targets guestcaps inspect + * See RHBZ#1213701 and RHBZ#1211231 for the reasoning + * behind that. + *) ++ let qxl_resourcetype = ++ match ovf_flavour with ++ | OVirt -> 32768 (* RHBZ#1598715 *) ++ | RHVExportStorageDomain -> 20 in + e "Item" [] [ + e "rasd:Caption" [] [PCData "Graphical Controller"]; + e "rasd:InstanceId" [] [PCData (uuidgen ())]; +- e "rasd:ResourceType" [] [PCData "20"]; ++ e "rasd:ResourceType" [] [PCData (string_of_int qxl_resourcetype)]; + e "Type" [] [PCData "video"]; + e "rasd:VirtualQuantity" [] [PCData "1"]; + e "rasd:Device" [] [PCData "qxl"]; +-- +2.20.1 + diff --git a/SOURCES/0036-v2v-o-rhv-upload-check-for-ovirtsdk4-RHBZ-1601943.patch b/SOURCES/0036-v2v-o-rhv-upload-check-for-ovirtsdk4-RHBZ-1601943.patch new file mode 100644 index 0000000..a6d91d9 --- /dev/null +++ b/SOURCES/0036-v2v-o-rhv-upload-check-for-ovirtsdk4-RHBZ-1601943.patch @@ -0,0 +1,40 @@ +From bb6b81861e72535f57bdc8e9a3457807f21ad28c Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 17 Jul 2018 17:12:38 +0200 +Subject: [PATCH] v2v: -o rhv-upload: check for ovirtsdk4 (RHBZ#1601943) + +Check earlier whether the ovirtsdk4 Python can be imported correctly, +to avoid errors later on during the migration. +--- + v2v/output_rhv_upload.ml | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 0152b8d5a..63fa2411a 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -126,6 +126,13 @@ class output_rhv_upload output_alloc output_conn + python3 + in + ++ (* Check that the 'ovirtsdk4' Python module is available. *) ++ let error_unless_ovirtsdk4_module_available () = ++ let res = run_command [ python3; "-c"; "import ovirtsdk4" ] in ++ if res <> 0 then ++ error (f_"the Python module ‘ovirtsdk4’ could not be loaded, is it installed? See previous messages for problems.") ++ in ++ + (* Check that nbdkit is available and new enough. *) + let error_unless_nbdkit_working () = + if 0 <> Sys.command "nbdkit --version >/dev/null" then +@@ -231,6 +238,7 @@ object + + method precheck () = + error_unless_python_binary_on_path (); ++ error_unless_ovirtsdk4_module_available (); + error_unless_nbdkit_working (); + error_unless_nbdkit_python3_working (); + error_unless_output_alloc_sparse (); +-- +2.20.1 + diff --git a/SOURCES/0037-v2v-rhv-plugin-fix-DC-search-string.patch b/SOURCES/0037-v2v-rhv-plugin-fix-DC-search-string.patch new file mode 100644 index 0000000..d3b0f69 --- /dev/null +++ b/SOURCES/0037-v2v-rhv-plugin-fix-DC-search-string.patch @@ -0,0 +1,29 @@ +From c0f9ab66655ec5ca3f065357d6797d0061f04fe0 Mon Sep 17 00:00:00 2001 +From: Daniel Erez +Date: Tue, 24 Jul 2018 19:16:10 +0300 +Subject: [PATCH] v2v: rhv plugin - fix DC search string + +Search for DC by 'storage.name=' to make it explicit. +I.e. "storage=" uses regex, so similar names can be +found in the search query. For example, searching for +a domain named FCSD, will find FCSD1 as well. +--- + v2v/rhv-upload-plugin.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 931fcfaa2..8274f1ee1 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -72,7 +72,7 @@ def find_host(connection): + system_service = connection.system_service() + storage_name = params['output_storage'] + data_centers = system_service.data_centers_service().list( +- search='storage=%s' % storage_name, ++ search='storage.name=%s' % storage_name, + case_sensitive=False, + ) + if len(data_centers) == 0: +-- +2.20.1 + diff --git a/SOURCES/0038-v2v-rhv-plugin-case-sensitive-search-queries.patch b/SOURCES/0038-v2v-rhv-plugin-case-sensitive-search-queries.patch new file mode 100644 index 0000000..9030fa4 --- /dev/null +++ b/SOURCES/0038-v2v-rhv-plugin-case-sensitive-search-queries.patch @@ -0,0 +1,35 @@ +From bc2ba2f47ba8a1f88ea6f3c14addd60e84423adf Mon Sep 17 00:00:00 2001 +From: Daniel Erez +Date: Wed, 25 Jul 2018 11:24:33 +0300 +Subject: [PATCH] v2v: rhv plugin - case-sensitive search queries + +Changed both search queries to case-sensitive (to ensure an exact match). +--- + v2v/rhv-upload-plugin.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 8274f1ee1..4fad27fb8 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -73,7 +73,7 @@ def find_host(connection): + storage_name = params['output_storage'] + data_centers = system_service.data_centers_service().list( + search='storage.name=%s' % storage_name, +- case_sensitive=False, ++ case_sensitive=True, + ) + if len(data_centers) == 0: + # The storage domain is not attached to a datacenter +@@ -87,7 +87,7 @@ def find_host(connection): + hosts_service = system_service.hosts_service() + hosts = hosts_service.list( + search="hw_id=%s and datacenter=%s and status=Up" % (vdsm_id, datacenter.name), +- case_sensitive=False, ++ case_sensitive=True, + ) + if len(hosts) == 0: + # Couldn't find a host that's fulfilling the following criteria: +-- +2.20.1 + diff --git a/SOURCES/0039-uefi-remove-last-references-to-kraxel-s-old-edk2-bui.patch b/SOURCES/0039-uefi-remove-last-references-to-kraxel-s-old-edk2-bui.patch new file mode 100644 index 0000000..e320dad --- /dev/null +++ b/SOURCES/0039-uefi-remove-last-references-to-kraxel-s-old-edk2-bui.patch @@ -0,0 +1,44 @@ +From 21cf4aaafb6088168d2f5c679477644c19116f3d Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 20 Apr 2018 15:27:04 +0200 +Subject: [PATCH] uefi: remove last references to kraxel's old edk2 builds + +Commit 889386f8c6088e57fd68f2bb6bf85f69ecfc6f6c removed most of them +already, so remove the last ones, and the supporting code. +--- + generator/UEFI.ml | 6 ------ + v2v/utils.ml | 1 - + 2 files changed, 7 deletions(-) + +diff --git a/generator/UEFI.ml b/generator/UEFI.ml +index daa78bdc9..bca3fa1ae 100644 +--- a/generator/UEFI.ml ++++ b/generator/UEFI.ml +@@ -30,12 +30,6 @@ open Docstrings + + (* Order is significant *within architectures only*. *) + let firmware = [ +- "i386", +- "/usr/share/edk2.git/ovmf-ia32/OVMF_CODE-pure-efi.fd", +- None, +- "/usr/share/edk2.git/ovmf-ia32/OVMF_VARS-pure-efi.fd", +- []; +- + "x86_64", + "/usr/share/OVMF/OVMF_CODE.fd", + None, +diff --git a/v2v/utils.ml b/v2v/utils.ml +index e880001eb..67e2028f3 100644 +--- a/v2v/utils.ml ++++ b/v2v/utils.ml +@@ -64,7 +64,6 @@ let find_uefi_firmware guest_arch = + let files = + (* The lists of firmware are actually defined in common/utils/uefi.c. *) + match guest_arch with +- | "i386" | "i486" | "i586" | "i686" -> Uefi.uefi_i386_firmware + | "x86_64" -> Uefi.uefi_x86_64_firmware + | "aarch64" -> Uefi.uefi_aarch64_firmware + | arch -> +-- +2.20.1 + diff --git a/SOURCES/0040-v2v-parse_libvirt_xml-handle-srN-CDROM-devices-RHBZ-.patch b/SOURCES/0040-v2v-parse_libvirt_xml-handle-srN-CDROM-devices-RHBZ-.patch new file mode 100644 index 0000000..a9d5701 --- /dev/null +++ b/SOURCES/0040-v2v-parse_libvirt_xml-handle-srN-CDROM-devices-RHBZ-.patch @@ -0,0 +1,38 @@ +From bb804081e9b5fc959b14d2e254d320cf5a658441 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 9 Aug 2018 15:01:37 +0200 +Subject: [PATCH] v2v: parse_libvirt_xml: handle srN CDROM devices + (RHBZ#1612785) + +This device naming is mostly written by virt-p2v, so get the slot from +it directly without using the drive_index "decoding" function. + +(cherry picked from commit c9abaa3e96e7209595f0982c1f2f97e37f3369a6) +--- + v2v/parse_libvirt_xml.ml | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/v2v/parse_libvirt_xml.ml b/v2v/parse_libvirt_xml.ml +index 03a201e77..44723014c 100644 +--- a/v2v/parse_libvirt_xml.ml ++++ b/v2v/parse_libvirt_xml.ml +@@ -379,6 +379,16 @@ let parse_libvirt_xml ?conn xml = + let target_dev = xpath_string "target/@dev" in + match target_dev with + | None -> None ++ | Some dev when String.is_prefix dev "sr" -> ++ (* "srN" devices are found mostly in the physical XML written by ++ * virt-p2v. ++ *) ++ let name = String.sub dev 2 (String.length dev - 2) in ++ (try Some (int_of_string name) ++ with Failure _ -> ++ warning (f_"could not parse device name ‘%s’ from the source libvirt XML") dev; ++ None ++ ) + | Some dev -> + let rec loop = function + | [] -> +-- +2.20.1 + diff --git a/SOURCES/0041-v2v-o-rhv-upload-Fix-error-message-disk-numbering-RH.patch b/SOURCES/0041-v2v-o-rhv-upload-Fix-error-message-disk-numbering-RH.patch new file mode 100644 index 0000000..35d89c9 --- /dev/null +++ b/SOURCES/0041-v2v-o-rhv-upload-Fix-error-message-disk-numbering-RH.patch @@ -0,0 +1,43 @@ +From 6f116349a2a02739e64a39ab2aeb23706fac188b Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 14 Aug 2018 12:50:07 +0100 +Subject: [PATCH] v2v: -o rhv-upload: Fix error message disk numbering + (RHBZ#1615885). + +The output method used the s_disk_id field assuming it was a unique, +monotonically increasing number counting from 0. However this is not +the case, the input method simply has to set s_disk_id to be unique +for each disk. + +Fixes commit cc04573927cca97de60d544d37467e67c25867a7. + +Thanks: Xiaodai Wang +(cherry picked from commit 90c9c12258fbb9a89d16f798725d16fe5bb3504c) +--- + v2v/output_rhv_upload.ml | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 63fa2411a..7dbd98a0d 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -383,13 +383,13 @@ If the messages above are not sufficient to diagnose the problem then add the + *) + let nr_disks = List.length targets in + let image_uuids = +- List.map ( +- fun t -> ++ List.mapi ( ++ fun i t -> + let id = t.target_overlay.ov_source.s_disk_id in + let diskid_file = diskid_file_of_id id in + if not (wait_for_file diskid_file finalization_timeout) then + error (f_"transfer of disk %d/%d failed, see earlier error messages") +- (id+1) nr_disks; ++ (i+1) nr_disks; + let diskid = read_whole_file diskid_file in + diskid + ) targets in +-- +2.20.1 + diff --git a/SOURCES/0042-v2v-o-rhv-upload-Properly-replace-SD_UUID-in-OVF-RHB.patch b/SOURCES/0042-v2v-o-rhv-upload-Properly-replace-SD_UUID-in-OVF-RHB.patch new file mode 100644 index 0000000..8850bef --- /dev/null +++ b/SOURCES/0042-v2v-o-rhv-upload-Properly-replace-SD_UUID-in-OVF-RHB.patch @@ -0,0 +1,30 @@ +From 739ac1bc0f37c4bceb2e2eeed00f9320605aa641 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 7 Aug 2018 09:06:46 +0100 +Subject: [PATCH] v2v: -o rhv-upload: Properly replace SD_UUID in OVF + (RHBZ#1612653). + +The @SD_UUID@ pattern was not being replaced correctly. + +Thanks: Daniel Erez. +(cherry picked from commit 389e165519c33b5234db50ea26dcb267321ee152) +--- + v2v/rhv-upload-createvm.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/rhv-upload-createvm.py b/v2v/rhv-upload-createvm.py +index a34627ec8..1d0e8c95d 100644 +--- a/v2v/rhv-upload-createvm.py ++++ b/v2v/rhv-upload-createvm.py +@@ -70,7 +70,7 @@ sds_service = system_service.storage_domains_service() + sd = sds_service.list(search=("name=%s" % params['output_storage']))[0] + sd_uuid = sd.id + +-ovf.replace("@SD_UUID@", sd_uuid) ++ovf = ovf.replace("@SD_UUID@", sd_uuid) + + vms_service = system_service.vms_service() + vm = vms_service.add( +-- +2.20.1 + diff --git a/SOURCES/0043-ppc64le-Don-t-use-cpu-parameter-under-any-circumstan.patch b/SOURCES/0043-ppc64le-Don-t-use-cpu-parameter-under-any-circumstan.patch new file mode 100644 index 0000000..074ab41 --- /dev/null +++ b/SOURCES/0043-ppc64le-Don-t-use-cpu-parameter-under-any-circumstan.patch @@ -0,0 +1,28 @@ +From 8be6817e95dbdf826a6065751b4a3a000c78071c Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 28 Aug 2018 12:59:06 +0100 +Subject: [PATCH] ppc64le: Don't use -cpu parameter under any circumstances + (RHBZ#1605071). + +(cherry picked from commit 56318f0b5ffc287fed71cc7cdd2007dff2b8fb17) +--- + lib/appliance-cpu.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/lib/appliance-cpu.c b/lib/appliance-cpu.c +index a6c1b0faf..fa1bae3f9 100644 +--- a/lib/appliance-cpu.c ++++ b/lib/appliance-cpu.c +@@ -76,6 +76,9 @@ guestfs_int_get_cpu_model (int kvm) + return "host"; + else + return "cortex-a57"; ++#elif defined(__powerpc64__) ++ /* See discussion in https://bugzilla.redhat.com/show_bug.cgi?id=1605071 */ ++ return NULL; + #else + /* On most architectures, it is faster to pass the CPU host model to + * the appliance, allowing maximum speed for things like checksums +-- +2.20.1 + diff --git a/SOURCES/0044-tools-Link-OCaml-programs-with-runtime-variant-_pic-.patch b/SOURCES/0044-tools-Link-OCaml-programs-with-runtime-variant-_pic-.patch new file mode 100644 index 0000000..bc17b77 --- /dev/null +++ b/SOURCES/0044-tools-Link-OCaml-programs-with-runtime-variant-_pic-.patch @@ -0,0 +1,108 @@ +From 81a9e4f428e9a2305a2ea8c576dadde60fa5a381 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 20 Sep 2018 12:42:59 +0100 +Subject: [PATCH] tools: Link OCaml programs with -runtime-variant _pic if + available. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +OCaml has a small runtime which is statically linked into the virt +tools (providing things like GC and primitives). Since OCaml 4.03 it +has been possible to select variants of this runtime, one of which is +compiled with -fPIC, using ‘ocamlopt -runtime-variant _pic’. + +This has performance implications on i686, but is relatively free on +other architectures. Since it (in theory) adds to the security of the +final binary this commit enables it whenever it is available. + +(cherry picked from commit 09abb9c990f6e07b3577088522b8ad9fb439a80e) +--- + .gitignore | 1 + + configure.ac | 2 ++ + m4/guestfs-ocaml.m4 | 18 ++++++++++++++++++ + ocaml-link.sh => ocaml-link.sh.in | 8 +++++++- + 4 files changed, 28 insertions(+), 1 deletion(-) + rename ocaml-link.sh => ocaml-link.sh.in (88%) + +diff --git a/.gitignore b/.gitignore +index af80e36d1..89b8baa17 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -410,6 +410,7 @@ Makefile.in + /make-fs/virt-make-fs.1 + /missing + /ocaml-dep.sh ++/ocaml-link.sh + /ocaml/bindtests.bc + /ocaml/bindtests.opt + /ocaml/bindtests.ml +diff --git a/configure.ac b/configure.ac +index 4da3bd021..6c38406bb 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -198,6 +198,8 @@ AC_CONFIG_FILES([installcheck.sh], + [chmod +x,-w installcheck.sh]) + AC_CONFIG_FILES([ocaml-dep.sh], + [chmod +x,-w ocaml-dep.sh]) ++AC_CONFIG_FILES([ocaml-link.sh], ++ [chmod +x,-w ocaml-link.sh]) + AC_CONFIG_FILES([p2v/virt-p2v-make-disk], + [chmod +x,-w p2v/virt-p2v-make-disk]) + AC_CONFIG_FILES([p2v/virt-p2v-make-kickstart], +diff --git a/m4/guestfs-ocaml.m4 b/m4/guestfs-ocaml.m4 +index e08f40a02..fea11a334 100644 +--- a/m4/guestfs-ocaml.m4 ++++ b/m4/guestfs-ocaml.m4 +@@ -59,6 +59,24 @@ AM_CONDITIONAL([HAVE_OCAMLOPT], + AM_CONDITIONAL([HAVE_OCAMLDOC], + [test "x$OCAMLDOC" != "xno"]) + ++dnl Check if ocamlc/ocamlopt -runtime-variant _pic works. It was ++dnl added in OCaml >= 4.03, but in theory might be disabled by ++dnl downstream distros. ++OCAML_RUNTIME_VARIANT_PIC_OPTION="" ++if test "x$OCAMLC" != "xno"; then ++ AC_MSG_CHECKING([if OCaml ‘-runtime-variant _pic’ works]) ++ rm -f conftest.ml contest ++ echo 'print_endline "hello world"' > conftest.ml ++ if $OCAMLC conftest.ml -runtime-variant _pic -o conftest >&5 2>&5 ; then ++ AC_MSG_RESULT([yes]) ++ OCAML_RUNTIME_VARIANT_PIC_OPTION="-runtime-variant _pic" ++ else ++ AC_MSG_RESULT([no]) ++ fi ++ rm -f conftest.ml contest ++fi ++AC_SUBST([OCAML_RUNTIME_VARIANT_PIC_OPTION]) ++ + dnl Check if ocamldep has options -all and -one-line (not present in RHEL 6). + AC_MSG_CHECKING([if ocamldep has the ‘-all’ option]) + if ocamldep -all >&AS_MESSAGE_LOG_FD 2>&1; then +diff --git a/ocaml-link.sh b/ocaml-link.sh.in +similarity index 88% +rename from ocaml-link.sh +rename to ocaml-link.sh.in +index 855637534..fbcc07951 100755 +--- a/ocaml-link.sh ++++ b/ocaml-link.sh.in +@@ -1,4 +1,6 @@ + #!/bin/bash - ++# Script used to link OCaml programs. ++# @configure_input@ + # (C) Copyright 2015-2018 Red Hat Inc. + # + # This program is free software; you can redistribute it and/or modify +@@ -41,4 +43,8 @@ while true ; do + esac + done + +-exec "$@" -linkpkg -cclib "${cclib}" ++# NB -cclib must come last. ++exec "$@" \ ++ @OCAML_RUNTIME_VARIANT_PIC_OPTION@ \ ++ -linkpkg \ ++ -cclib "${cclib}" +-- +2.20.1 + diff --git a/SOURCES/0045-tools-Ensure-CFLAGS-and-LDFLAGS-are-passed-to-all-OC.patch b/SOURCES/0045-tools-Ensure-CFLAGS-and-LDFLAGS-are-passed-to-all-OC.patch new file mode 100644 index 0000000..a966250 --- /dev/null +++ b/SOURCES/0045-tools-Ensure-CFLAGS-and-LDFLAGS-are-passed-to-all-OC.patch @@ -0,0 +1,328 @@ +From 7423e43ec2cd27d52650a1caeb7c0576350e0a78 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 20 Sep 2018 12:59:44 +0100 +Subject: [PATCH] tools: Ensure CFLAGS and LDFLAGS are passed to all OCaml + binaries (RHBZ#1624130). + +After this commit, all annocheck errors are fixed except for: + + Hardened: virt-get-kernel: MAYB: Gaps were detected in the annobin coverage. Run with -v to list. + +After discussion with the annocheck maintainers this gap in coverage +(which corresponds to the OCaml runtime) seems to be caused either by +the runtime not being linked with the right flags, or might be a bug +in annocheck itself. In any case it's not something that can be +resolved within the scope of libguestfs. + +(cherry picked from commit 34c23403c51a4d59d826c8045e06f9aabc2ceb16) +--- + builder/Makefile.am | 2 +- + common/mlaugeas/Makefile.am | 2 +- + common/mlgettext/Makefile.am | 2 +- + common/mlpcre/Makefile.am | 2 +- + common/mlprogress/Makefile.am | 2 +- + common/mlstdutils/Makefile.am | 2 +- + common/mltools/Makefile.am | 2 +- + common/mlutils/Makefile.am | 2 +- + common/mlvisit/Makefile.am | 2 +- + common/mlxml/Makefile.am | 2 +- + customize/Makefile.am | 2 +- + daemon/Makefile.am | 2 +- + dib/Makefile.am | 2 +- + generator/Makefile.am | 2 +- + get-kernel/Makefile.am | 2 +- + ocaml-link.sh.in | 2 +- + ocaml/Makefile.am | 2 +- + resize/Makefile.am | 2 +- + sparsify/Makefile.am | 2 +- + sysprep/Makefile.am | 2 +- + v2v/Makefile.am | 2 +- + v2v/test-harness/Makefile.am | 2 +- + 22 files changed, 22 insertions(+), 22 deletions(-) + +diff --git a/builder/Makefile.am b/builder/Makefile.am +index c7b50778a..a30a229b2 100644 +--- a/builder/Makefile.am ++++ b/builder/Makefile.am +@@ -215,7 +215,7 @@ OCAMLCLIBS = \ + $(LIBINTL) \ + -lgnu + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/common/mlaugeas/Makefile.am b/common/mlaugeas/Makefile.am +index 8aa15b80e..2c1a6e0fd 100644 +--- a/common/mlaugeas/Makefile.am ++++ b/common/mlaugeas/Makefile.am +@@ -61,7 +61,7 @@ BOBJECTS = $(SOURCES_ML:.ml=.cmo) + XOBJECTS = $(BOBJECTS:.cmo=.cmx) + + OCAMLPACKAGES = +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/common/mlgettext/Makefile.am b/common/mlgettext/Makefile.am +index cdcea33ec..b918f90c3 100644 +--- a/common/mlgettext/Makefile.am ++++ b/common/mlgettext/Makefile.am +@@ -60,7 +60,7 @@ if HAVE_OCAML_PKG_GETTEXT + OCAMLPACKAGES += -package gettext-stub + endif + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/common/mlpcre/Makefile.am b/common/mlpcre/Makefile.am +index f9699f592..6f04256da 100644 +--- a/common/mlpcre/Makefile.am ++++ b/common/mlpcre/Makefile.am +@@ -70,7 +70,7 @@ OCAMLPACKAGES = \ + -I $(builddir) + OCAMLPACKAGES_TESTS = $(MLPCRE_CMA) + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/common/mlprogress/Makefile.am b/common/mlprogress/Makefile.am +index be88ef2de..af006d228 100644 +--- a/common/mlprogress/Makefile.am ++++ b/common/mlprogress/Makefile.am +@@ -76,7 +76,7 @@ OCAMLPACKAGES = \ + -I $(top_builddir)/ocaml \ + -I $(builddir) + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/common/mlstdutils/Makefile.am b/common/mlstdutils/Makefile.am +index e38230db8..75252eb46 100644 +--- a/common/mlstdutils/Makefile.am ++++ b/common/mlstdutils/Makefile.am +@@ -79,7 +79,7 @@ if HAVE_OCAML_PKG_OUNIT + OCAMLPACKAGES_TESTS += -package oUnit + endif + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/common/mltools/Makefile.am b/common/mltools/Makefile.am +index 66b18f5de..b326cf56a 100644 +--- a/common/mltools/Makefile.am ++++ b/common/mltools/Makefile.am +@@ -131,7 +131,7 @@ OCAMLCLIBS = \ + $(LIBINTL) \ + -lgnu + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/common/mlutils/Makefile.am b/common/mlutils/Makefile.am +index 8627e5b10..77feafa56 100644 +--- a/common/mlutils/Makefile.am ++++ b/common/mlutils/Makefile.am +@@ -74,7 +74,7 @@ OCAMLPACKAGES = \ + -I $(top_builddir)/common/mlstdutils \ + -I $(builddir) + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/common/mlvisit/Makefile.am b/common/mlvisit/Makefile.am +index add1fe56e..7230415e7 100644 +--- a/common/mlvisit/Makefile.am ++++ b/common/mlvisit/Makefile.am +@@ -80,7 +80,7 @@ OCAMLPACKAGES = \ + -I $(builddir) + OCAMLPACKAGES_TESTS = $(MLVISIT_CMA) + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/common/mlxml/Makefile.am b/common/mlxml/Makefile.am +index eab036b82..7f36b743a 100644 +--- a/common/mlxml/Makefile.am ++++ b/common/mlxml/Makefile.am +@@ -72,7 +72,7 @@ OCAMLPACKAGES = \ + -I $(top_builddir)/gnulib/lib/.libs \ + -I $(builddir) + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/customize/Makefile.am b/customize/Makefile.am +index efdd27227..69cf6c13f 100644 +--- a/customize/Makefile.am ++++ b/customize/Makefile.am +@@ -173,7 +173,7 @@ OCAMLCLIBS = \ + $(LIBINTL) \ + -lgnu + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + virt_customize_DEPENDENCIES = \ + $(top_srcdir)/ocaml-link.sh \ +diff --git a/daemon/Makefile.am b/daemon/Makefile.am +index d9ed5625e..dcae1a66c 100644 +--- a/daemon/Makefile.am ++++ b/daemon/Makefile.am +@@ -347,7 +347,7 @@ OCAMLPACKAGES = \ + -I $(top_builddir)/common/mlpcre/.libs \ + -I $(top_builddir)/gnulib/lib/.libs + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/dib/Makefile.am b/dib/Makefile.am +index 316f49903..7c2ab09d6 100644 +--- a/dib/Makefile.am ++++ b/dib/Makefile.am +@@ -99,7 +99,7 @@ OCAMLCLIBS = \ + $(LIBINTL) \ + -lgnu + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/generator/Makefile.am b/generator/Makefile.am +index c2d10966a..056d01346 100644 +--- a/generator/Makefile.am ++++ b/generator/Makefile.am +@@ -175,7 +175,7 @@ OCAMLPACKAGES = \ + -I . \ + -I $(top_srcdir)/common/mlstdutils \ + -I $(top_builddir)/common/mlstdutils +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + noinst_PROGRAM = generator + +diff --git a/get-kernel/Makefile.am b/get-kernel/Makefile.am +index 81dfb48b4..75379e21f 100644 +--- a/get-kernel/Makefile.am ++++ b/get-kernel/Makefile.am +@@ -82,7 +82,7 @@ OCAMLCLIBS = \ + $(LIBINTL) \ + -lgnu + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/ocaml-link.sh.in b/ocaml-link.sh.in +index fbcc07951..6819c641e 100755 +--- a/ocaml-link.sh.in ++++ b/ocaml-link.sh.in +@@ -47,4 +47,4 @@ done + exec "$@" \ + @OCAML_RUNTIME_VARIANT_PIC_OPTION@ \ + -linkpkg \ +- -cclib "${cclib}" ++ -cclib "@LDFLAGS@ $cclib" +diff --git a/ocaml/Makefile.am b/ocaml/Makefile.am +index b0f2900f2..752fc109c 100644 +--- a/ocaml/Makefile.am ++++ b/ocaml/Makefile.am +@@ -37,7 +37,7 @@ CLEANFILES += t/*.annot t/*.cmi t/*.cmo t/*.cmx t/*.o t/*.a t/*.so + + if HAVE_OCAML + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + noinst_DATA = mlguestfs.cma META + if HAVE_OCAMLOPT +diff --git a/resize/Makefile.am b/resize/Makefile.am +index 847fb313a..7a4367023 100644 +--- a/resize/Makefile.am ++++ b/resize/Makefile.am +@@ -80,7 +80,7 @@ OCAMLCLIBS = \ + $(LIBINTL) \ + -lgnu + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/sparsify/Makefile.am b/sparsify/Makefile.am +index 2ab357a68..2dce5e582 100644 +--- a/sparsify/Makefile.am ++++ b/sparsify/Makefile.am +@@ -88,7 +88,7 @@ OCAMLCLIBS = \ + $(LIBINTL) \ + -lgnu + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/sysprep/Makefile.am b/sysprep/Makefile.am +index 0cc9da80a..6ed4ac713 100644 +--- a/sysprep/Makefile.am ++++ b/sysprep/Makefile.am +@@ -136,7 +136,7 @@ OCAMLCLIBS = \ + $(LIBINTL) \ + -lgnu + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index 7de050b06..7a1ac329e 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -201,7 +201,7 @@ OCAMLCLIBS = \ + $(LIBINTL) \ + -lgnu + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + if !HAVE_OCAMLOPT + OBJECTS = $(BOBJECTS) +diff --git a/v2v/test-harness/Makefile.am b/v2v/test-harness/Makefile.am +index d69188969..22c3b8c49 100644 +--- a/v2v/test-harness/Makefile.am ++++ b/v2v/test-harness/Makefile.am +@@ -47,7 +47,7 @@ OCAMLPACKAGES = \ + -I $(top_builddir)/common/mltools \ + -I $(top_builddir)/v2v + +-OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) ++OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) -ccopt '$(CFLAGS)' + + BOBJECTS = \ + $(SOURCES_ML:.ml=.cmo) \ +-- +2.20.1 + diff --git a/SOURCES/0046-ocaml-make-sure-to-pass-LDFLAGS-to-ocamlmklibs-linke.patch b/SOURCES/0046-ocaml-make-sure-to-pass-LDFLAGS-to-ocamlmklibs-linke.patch new file mode 100644 index 0000000..3f26fd5 --- /dev/null +++ b/SOURCES/0046-ocaml-make-sure-to-pass-LDFLAGS-to-ocamlmklibs-linke.patch @@ -0,0 +1,40 @@ +From 57ed1fc4281462e02604b0e740c4ffa31cf93afb Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 27 Sep 2018 15:51:01 +0200 +Subject: [PATCH] ocaml: make sure to pass LDFLAGS to ocamlmklibs linker + (RHBZ#1624130) + +Pass the LDFLAGS properly as arguments for the C linker when using +ocamlmklibs via the -ldopt option. + +Followup of commit 34c23403c51a4d59d826c8045e06f9aabc2ceb16. + +(cherry picked from commit 4ff573c352973036b722ec0c9bf79be958b83b2c) +--- + ocaml/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/ocaml/Makefile.am b/ocaml/Makefile.am +index 752fc109c..4d13eed97 100644 +--- a/ocaml/Makefile.am ++++ b/ocaml/Makefile.am +@@ -64,14 +64,14 @@ endif + + stamp-mlguestfs: libguestfsocaml.a $(guestfs_cmm) + $(OCAMLMKLIB) -o mlguestfs \ ++ -ldopt '$(LDFLAGS)' \ + $(libguestfsocaml_a_OBJECTS) guestfs.cmo \ +- $(LDFLAGS) \ + $(LTLIBINTL) \ + -L../lib/.libs -lguestfs + if HAVE_OCAMLOPT + $(OCAMLMKLIB) -o mlguestfs \ ++ -ldopt '$(LDFLAGS)' \ + $(libguestfsocaml_a_OBJECTS) guestfs.cmx \ +- $(LDFLAGS) \ + $(LTLIBINTL) \ + -L../lib/.libs -lguestfs + endif +-- +2.20.1 + diff --git a/SOURCES/0047-v2v-Model-machine-type-explicitly.patch b/SOURCES/0047-v2v-Model-machine-type-explicitly.patch new file mode 100644 index 0000000..8f60cc2 --- /dev/null +++ b/SOURCES/0047-v2v-Model-machine-type-explicitly.patch @@ -0,0 +1,323 @@ +From 81f35e441d06bff2bf60bff6354d53de137847d9 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 19 Jun 2018 10:44:57 +0100 +Subject: [PATCH] v2v: Model machine type explicitly. + +QEMU for x86 supports two machine types, "pc" (emulating the ancient +Intel i440FX chipset originally used by the Pentium Pro), and "q35" +(https://wiki.qemu.org/Features/Q35). + +Currently virt-v2v does not set any machine type, so libvirt or the +target hypervisor will choose some default, probably i440fx. The +latest advice from the QEMU and libvirt communities is not to rely on +the default machine type but to specify what we need explicitly, but +it may also be that the libvirt configuration file has been changed to +set the default machine type to Q35 (either by the distro or the end +user). + +None of this matters for reasonably new guests since they can boot +with either chipset. However there are some very old guests (notably +Windows XP) which cannot handle Q35. + +This commit changes virt-v2v so it always tries to specify the machine +type explicitly (assuming the target supports that, and not all of +them do). For x86_64 guests this patch always selects i440fx (pc). +In future we hope to get the correct machine type for the guest from +libosinfo but this is not available yet. + +For non-x86 architectures we select the "virt" model which will +probably only work for AArch64. More work is needed for POWER. + +For secure boot we still have to force the machine type to Q35. In a +future version this forcing can be removed since any guest which is +using secure boot will be new enough that it'll be using Q35 anyway +(on x86). + +(cherry picked from commit 55879b2f2c5b205352f48f999e20efd9b455ea43) +--- + v2v/convert_linux.ml | 7 +++++++ + v2v/convert_windows.ml | 7 +++++++ + v2v/create_libvirt_xml.ml | 37 +++++++++++++++++++++++++------------ + v2v/create_ovf.ml | 2 ++ + v2v/output_glance.ml | 5 +++++ + v2v/output_qemu.ml | 30 +++++++++++++++++++----------- + v2v/test-v2v-i-ova.xml | 2 +- + v2v/types.ml | 8 ++++++++ + v2v/types.mli | 6 ++++-- + 9 files changed, 78 insertions(+), 26 deletions(-) + +diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml +index 4a7447fe1..fd6b71ba4 100644 +--- a/v2v/convert_linux.ml ++++ b/v2v/convert_linux.ml +@@ -122,6 +122,12 @@ let convert (g : G.guestfs) inspect source output rcaps = + + SELinux_relabel.relabel g; + ++ (* XXX Look up this information in libosinfo in future. *) ++ let machine = ++ match inspect.i_arch with ++ | "i386"|"x86_64" -> I440FX ++ | _ -> Virt in ++ + (* Return guest capabilities from the convert () function. *) + let guestcaps = { + gcaps_block_bus = block_type; +@@ -130,6 +136,7 @@ let convert (g : G.guestfs) inspect source output rcaps = + gcaps_virtio_rng = kernel.ki_supports_virtio_rng; + gcaps_virtio_balloon = kernel.ki_supports_virtio_balloon; + gcaps_isa_pvpanic = kernel.ki_supports_isa_pvpanic; ++ gcaps_machine = machine; + gcaps_arch = Utils.kvm_arch inspect.i_arch; + gcaps_acpi = acpi; + } in +diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml +index 163319545..1e058136e 100644 +--- a/v2v/convert_windows.ml ++++ b/v2v/convert_windows.ml +@@ -212,6 +212,12 @@ let convert (g : G.guestfs) inspect source output rcaps = + warning (f_"this guest has Anti-Virus (AV) software and a new virtio block device driver was installed. In some circumstances, AV may prevent new drivers from working (resulting in a 7B boot error). If this happens, try disabling AV before doing the conversion."); + ); + ++ (* XXX Look up this information in libosinfo in future. *) ++ let machine = ++ match inspect.i_arch with ++ | "i386"|"x86_64" -> I440FX ++ | _ -> Virt in ++ + (* Return guest capabilities from the convert () function. *) + let guestcaps = { + gcaps_block_bus = block_driver; +@@ -220,6 +226,7 @@ let convert (g : G.guestfs) inspect source output rcaps = + gcaps_virtio_rng = virtio_rng_supported; + gcaps_virtio_balloon = virtio_ballon_supported; + gcaps_isa_pvpanic = isa_pvpanic_supported; ++ gcaps_machine = machine; + gcaps_arch = Utils.kvm_arch inspect.i_arch; + gcaps_acpi = true; + } in +diff --git a/v2v/create_libvirt_xml.ml b/v2v/create_libvirt_xml.ml +index fbe90eeaa..8a34c94b0 100644 +--- a/v2v/create_libvirt_xml.ml ++++ b/v2v/create_libvirt_xml.ml +@@ -81,15 +81,17 @@ let create_libvirt_xml ?pool source target_buses guestcaps + match target_firmware with + | TargetBIOS -> None + | TargetUEFI -> Some (find_uefi_firmware guestcaps.gcaps_arch) in +- let secure_boot_required = +- match uefi_firmware with +- | Some { Uefi.flags = flags } +- when List.mem Uefi.UEFI_FLAG_SECURE_BOOT_REQUIRED flags -> true +- | _ -> false in +- (* Currently these are required by secure boot, but in theory they +- * might be independent properties. +- *) +- let machine_q35 = secure_boot_required in ++ let machine, secure_boot_required = ++ match guestcaps.gcaps_machine, uefi_firmware with ++ | _, Some { Uefi.flags = flags } ++ when List.mem Uefi.UEFI_FLAG_SECURE_BOOT_REQUIRED flags -> ++ (* Force machine type to Q35 because PC does not support ++ * secure boot. We must remove this when we get the ++ * correct machine type from libosinfo in future. XXX ++ *) ++ Q35, true ++ | machine, _ -> ++ machine, false in + let smm = secure_boot_required in + + (* We have the machine features of the guest when it was on the +@@ -140,7 +142,18 @@ let create_libvirt_xml ?pool source target_buses guestcaps + + (* The section subelements. *) + let os_section = +- let machine = if machine_q35 then [ "machine", "q35" ] else [] in ++ let os = ref [] in ++ ++ let machine = ++ match machine with ++ | I440FX -> "pc" ++ | Q35 -> "q35" ++ | Virt -> "virt" in ++ ++ List.push_back os ++ (e "type" ["arch", guestcaps.gcaps_arch; ++ "machine", machine] ++ [PCData "hvm"]); + + let loader = + match uefi_firmware with +@@ -152,8 +165,8 @@ let create_libvirt_xml ?pool source target_buses guestcaps + [ PCData code ]; + e "nvram" ["template", vars_template] [] ] in + +- (e "type" (["arch", guestcaps.gcaps_arch] @ machine) [PCData "hvm"]) +- :: loader in ++ List.push_back_list os loader; ++ !os in + + List.push_back_list body [ + e "os" [] os_section; +diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml +index 5db239d66..01970013e 100644 +--- a/v2v/create_ovf.ml ++++ b/v2v/create_ovf.ml +@@ -602,6 +602,8 @@ let rec create_ovf source targets guestcaps inspect + source.s_vcpu memsize_mb)] + ] in + ++ (* XXX How to set machine type for Q35? *) ++ + List.push_back virtual_hardware_section_items ( + e "Item" [] ([ + e "rasd:Caption" [] [PCData (sprintf "%d virtual cpu" source.s_vcpu)]; +diff --git a/v2v/output_glance.ml b/v2v/output_glance.ml +index c334def42..96c31da59 100644 +--- a/v2v/output_glance.ml ++++ b/v2v/output_glance.ml +@@ -86,6 +86,11 @@ object + (match guestcaps.gcaps_video with + | QXL -> "qxl" + | Cirrus -> "cirrus"); ++ "hw_machine_type", ++ (match guestcaps.gcaps_machine with ++ | I440FX -> "pc" ++ | Q35 -> "q35" ++ | Virt -> "virt"); + "architecture", guestcaps.gcaps_arch; + "hypervisor_type", "kvm"; + "vm_mode", "hvm"; +diff --git a/v2v/output_qemu.ml b/v2v/output_qemu.ml +index 952660de2..e23f22e12 100644 +--- a/v2v/output_qemu.ml ++++ b/v2v/output_qemu.ml +@@ -56,17 +56,25 @@ object + match target_firmware with + | TargetBIOS -> None + | TargetUEFI -> Some (find_uefi_firmware guestcaps.gcaps_arch) in +- let secure_boot_required = +- match uefi_firmware with +- | Some { Uefi.flags } +- when List.mem Uefi.UEFI_FLAG_SECURE_BOOT_REQUIRED flags -> true +- | _ -> false in +- (* Currently these are required by secure boot, but in theory they +- * might be independent properties. +- *) +- let machine_q35 = secure_boot_required in ++ let machine, secure_boot_required = ++ match guestcaps.gcaps_machine, uefi_firmware with ++ | _, Some { Uefi.flags } ++ when List.mem Uefi.UEFI_FLAG_SECURE_BOOT_REQUIRED flags -> ++ (* Force machine type to Q35 because PC does not support ++ * secure boot. We must remove this when we get the ++ * correct machine type from libosinfo in future. XXX ++ *) ++ Q35, true ++ | machine, _ -> ++ machine, false in + let smm = secure_boot_required in + ++ let machine = ++ match machine with ++ | I440FX -> "pc" ++ | Q35 -> "q35" ++ | Virt -> "virt" in ++ + (* Construct the command line. Note that the [Qemuopts] + * module deals with shell and qemu comma quoting. + *) +@@ -80,8 +88,8 @@ object + + flag "-no-user-config"; flag "-nodefaults"; + arg "-name" source.s_name; +- arg_list "-machine" (if machine_q35 then ["q35"] else [] @ +- if smm then ["smm=on"] else [] @ ++ arg_list "-machine" (machine :: ++ (if smm then ["smm=on"] else []) @ + ["accel=kvm:tcg"]); + + (match uefi_firmware with +diff --git a/v2v/test-v2v-i-ova.xml b/v2v/test-v2v-i-ova.xml +index 5a303b80a..b277193a8 100644 +--- a/v2v/test-v2v-i-ova.xml ++++ b/v2v/test-v2v-i-ova.xml +@@ -10,7 +10,7 @@ + + + +- hvm ++ hvm + + destroy + restart +diff --git a/v2v/types.ml b/v2v/types.ml +index bb77e5669..9851386f7 100644 +--- a/v2v/types.ml ++++ b/v2v/types.ml +@@ -401,6 +401,7 @@ type guestcaps = { + gcaps_virtio_rng : bool; + gcaps_virtio_balloon : bool; + gcaps_isa_pvpanic : bool; ++ gcaps_machine : guestcaps_machine; + gcaps_arch : string; + gcaps_acpi : bool; + } +@@ -412,6 +413,7 @@ and requested_guestcaps = { + and guestcaps_block_type = Virtio_blk | Virtio_SCSI | IDE + and guestcaps_net_type = Virtio_net | E1000 | RTL8139 + and guestcaps_video_type = QXL | Cirrus ++and guestcaps_machine = I440FX | Q35 | Virt + + let string_of_block_type = function + | Virtio_blk -> "virtio-blk" +@@ -424,17 +426,23 @@ let string_of_net_type = function + let string_of_video = function + | QXL -> "qxl" + | Cirrus -> "cirrus" ++let string_of_machine = function ++ | I440FX -> "i440fx" ++ | Q35 -> "q35" ++ | Virt -> "virt" + + let string_of_guestcaps gcaps = + sprintf "\ + gcaps_block_bus = %s + gcaps_net_bus = %s + gcaps_video = %s ++gcaps_machine = %s + gcaps_arch = %s + gcaps_acpi = %b + " (string_of_block_type gcaps.gcaps_block_bus) + (string_of_net_type gcaps.gcaps_net_bus) + (string_of_video gcaps.gcaps_video) ++ (string_of_machine gcaps.gcaps_machine) + gcaps.gcaps_arch + gcaps.gcaps_acpi + +diff --git a/v2v/types.mli b/v2v/types.mli +index f60e5c98f..5e33b1de9 100644 +--- a/v2v/types.mli ++++ b/v2v/types.mli +@@ -240,8 +240,9 @@ type guestcaps = { + gcaps_virtio_balloon : bool; (** Guest supports virtio balloon. *) + gcaps_isa_pvpanic : bool; (** Guest supports ISA pvpanic device. *) + +- gcaps_arch : string; (** Architecture that KVM must emulate. *) +- gcaps_acpi : bool; (** True if guest supports acpi. *) ++ gcaps_machine : guestcaps_machine; (** Machine model. *) ++ gcaps_arch : string; (** Architecture that KVM must emulate. *) ++ gcaps_acpi : bool; (** True if guest supports acpi. *) + } + (** Guest capabilities after conversion. eg. Was virtio found or installed? *) + +@@ -257,6 +258,7 @@ and requested_guestcaps = { + and guestcaps_block_type = Virtio_blk | Virtio_SCSI | IDE + and guestcaps_net_type = Virtio_net | E1000 | RTL8139 + and guestcaps_video_type = QXL | Cirrus ++and guestcaps_machine = I440FX | Q35 | Virt + + val string_of_guestcaps : guestcaps -> string + val string_of_requested_guestcaps : requested_guestcaps -> string +-- +2.20.1 + diff --git a/SOURCES/0048-v2v-windows-Fix-rhev-apt-command-line-RHBZ-1624902.patch b/SOURCES/0048-v2v-windows-Fix-rhev-apt-command-line-RHBZ-1624902.patch new file mode 100644 index 0000000..dd0bb65 --- /dev/null +++ b/SOURCES/0048-v2v-windows-Fix-rhev-apt-command-line-RHBZ-1624902.patch @@ -0,0 +1,37 @@ +From 8a4072c4b16e20c6ac55cbf350bfae2d0d1c7a0b Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 3 Sep 2018 15:24:05 +0100 +Subject: [PATCH] v2v: windows: Fix rhev-apt command line (RHBZ#1624902). + +See: +https://bugzilla.redhat.com/show_bug.cgi?id=1584678#c15 + +Fixes commit bcdbe6405c10ecb7374ae47eee6385be17dbd49e. However this +bug was copied directly from old virt-v2v which did the same thing +(from lib/Sys/VirtConvert/Converter/Windows.pm): + + echo installing rhev-apt >>log.txt + "rhev-apt.exe" /S /v /qn >>log.txt + +Thanks: Lev Veyde +(cherry picked from commit e12c56176abcc2d970a35f83bffc95f7ad1b2aab) +--- + v2v/convert_windows.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml +index 1e058136e..0346ba4fe 100644 +--- a/v2v/convert_windows.ml ++++ b/v2v/convert_windows.ml +@@ -347,7 +347,7 @@ echo Wait for PnP to complete + @echo off + + echo installing rhev-apt +-\"\\rhev-apt.exe\" /S /v /qn ++\"\\rhev-apt.exe\" /S /v/qn + + echo starting rhev-apt + net start rhev-apt +-- +2.20.1 + diff --git a/SOURCES/0049-v2v-docs-Describe-support-for-SHA-2-certs-for-Window.patch b/SOURCES/0049-v2v-docs-Describe-support-for-SHA-2-certs-for-Window.patch new file mode 100644 index 0000000..6595e48 --- /dev/null +++ b/SOURCES/0049-v2v-docs-Describe-support-for-SHA-2-certs-for-Window.patch @@ -0,0 +1,40 @@ +From 4d78c436b15742c25288bcae441a9782ee316fe5 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 3 Sep 2018 14:30:21 +0100 +Subject: [PATCH] v2v: docs: Describe support for SHA-2 certs for Windows 7 / + 2008 R2 (RHBZ#1624878). + +Thanks: Yan Vugenfirer. +(cherry picked from commit 741ef228cd8d17bd1a8a60a2cfa83c3937120ede) +--- + v2v/virt-v2v.pod | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 893e47fb9..dc443b717 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -1097,6 +1097,20 @@ This can also prevent booting with a 7B error [see previous section] + if the guest has group policy containing + C. + ++=head2 Support for SHA-2 certificates in Windows 7 and Windows Server 2008 R2 ++ ++Later versions of the Windows virtio drivers are signed using SHA-2 ++certificates (instead of SHA-1). The original shipping Windows 7 and ++Windows Server 2008 R2 did not understand SHA-2 certificates and so ++the Windows virtio drivers will not install properly. ++ ++To fix this you must apply SHA-2 Code Signing Support from: ++L ++before converting the guest. ++ ++For further information see: ++L ++ + =head1 UEFI + + VMware allows you to present UEFI firmware to guests (instead of the +-- +2.20.1 + diff --git a/SOURCES/0050-v2v-docs-Remove-sentence-about-supporting-qemu-kvm-r.patch b/SOURCES/0050-v2v-docs-Remove-sentence-about-supporting-qemu-kvm-r.patch new file mode 100644 index 0000000..6004ae8 --- /dev/null +++ b/SOURCES/0050-v2v-docs-Remove-sentence-about-supporting-qemu-kvm-r.patch @@ -0,0 +1,39 @@ +From e4ba4ed8bbb033318e85407099a87912124e0040 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Wed, 21 Nov 2018 10:55:45 +0000 +Subject: [PATCH] v2v: docs: Remove sentence about supporting qemu-kvm-rhev in + RHEL (RHBZ#1651977). +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The previous support documentation said that for UEFI guests, when +using RHEL ≥ 7.3 host, you must use qemu-kvm-rhev. For RHEL 8 this is +inaccurate since qemu-kvm-rhev no longer exists. + +To fix this I've dropped the whole sentence. It only applies to the +downstream product (RHEL) and so RHEL can add the right documentation +if it needs to. + +Thanks: Ming Xie, Pino Toscano. +(cherry picked from commit 0e6bbcee7e30f6f1c3b92b77b5214c549d023044) +--- + v2v/virt-v2v.pod | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index dc443b717..4b53cdc0e 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -1132,8 +1132,6 @@ automatically, but note that the same version of OVMF must be + installed on the conversion host as is installed on the target + hypervisor, else you will have to adjust paths in the metadata. + +-On RHEL E 7.3, only qemu-kvm-rhev (not qemu-kvm) is supported. +- + =item UEFI on OpenStack + + Not supported. +-- +2.20.1 + diff --git a/SOURCES/0051-v2v-linux-improve-regex-for-resume-entries-RHBZ-1651.patch b/SOURCES/0051-v2v-linux-improve-regex-for-resume-entries-RHBZ-1651.patch new file mode 100644 index 0000000..72bfcff --- /dev/null +++ b/SOURCES/0051-v2v-linux-improve-regex-for-resume-entries-RHBZ-1651.patch @@ -0,0 +1,33 @@ +From e003f5b8e7fe673aa462199e6190ea58a0cef011 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 4 Dec 2018 18:43:59 +0100 +Subject: [PATCH] v2v: linux: improve regex for resume= entries (RHBZ#1651987) + +Add few more characters for the devices of resume= entries in the +command line of grub: this way it is possible to match also /dev/mapper +devices. + +This should require no further processing, since the names of the +/dev/mapper devices do not change after the conversion. + +(cherry picked from commit 50b08fd84bc035ada9e7a3cdda6c36ab7e418e8c) +--- + v2v/convert_linux.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml +index fd6b71ba4..da06352a0 100644 +--- a/v2v/convert_linux.ml ++++ b/v2v/convert_linux.ml +@@ -983,7 +983,7 @@ let convert (g : G.guestfs) inspect source output rcaps = + List.flatten (List.map Array.to_list (List.map g#aug_match paths)) in + + (* Map device names for each entry. *) +- let rex_resume = PCRE.compile "^resume=(/dev/[a-z\\d]+)(.*)$" ++ let rex_resume = PCRE.compile "^resume=(/dev/[-a-z\\d/_]+)(.*)$" + and rex_device_cciss = PCRE.compile "^/dev/(cciss/c\\d+d\\d+)(?:p(\\d+))?$" + and rex_device = PCRE.compile "^/dev/([a-z]+)(\\d*)?$" in + +-- +2.20.1 + diff --git a/SOURCES/0052-inspection-Parse-os-release-opensuse-leap-as-opensus.patch b/SOURCES/0052-inspection-Parse-os-release-opensuse-leap-as-opensus.patch new file mode 100644 index 0000000..ad43f4d --- /dev/null +++ b/SOURCES/0052-inspection-Parse-os-release-opensuse-leap-as-opensus.patch @@ -0,0 +1,27 @@ +From 1e72a13be2bbe054f0a15cdf5cc08c58fe5c43ab Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 1 Oct 2018 09:51:15 +0100 +Subject: [PATCH] inspection: Parse os-release "opensuse-leap" as opensuse + (RHBZ#1634248). + +(cherry picked from commit 70407cd622dda6f088a0876e1e1ae669e9f8a281) +--- + daemon/inspect_fs_unix.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/daemon/inspect_fs_unix.ml b/daemon/inspect_fs_unix.ml +index f4b2fea14..33b93256f 100644 +--- a/daemon/inspect_fs_unix.ml ++++ b/daemon/inspect_fs_unix.ml +@@ -142,7 +142,7 @@ and distro_of_os_release_id = function + | "frugalware" -> Some DISTRO_FRUGALWARE + | "mageia" -> Some DISTRO_MAGEIA + | "neokylin" -> Some DISTRO_NEOKYLIN +- | "opensuse" -> Some DISTRO_OPENSUSE ++ | "opensuse" | "opensuse-leap" -> Some DISTRO_OPENSUSE + | "pld" -> Some DISTRO_PLD_LINUX + | "rhel" -> Some DISTRO_RHEL + | "sles" | "sled" -> Some DISTRO_SLES +-- +2.20.1 + diff --git a/SOURCES/0053-inspect-handle-os-release-opensuse-tumbleweed-as-ope.patch b/SOURCES/0053-inspect-handle-os-release-opensuse-tumbleweed-as-ope.patch new file mode 100644 index 0000000..378a641 --- /dev/null +++ b/SOURCES/0053-inspect-handle-os-release-opensuse-tumbleweed-as-ope.patch @@ -0,0 +1,30 @@ +From c9b55904a06abaea5ee858b590c861caa705ad52 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 30 Nov 2018 12:41:03 +0100 +Subject: [PATCH] inspect: handle os-release "opensuse-tumbleweed" as opensuse + +Followup of commit 70407cd622dda6f088a0876e1e1ae669e9f8a281 for openSUSE +Thumbleweed. + +(cherry picked from commit 28bd06227b1633fa08c073fe8dbe65d013d7dc9e) +--- + daemon/inspect_fs_unix.ml | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/daemon/inspect_fs_unix.ml b/daemon/inspect_fs_unix.ml +index 33b93256f..6c3ab6e34 100644 +--- a/daemon/inspect_fs_unix.ml ++++ b/daemon/inspect_fs_unix.ml +@@ -142,7 +142,8 @@ and distro_of_os_release_id = function + | "frugalware" -> Some DISTRO_FRUGALWARE + | "mageia" -> Some DISTRO_MAGEIA + | "neokylin" -> Some DISTRO_NEOKYLIN +- | "opensuse" | "opensuse-leap" -> Some DISTRO_OPENSUSE ++ | "opensuse" -> Some DISTRO_OPENSUSE ++ | s when String.is_prefix s "opensuse-" -> Some DISTRO_OPENSUSE + | "pld" -> Some DISTRO_PLD_LINUX + | "rhel" -> Some DISTRO_RHEL + | "sles" | "sled" -> Some DISTRO_SLES +-- +2.20.1 + diff --git a/SOURCES/0054-v2v-update-docs-for-VMware-roles-RHBZ-1530967.patch b/SOURCES/0054-v2v-update-docs-for-VMware-roles-RHBZ-1530967.patch new file mode 100644 index 0000000..0a10895 --- /dev/null +++ b/SOURCES/0054-v2v-update-docs-for-VMware-roles-RHBZ-1530967.patch @@ -0,0 +1,43 @@ +From 10bff3240c5593c6c2e3c03063b98c53bb1b963e Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 13 Dec 2018 11:49:48 +0100 +Subject: [PATCH] v2v: update docs for VMware roles (RHBZ#1530967) + +Update the list of permissions needed for VMware vCenter 6.5. + +(cherry picked from commit 37955f14aa628bedbe0c06bddb5f8fa4f508cc62) +--- + v2v/virt-v2v.pod | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 4b53cdc0e..d4d8578cb 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -1331,7 +1331,8 @@ write to libvirt or any other supported target. + + Instead of using the vCenter Administrator role, you can create a + custom non-administrator role to perform the conversion. You will +-however need to give it a minimum set of permissions as follows: ++however need to give it a minimum set of permissions as follows ++(using VMware vCenter 6.5): + + =over 4 + +@@ -1351,10 +1352,12 @@ Enable (check) the following objects: + - Validate session + + Virtual Machine: ++ Interaction: ++ - Guest operating system management by VIX API + Provisioning: + - Allow disk access + - Allow read-only disk access +- - Guest Operating system management by VIX API ++ - Allow virtual machine download + + =back + +-- +2.20.1 + diff --git a/SOURCES/0055-v2v-o-rhv-upload-decouple-name-of-nbdkit-python-plug.patch b/SOURCES/0055-v2v-o-rhv-upload-decouple-name-of-nbdkit-python-plug.patch new file mode 100644 index 0000000..aa07e6b --- /dev/null +++ b/SOURCES/0055-v2v-o-rhv-upload-decouple-name-of-nbdkit-python-plug.patch @@ -0,0 +1,50 @@ +From 6e71dcc1c9c1d8dd37da3f0fd71fc97cc5cbe92f Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 13 Dec 2018 18:36:20 +0100 +Subject: [PATCH] v2v: -o rhv-upload: decouple name of nbdkit python plugin + +Do not assume that the Python plugin of nbdkit has the same name of the +Python interpreter. + +Use the default upstream name of nbdkit to identify it; downstream +distributions must adjust this variable, in case they rename the Python +plugin of nbdkit. + +(cherry picked from commit 6b80c5fb51f08d3e62393e6722655bbcd940f4e7) +--- + v2v/output_rhv_upload.ml | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 7dbd98a0d..79a2fc8fd 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -79,6 +79,7 @@ let parse_output_options options = + { rhv_cafile; rhv_cluster; rhv_direct; rhv_verifypeer } + + let python3 = "python3" (* Defined by PEP 394 *) ++let nbdkit_python_plugin = "python" + let pidfile_timeout = 30 + let finalization_timeout = 5*60 + +@@ -155,7 +156,7 @@ class output_rhv_upload output_alloc output_conn + *) + let error_unless_nbdkit_python3_working () = + let cmd = sprintf "nbdkit %s %s --dump-plugin >/dev/null" +- python3 (quote plugin) in ++ nbdkit_python_plugin (quote plugin) in + if Sys.command cmd <> 0 then + error (f_"nbdkit Python 3 plugin is not installed or not working. It is required if you want to use ‘-o rhv-upload’. + +@@ -222,7 +223,7 @@ See also \"OUTPUT TO RHV\" in the virt-v2v(1) manual.") + "--newstyle"; (* use newstyle NBD protocol *) + "--exportname"; "/"; + +- "python3"; (* use the nbdkit Python 3 plugin *) ++ nbdkit_python_plugin; (* use the nbdkit Python plugin *) + plugin; (* Python plugin script *) + ] in + let args = if verbose () then args @ ["--verbose"] else args in +-- +2.20.1 + diff --git a/SOURCES/0056-v2v-further-doc-update-for-VMware-roles.patch b/SOURCES/0056-v2v-further-doc-update-for-VMware-roles.patch new file mode 100644 index 0000000..286bc72 --- /dev/null +++ b/SOURCES/0056-v2v-further-doc-update-for-VMware-roles.patch @@ -0,0 +1,30 @@ +From c5460f73b805c754ad736dcacc7d6bf7a5f6cfb7 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Mon, 7 Jan 2019 12:23:25 +0100 +Subject: [PATCH] v2v: further doc update for VMware roles + +Remove "Allow virtual machine download", added with +commit 37955f14aa628bedbe0c06bddb5f8fa4f508cc62, because it does not +seem to be actually needed. + +Related: RHBZ#1530967 +(cherry picked from commit 5e5896752ef06872696f1da05b414fc9eca94015) +--- + v2v/virt-v2v.pod | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index d4d8578cb..f4d200e3d 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -1357,7 +1357,6 @@ Enable (check) the following objects: + Provisioning: + - Allow disk access + - Allow read-only disk access +- - Allow virtual machine download + + =back + +-- +2.20.1 + diff --git a/SOURCES/0057-python-fix-call-of-Python-handlers-of-events.patch b/SOURCES/0057-python-fix-call-of-Python-handlers-of-events.patch new file mode 100644 index 0000000..d8e6a65 --- /dev/null +++ b/SOURCES/0057-python-fix-call-of-Python-handlers-of-events.patch @@ -0,0 +1,40 @@ +From da45c7c305a8ed03b7b1b11f6524e1321c5ad2b3 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 22 Jan 2019 12:43:11 +0100 +Subject: [PATCH] python: fix call of Python handlers of events + +Make sure to reference the arguments, to make sure they are kept alive +during the function call; this is visible when setting an event handler +for the CLOSE event, and testing it with Python 3. + +This does not seem to create a memory leak e.g. with Python 2. + +Also, switch away from the quasi-internal PyEval_CallObject to the +public PyObject_CallObject, which takes care of doing safety checks. + +(cherry picked from commit 85235aec837716f1ddb2926b9a59a02543195500) +--- + python/handle.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/python/handle.c b/python/handle.c +index 1ffa4588a..13a93ad8c 100644 +--- a/python/handle.c ++++ b/python/handle.c +@@ -136,11 +136,12 @@ guestfs_int_py_event_callback_wrapper (guestfs_h *g, + args = Py_BuildValue ("(Kis#O)", + (unsigned PY_LONG_LONG) event, event_handle, + buf, buf_len, py_array); ++ Py_INCREF (args); + + if (PyEval_ThreadsInitialized ()) + py_save = PyGILState_Ensure (); + +- py_r = PyEval_CallObject (py_callback, args); ++ py_r = PyObject_CallObject (py_callback, args); + + if (PyEval_ThreadsInitialized ()) + PyGILState_Release (py_save); +-- +2.20.1 + diff --git a/SOURCES/0058-python-change-types-for-RBufferOut-FBuffer-with-Pyth.patch b/SOURCES/0058-python-change-types-for-RBufferOut-FBuffer-with-Pyth.patch new file mode 100644 index 0000000..f31e4e7 --- /dev/null +++ b/SOURCES/0058-python-change-types-for-RBufferOut-FBuffer-with-Pyth.patch @@ -0,0 +1,54 @@ +From f4c25f88b1187bfd1ff73c8f824d9a020716ae79 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 22 Jan 2019 13:04:59 +0100 +Subject: [PATCH] python: change types for RBufferOut/FBuffer with Python 3 + (RHBZ#1661871) + +So far RBufferOut return values, and FBuffer struct fields are 'str' on +all the versions of Python. Python 3 distinguishes between 'str' +(unicode strings), and 'bytes', with 'str' no more able to hold +arbitrary data. + +For this reason, switch the return value of RBufferOut functions, and +FBuffer struct fields to bytes on Python 3: while this is a potentially +incompatibile change, this is the only way to handle safely sequences +of arbitrary bytes. + +(cherry picked from commit 0ee02e0117527b86a31b2a88a14994ce7f15571f) +--- + generator/python.ml | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/generator/python.ml b/generator/python.ml +index 8fa0b17c0..a75b5f375 100644 +--- a/generator/python.ml ++++ b/generator/python.ml +@@ -195,8 +195,13 @@ and generate_python_structs () = + pr " goto err;\n"; + pr " PyDict_SetItemString (dict, \"%s\", value);\n" name; + | name, FBuffer -> ++ pr "#if PY_MAJOR_VERSION >= 3\n"; ++ pr " value = PyBytes_FromStringAndSize (%s->%s, %s->%s_len);\n" ++ typ name typ name; ++ pr "#else\n"; + pr " value = guestfs_int_py_fromstringsize (%s->%s, %s->%s_len);\n" + typ name typ name; ++ pr "#endif\n"; + pr " if (value == NULL)\n"; + pr " goto err;\n"; + pr " PyDict_SetItemString (dict, \"%s\", value);\n" name; +@@ -511,7 +516,11 @@ and generate_python_actions actions () = + pr " guestfs_int_free_string_list (r);\n"; + pr " if (py_r == NULL) goto out;\n"; + | RBufferOut _ -> ++ pr "#if PY_MAJOR_VERSION >= 3\n"; ++ pr " py_r = PyBytes_FromStringAndSize (r, size);\n"; ++ pr "#else\n"; + pr " py_r = guestfs_int_py_fromstringsize (r, size);\n"; ++ pr "#endif\n"; + pr " free (r);\n"; + pr " if (py_r == NULL) goto out;\n"; + ); +-- +2.20.1 + diff --git a/SOURCES/0059-Revert-launch-libvirt-Use-qemu-bridge-helper-to-impl.patch b/SOURCES/0059-Revert-launch-libvirt-Use-qemu-bridge-helper-to-impl.patch new file mode 100644 index 0000000..e9607b2 --- /dev/null +++ b/SOURCES/0059-Revert-launch-libvirt-Use-qemu-bridge-helper-to-impl.patch @@ -0,0 +1,238 @@ +From 66a40516a2696b7528803d7637c022659fa8c46e Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 2 Oct 2014 16:44:07 +0100 +Subject: [PATCH] Revert "launch: libvirt: Use qemu-bridge-helper to implement + a full network (RHBZ#1148012)." + +We've been carrying this exact patch in RHEL 7 for several years. It +reverts the change made in 2014 where we switched to using the virbr0 +bridge for libguestfs networking instead of SLIRP. We thought SLIRP +was going to become unsupported in qemu, but recently there have been +more encouraging signs since it looks like SLIRP will be spun off as a +separate project, running as a modular process and properly secured +and supported. + +This reverts commit 224de20b9a8d5ea56f6337f19b4ca237bb88eca0. + +(cherry picked from commit 492a945791b43f80a769a53e60d0899b3d7c60ab) +--- + lib/guestfs-internal.h | 11 +++++ + lib/guestfs.pod | 10 ----- + lib/launch-direct.c | 11 ----- + lib/launch-libvirt.c | 91 ++++++++++-------------------------------- + 4 files changed, 32 insertions(+), 91 deletions(-) + +diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h +index adeb9478a..fe3a0e3b9 100644 +--- a/lib/guestfs-internal.h ++++ b/lib/guestfs-internal.h +@@ -147,6 +147,17 @@ + #define MACHINE_TYPE "pseries" + #endif + ++/* Differences in qemu device names on ARMv7 (virtio-mmio), s/390x ++ * (CCW) vs normal hardware with PCI. ++ */ ++#if defined(__arm__) ++#define VIRTIO_DEVICE_NAME(type) type "-device" ++#elif defined(__s390x__) ++#define VIRTIO_DEVICE_NAME(type) type "-ccw" ++#else ++#define VIRTIO_DEVICE_NAME(type) type "-pci" ++#endif ++ + /* Guestfs handle and associated structures. */ + + /* State. */ +diff --git a/lib/guestfs.pod b/lib/guestfs.pod +index 4b24006df..c7fbeef03 100644 +--- a/lib/guestfs.pod ++++ b/lib/guestfs.pod +@@ -1551,16 +1551,6 @@ On Fedora, install C for the C file + (containing symbols). Make sure the symbols precisely match the + kernel being used. + +-=head3 network_bridge +- +-The libvirt backend supports: +- +- export LIBGUESTFS_BACKEND_SETTINGS=network_bridge=virbrX +- +-This allows you to override the bridge that is connected to when the +-network is enabled. The default is C. See also +-L. +- + =head2 ATTACHING TO RUNNING DAEMONS + + I This is B and has a tendency to eat +diff --git a/lib/launch-direct.c b/lib/launch-direct.c +index 47e8f37de..f6c494d69 100644 +--- a/lib/launch-direct.c ++++ b/lib/launch-direct.c +@@ -49,17 +49,6 @@ + #include "guestfs_protocol.h" + #include "qemuopts.h" + +-/* Differences in qemu device names on ARMv7 (virtio-mmio), s/390x +- * (CCW) vs normal hardware with PCI. +- */ +-#if defined(__arm__) +-#define VIRTIO_DEVICE_NAME(type) type "-device" +-#elif defined(__s390x__) +-#define VIRTIO_DEVICE_NAME(type) type "-ccw" +-#else +-#define VIRTIO_DEVICE_NAME(type) type "-pci" +-#endif +- + /* Per-handle data. */ + struct backend_direct_data { + pid_t pid; /* Qemu PID. */ +diff --git a/lib/launch-libvirt.c b/lib/launch-libvirt.c +index 7121aee1b..4df26825a 100644 +--- a/lib/launch-libvirt.c ++++ b/lib/launch-libvirt.c +@@ -116,7 +116,6 @@ struct backend_libvirt_data { + char *selinux_label; + char *selinux_imagelabel; + bool selinux_norelabel_disks; +- char *network_bridge; + char name[DOMAIN_NAME_LEN]; /* random name */ + bool is_kvm; /* false = qemu, true = kvm (from capabilities)*/ + struct version libvirt_version; /* libvirt version */ +@@ -157,7 +156,6 @@ static int is_blk (const char *path); + static void ignore_errors (void *ignore, virErrorPtr ignore2); + static void set_socket_create_context (guestfs_h *g); + static void clear_socket_create_context (guestfs_h *g); +-static int check_bridge_exists (guestfs_h *g, const char *brname); + + #if HAVE_LIBSELINUX + static void selinux_warning (guestfs_h *g, const char *func, const char *selinux_op, const char *data); +@@ -438,17 +436,8 @@ launch_libvirt (guestfs_h *g, void *datav, const char *libvirt_uri) + guestfs_get_backend_setting (g, "internal_libvirt_imagelabel"); + data->selinux_norelabel_disks = + guestfs_int_get_backend_setting_bool (g, "internal_libvirt_norelabel_disks"); +- if (g->enable_network) { +- data->network_bridge = +- guestfs_get_backend_setting (g, "network_bridge"); +- if (!data->network_bridge) +- data->network_bridge = safe_strdup (g, "virbr0"); +- } + guestfs_pop_error_handler (g); + +- if (g->enable_network && check_bridge_exists (g, data->network_bridge) == -1) +- goto cleanup; +- + /* Locate and/or build the appliance. */ + TRACE0 (launch_build_libvirt_appliance_start); + +@@ -1403,19 +1392,6 @@ construct_libvirt_xml_devices (guestfs_h *g, + } end_element (); + } end_element (); + +- /* Connect to libvirt bridge (see: RHBZ#1148012). */ +- if (g->enable_network) { +- start_element ("interface") { +- attribute ("type", "bridge"); +- start_element ("source") { +- attribute ("bridge", params->data->network_bridge); +- } end_element (); +- start_element ("model") { +- attribute ("type", "virtio"); +- } end_element (); +- } end_element (); +- } +- + /* Libvirt adds some devices by default. Indicate to libvirt + * that we don't want them. + */ +@@ -1823,6 +1799,27 @@ construct_libvirt_xml_qemu_cmdline (guestfs_h *g, + attribute ("value", tmpdir); + } end_element (); + ++ /* Workaround because libvirt user networking cannot specify "net=" ++ * parameter. ++ */ ++ if (g->enable_network) { ++ start_element ("qemu:arg") { ++ attribute ("value", "-netdev"); ++ } end_element (); ++ ++ start_element ("qemu:arg") { ++ attribute ("value", "user,id=usernet,net=169.254.0.0/16"); ++ } end_element (); ++ ++ start_element ("qemu:arg") { ++ attribute ("value", "-device"); ++ } end_element (); ++ ++ start_element ("qemu:arg") { ++ attribute ("value", VIRTIO_DEVICE_NAME ("virtio-net") ",netdev=usernet"); ++ } end_element (); ++ } ++ + /* The qemu command line arguments requested by the caller. */ + for (hp = g->hv_params; hp; hp = hp->next) { + start_element ("qemu:arg") { +@@ -2060,49 +2057,6 @@ is_blk (const char *path) + return S_ISBLK (statbuf.st_mode); + } + +-static int +-is_dir (const char *path) +-{ +- struct stat statbuf; +- +- if (stat (path, &statbuf) == -1) +- return 0; +- return S_ISDIR (statbuf.st_mode); +-} +- +-/* Used to check the network_bridge exists, or give a useful error +- * message. +- */ +-static int +-check_bridge_exists (guestfs_h *g, const char *brname) +-{ +- CLEANUP_FREE char *path = NULL; +- +- /* If this doesn't look like Linux, give up. */ +- if (!is_dir ("/sys/class/net")) +- return 0; +- +- /* Does the interface exist and is it a bridge? */ +- path = safe_asprintf (g, "/sys/class/net/%s/bridge", brname); +- if (is_dir (path)) +- return 0; +- +- error (g, +- _("bridge ‘%s’ not found. Try running:\n" +- "\n" +- " brctl show\n" +- "\n" +- "to get a list of bridges on the host, and then selecting the\n" +- "bridge you wish the appliance network to connect to using:\n" +- "\n" +- " export LIBGUESTFS_BACKEND_SETTINGS=network_bridge=\n" +- "\n" +- "You may also need to allow the bridge in /etc/qemu/bridge.conf.\n" +- "For further information see guestfs(3)."), +- brname); +- return -1; +-} +- + static void + ignore_errors (void *ignore, virErrorPtr ignore2) + { +@@ -2148,9 +2102,6 @@ shutdown_libvirt (guestfs_h *g, void *datav, int check_for_errors) + free (data->selinux_imagelabel); + data->selinux_imagelabel = NULL; + +- free (data->network_bridge); +- data->network_bridge = NULL; +- + for (i = 0; i < data->nr_secrets; ++i) + free (data->secrets[i].secret); + free (data->secrets); +-- +2.20.1 + diff --git a/SOURCES/0060-RHEL-8-Remove-libguestfs-live-RHBZ-798980.patch b/SOURCES/0060-RHEL-8-Remove-libguestfs-live-RHBZ-798980.patch new file mode 100644 index 0000000..1e35756 --- /dev/null +++ b/SOURCES/0060-RHEL-8-Remove-libguestfs-live-RHBZ-798980.patch @@ -0,0 +1,38 @@ +From 3f9e952ef7c825e1458986e40fad3153fb09473d Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 21 Dec 2012 15:50:11 +0000 +Subject: [PATCH] RHEL 8: Remove libguestfs live (RHBZ#798980). + +This isn't supported in RHEL 8. +--- + lib/launch-unix.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/lib/launch-unix.c b/lib/launch-unix.c +index 9af481fd9..974336ccd 100644 +--- a/lib/launch-unix.c ++++ b/lib/launch-unix.c +@@ -37,6 +37,12 @@ + static int + launch_unix (guestfs_h *g, void *datav, const char *sockpath) + { ++ error (g, ++ "launch: In RHEL, only the 'libvirt' or 'direct' method is supported.\n" ++ "In particular, \"libguestfs live\" is not supported."); ++ return -1; ++ ++#if 0 + int r, daemon_sock = -1; + struct sockaddr_un addr; + uint32_t size; +@@ -106,6 +112,7 @@ launch_unix (guestfs_h *g, void *datav, const char *sockpath) + g->conn = NULL; + } + return -1; ++#endif + } + + static int +-- +2.20.1 + diff --git a/SOURCES/0061-RHEL-8-Remove-9p-APIs-from-RHEL-RHBZ-921710.patch b/SOURCES/0061-RHEL-8-Remove-9p-APIs-from-RHEL-RHBZ-921710.patch new file mode 100644 index 0000000..17d07f2 --- /dev/null +++ b/SOURCES/0061-RHEL-8-Remove-9p-APIs-from-RHEL-RHBZ-921710.patch @@ -0,0 +1,372 @@ +From 28c43ee7f5ae33ea421732455bfef898235a2e5c Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 18 Jul 2013 18:31:53 +0100 +Subject: [PATCH] RHEL 8: Remove 9p APIs from RHEL (RHBZ#921710). + +--- + Makefile.am | 2 +- + daemon/9p.c | 224 -------------------------------------- + daemon/Makefile.am | 1 - + docs/C_SOURCE_FILES | 1 - + generator/actions_core.ml | 21 ---- + generator/proc_nr.ml | 2 - + gobject/Makefile.inc | 2 - + po/POTFILES | 2 - + 8 files changed, 1 insertion(+), 254 deletions(-) + delete mode 100644 daemon/9p.c + +diff --git a/Makefile.am b/Makefile.am +index cc363341f..8fb25a57c 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -78,7 +78,7 @@ SUBDIRS += tests/xfs + SUBDIRS += tests/charsets + SUBDIRS += tests/xml + SUBDIRS += tests/mount-local +-SUBDIRS += tests/9p ++#SUBDIRS += tests/9p + SUBDIRS += tests/rsync + SUBDIRS += tests/bigdirs + SUBDIRS += tests/disk-labels +diff --git a/daemon/9p.c b/daemon/9p.c +deleted file mode 100644 +index 55644249d..000000000 +--- a/daemon/9p.c ++++ /dev/null +@@ -1,224 +0,0 @@ +-/* libguestfs - the guestfsd daemon +- * Copyright (C) 2011 Red Hat Inc. +- * +- * This program is free software; you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation; either version 2 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +- */ +- +-#include +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include "daemon.h" +-#include "actions.h" +- +-#define BUS_PATH "/sys/bus/virtio/drivers/9pnet_virtio" +- +-static char *read_whole_file (const char *filename); +- +-/* https://bugzilla.redhat.com/show_bug.cgi?id=714981#c1 */ +-char ** +-do_list_9p (void) +-{ +- CLEANUP_FREE_STRINGSBUF DECLARE_STRINGSBUF (r); +- +- DIR *dir; +- +- dir = opendir (BUS_PATH); +- if (!dir) { +- perror ("opendir: " BUS_PATH); +- if (errno != ENOENT) { +- reply_with_perror ("opendir: " BUS_PATH); +- return NULL; +- } +- +- /* If this directory doesn't exist, it probably means that +- * the virtio driver isn't loaded. Don't return an error +- * in this case, but return an empty list. +- */ +- if (end_stringsbuf (&r) == -1) +- return NULL; +- +- return take_stringsbuf (&r); +- } +- +- while (1) { +- struct dirent *d; +- +- errno = 0; +- d = readdir (dir); +- if (d == NULL) break; +- +- if (STRPREFIX (d->d_name, "virtio")) { +- CLEANUP_FREE char *mount_tag_path = NULL; +- if (asprintf (&mount_tag_path, BUS_PATH "/%s/mount_tag", +- d->d_name) == -1) { +- reply_with_perror ("asprintf"); +- closedir (dir); +- return NULL; +- } +- +- /* A bit unclear, but it looks like the virtio transport allows +- * the mount tag length to be unlimited (or up to 65536 bytes). +- * See: linux/include/linux/virtio_9p.h +- */ +- CLEANUP_FREE char *mount_tag = read_whole_file (mount_tag_path); +- if (mount_tag == 0) +- continue; +- +- if (add_string (&r, mount_tag) == -1) { +- closedir (dir); +- return NULL; +- } +- } +- } +- +- /* Check readdir didn't fail */ +- if (errno != 0) { +- reply_with_perror ("readdir: /sys/block"); +- closedir (dir); +- return NULL; +- } +- +- /* Close the directory handle */ +- if (closedir (dir) == -1) { +- reply_with_perror ("closedir: /sys/block"); +- return NULL; +- } +- +- /* Sort the tags. */ +- if (r.size > 0) +- sort_strings (r.argv, r.size); +- +- /* NULL terminate the list */ +- if (end_stringsbuf (&r) == -1) +- return NULL; +- +- return take_stringsbuf (&r); +-} +- +-/* Read whole file into dynamically allocated array. If there is an +- * error, DON'T call reply_with_perror, just return NULL. Returns a +- * \0-terminated string. +- */ +-static char * +-read_whole_file (const char *filename) +-{ +- char *r = NULL; +- size_t alloc = 0, size = 0; +- int fd; +- +- fd = open (filename, O_RDONLY|O_CLOEXEC); +- if (fd == -1) { +- perror (filename); +- return NULL; +- } +- +- while (1) { +- alloc += 256; +- char *r2 = realloc (r, alloc); +- if (r2 == NULL) { +- perror ("realloc"); +- free (r); +- close (fd); +- return NULL; +- } +- r = r2; +- +- /* The '- 1' in the size calculation ensures there is space below +- * to add \0 to the end of the input. +- */ +- ssize_t n = read (fd, r + size, alloc - size - 1); +- if (n == -1) { +- fprintf (stderr, "read: %s: %m\n", filename); +- free (r); +- close (fd); +- return NULL; +- } +- if (n == 0) +- break; +- size += n; +- } +- +- if (close (fd) == -1) { +- fprintf (stderr, "close: %s: %m\n", filename); +- free (r); +- return NULL; +- } +- +- r[size] = '\0'; +- +- return r; +-} +- +-/* Takes optional arguments, consult optargs_bitmask. */ +-int +-do_mount_9p (const char *mount_tag, const char *mountpoint, const char *options) +-{ +- CLEANUP_FREE char *mp = NULL, *opts = NULL, *err = NULL; +- struct stat statbuf; +- int r; +- +- ABS_PATH (mountpoint, 0, return -1); +- +- mp = sysroot_path (mountpoint); +- if (!mp) { +- reply_with_perror ("malloc"); +- return -1; +- } +- +- /* Check the mountpoint exists and is a directory. */ +- if (stat (mp, &statbuf) == -1) { +- reply_with_perror ("%s", mountpoint); +- return -1; +- } +- if (!S_ISDIR (statbuf.st_mode)) { +- reply_with_perror ("%s: mount point is not a directory", mountpoint); +- return -1; +- } +- +- /* Add trans=virtio to the options. */ +- if ((optargs_bitmask & GUESTFS_MOUNT_9P_OPTIONS_BITMASK) && +- STRNEQ (options, "")) { +- if (asprintf (&opts, "trans=virtio,%s", options) == -1) { +- reply_with_perror ("asprintf"); +- return -1; +- } +- } +- else { +- opts = strdup ("trans=virtio"); +- if (opts == NULL) { +- reply_with_perror ("strdup"); +- return -1; +- } +- } +- +- r = command (NULL, &err, +- "mount", "-o", opts, "-t", "9p", mount_tag, mp, NULL); +- if (r == -1) { +- reply_with_error ("%s on %s: %s", mount_tag, mountpoint, err); +- return -1; +- } +- +- return 0; +-} +diff --git a/daemon/Makefile.am b/daemon/Makefile.am +index dcae1a66c..75bef5500 100644 +--- a/daemon/Makefile.am ++++ b/daemon/Makefile.am +@@ -76,7 +76,6 @@ guestfsd_SOURCES = \ + ../common/protocol/guestfs_protocol.h \ + ../common/utils/cleanups.h \ + ../common/utils/guestfs-utils.h \ +- 9p.c \ + acl.c \ + actions.h \ + available.c \ +diff --git a/docs/C_SOURCE_FILES b/docs/C_SOURCE_FILES +index f3ee61e0d..e8b1d5283 100644 +--- a/docs/C_SOURCE_FILES ++++ b/docs/C_SOURCE_FILES +@@ -70,7 +70,6 @@ common/windows/windows.h + customize/crypt-c.c + customize/dummy.c + customize/perl_edit-c.c +-daemon/9p.c + daemon/acl.c + daemon/actions.h + daemon/augeas.c +diff --git a/generator/actions_core.ml b/generator/actions_core.ml +index 2ae3ec1d9..237edafce 100644 +--- a/generator/actions_core.ml ++++ b/generator/actions_core.ml +@@ -6179,27 +6179,6 @@ This returns true iff the device exists and contains all zero bytes. + + Note that for large devices this can take a long time to run." }; + +- { defaults with +- name = "list_9p"; added = (1, 11, 12); +- style = RStringList (RPlainString, "mounttags"), [], []; +- shortdesc = "list 9p filesystems"; +- longdesc = "\ +-List all 9p filesystems attached to the guest. A list of +-mount tags is returned." }; +- +- { defaults with +- name = "mount_9p"; added = (1, 11, 12); +- style = RErr, [String (PlainString, "mounttag"); String (PlainString, "mountpoint")], [OString "options"]; +- camel_name = "Mount9P"; +- shortdesc = "mount 9p filesystem"; +- longdesc = "\ +-Mount the virtio-9p filesystem with the tag C on the +-directory C. +- +-If required, C will be automatically added to the options. +-Any other options required can be passed in the optional C +-parameter." }; +- + { defaults with + name = "list_dm_devices"; added = (1, 11, 15); + style = RStringList (RDevice, "devices"), [], []; +diff --git a/generator/proc_nr.ml b/generator/proc_nr.ml +index 9e16ab14a..e6b018c62 100644 +--- a/generator/proc_nr.ml ++++ b/generator/proc_nr.ml +@@ -295,8 +295,6 @@ let proc_nr = [ + 282, "internal_autosync"; + 283, "is_zero"; + 284, "is_zero_device"; +-285, "list_9p"; +-286, "mount_9p"; + 287, "list_dm_devices"; + 288, "ntfsresize"; + 289, "btrfs_filesystem_resize"; +diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc +index 5aa2dcafe..b8f8e9226 100644 +--- a/gobject/Makefile.inc ++++ b/gobject/Makefile.inc +@@ -93,7 +93,6 @@ guestfs_gobject_headers= \ + include/guestfs-gobject/optargs-mksquashfs.h \ + include/guestfs-gobject/optargs-mkswap.h \ + include/guestfs-gobject/optargs-mktemp.h \ +- include/guestfs-gobject/optargs-mount_9p.h \ + include/guestfs-gobject/optargs-mount_local.h \ + include/guestfs-gobject/optargs-ntfsclone_out.h \ + include/guestfs-gobject/optargs-ntfsfix.h \ +@@ -186,7 +185,6 @@ guestfs_gobject_sources= \ + src/optargs-mksquashfs.c \ + src/optargs-mkswap.c \ + src/optargs-mktemp.c \ +- src/optargs-mount_9p.c \ + src/optargs-mount_local.c \ + src/optargs-ntfsclone_out.c \ + src/optargs-ntfsfix.c \ +diff --git a/po/POTFILES b/po/POTFILES +index a049d66fe..5daec8a89 100644 +--- a/po/POTFILES ++++ b/po/POTFILES +@@ -58,7 +58,6 @@ customize/crypt-c.c + customize/dummy.c + customize/perl_edit-c.c + customize/test-password.pl +-daemon/9p.c + daemon/acl.c + daemon/augeas.c + daemon/available.c +@@ -290,7 +289,6 @@ gobject/src/optargs-mkfs_btrfs.c + gobject/src/optargs-mksquashfs.c + gobject/src/optargs-mkswap.c + gobject/src/optargs-mktemp.c +-gobject/src/optargs-mount_9p.c + gobject/src/optargs-mount_local.c + gobject/src/optargs-ntfsclone_out.c + gobject/src/optargs-ntfsfix.c +-- +2.20.1 + diff --git a/SOURCES/0062-RHEL-8-Disable-unsupported-remote-drive-protocols-RH.patch b/SOURCES/0062-RHEL-8-Disable-unsupported-remote-drive-protocols-RH.patch new file mode 100644 index 0000000..96a30cd --- /dev/null +++ b/SOURCES/0062-RHEL-8-Disable-unsupported-remote-drive-protocols-RH.patch @@ -0,0 +1,609 @@ +From ff52a86d87cd1e36fd3b59beb1c3e590dd475d34 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 29 Jul 2013 14:47:56 +0100 +Subject: [PATCH] RHEL 8: Disable unsupported remote drive protocols + (RHBZ#962113). + +This disables support for unsupported remote drive protocols: + + * ftp + * ftps + * http + * https + * tftp + * gluster + * iscsi + * sheepdog + * ssh + +Note 'nbd' is not disabled, and of course 'file' works. + +We hope to gradually add some of these back over the lifetime of RHEL 8. +--- + docs/guestfs-testing.pod | 20 ----- + fish/guestfish.pod | 66 ++-------------- + fish/test-add-uri.sh | 32 -------- + generator/actions_core.ml | 50 +------------ + lib/drives.c | 8 ++ + lib/guestfs.pod | 100 ------------------------- + tests/disks/test-qemu-drive-libvirt.sh | 28 ------- + tests/disks/test-qemu-drive.sh | 60 --------------- + 8 files changed, 16 insertions(+), 348 deletions(-) + +diff --git a/docs/guestfs-testing.pod b/docs/guestfs-testing.pod +index f558964bf..8f264ed17 100644 +--- a/docs/guestfs-testing.pod ++++ b/docs/guestfs-testing.pod +@@ -109,26 +109,6 @@ image. To exit, type C. + If you get an error, try enabling debugging (add C<-v> to the command + line). Also make sure that L succeeds. + +-=head2 Try to open a remote guest image with guestfish. +- +-You may also have to disable libvirt by setting this: +- +- export LIBGUESTFS_BACKEND=direct +- +-If you have a disk image available over HTTP/FTP, try to open it. +- +- guestfish --ro -i --format=raw -a http://www.example.com/disk.img +- +-For SSH you will need to make sure that ssh-agent is set up so you +-don't need a password to log in to the remote machine. Then a command +-similar to this should work: +- +- guestfish --ro -i --format=raw \ +- -a ssh://remote.example.com/path/to/disk.img +- +-If you get an error, try enabling debugging (add C<-v> to the command +-line). Also make sure that L succeeds. +- + =head2 Run virt-alignment-scan on all your guests. + + Run L on guests or disk images: +diff --git a/fish/guestfish.pod b/fish/guestfish.pod +index bbf43aad5..f4762f929 100644 +--- a/fish/guestfish.pod ++++ b/fish/guestfish.pod +@@ -131,9 +131,9 @@ To list what is available do: + + =head2 Remote drives + +-Access a remote disk using ssh: ++Access a remote disk using NBD: + +- guestfish -a ssh://example.com/path/to/disk.img ++ guestfish -a nbd://example.com + + =head2 Remote control + +@@ -1127,12 +1127,12 @@ L>. + On the command line, you can use the I<-a> option to add network + block devices using a URI-style format, for example: + +- guestfish -a ssh://root@example.com/disk.img ++ guestfish -a nbd://example.com + + URIs I be used with the L command. The equivalent + command using the API directly is: + +- > add /disk.img protocol:ssh server:tcp:example.com username:root ++ > add /disk.img protocol:nbd server:tcp:example.com + + The possible I<-a URI> formats are described below. + +@@ -1142,40 +1142,6 @@ The possible I<-a URI> formats are described below. + + Add the local disk image (or device) called F. + +-=head2 B<-a ftp://[user@]example.com[:port]/disk.img> +- +-=head2 B<-a ftps://[user@]example.com[:port]/disk.img> +- +-=head2 B<-a http://[user@]example.com[:port]/disk.img> +- +-=head2 B<-a https://[user@]example.com[:port]/disk.img> +- +-=head2 B<-a tftp://[user@]example.com[:port]/disk.img> +- +-Add a disk located on a remote FTP, HTTP or TFTP server. +- +-The equivalent API command would be: +- +- > add /disk.img protocol:(ftp|...) server:tcp:example.com +- +-=head2 B<-a gluster://example.com[:port]/volname/image> +- +-Add a disk image located on GlusterFS storage. +- +-The server is the one running C, and may be C. +- +-The equivalent API command would be: +- +- > add volname/image protocol:gluster server:tcp:example.com +- +-=head2 B<-a iscsi://example.com[:port]/target-iqn-name[/lun]> +- +-Add a disk located on an iSCSI server. +- +-The equivalent API command would be: +- +- > add target-iqn-name/lun protocol:iscsi server:tcp:example.com +- + =head2 B<-a nbd://example.com[:port]> + + =head2 B<-a nbd://example.com[:port]/exportname> +@@ -1210,35 +1176,13 @@ The equivalent API command would be: + + > add pool/disk protocol:rbd server:tcp:example.com:port + +-=head2 B<-a sheepdog://[example.com[:port]]/volume/image> +- +-Add a disk image located on a Sheepdog volume. +- +-The server name is optional. Although libguestfs and Sheepdog +-supports multiple servers, only at most one server can be specified +-when using this URI syntax. +- +-The equivalent API command would be: +- +- > add volume protocol:sheepdog [server:tcp:example.com] +- +-=head2 B<-a ssh://[user@]example.com[:port]/disk.img> +- +-Add a disk image located on a remote server, accessed using the Secure +-Shell (ssh) SFTP protocol. SFTP is supported out of the box by all +-major SSH servers. +- +-The equivalent API command would be: +- +- > add /disk protocol:ssh server:tcp:example.com [username:user] +- + Note that the URIs follow the syntax of + L: in particular, there + are restrictions on the allowed characters for the various components + of the URI. Characters such as C<:>, C<@>, and C B be + percent-encoded: + +- $ guestfish -a ssh://user:pass%40word@example.com/disk.img ++ $ guestfish -a rbd://user:pass%40word@example.com[:port]/pool/disk + + In this case, the password is C. + +diff --git a/fish/test-add-uri.sh b/fish/test-add-uri.sh +index 756df997b..8f84fd31b 100755 +--- a/fish/test-add-uri.sh ++++ b/fish/test-add-uri.sh +@@ -40,14 +40,6 @@ function fail () + $VG guestfish -x -a file://$abs_builddir/test-add-uri.img test-add-uri.out 2>&1 + grep -sq 'add_drive ".*/test-add-uri.img"' test-add-uri.out || fail + +-# curl +-$VG guestfish -x -a ftp://user@example.com/disk.img test-add-uri.out 2>&1 +-grep -sq 'add_drive "/disk.img" "protocol:ftp" "server:tcp:example.com" "username:user"' test-add-uri.out || fail +- +-# gluster +-$VG guestfish -x -a gluster://example.com/disk test-add-uri.out 2>&1 +-grep -sq 'add_drive "disk" "protocol:gluster" "server:tcp:example.com"' test-add-uri.out || fail +- + # NBD + $VG guestfish -x -a nbd://example.com test-add-uri.out 2>&1 + grep -sq 'add_drive "" "protocol:nbd" "server:tcp:example.com"' test-add-uri.out || fail +@@ -67,29 +59,5 @@ grep -sq 'add_drive "pool/disk" "protocol:rbd" "server:tcp:example.com:6789"' te + $VG guestfish -x -a rbd:///pool/disk test-add-uri.out 2>&1 + grep -sq 'add_drive "pool/disk" "protocol:rbd"' test-add-uri.out || fail + +-# sheepdog +-$VG guestfish -x -a sheepdog:///volume/image test-add-uri.out 2>&1 +-grep -sq 'add_drive "volume/image" "protocol:sheepdog"' test-add-uri.out || fail +- +-$VG guestfish -x -a sheepdog://example.com:3000/volume/image test-add-uri.out 2>&1 +-grep -sq 'add_drive "volume/image" "protocol:sheepdog" "server:tcp:example.com:3000"' test-add-uri.out || fail +- +-# ssh +-$VG guestfish -x -a ssh://example.com/disk.img test-add-uri.out 2>&1 +-grep -sq 'add_drive "/disk.img" "protocol:ssh" "server:tcp:example.com"' test-add-uri.out || fail +- +-$VG guestfish -x -a ssh://user@example.com/disk.img test-add-uri.out 2>&1 +-grep -sq 'add_drive "/disk.img" "protocol:ssh" "server:tcp:example.com" "username:user"' test-add-uri.out || fail +- +-$VG guestfish -x -a ssh://user@example.com:2000/disk.img test-add-uri.out 2>&1 +-grep -sq 'add_drive "/disk.img" "protocol:ssh" "server:tcp:example.com:2000" "username:user"' test-add-uri.out || fail +- +-# iSCSI +-$VG guestfish -x -a iscsi://example.com/iqn.2015-12.com.libguestfs:test1/0 test-add-uri.out 2>&1 +-grep -sq 'add_drive "iqn.2015-12.com.libguestfs:test1/0" "protocol:iscsi" "server:tcp:example.com"' test-add-uri.out || fail +- +-$VG guestfish -x -a iscsi://user:password@example.com/iqn.2015-12.com.libguestfs:test2/0 test-add-uri.out 2>&1 +-grep -sq 'add_drive "iqn.2015-12.com.libguestfs:test2/0" "protocol:iscsi" "server:tcp:example.com" "username:user" "secret:password"' test-add-uri.out || fail +- + rm test-add-uri.out + rm test-add-uri.img +diff --git a/generator/actions_core.ml b/generator/actions_core.ml +index 237edafce..aca5b1f43 100644 +--- a/generator/actions_core.ml ++++ b/generator/actions_core.ml +@@ -297,29 +297,6 @@ F is interpreted as a local file or device. + This is the default if the optional protocol parameter + is omitted. + +-=item C +- +-Connect to a remote FTP, HTTP or TFTP server. +-The C parameter must also be supplied - see below. +- +-See also: L +- +-=item C +- +-Connect to the GlusterFS server. +-The C parameter must also be supplied - see below. +- +-See also: L +- +-=item C +- +-Connect to the iSCSI server. +-The C parameter must also be supplied - see below. +-The C parameter may be supplied. See below. +-The C parameter may be supplied. See below. +- +-See also: L. +- + =item C + + Connect to the Network Block Device server. +@@ -336,22 +313,6 @@ The C parameter may be supplied. See below. + + See also: L. + +-=item C +- +-Connect to the Sheepdog server. +-The C parameter may also be supplied - see below. +- +-See also: L. +- +-=item C +- +-Connect to the Secure Shell (ssh) server. +- +-The C parameter must be supplied. +-The C parameter may be supplied. See below. +- +-See also: L. +- + =back + + =item C +@@ -362,13 +323,8 @@ is a list of server(s). + Protocol Number of servers required + -------- -------------------------- + file List must be empty or param not used at all +- ftp|ftps|http|https|tftp Exactly one +- gluster Exactly one +- iscsi Exactly one + nbd Exactly one + rbd Zero or more +- sheepdog Zero or more +- ssh Exactly one + + Each list element is a string specifying a server. The string must be + in one of the following formats: +@@ -384,10 +340,10 @@ for the protocol is used (see F). + + =item C + +-For the C, C, C, C, C, C, C +-and C protocols, this specifies the remote username. ++For the C ++protocol, this specifies the remote username. + +-If not given, then the local username is used for C, and no authentication ++If not given, then no authentication + is attempted for ceph. But note this sometimes may give unexpected results, for + example if using the libvirt backend and if the libvirt backend is configured to + start the qemu appliance as a special user such as C. If in doubt, +diff --git a/lib/drives.c b/lib/drives.c +index 82ef30093..3d712c6e4 100644 +--- a/lib/drives.c ++++ b/lib/drives.c +@@ -165,6 +165,7 @@ create_drive_non_file (guestfs_h *g, + return drv; + } + ++#if 0 /* DISABLED IN RHEL 8 */ + static struct drive * + create_drive_curl (guestfs_h *g, + const struct drive_create_data *data) +@@ -223,6 +224,7 @@ create_drive_gluster (guestfs_h *g, + + return create_drive_non_file (g, data); + } ++#endif /* DISABLED IN RHEL 8 */ + + static int + nbd_port (void) +@@ -291,6 +293,7 @@ create_drive_rbd (guestfs_h *g, + return create_drive_non_file (g, data); + } + ++#if 0 /* DISABLED IN RHEL 8 */ + static struct drive * + create_drive_sheepdog (guestfs_h *g, + const struct drive_create_data *data) +@@ -391,6 +394,7 @@ create_drive_iscsi (guestfs_h *g, + + return create_drive_non_file (g, data); + } ++#endif /* DISABLED IN RHEL 8 */ + + /** + * Create the special F drive. +@@ -826,6 +830,7 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename, + drv = create_drive_file (g, &data); + } + } ++#if 0 /* DISABLED IN RHEL 8 */ + else if (STREQ (protocol, "ftp")) { + data.protocol = drive_protocol_ftp; + drv = create_drive_curl (g, &data); +@@ -850,6 +855,7 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename, + data.protocol = drive_protocol_iscsi; + drv = create_drive_iscsi (g, &data); + } ++#endif /* DISABLED IN RHEL 8 */ + else if (STREQ (protocol, "nbd")) { + data.protocol = drive_protocol_nbd; + drv = create_drive_nbd (g, &data); +@@ -858,6 +864,7 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename, + data.protocol = drive_protocol_rbd; + drv = create_drive_rbd (g, &data); + } ++#if 0 /* DISABLED IN RHEL 8 */ + else if (STREQ (protocol, "sheepdog")) { + data.protocol = drive_protocol_sheepdog; + drv = create_drive_sheepdog (g, &data); +@@ -870,6 +877,7 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename, + data.protocol = drive_protocol_tftp; + drv = create_drive_curl (g, &data); + } ++#endif /* DISABLED IN RHEL 8 */ + else { + error (g, _("unknown protocol ‘%s’"), protocol); + drv = NULL; /*FALLTHROUGH*/ +diff --git a/lib/guestfs.pod b/lib/guestfs.pod +index c7fbeef03..18e336a1f 100644 +--- a/lib/guestfs.pod ++++ b/lib/guestfs.pod +@@ -714,70 +714,6 @@ servers. The server string is documented in + L. The C and C parameters are + also optional, and if not given, then no authentication will be used. + +-=head3 FTP, HTTP AND TFTP +- +-Libguestfs can access remote disks over FTP, FTPS, HTTP, HTTPS +-or TFTP protocols. +- +-To do this, set the optional C and C parameters of +-L like this: +- +- char **servers = { "www.example.org", NULL }; +- guestfs_add_drive_opts (g, "/disk.img", +- GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", +- GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "http", +- GUESTFS_ADD_DRIVE_OPTS_SERVER, servers, +- -1); +- +-The C can be one of C<"ftp">, C<"ftps">, C<"http">, +-C<"https"> or C<"tftp">. +- +-C (the C parameter) is a list which must have a +-single element. The single element is a string defining the web, +-FTP or TFTP server. The format of this string is documented in +-L. +- +-=head3 GLUSTER +- +-Libguestfs can access Gluster disks. +- +-To do this, set the optional C and C parameters of +-L like this: +- +- char **servers = { "gluster.example.org:24007", NULL }; +- guestfs_add_drive_opts (g, "volname/image", +- GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", +- GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "gluster", +- GUESTFS_ADD_DRIVE_OPTS_SERVER, servers, +- -1); +- +-C (the C parameter) is a list which must have a +-single element. The single element is a string defining the Gluster +-server. The format of this string is documented in +-L. +- +-Note that gluster usually requires the client process (ie. libguestfs) +-to run as B and will give unfathomable errors if it is not +-(eg. "No data available"). +- +-=head3 ISCSI +- +-Libguestfs can access iSCSI disks remotely. +- +-To do this, set the optional C and C parameters like +-this: +- +- char **server = { "iscsi.example.org:3000", NULL }; +- guestfs_add_drive_opts (g, "target-iqn-name/lun", +- GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", +- GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "iscsi", +- GUESTFS_ADD_DRIVE_OPTS_SERVER, server, +- -1); +- +-The C parameter is a list which must have a single element. +-The single element is a string defining the iSCSI server. The format +-of this string is documented in L. +- + =head3 NETWORK BLOCK DEVICE + + Libguestfs can access Network Block Device (NBD) disks remotely. +@@ -840,42 +776,6 @@ L + + =back + +-=head3 SHEEPDOG +- +-Libguestfs can access Sheepdog disks. +- +-To do this, set the optional C and C parameters of +-L like this: +- +- char **servers = { /* optional servers ... */ NULL }; +- guestfs_add_drive_opts (g, "volume", +- GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", +- GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "sheepdog", +- GUESTFS_ADD_DRIVE_OPTS_SERVER, servers, +- -1); +- +-The optional list of C may be zero or more server addresses +-(C<"hostname:port">). The format of the server strings is documented +-in L. +- +-=head3 SSH +- +-Libguestfs can access disks over a Secure Shell (SSH) connection. +- +-To do this, set the C and C and (optionally) +-C parameters of L like this: +- +- char **server = { "remote.example.com", NULL }; +- guestfs_add_drive_opts (g, "/path/to/disk.img", +- GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", +- GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "ssh", +- GUESTFS_ADD_DRIVE_OPTS_SERVER, server, +- GUESTFS_ADD_DRIVE_OPTS_USERNAME, "remoteuser", +- -1); +- +-The format of the server string is documented in +-L. +- + =head2 INSPECTION + + Libguestfs has APIs for inspecting an unknown disk image to find out +diff --git a/tests/disks/test-qemu-drive-libvirt.sh b/tests/disks/test-qemu-drive-libvirt.sh +index ab8052de1..ad22b2fbb 100755 +--- a/tests/disks/test-qemu-drive-libvirt.sh ++++ b/tests/disks/test-qemu-drive-libvirt.sh +@@ -64,34 +64,6 @@ check_output + grep -sq -- '-drive file=rbd:abc-def/ghi-jkl:auth_supported=none,' "$DEBUG_QEMU_FILE" || fail ceph2 + rm "$DEBUG_QEMU_FILE" + +-# Gluster. +- +-$guestfish -d gluster run ||: +-check_output +-grep -sq -- '-drive file=gluster://1.2.3.4:1234/volname/image,' "$DEBUG_QEMU_FILE" || fail gluster +-rm "$DEBUG_QEMU_FILE" +- +-# iSCSI. +- +-$guestfish -d iscsi run ||: +-check_output +-grep -sq -- '-drive file=iscsi://1.2.3.4:1234/iqn.2003-01.org.linux-iscsi.fedora' "$DEBUG_QEMU_FILE" || fail iscsi +-rm "$DEBUG_QEMU_FILE" +- +-# NBD. +- +-$guestfish -d nbd run ||: +-check_output +-grep -sq -- '-drive file=nbd:1.2.3.4:1234,' "$DEBUG_QEMU_FILE" || fail nbd +-rm "$DEBUG_QEMU_FILE" +- +-# Sheepdog. +- +-$guestfish -d sheepdog run ||: +-check_output +-grep -sq -- '-drive file=sheepdog:volume,' "$DEBUG_QEMU_FILE" || fail sheepdog +-rm "$DEBUG_QEMU_FILE" +- + # Local, stored in a pool. + + $guestfish -d pool1 run ||: +diff --git a/tests/disks/test-qemu-drive.sh b/tests/disks/test-qemu-drive.sh +index 19dd60a2f..583e031bd 100755 +--- a/tests/disks/test-qemu-drive.sh ++++ b/tests/disks/test-qemu-drive.sh +@@ -62,45 +62,6 @@ check_output + grep -sq -- '-drive file=rbd:abc-def/ghi-jkl:auth_supported=none,' "$DEBUG_QEMU_FILE" || fail + rm "$DEBUG_QEMU_FILE" + +-# HTTP. +- +-guestfish < +Date: Fri, 19 Sep 2014 13:38:20 +0100 +Subject: [PATCH] RHEL 8: Remove User-Mode Linux (RHBZ#1144197). + +This isn't supported in RHEL 8. +--- + lib/launch-uml.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/lib/launch-uml.c b/lib/launch-uml.c +index b8825cf56..1acf8db27 100644 +--- a/lib/launch-uml.c ++++ b/lib/launch-uml.c +@@ -44,7 +44,9 @@ struct backend_uml_data { + char umid[UML_UMID_LEN+1]; /* umid=<...> unique ID. */ + }; + ++#if 0 + static void print_vmlinux_command_line (guestfs_h *g, char **argv); ++#endif + + /* Run uml_mkcow to create a COW overlay. */ + static char * +@@ -81,6 +83,7 @@ create_cow_overlay_uml (guestfs_h *g, void *datav, struct drive *drv) + return make_cow_overlay (g, drv->src.u.path); + } + ++#if 0 + /* Test for features which are not supported by the UML backend. + * Possibly some of these should just be warnings, not errors. + */ +@@ -128,10 +131,17 @@ uml_supported (guestfs_h *g) + + return true; + } ++#endif + + static int + launch_uml (guestfs_h *g, void *datav, const char *arg) + { ++ error (g, ++ "launch: In RHEL, only the 'libvirt' or 'direct' method is supported.\n" ++ "In particular, User-Mode Linux (UML) is not supported."); ++ return -1; ++ ++#if 0 + struct backend_uml_data *data = datav; + CLEANUP_FREE_STRINGSBUF DECLARE_STRINGSBUF (cmdline); + int console_sock = -1, daemon_sock = -1; +@@ -491,8 +501,10 @@ launch_uml (guestfs_h *g, void *datav, const char *arg) + } + g->state = CONFIG; + return -1; ++#endif + } + ++#if 0 + /* This is called from the forked subprocess just before vmlinux runs, + * so it can just print the message straight to stderr, where it will + * be picked up and funnelled through the usual appliance event API. +@@ -522,6 +534,7 @@ print_vmlinux_command_line (guestfs_h *g, char **argv) + + fputc ('\n', stderr); + } ++#endif + + static int + shutdown_uml (guestfs_h *g, void *datav, int check_for_errors) +-- +2.20.1 + diff --git a/SOURCES/0064-RHEL-8-v2v-Select-correct-qemu-binary-for-o-qemu-mod.patch b/SOURCES/0064-RHEL-8-v2v-Select-correct-qemu-binary-for-o-qemu-mod.patch new file mode 100644 index 0000000..88eedfe --- /dev/null +++ b/SOURCES/0064-RHEL-8-v2v-Select-correct-qemu-binary-for-o-qemu-mod.patch @@ -0,0 +1,33 @@ +From 81901b3a74d76fbee7a709dee91374c0d0069365 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Sun, 28 Sep 2014 19:14:43 +0100 +Subject: [PATCH] RHEL 8: v2v: Select correct qemu binary for -o qemu mode + (RHBZ#1147313). + +RHEL 8 does not have qemu-system-x86_64 (etc), and in addition the +qemu binary is located in /usr/libexec. Encode the path to this +binary directly in the script. + +Note that we don't support people running qemu directly like this. +It's just for quick testing of converted VMs, and to help us with +support cases. +--- + v2v/output_qemu.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/output_qemu.ml b/v2v/output_qemu.ml +index e23f22e12..c2f43119a 100644 +--- a/v2v/output_qemu.ml ++++ b/v2v/output_qemu.ml +@@ -79,7 +79,7 @@ object + * module deals with shell and qemu comma quoting. + *) + let cmd = Qemuopts.create () in +- Qemuopts.set_binary_by_arch cmd (Some guestcaps.gcaps_arch); ++ Qemuopts.set_binary cmd "/usr/libexec/qemu-kvm"; + + let flag = Qemuopts.flag cmd + and arg = Qemuopts.arg cmd +-- +2.20.1 + diff --git a/SOURCES/0065-RHEL-8-v2v-Disable-the-qemu-boot-option-RHBZ-1147313.patch b/SOURCES/0065-RHEL-8-v2v-Disable-the-qemu-boot-option-RHBZ-1147313.patch new file mode 100644 index 0000000..5424a87 --- /dev/null +++ b/SOURCES/0065-RHEL-8-v2v-Disable-the-qemu-boot-option-RHBZ-1147313.patch @@ -0,0 +1,77 @@ +From d18a3011c9953961db0533d150fc687d691bdc43 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 30 Sep 2014 10:50:27 +0100 +Subject: [PATCH] RHEL 8: v2v: Disable the --qemu-boot option (RHBZ#1147313). + +This cannot work because there is no Gtk or SDL output mode +in RHEL 8's qemu-kvm. + +In addition you will have to edit the -display option in the +qemu script. +--- + v2v/cmdline.ml | 3 ++- + v2v/virt-v2v.pod | 13 ------------- + 2 files changed, 2 insertions(+), 14 deletions(-) + +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index 97d4f4377..6bca12ce3 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -228,7 +228,6 @@ let parse_cmdline () = + s_"Use password from file"; + [ L"print-source" ], Getopt.Set print_source, + s_"Print source and stop"; +- [ L"qemu-boot" ], Getopt.Set qemu_boot, s_"Boot in qemu (-o qemu only)"; + [ L"root" ], Getopt.String ("ask|... ", set_root_choice), + s_"How to choose root filesystem"; + [ L"vddk-config" ], Getopt.String ("filename", set_input_option_compat "vddk-config"), +@@ -564,6 +563,8 @@ read the man page virt-v2v(1). + | Some d when not (is_directory d) -> + error (f_"-os %s: output directory does not exist or is not a directory") d + | Some d -> d in ++ if qemu_boot then ++ error (f_"-o qemu: the --qemu-boot option cannot be used in RHEL"); + Output_qemu.output_qemu os qemu_boot, + output_format, output_alloc + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index f4d200e3d..a5b1c218a 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -115,11 +115,6 @@ Since F contains the path(s) to the guest disk + image(s) you do not need to specify the name of the disk image on the + command line. + +-To convert a local disk image and immediately boot it in local +-qemu, do: +- +- virt-v2v -i disk disk.img -o qemu -os /var/tmp --qemu-boot +- + =head1 INPUT AND OUTPUT MODES + + ┌────────────┐ ┌─────────▶ -o null +@@ -564,9 +559,6 @@ This is similar to I<-o local>, except that a shell script is written + which you can use to boot the guest in qemu. The converted disks and + shell script are written to the directory specified by I<-os>. + +-When using this output mode, you can also specify the I<--qemu-boot> +-option which boots the guest under qemu immediately. +- + =item B<-o> B + + This is the same as I<-o rhv>. +@@ -791,11 +783,6 @@ Print information about the source guest and stop. This option is + useful when you are setting up network and bridge maps. + See L. + +-=item B<--qemu-boot> +- +-When using I<-o qemu> only, this boots the guest immediately after +-virt-v2v finishes. +- + =item B<-q> + + =item B<--quiet> +-- +2.20.1 + diff --git a/SOURCES/0066-RHEL-8-Disable-alternate-Augeas-lenses.patch b/SOURCES/0066-RHEL-8-Disable-alternate-Augeas-lenses.patch new file mode 100644 index 0000000..c44d0a7 --- /dev/null +++ b/SOURCES/0066-RHEL-8-Disable-alternate-Augeas-lenses.patch @@ -0,0 +1,60 @@ +From 2d9866c3d979a54da7a1abd0e8d611890a41212c Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 24 Oct 2014 16:33:50 +0100 +Subject: [PATCH] RHEL 8: Disable alternate Augeas lenses. + +These are included in the RHEL augeas package, and therefore not +required. + +See: +https://www.redhat.com/archives/libguestfs/2014-October/msg00220.html +--- + appliance/Makefile.am | 1 - + daemon/augeas.c | 5 ++++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/appliance/Makefile.am b/appliance/Makefile.am +index 6cba8d158..16714b197 100644 +--- a/appliance/Makefile.am ++++ b/appliance/Makefile.am +@@ -91,7 +91,6 @@ supermin.d/daemon.tar.gz: ../daemon/guestfsd guestfs_shadow.aug + rm -rf tmp-d + mkdir -p tmp-d$(DAEMON_SUPERMIN_DIR) tmp-d/etc tmp-d/usr/share/guestfs + ln ../daemon/guestfsd tmp-d$(DAEMON_SUPERMIN_DIR)/guestfsd +- ln $(srcdir)/guestfs_shadow.aug tmp-d/usr/share/guestfs/guestfs_shadow.aug + ( cd tmp-d && tar zcf - * ) > $@-t + rm -r tmp-d + mv $@-t $@ +diff --git a/daemon/augeas.c b/daemon/augeas.c +index 453251337..5bbfffa2d 100644 +--- a/daemon/augeas.c ++++ b/daemon/augeas.c +@@ -134,7 +134,7 @@ do_aug_init (const char *root, int flags) + } + + /* Pass AUG_NO_ERR_CLOSE so we can display detailed errors. */ +- aug = aug_init (buf, "/usr/share/guestfs/", flags | AUG_NO_ERR_CLOSE); ++ aug = aug_init (buf, NULL, flags | AUG_NO_ERR_CLOSE); + + if (!aug) { + reply_with_error ("augeas initialization failed"); +@@ -148,6 +148,8 @@ do_aug_init (const char *root, int flags) + return -1; + } + ++ /* We already have the needed lenses in RHEL 8 */ ++#if 0 + if (!augeas_is_version (1, 2, 1)) { + int r = aug_transform (aug, "guestfs_shadow", "/etc/shadow", + 0 /* = included */); +@@ -166,6 +168,7 @@ do_aug_init (const char *root, int flags) + } + } + } ++#endif + + return 0; + } +-- +2.20.1 + diff --git a/SOURCES/0067-RHEL-8-Fix-list-of-supported-sound-cards-to-match-RH.patch b/SOURCES/0067-RHEL-8-Fix-list-of-supported-sound-cards-to-match-RH.patch new file mode 100644 index 0000000..68649b3 --- /dev/null +++ b/SOURCES/0067-RHEL-8-Fix-list-of-supported-sound-cards-to-match-RH.patch @@ -0,0 +1,34 @@ +From 615c592af0b26a48d9e9b955257d8793e1c040fd Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 24 Apr 2015 09:45:41 -0400 +Subject: [PATCH] RHEL 8: Fix list of supported sound cards to match RHEL qemu + (RHBZ#1176493). + +--- + v2v/utils.ml | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/v2v/utils.ml b/v2v/utils.ml +index 67e2028f3..436acb5f1 100644 +--- a/v2v/utils.ml ++++ b/v2v/utils.ml +@@ -51,13 +51,14 @@ let kvm_arch = function + (* Does qemu support the given sound card? *) + let qemu_supports_sound_card = function + | Types.AC97 +- | Types.ES1370 + | Types.ICH6 + | Types.ICH9 + | Types.PCSpeaker ++ -> true ++ | Types.ES1370 + | Types.SB16 + | Types.USBAudio +- -> true ++ -> false + + (* Find the UEFI firmware. *) + let find_uefi_firmware guest_arch = +-- +2.20.1 + diff --git a/SOURCES/0068-RHEL-8-Reject-use-of-libguestfs-winsupport-features-.patch b/SOURCES/0068-RHEL-8-Reject-use-of-libguestfs-winsupport-features-.patch new file mode 100644 index 0000000..f9c99f7 --- /dev/null +++ b/SOURCES/0068-RHEL-8-Reject-use-of-libguestfs-winsupport-features-.patch @@ -0,0 +1,40 @@ +From 5618fda1d155350ff2c5277faa81cf257f1f6dea Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 7 Jul 2015 09:28:03 -0400 +Subject: [PATCH] RHEL 8: Reject use of libguestfs-winsupport features except + for virt-* tools (RHBZ#1240276). + +--- + generator/c.ml | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/generator/c.ml b/generator/c.ml +index 0366866e2..ded9685dc 100644 +--- a/generator/c.ml ++++ b/generator/c.ml +@@ -1832,6 +1832,22 @@ and generate_client_actions actions () = + check_args_validity c_name style; + trace_call name c_name style; + ++ (* RHEL 8 *) ++ if name = "mount" || name = "mount_ro" || name = "mount_options" || ++ name = "mount_vfs" then ( ++ pr " if (g->program && !STRPREFIX (g->program, \"virt-\")) {\n"; ++ pr " CLEANUP_FREE char *vfs_type = guestfs_vfs_type (g, mountable);\n"; ++ pr " if (vfs_type && STREQ (vfs_type, \"ntfs\")) {\n"; ++ pr " error (g, \"mount: unsupported filesystem type\");\n"; ++ pr " if (trace_flag)\n"; ++ pr " guestfs_int_trace (g, \"%%s = %%s (error)\",\n"; ++ pr " \"%s\", \"-1\");\n" name; ++ pr " return %s;\n" (string_of_errcode errcode); ++ pr " }\n"; ++ pr " }\n"; ++ pr "\n"; ++ ); ++ + (* Calculate the total size of all FileIn arguments to pass + * as a progress bar hint. + *) +-- +2.20.1 + diff --git a/SOURCES/0069-RHEL-8-Fix-tests-for-libguestfs-winsupport.patch b/SOURCES/0069-RHEL-8-Fix-tests-for-libguestfs-winsupport.patch new file mode 100644 index 0000000..73d7fcf --- /dev/null +++ b/SOURCES/0069-RHEL-8-Fix-tests-for-libguestfs-winsupport.patch @@ -0,0 +1,93 @@ +From 31bfcd182f183d15e996170105c64fb47c553e50 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Sun, 30 Aug 2015 03:21:57 -0400 +Subject: [PATCH] RHEL 8: Fix tests for libguestfs-winsupport. + +It doesn't let us use guestfish for arbitrary Windows edits. +--- + test-data/phony-guests/make-windows-img.sh | 1 + + tests/charsets/test-charset-fidelity.c | 2 ++ + v2v/test-v2v-virtio-win-iso.sh | 8 +++++++- + v2v/test-v2v-windows-conversion.sh | 8 +++++++- + 4 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/test-data/phony-guests/make-windows-img.sh b/test-data/phony-guests/make-windows-img.sh +index d7c3ec9cf..9e556215a 100755 +--- a/test-data/phony-guests/make-windows-img.sh ++++ b/test-data/phony-guests/make-windows-img.sh +@@ -37,6 +37,7 @@ fi + + # Create a disk image. + guestfish < "$script" + :> "$expected" + ++cat >> "$script" < "$response" ++guestfish --ro -a "$d/windows-sda" < "$script" > "$response" + diff -u "$expected" "$response" + + rm -r $d +diff --git a/v2v/test-v2v-windows-conversion.sh b/v2v/test-v2v-windows-conversion.sh +index f1da222a9..ff94fe39b 100755 +--- a/v2v/test-v2v-windows-conversion.sh ++++ b/v2v/test-v2v-windows-conversion.sh +@@ -73,6 +73,12 @@ mktest () + :> "$script" + :> "$expected" + ++cat >> "$script" < "$response" ++guestfish --ro -a "$d/windows-sda" < "$script" > "$response" + diff -u "$expected" "$response" + + # We also update the Registry several times, for firstboot, and (ONLY +-- +2.20.1 + diff --git a/SOURCES/0070-RHEL-8-Revert-v2v-Add-a-support-matrix-to-the-manual.patch b/SOURCES/0070-RHEL-8-Revert-v2v-Add-a-support-matrix-to-the-manual.patch new file mode 100644 index 0000000..9f34ff5 --- /dev/null +++ b/SOURCES/0070-RHEL-8-Revert-v2v-Add-a-support-matrix-to-the-manual.patch @@ -0,0 +1,125 @@ +From b141da6653cf2cd6b73470b7aa0a956fc04802e0 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 21 Sep 2015 15:49:17 +0100 +Subject: [PATCH] RHEL 8: Revert "v2v: Add a support matrix to the manual + page." + +This reverts commit a03bffa15a5357d5d0244595caf99607be1ec3ab. +--- + v2v/virt-v2v.pod | 100 ----------------------------------------------- + 1 file changed, 100 deletions(-) + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index a5b1c218a..86046f891 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -167,106 +167,6 @@ only used when virt-v2v runs under VDSM control. + I<--in-place> instructs virt-v2v to customize the guest OS in the input + virtual machine, instead of creating a new VM in the target hypervisor. + +-=head1 SUPPORT MATRIX +- +-=head2 Hypervisors (Input) +- +-=over 4 +- +-=item VMware ESXi +- +-Must be managed by VMware vCenter E 5.0 unless VDDK is available. +- +-=item OVA exported from VMware +- +-OVAs from other hypervisors will not work. +- +-=item VMX from VMware +- +-VMX files generated by other hypervisors will not work. +- +-=item RHEL 5 Xen +- +-=item SUSE Xen +- +-=item Citrix Xen +- +-Citrix Xen has not been recently tested. +- +-=item Hyper-V +- +-Not recently tested. Requires that you export the disk or use +-L on Hyper-V. +- +-=item Direct from disk images +- +-Only disk images exported from supported hypervisors, and using +-container formats supported by qemu. +- +-=item Physical machines +- +-Using the L tool. +- +-=back +- +-=head2 Hypervisors (Output) +- +-QEMU and KVM only. +- +-=head2 Virtualization management systems (Output) +- +-=over 4 +- +-=item OpenStack Glance +- +-=item Red Hat Virtualization (RHV) 4.1 and up +- +-=item Local libvirt +- +-And hence L, L, and similar tools. +- +-=item Local disk +- +-=back +- +-=head2 Guests +- +-=over 4 +- +-=item Red Hat Enterprise Linux 3, 4, 5, 6, 7 +- +-=item CentOS 3, 4, 5, 6, 7 +- +-=item Scientific Linux 3, 4, 5, 6, 7 +- +-=item Oracle Linux +- +-=item Fedora +- +-=item SLES 10 and up +- +-=item OpenSUSE 10 and up +- +-=item Debian 6 and up +- +-=item Ubuntu 10.04, 12.04, 14.04, 16.04, and up +- +-=item Windows XP to Windows 10 / Windows Server 2016 +- +-We use Windows internal version numbers, see +-L +- +-Currently NT 5.2 to NT 6.3 are supported. +- +-See L below for additional notes on converting Windows +-guests. +- +-=back +- +-=head2 Guest firmware +- +-BIOS or UEFI for all guest types (but see L below). +- + =head1 OPTIONS + + =over 4 +-- +2.20.1 + diff --git a/SOURCES/0071-RHEL-8-tests-Disable-daemon-tests-that-require-the-u.patch b/SOURCES/0071-RHEL-8-tests-Disable-daemon-tests-that-require-the-u.patch new file mode 100644 index 0000000..167cf85 --- /dev/null +++ b/SOURCES/0071-RHEL-8-tests-Disable-daemon-tests-that-require-the-u.patch @@ -0,0 +1,28 @@ +From 2f2626d6e3de4e3e4db056eb0816a2a112f8c070 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 21 Sep 2015 13:12:43 -0400 +Subject: [PATCH] RHEL 8: tests: Disable daemon tests that require the 'unix' + backend. + +--- + tests/daemon/Makefile.am | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/tests/daemon/Makefile.am b/tests/daemon/Makefile.am +index 053cad3e1..0d723fee4 100644 +--- a/tests/daemon/Makefile.am ++++ b/tests/daemon/Makefile.am +@@ -23,9 +23,7 @@ include $(top_srcdir)/subdir-rules.mk + + check_DATA = captive-daemon.pm + +-TESTS = \ +- test-daemon-start.pl \ +- test-btrfs.pl ++TESTS = + + TESTS_ENVIRONMENT = $(top_builddir)/run --test + +-- +2.20.1 + diff --git a/SOURCES/0072-RHEL-8-v2v-Disable-the-virt-v2v-in-place-option.patch b/SOURCES/0072-RHEL-8-v2v-Disable-the-virt-v2v-in-place-option.patch new file mode 100644 index 0000000..028d0bf --- /dev/null +++ b/SOURCES/0072-RHEL-8-v2v-Disable-the-virt-v2v-in-place-option.patch @@ -0,0 +1,284 @@ +From 3391284ce7368506fd03ea2c55cb2bef8253ec3a Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 14 Jan 2016 11:53:42 -0500 +Subject: [PATCH] RHEL 8: v2v: Disable the virt-v2v --in-place option. + +This disables the virt-v2v --in-place option which we do not +wish to support in RHEL. +(See commit d0069559a939e47e5f29973ed9a69a13f0b58301). +--- + v2v/Makefile.am | 2 - + v2v/cmdline.ml | 8 +-- + v2v/test-v2v-docs.sh | 1 + + v2v/test-v2v-in-place.sh | 108 --------------------------------------- + v2v/virt-v2v.pod | 46 +---------------- + 5 files changed, 7 insertions(+), 158 deletions(-) + delete mode 100755 v2v/test-v2v-in-place.sh + +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index 7a1ac329e..156f8ad5b 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -358,7 +358,6 @@ if HAVE_LIBVIRT + TESTS += \ + test-v2v-cdrom.sh \ + test-v2v-floppy.sh \ +- test-v2v-in-place.sh \ + test-v2v-networks-and-bridges.sh \ + test-v2v-no-copy.sh \ + test-v2v-o-glance.sh \ +@@ -497,7 +496,6 @@ EXTRA_DIST += \ + test-v2v-i-vmx-3.vmx \ + test-v2v-i-vmx-4.vmx \ + test-v2v-i-vmx-5.vmx \ +- test-v2v-in-place.sh \ + test-v2v-it-vddk-io-query.sh \ + test-v2v-machine-readable.sh \ + test-v2v-networks-and-bridges-expected.xml \ +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index 6bca12ce3..0efff4c1d 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -198,8 +198,7 @@ let parse_cmdline () = + s_"Set option for input mode"; + [ M"it" ], Getopt.String ("transport", set_string_option_once "-it" input_transport), + s_"Input transport"; +- [ L"in-place" ], Getopt.Set in_place, +- s_"Only tune the guest in the input VM"; ++ [ L"in-place" ], Getopt.Set in_place, Getopt.hidden_option_description; + [ L"machine-readable" ], Getopt.Set machine_readable, + s_"Make output machine readable"; + [ S 'n'; L"network" ], Getopt.String ("in:out", add_network), +@@ -336,7 +335,6 @@ read the man page virt-v2v(1). + printf "vddk\n"; + printf "colours-option\n"; + printf "vdsm-compat-option\n"; +- printf "in-place\n"; + printf "io/oo\n"; + List.iter (printf "input:%s\n") (Modules_list.input_modules ()); + List.iter (printf "output:%s\n") (Modules_list.output_modules ()); +@@ -485,6 +483,10 @@ read the man page virt-v2v(1). + error (f_"only ‘-it ssh’ can be used here") in + Input_vmx.input_vmx input_transport arg in + ++ (* Prevent use of --in-place option in RHEL. *) ++ if in_place then ++ error (f_"--in-place cannot be used in RHEL"); ++ + (* Common error message. *) + let error_option_cannot_be_used_in_output_mode mode opt = + error (f_"-o %s: %s option cannot be used in this output mode") mode opt +diff --git a/v2v/test-v2v-docs.sh b/v2v/test-v2v-docs.sh +index e1e22b599..da98050ee 100755 +--- a/v2v/test-v2v-docs.sh ++++ b/v2v/test-v2v-docs.sh +@@ -26,6 +26,7 @@ $top_srcdir/podcheck.pl virt-v2v.pod virt-v2v \ + --debug-overlay,\ + --ic,\ + --if,\ ++--in-place,\ + --io,\ + --it,\ + --no-trim,\ +diff --git a/v2v/test-v2v-in-place.sh b/v2v/test-v2v-in-place.sh +deleted file mode 100755 +index 6f7d78f39..000000000 +--- a/v2v/test-v2v-in-place.sh ++++ /dev/null +@@ -1,108 +0,0 @@ +-#!/bin/bash - +-# libguestfs virt-v2v test script +-# Copyright (C) 2014 Red Hat Inc. +-# Copyright (C) 2015 Parallels IP Holdings GmbH. +-# +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or +-# (at your option) any later version. +-# +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +- +-# Test --in-place. +- +-unset CDPATH +-export LANG=C +-set -e +- +-$TEST_FUNCTIONS +-skip_if_skipped +-skip_if_backend uml +-skip_unless_phony_guest windows.img +- +-img_base="$abs_top_builddir/test-data/phony-guests/windows.img" +- +-export VIRT_TOOLS_DATA_DIR="$top_srcdir/test-data/fake-virt-tools" +-export VIRTIO_WIN="$top_srcdir/test-data/fake-virtio-win" +- +-d=$PWD/test-v2v-in-place.d +-rm -rf $d +-mkdir $d +- +-img="$d/test.qcow2" +-rm -f $img +-qemu-img create -f qcow2 -b $img_base -o compat=1.1,backing_fmt=raw $img +-md5="$(do_md5 $img_base)" +- +-libvirt_xml="$d/test.xml" +-rm -f $libvirt_xml +-n=windows-overlay +-cat > $libvirt_xml < +- +- $n +- 1048576 +- +- hvm +- +- +- +- +- +- +- +- +- +- +- +-EOF +- +-$VG virt-v2v --debug-gc -i libvirt -ic "test://$libvirt_xml" $n --in-place +- +-# Test that the drivers have been copied over into the guest +-script="$d/test.fish" +-expected="$d/expected" +-response="$d/response" +- +-mktest () +-{ +- local cmd="$1" exp="$2" +- +- echo "echo '$cmd'" >> "$script" +- echo "$cmd" >> "$expected" +- +- echo "$cmd" >> "$script" +- echo "$exp" >> "$expected" +-} +- +-:> "$script" +-:> "$expected" +- +-firstboot_dir="/Program Files/Guestfs/Firstboot" +-mktest "is-dir \"$firstboot_dir\"" true +-mktest "is-file \"$firstboot_dir/firstboot.bat\"" true +-mktest "is-dir \"$firstboot_dir/scripts\"" true +-virtio_dir="/Windows/Drivers/VirtIO" +-mktest "is-dir \"$virtio_dir\"" true +-for drv in netkvm qxl vioscsi viostor; do +- for sfx in cat inf sys; do +- mktest "is-file \"$virtio_dir/$drv.$sfx\"" true +- done +-done +- +-guestfish --ro -a "$img" -i < "$script" > "$response" +-diff -u "$expected" "$response" +- +-# Test the base image remained untouched +-test "$md5" = "$(do_md5 $img_base)" +- +-# Clean up. +-rm -r $d +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 86046f891..e095a6f82 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -18,8 +18,6 @@ virt-v2v - Convert a guest to use KVM + -oo rhv-cafile=/tmp/ca.pem -oo rhv-direct \ + --bridge ovirtmgmt + +- virt-v2v -ic qemu:///system qemu_guest --in-place +- + =head1 DESCRIPTION + + Virt-v2v converts guests from a foreign hypervisor to run on KVM. It +@@ -164,9 +162,6 @@ I<-o rhv-upload> is used to write to a RHV / oVirt target. I<-o rhv> + is a legacy method to write to RHV / oVirt E 4.2. I<-o vdsm> is + only used when virt-v2v runs under VDSM control. + +-I<--in-place> instructs virt-v2v to customize the guest OS in the input +-virtual machine, instead of creating a new VM in the target hypervisor. +- + =head1 OPTIONS + + =over 4 +@@ -280,20 +275,6 @@ For I<-i disk> only, this specifies the format of the input disk + image. For other input methods you should specify the input + format in the metadata. + +-=item B<--in-place> +- +-Do not create an output virtual machine in the target hypervisor. +-Instead, adjust the guest OS in the source VM to run in the input +-hypervisor. +- +-This mode is meant for integration with other toolsets, which take the +-responsibility of converting the VM configuration, providing for +-rollback in case of errors, transforming the storage, etc. +- +-See L below. +- +-Conflicts with all I<-o *> options. +- + =item B<-io> OPTION=VALUE + + Set input option(s) related to the current input mode or transport. +@@ -2160,7 +2141,7 @@ Minimum free space: 10 MB + =head2 Minimum free space check in the host + + You must have sufficient free space in the host directory used to +-store temporary overlays (except in I<--in-place> mode). To find out ++store temporary overlays. To find out + which directory this is, use: + + $ df -h "`guestfish get-cachedir`" +@@ -2292,31 +2273,6 @@ that instead. + + + +-=head1 IN PLACE CONVERSION +- +-It is also possible to use virt-v2v in scenarios where a foreign VM +-has already been imported into a KVM-based hypervisor, but still needs +-adjustments in the guest to make it run in the new virtual hardware. +- +-In that case it is assumed that a third-party tool has created the +-target VM in the supported KVM-based hypervisor based on the source VM +-configuration and contents, but using virtual devices more appropriate +-for KVM (e.g. virtio storage and network, etc.). +- +-Then, to make the guest OS boot and run in the changed environment, +-one can use: +- +- virt-v2v -ic qemu:///system converted_vm --in-place +- +-Virt-v2v will analyze the configuration of C in the +-C libvirt instance, and apply various fixups to the +-guest OS configuration to make it match the VM configuration. This +-may include installing virtio drivers, configuring the bootloader, the +-mountpoints, the network interfaces, and so on. +- +-Should an error occur during the operation, virt-v2v exits with an +-error code leaving the VM in an undefined state. +- + =head1 MACHINE READABLE OUTPUT + + The I<--machine-readable> option can be used to make the output more +-- +2.20.1 + diff --git a/SOURCES/0073-RHEL-8-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch b/SOURCES/0073-RHEL-8-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch new file mode 100644 index 0000000..9c11d92 --- /dev/null +++ b/SOURCES/0073-RHEL-8-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch @@ -0,0 +1,26 @@ +From 24a339f74a0abca4f84fd00d3a2afc9c2564b8eb Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 2 Mar 2017 14:21:37 +0100 +Subject: [PATCH] RHEL 8: v2v: -i disk: force VNC as display (RHBZ#1372671) + +The SDL output mode is not supported in RHEL 8's qemu-kvm. +--- + v2v/input_disk.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/input_disk.ml b/v2v/input_disk.ml +index 7ecd19fd3..e2b16cf70 100644 +--- a/v2v/input_disk.ml ++++ b/v2v/input_disk.ml +@@ -87,7 +87,7 @@ class input_disk input_format disk = object + s_features = [ "acpi"; "apic"; "pae" ]; + s_firmware = UnknownFirmware; (* causes virt-v2v to autodetect *) + s_display = +- Some { s_display_type = Window; s_keymap = None; s_password = None; ++ Some { s_display_type = VNC; s_keymap = None; s_password = None; + s_listen = LNoListen; s_port = None }; + s_video = None; + s_sound = None; +-- +2.20.1 + diff --git a/SOURCES/0074-RHEL-8-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-143020.patch b/SOURCES/0074-RHEL-8-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-143020.patch new file mode 100644 index 0000000..93c1bfa --- /dev/null +++ b/SOURCES/0074-RHEL-8-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-143020.patch @@ -0,0 +1,27 @@ +From e6f868a3949ee95f0528561453a12c323394f5a4 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Wed, 8 Mar 2017 11:03:40 +0100 +Subject: [PATCH] RHEL 8: v2v: do not mention SUSE Xen hosts (RHBZ#1430203) + +They are not supported in RHEL 8. +--- + v2v/virt-v2v.pod | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index e095a6f82..8e3a06434 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -1639,8 +1639,7 @@ verbose messages. + + =head1 INPUT FROM XEN + +-Virt-v2v is able to import Xen guests from RHEL 5 Xen or SLES and +-openSUSE Xen hosts. ++Virt-v2v is able to import Xen guests from RHEL 5 Xen hosts. + + Virt-v2v uses libvirt for access to the remote Xen host, and therefore + the input mode should be I<-i libvirt>. As this is the default, you +-- +2.20.1 + diff --git a/SOURCES/0075-RHEL-8-v2v-disable-unconfig-of-manually-installed-VM.patch b/SOURCES/0075-RHEL-8-v2v-disable-unconfig-of-manually-installed-VM.patch new file mode 100644 index 0000000..c7fe689 --- /dev/null +++ b/SOURCES/0075-RHEL-8-v2v-disable-unconfig-of-manually-installed-VM.patch @@ -0,0 +1,36 @@ +From 8f6ea87fbc19896afbe0e1d0a8441d9283042bdc Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Mon, 14 Aug 2017 10:02:13 +0200 +Subject: [PATCH] RHEL 8: v2v: disable unconfig of manually installed VMware + tools (RHBZ#1477905) + +It looks like they may require connection to the VMware servers, which +is not always available during conversion. +--- + v2v/convert_linux.ml | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml +index da06352a0..c9cf99570 100644 +--- a/v2v/convert_linux.ml ++++ b/v2v/convert_linux.ml +@@ -359,6 +359,7 @@ let convert (g : G.guestfs) inspect source output rcaps = + let remove = !remove in + Linux.remove g inspect remove; + ++(* + (* VMware Tools may have been installed from a tarball, so the + * above code won't remove it. Look for the uninstall tool and run + * if present. +@@ -380,6 +381,8 @@ let convert (g : G.guestfs) inspect source output rcaps = + warning (f_"VMware tools was detected, but uninstallation failed. The error message was: %s (ignored)") + msg + ) ++*) ++ () + + and unconfigure_citrix () = + let pkgs = +-- +2.20.1 + diff --git a/SOURCES/0076-RHEL-8-v2v-rhv-upload-Remove-restriction-on-oa-spars.patch b/SOURCES/0076-RHEL-8-v2v-rhv-upload-Remove-restriction-on-oa-spars.patch new file mode 100644 index 0000000..f1ddb45 --- /dev/null +++ b/SOURCES/0076-RHEL-8-v2v-rhv-upload-Remove-restriction-on-oa-spars.patch @@ -0,0 +1,82 @@ +From 1a6907340ef1023ad42750ef723f15bf7d8c1649 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 14 May 2018 10:16:58 +0100 +Subject: [PATCH] RHEL 8: v2v: rhv-upload: Remove restriction on -oa sparse. + +See: https://bugzilla.redhat.com/show_bug.cgi?id=1565681 +and the v2v-devel private thread "Do we already support migration using FC?" +--- + v2v/output_rhv_upload.ml | 11 +---------- + v2v/rhv-upload-plugin.py | 4 +--- + v2v/virt-v2v.pod | 6 ------ + 3 files changed, 2 insertions(+), 19 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 79a2fc8fd..59911f32c 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -177,19 +177,11 @@ See also \"OUTPUT TO RHV\" in the virt-v2v(1) manual.") + error (f_"nbdkit was compiled without SELinux support. You will have to recompile nbdkit with libselinux-devel installed, or else set SELinux to Permissive mode while doing the conversion.") + in + +- (* Output format/sparse must be raw/sparse. We may be able to +- * lift this limitation in future, but it requires changes on the +- * RHV side. See TODO file for details. XXX +- *) ++ (* Output format must be raw. *) + let error_current_limitation required_param = + error (f_"rhv-upload: currently you must use ‘%s’. This restriction will be loosened in a future version.") required_param + in + +- let error_unless_output_alloc_sparse () = +- if output_alloc <> Sparse then +- error_current_limitation "-oa sparse" +- in +- + (* JSON parameters which are invariant between disks. *) + let json_params = [ + "verbose", JSON.Bool (verbose ()); +@@ -242,7 +234,6 @@ object + error_unless_ovirtsdk4_module_available (); + error_unless_nbdkit_working (); + error_unless_nbdkit_python3_working (); +- error_unless_output_alloc_sparse (); + if have_selinux then + error_unless_nbdkit_compiled_with_selinux () + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 4fad27fb8..41cb29992 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -139,10 +139,8 @@ def open(readonly): + format = disk_format, + initial_size = params['disk_size'], + provisioned_size = params['disk_size'], +- # XXX Ignores params['output_sparse']. +- # Handling this properly will be complex, see: + # https://www.redhat.com/archives/libguestfs/2018-March/msg00177.html +- sparse = True, ++ sparse = params['output_sparse'], + storage_domains = [ + types.StorageDomain( + name = params['output_storage'], +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 8e3a06434..944b0fade 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -1846,12 +1846,6 @@ username is not specified then virt-v2v defaults to using + C which is the typical superuser account for oVirt + instances. + +-=item I<-of raw> +- +-Currently you must use I<-of raw> and you cannot use I<-oa preallocated>. +- +-These restrictions will be loosened in a future version. +- + =item I<-op> F + + A file containing a password to be used when connecting to the oVirt +-- +2.20.1 + diff --git a/SOURCES/0077-RHEL-8-p2v-ignore-rhv-upload-driver-RHBZ-1590220.patch b/SOURCES/0077-RHEL-8-p2v-ignore-rhv-upload-driver-RHBZ-1590220.patch new file mode 100644 index 0000000..72a2b52 --- /dev/null +++ b/SOURCES/0077-RHEL-8-p2v-ignore-rhv-upload-driver-RHBZ-1590220.patch @@ -0,0 +1,33 @@ +From b2f6280262ec17ee7d6e66223808d432ea4f2e3f Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 19 Jul 2018 13:30:17 +0200 +Subject: [PATCH] RHEL 8: p2v: ignore 'rhv-upload' driver (RHBZ#1590220) + +The 'rhv-upload' output mode requires few options, and virt-p2v does not +have the GUI bits for specifying them. +--- + p2v/ssh.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/p2v/ssh.c b/p2v/ssh.c +index 15f53b692..654121a22 100644 +--- a/p2v/ssh.c ++++ b/p2v/ssh.c +@@ -1021,8 +1021,12 @@ add_input_driver (const char *name, size_t len) + static void + add_output_driver (const char *name, size_t len) + { +- /* Ignore the 'vdsm' driver, since that should only be used by VDSM. */ +- if (len != 4 || memcmp (name, "vdsm", 4) != 0) ++ /* Ignore the 'vdsm' driver, since that should only be used by VDSM. ++ * Ignore the 'rhv-upload' driver, since we do not support passing all the ++ * options for it. ++ */ ++ if ((len != 4 || memcmp (name, "vdsm", 4) != 0) && ++ (len != 10 || memcmp (name, "rhv-upload", 10) != 0)) + add_option ("output", &output_drivers, name, len); + } + +-- +2.20.1 + diff --git a/SOURCES/0078-RHEL-8-use-python3-as-nbdkit-plugin.patch b/SOURCES/0078-RHEL-8-use-python3-as-nbdkit-plugin.patch new file mode 100644 index 0000000..aca512a --- /dev/null +++ b/SOURCES/0078-RHEL-8-use-python3-as-nbdkit-plugin.patch @@ -0,0 +1,26 @@ +From a894c559d89907b9c97af481681c3384312f38fe Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Sun, 16 Dec 2018 16:32:46 +0100 +Subject: [PATCH] RHEL 8: use "python3" as nbdkit plugin + +RHEL uses "python3" as name for the nbdkit Python plugin. +--- + v2v/output_rhv_upload.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 59911f32c..1c102dc24 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -79,7 +79,7 @@ let parse_output_options options = + { rhv_cafile; rhv_cluster; rhv_direct; rhv_verifypeer } + + let python3 = "python3" (* Defined by PEP 394 *) +-let nbdkit_python_plugin = "python" ++let nbdkit_python_plugin = "python3" + let pidfile_timeout = 30 + let finalization_timeout = 5*60 + +-- +2.20.1 + diff --git a/SOURCES/0079-RHEL-8-use-platform-python.patch b/SOURCES/0079-RHEL-8-use-platform-python.patch new file mode 100644 index 0000000..7d18dce --- /dev/null +++ b/SOURCES/0079-RHEL-8-use-platform-python.patch @@ -0,0 +1,38 @@ +From 0d014b5aeca2d96918d81ecfdb34b5d9f0b79a68 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Sun, 16 Dec 2018 16:42:46 +0100 +Subject: [PATCH] RHEL 8: use platform-python + +Use the stable platform-python provided in BaseOS, instead of relying on +some arbitrary version installed by the user. +--- + v2v/output_rhv_upload.ml | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 1c102dc24..4e1362d98 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -78,7 +78,7 @@ let parse_output_options options = + + { rhv_cafile; rhv_cluster; rhv_direct; rhv_verifypeer } + +-let python3 = "python3" (* Defined by PEP 394 *) ++let python3 = "/usr/libexec/platform-python" + let nbdkit_python_plugin = "python3" + let pidfile_timeout = 30 + let finalization_timeout = 5*60 +@@ -121,8 +121,8 @@ class output_rhv_upload output_alloc output_conn + + (* Check that the Python binary is available. *) + let error_unless_python_binary_on_path () = +- try ignore (which python3) +- with Executable_not_found _ -> ++ try ignore (Unix.access python3 [Unix.X_OK]) ++ with Unix_error _ -> + error (f_"no python binary called ‘%s’ can be found on the $PATH") + python3 + in +-- +2.20.1 + diff --git a/SOURCES/README-replacement.in b/SOURCES/README-replacement.in new file mode 100644 index 0000000..f264092 --- /dev/null +++ b/SOURCES/README-replacement.in @@ -0,0 +1,38 @@ +Libguestfs is a set of tools and a library for accessing and modifying +guest disk images. For more information see the home page: + + http://libguestfs.org/ + +For discussion, development, patches, etc. please use the mailing +list: + + http://www.redhat.com/mailman/listinfo/libguestfs + +This Red Hat Enterprise Linux package comes with a lot of help and +examples to get you started. + +The first place to start are the manual pages. Type: + + man guestfs + man guestfs-faq + man guestfs-release-notes + man guestfish + man virt-cat # and other virt-* tools + +If you install the libguestfs-devel package, then in the +/usr/share/doc/libguestfs-devel/ directory you will also +find: + + - BUGS: list of open bugs in this version + + - ChangeLog: the detailed list of changes in this version + + - ROADMAP: the roadmap for future versions + + - TODO: ideas for extending libguestfs + + - *.c: example C programs using the API + + - *.xml: example virt-inspector output + + - *.rng: virt-inspector RelaxNG schema diff --git a/SOURCES/brew-overrides.sh b/SOURCES/brew-overrides.sh new file mode 100755 index 0000000..5b72490 --- /dev/null +++ b/SOURCES/brew-overrides.sh @@ -0,0 +1,20 @@ +#!/bin/bash - + +# This script is used when we build libguestfs from brew, as sometimes +# we require packages which are not available in the current version +# of RHEL. Normally these updated packages would be released along +# with libguestfs in the next RHEL, although unfortunately sometimes +# that doesn't happen (eg. RHBZ#1199605). + +set -x + +pkgs=" +" + +for pkg in $pkgs ; do + brew tag-pkg rhel-8.0-temp-override $pkg +done + +for pkg in $pkgs ; do + brew wait-repo rhel-8.0-build --build=$pkg +done diff --git a/SOURCES/copy-patches.sh b/SOURCES/copy-patches.sh new file mode 100755 index 0000000..83737da --- /dev/null +++ b/SOURCES/copy-patches.sh @@ -0,0 +1,55 @@ +#!/bin/bash - + +set -e + +# Maintainer script to copy patches from the git repo to the current +# directory. Use it like this: +# ./copy-patches.sh + +rhel_version=8.0 + +# Check we're in the right directory. +if [ ! -f libguestfs.spec ]; then + echo "$0: run this from the directory containing 'libguestfs.spec'" + exit 1 +fi + +git_checkout=$HOME/d/libguestfs-rhel-$rhel_version +if [ ! -d $git_checkout ]; then + echo "$0: $git_checkout does not exist" + echo "This script is only for use by the maintainer when preparing a" + echo "libguestfs release on RHEL." + exit 1 +fi + +# Get the base version of libguestfs. +version=`grep '^Version:' libguestfs.spec | awk '{print $2}'` +tag="v$version" + +# Remove any existing patches. +git rm -f [0-9]*.patch ||: +rm -f [0-9]*.patch + +# Get the patches. +(cd $git_checkout; rm -f [0-9]*.patch; git format-patch -N $tag) +mv $git_checkout/[0-9]*.patch . + +# Remove any not to be applied. +rm -f *NOT-FOR-RPM*.patch + +# Add the patches. +git add [0-9]*.patch + +# Print out the patch lines. +echo +echo "--- Copy the following text into libguestfs.spec file" +echo + +echo "# Patches." +for f in [0-9]*.patch; do + n=`echo $f | awk -F- '{print $1}'` + echo "Patch$n: $f" +done + +echo +echo "--- End of text" diff --git a/SOURCES/guestfish.sh b/SOURCES/guestfish.sh new file mode 100644 index 0000000..cfd0492 --- /dev/null +++ b/SOURCES/guestfish.sh @@ -0,0 +1,6 @@ +# Guestfish colour prompts. See PROMPT in guestfish(1). +GUESTFISH_PS1='\[\e[1;32m\]>\[\e[0;31m\] ' +GUESTFISH_OUTPUT='\e[0m' +GUESTFISH_RESTORE="$GUESTFISH_OUTPUT" +GUESTFISH_INIT='\e[1;34m' +export GUESTFISH_PS1 GUESTFISH_OUTPUT GUESTFISH_RESTORE GUESTFISH_INIT diff --git a/SOURCES/libguestfs-1.38.4.tar.gz.sig b/SOURCES/libguestfs-1.38.4.tar.gz.sig new file mode 100644 index 0000000..f411613 --- /dev/null +++ b/SOURCES/libguestfs-1.38.4.tar.gz.sig @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIcBAABAgAGBQJbbdyXAAoJEJFzj3Pht2igrTUP/RMnDgC/8Zi5vKDXC8y6n2rD +wgnvmPNNCNXiMOZa9APk8C8GraHwIGo9GjLThr194Dbk1LteIBSpkj3SkxK4z/vR +3sD9cecT0lgTfhYpcFBrKtETKnr0TEGPC4uanczg4kufYkmXoy6yDMJXVJMCn6rf +jR9HG75SGycqtchr4zwnztBw6TFdGA6Oj/RTGuHuYbhu/qmbUZzZ7tJ6JQ2GbyaJ +8EEkSLtSOAtvbHOj+pjiZrG/wBEhy6owjuAxvjF9ctEq4Hmbr13lJuSBzCC/ysUS +itQog+eVclgDNxVmLfJas3druYgGCJKWVJVEBw7H/8KiM+3leeD/4sFENIiQBg2y +0BTHVtH1RvSteQivFAVFvYee0twuYbJucTFELWbNYfw12Yd51KDJ/+Ncbuu/h1J/ +r5ies67AVohhMju5kIoSK0zgZq+Rsiwj+yMcyqLU+ug7UTy1Otd2O9Xskym5y40G +IKUaBxncaNhOQ6LDcChQCEVideBt4ESXS5ySDwIrEQOgEvcGV/JjsYsAH1WVwsEI +o53HI6ZOrTnBAIc7bJ6HnWXSoV+6NN+Tx7o9GT+oB87PzwTKZh0OzmwuQ4q+pmIz +oddg3IsLm8I1Zg8MgP38QVKS7YKIrwy5adN/3Gjd10ZlA70g3JTGzGyU9xH7GcqJ +rVwKc5uGRjPdwY2wyQIL +=NZ5w +-----END PGP SIGNATURE----- diff --git a/SOURCES/yum.conf.in b/SOURCES/yum.conf.in new file mode 100644 index 0000000..d5e30d0 --- /dev/null +++ b/SOURCES/yum.conf.in @@ -0,0 +1,17 @@ +[main] +cachedir=@PWD@/cachedir +debuglevel=1 +logfile=@PWD@/yum.log +retries=20 +obsoletes=1 +gpgcheck=0 +assumeyes=1 +reposdir=/dev/null +modulesdir=@PWD@/modules + +[local] +name=local +baseurl=file://@PWD@/repo +failovermethod=priority +enabled=1 +gpgcheck=0 diff --git a/SPECS/libguestfs.spec b/SPECS/libguestfs.spec new file mode 100644 index 0000000..6c8986f --- /dev/null +++ b/SPECS/libguestfs.spec @@ -0,0 +1,4109 @@ +%global _hardened_build 1 + +# Architectures that we run the basic sanity-check test. +# +# The full test suite is done after the package has been built. Here +# we only do a sanity check that kernel/qemu/libvirt/appliance is not +# broken. To perform the full test suite, see instructions here: +# https://www.redhat.com/archives/libguestfs/2015-September/msg00078.html +# +# Currently the basic sanity check is *broken* on: +# +# aarch64: too much output from verbose AAVMF causes libvirtd lockup (RHBZ#1661940) +# s390x: missing TCG support in brew builders (RHBZ#1615402) +%global test_arches %{power64} x86_64 + +# Architectures where virt-v2v is shipped. +# +# not on aarch64 because it is not useful there +# not on %%{power64} because of RHBZ#1287826 +# not on s390x because it is not useful there +%global v2v_arches x86_64 + +# Architectures where the benchmarking tools are shipped. +%global benchmark_arches aarch64 x86_64 + +# Trim older changelog entries. +# https://lists.fedoraproject.org/pipermail/devel/2013-April/thread.html#181627 +%global _changelog_trimtime %(date +%s -d "2 years ago") + +# Verify tarball signature with GPGv2 (only possible for stable branches). +%global verify_tarball_signature 1 + +# Filter perl provides. +%{?perl_default_filter} + +Summary: Access and modify virtual machine disk images +Name: libguestfs +Epoch: 1 +Version: 1.38.4 +Release: 10%{?dist} +License: LGPLv2+ + +# Source and patches. +URL: http://libguestfs.org/ +Source0: http://libguestfs.org/download/1.38-stable/%{name}-%{version}.tar.gz +%if 0%{verify_tarball_signature} +Source1: http://libguestfs.org/download/1.38-stable/%{name}-%{version}.tar.gz.sig +%endif + +ExclusiveArch: x86_64 %{power64} aarch64 s390x + +# RHEL 8 git repository is: +# https://github.com/libguestfs/libguestfs/tree/rhel-8.0 +# Use 'copy-patches.sh' to copy the patches from the git repo +# to the current directory. + +# Patches. +Patch0001: 0001-Switch-from-YAJL-to-Jansson.patch +Patch0002: 0002-qemu-Fix-transcription-error-in-conversion-of-yajl-t.patch +Patch0003: 0003-v2v-ovf-Create-OVF-more-aligned-with-the-standard.patch +Patch0004: 0004-v2v-vdsm-add-vdsm-fixed-ovf-option.patch +Patch0005: 0005-v2v-OVF-Code-formatting.patch +Patch0006: 0006-v2v-DOM-Add-doc_to_string-function.patch +Patch0007: 0007-v2v-Add-op-output-password-file-option.patch +Patch0008: 0008-v2v-cmdline-Move-definition-to-before-its-only-use.patch +Patch0009: 0009-v2v-Add-general-mechanism-for-input-and-output-optio.patch +Patch0010: 0010-v2v-OVF-write-ovirt-id-attribute-for-the-OS-in-OVirt.patch +Patch0011: 0011-v2v-OVF-fix-ovf-id-for-VirtualSystem-in-OVirt-flavou.patch +Patch0012: 0012-v2v-Add-o-rhv-upload-output-mode-RHBZ-1557273.patch +Patch0013: 0013-v2v-refer-to-the-right-embed-script-in-EXTRA_DIST.patch +Patch0014: 0014-v2v-o-rhv-upload-Don-t-require-of-raw-parameter.patch +Patch0015: 0015-v2v-o-rhv-upload-install-RHV-tools-RHBZ-1561828.patch +Patch0016: 0016-v2v-Map-Windows-Server-2012-R2-x86-64-to-ovirt-ID-25.patch +Patch0017: 0017-v2v-fix-build-rules-for-output_rhv_upload_-_source.m.patch +Patch0018: 0018-v2v-fix-rhevexp-typo-in-documentation.patch +Patch0019: 0019-v2v-add-and-use-Create_ovf.ovf_flavour_to_string.patch +Patch0020: 0020-v2v-o-rhv-upload-Set-inactivity-timeout-RHBZ-1586198.patch +Patch0021: 0021-New-API-inspect_get_osinfo.patch +Patch0022: 0022-inspector-show-the-per-OS-osinfo-guess-RHBZ-1544842.patch +Patch0023: 0023-v2v-o-rhv-upload-Optimize-http-request-sending.patch +Patch0024: 0024-v2v-o-rhv-upload-Log-full-imageio-response-on-failur.patch +Patch0025: 0025-v2v-rvh-upload-plugin-Always-read-the-response.patch +Patch0026: 0026-v2v-rhv-upload-plugin-Fix-name-error.patch +Patch0027: 0027-v2v-rhv-upload-plugin-Remove-unused-variables.patch +Patch0028: 0028-v2v-o-rhv-upload-Always-fetch-server-options-when-op.patch +Patch0029: 0029-v2v-o-rhv-upload-Use-Unix-domain-socket-to-access-im.patch +Patch0030: 0030-v2v-improve-os-documentation-for-rhv-upload.patch +Patch0031: 0031-v2v-rhv-upload-plugin-Remove-unneeded-auth.patch +Patch0032: 0032-v2v-rhv-upload-plugin-Improve-error-handling.patch +Patch0033: 0033-v2v-rhv-upload-plugin-Optimize-only-direct-upload.patch +Patch0034: 0034-v2v-rhv-plugin-find-suitable-host-RHBZ-1596810-RHBZ-.patch +Patch0035: 0035-v2v-change-QXL-ResourceType-in-OVirt-flavour-RHBZ-15.patch +Patch0036: 0036-v2v-o-rhv-upload-check-for-ovirtsdk4-RHBZ-1601943.patch +Patch0037: 0037-v2v-rhv-plugin-fix-DC-search-string.patch +Patch0038: 0038-v2v-rhv-plugin-case-sensitive-search-queries.patch +Patch0039: 0039-uefi-remove-last-references-to-kraxel-s-old-edk2-bui.patch +Patch0040: 0040-v2v-parse_libvirt_xml-handle-srN-CDROM-devices-RHBZ-.patch +Patch0041: 0041-v2v-o-rhv-upload-Fix-error-message-disk-numbering-RH.patch +Patch0042: 0042-v2v-o-rhv-upload-Properly-replace-SD_UUID-in-OVF-RHB.patch +Patch0043: 0043-ppc64le-Don-t-use-cpu-parameter-under-any-circumstan.patch +Patch0044: 0044-tools-Link-OCaml-programs-with-runtime-variant-_pic-.patch +Patch0045: 0045-tools-Ensure-CFLAGS-and-LDFLAGS-are-passed-to-all-OC.patch +Patch0046: 0046-ocaml-make-sure-to-pass-LDFLAGS-to-ocamlmklibs-linke.patch +Patch0047: 0047-v2v-Model-machine-type-explicitly.patch +Patch0048: 0048-v2v-windows-Fix-rhev-apt-command-line-RHBZ-1624902.patch +Patch0049: 0049-v2v-docs-Describe-support-for-SHA-2-certs-for-Window.patch +Patch0050: 0050-v2v-docs-Remove-sentence-about-supporting-qemu-kvm-r.patch +Patch0051: 0051-v2v-linux-improve-regex-for-resume-entries-RHBZ-1651.patch +Patch0052: 0052-inspection-Parse-os-release-opensuse-leap-as-opensus.patch +Patch0053: 0053-inspect-handle-os-release-opensuse-tumbleweed-as-ope.patch +Patch0054: 0054-v2v-update-docs-for-VMware-roles-RHBZ-1530967.patch +Patch0055: 0055-v2v-o-rhv-upload-decouple-name-of-nbdkit-python-plug.patch +Patch0056: 0056-v2v-further-doc-update-for-VMware-roles.patch +Patch0057: 0057-python-fix-call-of-Python-handlers-of-events.patch +Patch0058: 0058-python-change-types-for-RBufferOut-FBuffer-with-Pyth.patch +Patch0059: 0059-Revert-launch-libvirt-Use-qemu-bridge-helper-to-impl.patch +Patch0060: 0060-RHEL-8-Remove-libguestfs-live-RHBZ-798980.patch +Patch0061: 0061-RHEL-8-Remove-9p-APIs-from-RHEL-RHBZ-921710.patch +Patch0062: 0062-RHEL-8-Disable-unsupported-remote-drive-protocols-RH.patch +Patch0063: 0063-RHEL-8-Remove-User-Mode-Linux-RHBZ-1144197.patch +Patch0064: 0064-RHEL-8-v2v-Select-correct-qemu-binary-for-o-qemu-mod.patch +Patch0065: 0065-RHEL-8-v2v-Disable-the-qemu-boot-option-RHBZ-1147313.patch +Patch0066: 0066-RHEL-8-Disable-alternate-Augeas-lenses.patch +Patch0067: 0067-RHEL-8-Fix-list-of-supported-sound-cards-to-match-RH.patch +Patch0068: 0068-RHEL-8-Reject-use-of-libguestfs-winsupport-features-.patch +Patch0069: 0069-RHEL-8-Fix-tests-for-libguestfs-winsupport.patch +Patch0070: 0070-RHEL-8-Revert-v2v-Add-a-support-matrix-to-the-manual.patch +Patch0071: 0071-RHEL-8-tests-Disable-daemon-tests-that-require-the-u.patch +Patch0072: 0072-RHEL-8-v2v-Disable-the-virt-v2v-in-place-option.patch +Patch0073: 0073-RHEL-8-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch +Patch0074: 0074-RHEL-8-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-143020.patch +Patch0075: 0075-RHEL-8-v2v-disable-unconfig-of-manually-installed-VM.patch +Patch0076: 0076-RHEL-8-v2v-rhv-upload-Remove-restriction-on-oa-spars.patch +Patch0077: 0077-RHEL-8-p2v-ignore-rhv-upload-driver-RHBZ-1590220.patch +Patch0078: 0078-RHEL-8-use-python3-as-nbdkit-plugin.patch +Patch0079: 0079-RHEL-8-use-platform-python.patch + +# Use git for patch management. +BuildRequires: git + +# Run autotools after applying the patches. +BuildRequires: autoconf, automake, libtool, gettext-devel + +# Replacement README file for RHEL users. +Source4: README-replacement.in + +# Guestfish colour prompts. +Source5: guestfish.sh + +# Used to build the supermin appliance in Koji. +Source6: yum.conf.in + +# Keyring used to verify tarball signature. +%if 0%{verify_tarball_signature} +Source7: libguestfs.keyring +%endif + +# RHSRVANY and RHEV-APT, used for Windows virt-v2v conversions. +# RHSRVANY is built from source under Fedora from +# mingw32-srvany-1.0-15.20150115gitfd659e77.fc23.noarch +# RHEV-APT is taken from the RHEV Tools CD +# See https://bugzilla.redhat.com/show_bug.cgi?id=1186850 +Source96: rhsrvany.exe +Source97: RHEV-Application-Provisioning-Tool.exe_4.42 + +Source98: brew-overrides.sh +Source99: copy-patches.sh + +# Basic build requirements for the library and virt tools. +BuildRequires: gcc, gcc-c++ +BuildRequires: rpcgen +BuildRequires: libtirpc-devel +BuildRequires: supermin-devel >= 5.1.16-2 +BuildRequires: hivex-devel >= 1.3.10-5.8.el7 +BuildRequires: ocaml-hivex-devel +BuildRequires: perl(Pod::Simple) +BuildRequires: perl(Pod::Man) +BuildRequires: /usr/bin/pod2text +BuildRequires: po4a +BuildRequires: augeas-devel +BuildRequires: readline-devel +BuildRequires: genisoimage +BuildRequires: libxml2-devel +BuildRequires: createrepo_c +BuildRequires: glibc-static +BuildRequires: libselinux-utils +BuildRequires: libselinux-devel +BuildRequires: fuse, fuse-devel +BuildRequires: pcre-devel +BuildRequires: file-devel +BuildRequires: libvirt-devel +BuildRequires: gperf +BuildRequires: flex +BuildRequires: bison +BuildRequires: libdb-utils +BuildRequires: cpio +BuildRequires: libconfig-devel +BuildRequires: xz-devel +BuildRequires: zip +BuildRequires: unzip +BuildRequires: systemd-units +BuildRequires: netpbm-progs +BuildRequires: icoutils +BuildRequires: libvirt-daemon-kvm +BuildRequires: libacl-devel +BuildRequires: libcap-devel +BuildRequires: jansson-devel +BuildRequires: systemd-devel +BuildRequires: bash-completion +BuildRequires: /usr/bin/ping +BuildRequires: /usr/bin/wget +BuildRequires: curl +BuildRequires: xz +BuildRequires: gtk3-devel +BuildRequires: dbus-devel +BuildRequires: /usr/bin/qemu-img +BuildRequires: perl(Win::Hivex) +BuildRequires: perl(Win::Hivex::Regedit) +%if 0%{verify_tarball_signature} +BuildRequires: gnupg2 +%endif + +# For language bindings. +# Build using OCaml with fix for CVE-2015-8869. +BuildRequires: ocaml >= 4.01.0-22.7.el7 +BuildRequires: ocaml-ocamldoc +# Make sure to get the performance fix for findlib. +BuildRequires: ocaml-findlib-devel >= 1.3.3-7.el7 +BuildRequires: ocaml-gettext-devel +BuildRequires: lua +BuildRequires: lua-devel +BuildRequires: perl-devel +BuildRequires: perl-generators +BuildRequires: perl-macros +BuildRequires: perl(Sys::Virt) +BuildRequires: perl(Test::More) +BuildRequires: perl(Test::Pod) >= 1.00 +BuildRequires: perl(Test::Pod::Coverage) >= 1.00 +BuildRequires: perl(Module::Build) +BuildRequires: perl(ExtUtils::CBuilder) +BuildRequires: perl(Locale::TextDomain) +BuildRequires: python3-devel +BuildRequires: python3-libvirt +BuildRequires: ruby-devel +BuildRequires: rubygem-rake +BuildRequires: rubygem(rdoc) +BuildRequires: rubygem(test-unit) +BuildRequires: ruby-irb +BuildRequires: java-1.8.0-openjdk +BuildRequires: java-1.8.0-openjdk-devel +BuildRequires: jpackage-utils +BuildRequires: glib2-devel +BuildRequires: gobject-introspection-devel +BuildRequires: gjs + +# Build requirements for the appliance. +# +# Get the initial list by doing: +# for f in `cat appliance/packagelist`; do echo $f; done | sort -u +# However you have to edit the list down to packages which exist in +# current RHEL, since supermin ignores non-existent packages. +BuildRequires: acl attr augeas-libs bash binutils bzip2 coreutils cpio cryptsetup curl dhclient diffutils dosfstools e2fsprogs file findutils gawk gdisk genisoimage gfs2-utils grep gzip hivex iproute iputils kernel kmod kpartx less libcap libselinux libxml2 lsof lsscsi lvm2 lzop mdadm openssh-clients parted pciutils pcre policycoreutils procps psmisc qemu-img rsync scrub sed squashfs-tools strace systemd tar udev util-linux vim-minimal which xfsprogs xz yajl +%ifarch %{ix86} x86_64 +BuildRequires: syslinux syslinux-extlinux +%endif + +# For building the appliance. +Requires: supermin >= 5.1.16-2 + +# The daemon dependencies are not included automatically, because it +# is buried inside the appliance, so list them here. +Requires: augeas-libs%{?_isa} +Requires: libacl%{?_isa} +Requires: libcap%{?_isa} +Requires: hivex%{?_isa} >= 1.3.10-5.8.el7 +Requires: pcre%{?_isa} +Requires: libselinux%{?_isa} +Requires: systemd-libs%{?_isa} +Requires: yajl%{?_isa} + +# RHBZ#1211321 +Requires: kernel + +# Older lvmetad "forgets" VGs if you change their UUID. libguestfs +# since 1.34 enables lvmetad. So we must ensure we have new enough +# LVM: +Requires: lvm2 >= 7:2.02.166-1.el7 + +# For core inspection API. +Requires: libdb-utils + +# For core mount-local (FUSE) API. +Requires: fuse + +# For core disk-create API. +Requires: /usr/bin/qemu-img + +# For libvirt backend. +# RHBZ#1500870, RHBZ#1501239 +Requires: libvirt-daemon-kvm >= 3.9.0-1 +%ifarch aarch64 +Requires: edk2-aarch64 +%endif + +# https://fedoraproject.org/wiki/Packaging:No_Bundled_Libraries#Packages_granted_exceptions +Provides: bundled(gnulib) + +# Conflicts with libguestfs-winsupport from RHEL 7.0. You need to +# use the RHEL 7.2+ package. +Conflicts: libguestfs-winsupport < 7.2 + + +%description +Libguestfs is a library for accessing and modifying virtual machine +disk images. http://libguestfs.org + +It can be used to make batch configuration changes to guests, get +disk used/free statistics (virt-df), migrate between hypervisors +(virt-p2v, virt-v2v), perform backups and guest clones, change +registry/UUID/hostname info, build guests from scratch (virt-builder) +and much more. + +Libguestfs uses Linux kernel and qemu code, and can access any type of +guest filesystem that Linux and qemu can, including but not limited +to: ext2/3/4, FAT and NTFS, LVM, many different disk partition +schemes, qcow, qcow2, vmdk. + +Libguestfs for Red Hat Enterprise Linux is split into several subpackages. +The basic subpackages are: + + libguestfs C library + libguestfs-tools virt-* tools, guestfish and guestmount (FUSE) + libguestfs-tools-c only the subset of virt tools written in C + (for reduced dependencies) + virt-v2v convert virtual machines to run on KVM (V2V) + virt-p2v-maker convert physical machines to run on KVM (P2V) + virt-dib safe and secure diskimage-builder replacement + +For enhanced features, install: + + libguestfs-gfs2 adds Global Filesystem (GFS2) support + libguestfs-inspect-icons adds support for inspecting guest icons + libguestfs-rescue enhances virt-rescue shell with more tools + libguestfs-rsync rsync to/from guest filesystems + libguestfs-xfs adds XFS support + +For developers: + + libguestfs-devel C/C++ header files and library + libguestfs-benchmarking Benchmarking utilities + +Language bindings: + + libguestfs-gobject-devel GObject bindings and GObject Introspection + libguestfs-java-devel Java bindings + lua-guestfs Lua bindings + ocaml-libguestfs-devel OCaml bindings + perl-Sys-Guestfs Perl bindings + python3-libguestfs Python 3 bindings + ruby-libguestfs Ruby bindings + + +%ifarch %{benchmark_arches} +%package benchmarking +Summary: Benchmarking utilities for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + + +%description benchmarking +%{name}-benchmarking contains utilities for benchmarking and +performance analysis of %{name}, and also for general +understanding of the performance of the kernel and qemu when booting +small appliances. +%endif + + +%package devel +Summary: Development tools and libraries for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: pkgconfig + +# For libguestfs-make-fixed-appliance. +Requires: xz +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} + + +%description devel +%{name}-devel contains development tools and libraries +for %{name}. + + +%package gfs2 +Summary: GFS2 support for %{name} +License: LGPLv2+ +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + +%description gfs2 +This adds GFS2 support to %{name}. Install it if you want to process +disk images containing GFS2. + + +%package rescue +Summary: Additional tools for virt-rescue +License: LGPLv2+ +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} + +%description rescue +This adds additional tools to use inside the virt-rescue shell, +such as ssh, network utilities, editors and debugging utilities. + + +%package rsync +Summary: rsync support for %{name} +License: LGPLv2+ +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + +%description rsync +This adds rsync support to %{name}. Install it if you want to use +rsync to upload or download files into disk images. + + +%package xfs +Summary: XFS support for %{name} +License: LGPLv2+ +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + +%description xfs +This adds XFS support to %{name}. Install it if you want to process +disk images containing XFS. + + +%package inspect-icons +Summary: Additional dependencies for inspecting guest icons +License: LGPLv2+ +BuildArch: noarch +Requires: %{name} = %{epoch}:%{version}-%{release} + +Requires: netpbm-progs +Requires: icoutils + + +%description inspect-icons +%{name}-inspect-icons is a metapackage that pulls in additional +dependencies required by libguestfs to pull icons out of non-Linux +guests. Install this package if you want libguestfs to be able to +inspect non-Linux guests and display icons from them. + +The only reason this is a separate package is to avoid core libguestfs +having to depend on Perl. See https://bugzilla.redhat.com/1194158 + + +%package tools-c +Summary: System administration tools for virtual machines +License: GPLv2+ +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + +# For guestfish: +#Requires: /usr/bin/emacs #theoretically, but too large +Requires: /usr/bin/hexedit +Requires: /usr/bin/less +Requires: /usr/bin/man +Requires: /usr/bin/vi + +# For virt-builder: +Requires: gnupg2 +Requires: xz +#Requires: nbdkit, nbdkit-plugin-xz +Requires: curl + +# For virt-builder-repository: +Suggests: osinfo-db + +# Some Fedora, and all RHEL 7, use XFS: +Recommends: libguestfs-xfs + +# For virt-edit and virt-customize: +Suggests: perl + + +%description tools-c +This package contains miscellaneous system administrator command line +tools for virtual machines. + +Note that you should install %{name}-tools (which pulls in +this package). This package is only used directly when you want +to avoid dependencies on Perl. + + +%package tools +Summary: System administration tools for virtual machines +License: GPLv2+ +BuildArch: noarch +Requires: %{name} = %{epoch}:%{version}-%{release} +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} + +# NB: Only list deps here which are not picked up automatically. +Requires: perl(Sys::Virt) +Requires: perl(Win::Hivex) >= 1.2.7 + + +%description tools +This package contains miscellaneous system administrator command line +tools for virtual machines. + +Guestfish is the Filesystem Interactive SHell, for accessing and +modifying virtual machine disk images from the command line and shell +scripts. + +The guestmount command lets you mount guest filesystems on the host +using FUSE and %{name}. + +Virt-alignment-scan scans virtual machines looking for partition +alignment problems. + +Virt-builder is a command line tool for rapidly making disk images +of popular free operating systems. + +Virt-cat is a command line tool to display the contents of a file in a +virtual machine. + +Virt-copy-in and virt-copy-out are command line tools for uploading +and downloading files and directories to and from virtual machines. + +Virt-customize is a command line tool for customizing virtual machine +disk images. + +Virt-df is a command line tool to display free space on virtual +machine filesystems. Unlike other tools, it doesn’t just display the +amount of space allocated to a virtual machine, but can look inside +the virtual machine to see how much space is really being used. It is +like the df(1) command, but for virtual machines, except that it also +works for Windows virtual machines. + +Virt-diff shows the differences between virtual machines. + +Virt-edit is a command line tool to edit the contents of a file in a +virtual machine. + +Virt-filesystems is a command line tool to display the filesystems, +partitions, block devices, LVs, VGs and PVs found in a disk image +or virtual machine. It replaces the deprecated programs +virt-list-filesystems and virt-list-partitions with a much more +capable tool. + +Virt-format is a command line tool to erase and make blank disks. + +Virt-get-kernel extracts a kernel/initrd from a disk image. + +Virt-inspector examines a virtual machine and tries to determine the +version of the OS, the kernel version, what drivers are installed, +whether the virtual machine is fully virtualized (FV) or +para-virtualized (PV), what applications are installed and more. + +Virt-log is a command line tool to display the log files from a +virtual machine. + +Virt-ls is a command line tool to list out files in a virtual machine. + +Virt-make-fs is a command line tool to build a filesystem out of +a collection of files or a tarball. + +Virt-rescue provides a rescue shell for making interactive, +unstructured fixes to virtual machines. + +Virt-resize can resize existing virtual machine disk images. + +Virt-sparsify makes virtual machine disk images sparse (thin-provisioned). + +Virt-sysprep lets you reset or unconfigure virtual machines in +preparation for cloning them. + +Virt-tail follows (tails) a log file within a guest, like 'tail -f'. + +Virt-tar-in and virt-tar-out are archive, backup and upload tools +for virtual machines. These replace the deprecated program virt-tar. + +Virt-win-reg lets you look at and modify the Windows Registry of +Windows virtual machines. + + +%package -n virt-dib +Summary: Safe and secure diskimage-builder replacement +License: GPLv2+ + +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + + +%description -n virt-dib +Virt-dib is a safe and secure alternative to the OpenStack +diskimage-builder command. It is compatible with most +diskimage-builder elements. + + +%ifarch %{v2v_arches} +%package -n virt-v2v +Summary: Convert a virtual machine to run on KVM +License: GPLv2+ + +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} +# First version that added support for ssh, curl, json: URLs. +# (RHBZ#1226683, RHBZ#1226684, RHBZ#1226697). +Requires: qemu-kvm >= 1.5.3-92.el7 + +# For Windows conversions. +Requires: libguestfs-winsupport >= 7.2 + +Requires: gawk +Requires: gzip +Requires: unzip +Requires: curl +Requires: /usr/bin/virsh + +# Ensure the UEFI firmware is available, to properly convert +# EFI guests (RHBZ#1429643). +%ifarch x86_64 +Requires: edk2-ovmf +%endif +%ifarch aarch64 +Requires: edk2-aarch64 +%endif + +# Needed for -it vddk, and -o rhv-upload. +Requires: nbdkit +Requires: nbdkit-plugin-python3 +Requires: nbdkit-plugin-vddk +Requires: platform-python + + +%description -n virt-v2v +Virt-v2v converts virtual machines from non-KVM hypervisors +to run under KVM. + +To convert physical machines, see the virt-p2v-maker package. + + +%package -n virt-p2v-maker +Summary: Convert a physical machine to run on KVM +License: GPLv2+ + +Requires: gawk +Requires: gzip + +# virt-p2v-make-disk runs virt-builder: +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} + +# virt-p2v-make-kickstart runs strip: +Requires: binutils + + +%description -n virt-p2v-maker +Virt-p2v converts (virtualizes) physical machines so they can be run +as virtual machines under KVM. + +This package contains the tools needed to make a virt-p2v boot CD or +USB key which is booted on the physical machine to perform the +conversion. You also need virt-v2v installed somewhere else to +complete the conversion. + +To convert virtual machines from other hypervisors, see virt-v2v. +%endif + + +%package bash-completion +Summary: Bash tab-completion scripts for %{name} tools +BuildArch: noarch +Requires: bash-completion >= 2.0 +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} + + +%description bash-completion +Install this package if you want intelligent bash tab-completion +for guestfish, guestmount and various virt-* tools. + + +%package -n ocaml-%{name} +Summary: OCaml bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + + +%description -n ocaml-%{name} +ocaml-%{name} contains OCaml bindings for %{name}. + +This is for toplevel and scripting access only. To compile OCaml +programs which use %{name} you will also need ocaml-%{name}-devel. + + +%package -n ocaml-%{name}-devel +Summary: OCaml bindings for %{name} +Requires: ocaml-%{name}%{?_isa} = %{epoch}:%{version}-%{release} + + +%description -n ocaml-%{name}-devel +ocaml-%{name}-devel contains development libraries +required to use the OCaml bindings for %{name}. + + +%package -n perl-Sys-Guestfs +Summary: Perl bindings for %{name} (Sys::Guestfs) +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) + + +%description -n perl-Sys-Guestfs +perl-Sys-Guestfs contains Perl bindings for %{name} (Sys::Guestfs). + + +%package -n python3-%{name} +Summary: Python 3 bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +%{?python_provide:%python_provide python3-%{name}} + + +%description -n python3-%{name} +python3-%{name} contains Python 3 bindings for %{name}. + + +%package -n ruby-%{name} +Summary: Ruby bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: ruby(release) +Requires: ruby +Provides: ruby(guestfs) = %{version} + +%description -n ruby-%{name} +ruby-%{name} contains Ruby bindings for %{name}. + + +%package java +Summary: Java bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: java-headless >= 1.7.0 +Requires: jpackage-utils + +%description java +%{name}-java contains Java bindings for %{name}. + +If you want to develop software in Java which uses %{name}, then +you will also need %{name}-java-devel. + + +%package java-devel +Summary: Java development package for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: %{name}-java = %{epoch}:%{version}-%{release} + +%description java-devel +%{name}-java-devel contains the tools for developing Java software +using %{name}. + +See also %{name}-javadoc. + + +%package javadoc +Summary: Java documentation for %{name} +BuildArch: noarch +Requires: %{name} = %{epoch}:%{version}-%{release} +Requires: %{name}-java = %{epoch}:%{version}-%{release} +Requires: jpackage-utils + +%description javadoc +%{name}-javadoc contains the Java documentation for %{name}. + + +%package -n lua-guestfs +Summary: Lua bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: lua + +%description -n lua-guestfs +lua-guestfs contains Lua bindings for %{name}. + + +%package gobject +Summary: GObject bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + +%description gobject +%{name}-gobject contains GObject bindings for %{name}. + +To develop software against these bindings, you need to install +%{name}-gobject-devel. + + +%package gobject-devel +Summary: GObject bindings for %{name} +Requires: %{name}-gobject = %{epoch}:%{version}-%{release} + +Provides: libguestfs-gobject-doc = %{epoch}:%{version}-%{release} +Obsoletes: libguestfs-gobject-doc < %{epoch}:%{version}-%{release} + +%description gobject-devel +%{name}-gobject contains GObject bindings for %{name}. + +This package is needed if you want to write software using the +GObject bindings. It also contains GObject Introspection information. + + +%package man-pages-ja +Summary: Japanese (ja) man pages for %{name} +BuildArch: noarch +Requires: %{name} = %{epoch}:%{version}-%{release} + +%description man-pages-ja +%{name}-man-pages-ja contains Japanese (ja) man pages +for %{name}. + + +%package man-pages-uk +Summary: Ukrainian (uk) man pages for %{name} +BuildArch: noarch +Requires: %{name} = %{epoch}:%{version}-%{release} + +%description man-pages-uk +%{name}-man-pages-uk contains Ukrainian (uk) man pages +for %{name}. + + +%prep +%if 0%{verify_tarball_signature} +tmphome="$(mktemp -d)" +gpgv2 --homedir "$tmphome" --keyring %{SOURCE7} %{SOURCE1} %{SOURCE0} +%endif +%setup -q + +# For sVirt to work, the local temporary directory we use in the tests +# must be labelled the same way as /tmp. This doesn't work if either +# the directory is on NFS (no SELinux labels) or if SELinux is +# disabled, hence the tests. +if [ "$(stat -f -L -c %T .)" != "nfs" ] && \ + [ "$(getenforce | tr '[A-Z]' '[a-z]')" != "disabled" ]; then + chcon --reference=/tmp tmp +fi + +# Use git to manage patches. +# http://rwmj.wordpress.com/2011/08/09/nice-rpm-git-patch-management-trick/ +git init +git config user.email "libguestfs@redhat.com" +git config user.name "libguestfs" +git add . +git commit -a -q -m "%{version} baseline" +git am %{patches} + +# Patches affect Makefile.am and configure.ac, so rerun autotools. +autoreconf -fi + +# Replace developer-centric README that ships with libguestfs, with +# our replacement file. +mv README README.orig +sed 's/@VERSION@/%{version}/g' < %{SOURCE4} > README + + +%build +# Test if network is available. +ip addr list ||: +ip route list ||: +if ping -c 3 -w 20 8.8.8.8 && wget http://libguestfs.org -O /dev/null; then + extra= +else + mkdir cachedir repo + # -n 1 because of RHBZ#980502. + find /var/cache/{dnf,yum} -type f -name '*.rpm' -print0 | \ + xargs -0 -n 1 cp -t repo + createrepo_c repo + sed -e "s|@PWD@|$(pwd)|" %{SOURCE6} > yum.conf + extra=--with-supermin-packager-config=$(pwd)/yum.conf +fi + +export QEMU=/usr/libexec/qemu-kvm +export PYTHON=%{__python3} + +%{configure} \ + --with-default-backend=libvirt \ + --with-extra="rhel=%{rhel},release=%{release},libvirt" \ + --with-qemu="qemu-kvm qemu-system-%{_build_arch} qemu" \ + --disable-php \ + --disable-haskell \ + --disable-erlang \ + --disable-golang \ + $extra + +# Building index-parse.c by hand works around a race condition in the +# autotools cruft, where two or more copies of yacc race with each +# other, resulting in a corrupted file. +# +# 'INSTALLDIRS' ensures that Perl and Ruby libs are installed in the +# vendor dir not the site dir. +make -j1 -C builder index-parse.c +make V=1 INSTALLDIRS=vendor %{?_smp_mflags} + + +%check + +%ifarch %{test_arches} +export LIBGUESTFS_DEBUG=1 +export LIBGUESTFS_TRACE=1 +export LIBVIRT_DEBUG=1 + +if ! make quickcheck QUICKCHECK_TEST_TOOL_ARGS="-t 1200"; then + cat $HOME/.cache/libvirt/qemu/log/* + exit 1 +fi +%endif + + +%install +# This file is creeping over 1 MB uncompressed, and since it is +# included in the -devel subpackage, compress it to reduce +# installation size. +gzip -9 ChangeLog + +# 'INSTALLDIRS' ensures that Perl and Ruby libs are installed in the +# vendor dir not the site dir. +make DESTDIR=$RPM_BUILD_ROOT INSTALLDIRS=vendor install + +# Delete static libraries. +rm $( find $RPM_BUILD_ROOT -name '*.a' | grep -v /ocaml/ ) + +# Delete libtool files. +find $RPM_BUILD_ROOT -name '*.la' -delete + +# Delete some bogus Perl files. +find $RPM_BUILD_ROOT -name perllocal.pod -delete +find $RPM_BUILD_ROOT -name .packlist -delete +find $RPM_BUILD_ROOT -name '*.bs' -delete +find $RPM_BUILD_ROOT -name 'bindtests.pl' -delete + +# Remove obsolete binaries (RHBZ#947438). +rm $RPM_BUILD_ROOT%{_bindir}/virt-list-filesystems +rm $RPM_BUILD_ROOT%{_bindir}/virt-list-partitions +rm $RPM_BUILD_ROOT%{_bindir}/virt-tar +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-list-filesystems.1* +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-list-partitions.1* +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-tar.1* + +# Don't use versioned jar file (RHBZ#1022133). +# See: https://bugzilla.redhat.com/show_bug.cgi?id=1022184#c4 +mv $RPM_BUILD_ROOT%{_datadir}/java/%{name}-%{version}.jar \ + $RPM_BUILD_ROOT%{_datadir}/java/%{name}.jar + +# Move installed documentation back to the source directory so +# we can install it using a %%doc rule. +mv $RPM_BUILD_ROOT%{_docdir}/libguestfs installed-docs +gzip --best installed-docs/*.xml + +# Split up the monolithic packages file in the supermin appliance so +# we can install dependencies in subpackages. +pushd $RPM_BUILD_ROOT%{_libdir}/guestfs/supermin.d +function move_to +{ + if ! grep -Esq "^$1$" packages; then + echo "move_to $1: package name not found in packages file" + exit 1 + fi + grep -Ev "^$1$" < packages > packages-t + mv packages-t packages + echo "$1" >> "$2" +} +move_to curl zz-packages-dib +move_to kpartx zz-packages-dib +move_to qemu-img zz-packages-dib +move_to which zz-packages-dib +move_to gfs2-utils zz-packages-gfs2 +move_to iputils zz-packages-rescue +move_to lsof zz-packages-rescue +move_to openssh-clients zz-packages-rescue +move_to pciutils zz-packages-rescue +move_to strace zz-packages-rescue +move_to vim-minimal zz-packages-rescue +move_to rsync zz-packages-rsync +move_to xfsprogs zz-packages-xfs +popd + +# If there is a bogus dependency on kernel-*, rename it to 'kernel' +# instead. This can happen for various reasons: +# - DNF picks kernel-debug instead of kernel. +# - Version of kernel-rt in brew > version of kernel. +# On all known architectures, depending on 'kernel' should +# mean "we need a kernel". +pushd $RPM_BUILD_ROOT%{_libdir}/guestfs/supermin.d +sed 's/^kernel-.*/kernel/' < packages > packages-t +mv packages-t packages +popd + +# Guestfish colour prompts. +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/profile.d +install -m 0644 %{SOURCE5} $RPM_BUILD_ROOT%{_sysconfdir}/profile.d + +# Virt-tools data directory. +mkdir -p $RPM_BUILD_ROOT%{_datadir}/virt-tools +cp %{SOURCE96} $RPM_BUILD_ROOT%{_datadir}/virt-tools/rhsrvany.exe +cp %{SOURCE97} $RPM_BUILD_ROOT%{_datadir}/virt-tools/rhev-apt.exe + +%ifnarch %{v2v_arches} +rm $RPM_BUILD_ROOT%{_bindir}/virt-p2v* +rm $RPM_BUILD_ROOT%{_bindir}/virt-v2v* +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-p2v* +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v* +rm -r $RPM_BUILD_ROOT%{_libdir}/virt-p2v +rm -r $RPM_BUILD_ROOT%{_datadir}/virt-p2v +rm -r $RPM_BUILD_ROOT%{_datadir}/virt-tools +%endif + +# Delete the v2v test harness. (This might or might not exist +# depending on extra BRs installed when the package is built, so use +# '-f' option here.) +rm -rf $RPM_BUILD_ROOT%{_libdir}/ocaml/v2v_test_harness +rm -rf $RPM_BUILD_ROOT%{_libdir}/ocaml/stublibs/dllv2v_test_harness* +rm -f $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-test-harness.1* + +%ifarch %{v2v_arches} +# Delete kiwi tools. +rm $RPM_BUILD_ROOT%{_bindir}/virt-p2v-make-kiwi +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-p2v-make-kiwi.1* +%endif + +# Remove the .gitignore file from ocaml/html which will be copied to docdir. +rm ocaml/html/.gitignore + +%ifarch %{benchmark_arches} +# Copy the benchmarking tools and man pages, since upstream doesn't +# install them by default. NB Don't install the libtool wrapper scripts. +libtool --mode=install install -m 0755 utils/boot-analysis/boot-analysis $RPM_BUILD_ROOT%{_bindir}/libguestfs-boot-analysis +libtool --mode=install install -m 0755 utils/boot-benchmark/boot-benchmark $RPM_BUILD_ROOT%{_bindir}/libguestfs-boot-benchmark +install -m 0755 utils/boot-benchmark/boot-benchmark-range.pl $RPM_BUILD_ROOT%{_bindir}/libguestfs-boot-benchmark-range.pl +install -m 0644 utils/boot-analysis/boot-analysis.1 $RPM_BUILD_ROOT%{_mandir}/man1/libguestfs-boot-analysis.1 +install -m 0644 utils/boot-benchmark/boot-benchmark.1 $RPM_BUILD_ROOT%{_mandir}/man1/libguestfs-boot-benchmark.1 +%endif + +# Find locale files. +%find_lang %{name} + + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%post java -p /sbin/ldconfig + +%postun java -p /sbin/ldconfig + + +%files -f %{name}.lang +%doc COPYING README +%{_bindir}/libguestfs-test-tool +%{_libdir}/guestfs/ +%exclude %{_libdir}/guestfs/supermin.d/zz-packages-* +%{_libdir}/libguestfs.so.* +%{_mandir}/man1/guestfs-faq.1* +%{_mandir}/man1/guestfs-performance.1* +%{_mandir}/man1/guestfs-recipes.1* +%{_mandir}/man1/guestfs-release-notes.1* +%{_mandir}/man1/guestfs-security.1* +%{_mandir}/man1/libguestfs-test-tool.1* + + +%ifarch %{benchmark_arches} +%files benchmarking +%{_bindir}/libguestfs-boot-analysis +%{_bindir}/libguestfs-boot-benchmark +%{_bindir}/libguestfs-boot-benchmark-range.pl +%{_mandir}/man1/libguestfs-boot-analysis.1* +%{_mandir}/man1/libguestfs-boot-benchmark.1* +%endif + + +%files devel +%doc AUTHORS BUGS ChangeLog.gz HACKING TODO README +%doc examples/*.c +%doc installed-docs/* +%{_libdir}/libguestfs.so +%{_sbindir}/libguestfs-make-fixed-appliance +%{_mandir}/man1/guestfs-building.1* +%{_mandir}/man1/guestfs-hacking.1* +%{_mandir}/man1/guestfs-internals.1* +%{_mandir}/man1/guestfs-testing.1* +%{_mandir}/man1/libguestfs-make-fixed-appliance.1* +%{_mandir}/man3/guestfs.3* +%{_mandir}/man3/guestfs-examples.3* +%{_mandir}/man3/libguestfs.3* +%{_includedir}/guestfs.h +%{_libdir}/pkgconfig/libguestfs.pc + +%files gfs2 +%{_libdir}/guestfs/supermin.d/zz-packages-gfs2 + +%files rsync +%{_libdir}/guestfs/supermin.d/zz-packages-rsync + +%files rescue +%{_libdir}/guestfs/supermin.d/zz-packages-rescue + +%files xfs +%{_libdir}/guestfs/supermin.d/zz-packages-xfs + + +%files inspect-icons +# no files + + +%files tools-c +%doc README +%config(noreplace) %{_sysconfdir}/libguestfs-tools.conf +%{_sysconfdir}/virt-builder +%dir %{_sysconfdir}/xdg/virt-builder +%dir %{_sysconfdir}/xdg/virt-builder/repos.d +%config %{_sysconfdir}/xdg/virt-builder/repos.d/* +%config %{_sysconfdir}/profile.d/guestfish.sh +%{_mandir}/man5/libguestfs-tools.conf.5* +%{_bindir}/guestfish +%{_mandir}/man1/guestfish.1* +%{_bindir}/guestmount +%{_mandir}/man1/guestmount.1* +%{_bindir}/guestunmount +%{_mandir}/man1/guestunmount.1* +%{_bindir}/virt-alignment-scan +%{_mandir}/man1/virt-alignment-scan.1* +%{_bindir}/virt-builder +%{_mandir}/man1/virt-builder.1* +%{_bindir}/virt-builder-repository +%{_mandir}/man1/virt-builder-repository.1* +%{_bindir}/virt-cat +%{_mandir}/man1/virt-cat.1* +%{_bindir}/virt-copy-in +%{_mandir}/man1/virt-copy-in.1* +%{_bindir}/virt-copy-out +%{_mandir}/man1/virt-copy-out.1* +%{_bindir}/virt-customize +%{_mandir}/man1/virt-customize.1* +%{_bindir}/virt-df +%{_mandir}/man1/virt-df.1* +%{_bindir}/virt-diff +%{_mandir}/man1/virt-diff.1* +%{_bindir}/virt-edit +%{_mandir}/man1/virt-edit.1* +%{_bindir}/virt-filesystems +%{_mandir}/man1/virt-filesystems.1* +%{_bindir}/virt-format +%{_mandir}/man1/virt-format.1* +%{_bindir}/virt-get-kernel +%{_mandir}/man1/virt-get-kernel.1* +%{_bindir}/virt-index-validate +%{_mandir}/man1/virt-index-validate.1* +%{_bindir}/virt-inspector +%{_mandir}/man1/virt-inspector.1* +%{_bindir}/virt-log +%{_mandir}/man1/virt-log.1* +%{_bindir}/virt-ls +%{_mandir}/man1/virt-ls.1* +%{_bindir}/virt-make-fs +%{_mandir}/man1/virt-make-fs.1* +%{_bindir}/virt-rescue +%{_mandir}/man1/virt-rescue.1* +%{_bindir}/virt-resize +%{_mandir}/man1/virt-resize.1* +%{_bindir}/virt-sparsify +%{_mandir}/man1/virt-sparsify.1* +%{_bindir}/virt-sysprep +%{_mandir}/man1/virt-sysprep.1* +%{_bindir}/virt-tail +%{_mandir}/man1/virt-tail.1* +%{_bindir}/virt-tar-in +%{_mandir}/man1/virt-tar-in.1* +%{_bindir}/virt-tar-out +%{_mandir}/man1/virt-tar-out.1* + + +%files tools +%doc README +%{_bindir}/virt-win-reg +%{_mandir}/man1/virt-win-reg.1* + + +%files -n virt-dib +%doc COPYING README +%{_bindir}/virt-dib +%{_mandir}/man1/virt-dib.1* +%{_libdir}/guestfs/supermin.d/zz-packages-dib + + +%ifarch %{v2v_arches} +%files -n virt-v2v +%doc COPYING README +%{_bindir}/virt-v2v +%{_bindir}/virt-v2v-copy-to-local +%{_mandir}/man1/virt-v2v.1* +%{_mandir}/man1/virt-v2v-copy-to-local.1* +%{_datadir}/virt-tools + + +%files -n virt-p2v-maker +%doc COPYING README +%{_bindir}/virt-p2v-make-disk +%{_bindir}/virt-p2v-make-kickstart +%{_mandir}/man1/virt-p2v.1* +%{_mandir}/man1/virt-p2v-make-disk.1* +%{_mandir}/man1/virt-p2v-make-kickstart.1* +%{_datadir}/virt-p2v +%{_libdir}/virt-p2v +%endif + + +%files bash-completion +%dir %{_datadir}/bash-completion/completions +%{_datadir}/bash-completion/completions/guestfish +%{_datadir}/bash-completion/completions/guestmount +%{_datadir}/bash-completion/completions/guestunmount +%{_datadir}/bash-completion/completions/virt-* + + +%files -n ocaml-%{name} +%{_libdir}/ocaml/guestfs +%exclude %{_libdir}/ocaml/guestfs/*.a +%exclude %{_libdir}/ocaml/guestfs/*.cmxa +%exclude %{_libdir}/ocaml/guestfs/*.cmx +%exclude %{_libdir}/ocaml/guestfs/*.mli +%{_libdir}/ocaml/stublibs/dllmlguestfs.so +%{_libdir}/ocaml/stublibs/dllmlguestfs.so.owner + + +%files -n ocaml-%{name}-devel +%doc ocaml/examples/*.ml ocaml/html +%{_libdir}/ocaml/guestfs/*.a +%{_libdir}/ocaml/guestfs/*.cmxa +%{_libdir}/ocaml/guestfs/*.cmx +%{_libdir}/ocaml/guestfs/*.mli +%{_mandir}/man3/guestfs-ocaml.3* + + +%files -n perl-Sys-Guestfs +%doc perl/examples/*.pl +%{perl_vendorarch}/* +%{_mandir}/man3/Sys::Guestfs.3pm* +%{_mandir}/man3/guestfs-perl.3* + + +%files -n python3-%{name} +%doc python/examples/*.py +%{python3_sitearch}/libguestfsmod*.so +%{python3_sitearch}/guestfs.py +%{python3_sitearch}/__pycache__/guestfs*.py* +%{_mandir}/man3/guestfs-python.3* + + +%files -n ruby-%{name} +%doc ruby/examples/*.rb +%doc ruby/doc/site/* +%{ruby_vendorlibdir}/guestfs.rb +%{ruby_vendorarchdir}/_guestfs.so +%{_mandir}/man3/guestfs-ruby.3* + + +%files java +%{_libdir}/libguestfs_jni*.so.* +%{_datadir}/java/*.jar + + +%files java-devel +%doc java/examples/*.java +%{_libdir}/libguestfs_jni*.so +%{_mandir}/man3/guestfs-java.3* + + +%files javadoc +%{_javadocdir}/%{name} + + +%files -n lua-guestfs +%doc lua/examples/*.lua +%doc lua/examples/LICENSE +%{_libdir}/lua/*/guestfs.so +%{_mandir}/man3/guestfs-lua.3* + + +%files gobject +%{_libdir}/libguestfs-gobject-1.0.so.0* +%{_libdir}/girepository-1.0/Guestfs-1.0.typelib + + +%files gobject-devel +%{_libdir}/libguestfs-gobject-1.0.so +%{_includedir}/guestfs-gobject.h +%dir %{_includedir}/guestfs-gobject +%{_includedir}/guestfs-gobject/*.h +%{_datadir}/gir-1.0/Guestfs-1.0.gir +%{_libdir}/pkgconfig/libguestfs-gobject-1.0.pc +%{_mandir}/man3/guestfs-gobject.3* + + +%files man-pages-ja +%lang(ja) %{_mandir}/ja/man1/*.1* +%lang(ja) %{_mandir}/ja/man3/*.3* +%lang(ja) %{_mandir}/ja/man5/*.5* + + +%files man-pages-uk +%lang(uk) %{_mandir}/uk/man1/*.1* +%lang(uk) %{_mandir}/uk/man3/*.3* +%lang(uk) %{_mandir}/uk/man5/*.5* + + +%changelog +* Wed Jan 23 2019 Pino Toscano - 1:1.38.4-10 +- Rebase to libguestfs 1.38.4 in RHEL 8.0. + +* Mon Jan 22 2018 Pino Toscano - 1:1.36.10-6 +- Rebase to libguestfs 1.36.10 in RHEL 7.5. + resolves: rhbz#1472272 +- Build against OCaml 4.05 + resolves: rhbz#1447981 +- Enable the copyonread flag when running the appliance using libvirt. + resolves: rhbz#1466563 +- Make sure kernel-rt is never used as Requires. + resolves: rhbz#1471651 +- v2v: disable unconfiguration of manually installed VMware tools. + resolves: rhbz#1477905 +- v2v: prefer pigz or pxz for uncompressing OVA files, if available + resolves: rhbz#1448739 +- resize: handle empty UUIDs for swap partitions + resolves: rhbz#1482737 +- v2v: remove mention of --dcpath in an error message + resolves: rhbz#1486197 +- Disables the QEMU image file locking when opening disks as read-only + resolves: rhbz#1417306 + resolves: rhbz#1503497 +- Briefly document the format used for URIs + resolves: rhbz#1450325 +- v2v: deal with grub2 configurations without a default set + resolves: rhbz#1472288 +- v2v: warn when a guest has passthrough devices + resolves: rhbz#1472719 +- v2v: fix three regular expressions + resolves: rhbz#1494555 +- v2v: enable conversion of full-disk LUKS-encrypted Linux guests + resolves: rhbz#1451665 +- v2v: new 'vddk' import method + resolves: rhbz#1477912 + resolves: rhbz#1513884 +- Enable libguestfs to work on z Systems + resolves: rhbz#1479526 +- p2v: fx check for sudo requiring a password + resolves: rhbz#1500673 +- v2v: handle disks with snapshots in vCenter + resolves: rhbz#1172425 +- rescue: backport improved version + resolves: rhbz#1438710 +- v2v: improve bootloader detection + resolves: rhbz#1508299 +- v2v: parse MAC address of network interfaces in OVF files + resolves: rhbz#1506572 +- Unconditionally depend on libvirt-daemon-kvm >= 3.9.0-1, which will always + pull the right qemu-kvm too, and thus remove the unversioned dependencies + on it + resolves: rhbz#1500870 +- v2v: fix RPM file owned test + resolves: rhbz#1503958 +- Do not open read-only disks using in the libvirt backend + resolves: rhbz#1518517 +- v2v: handle better when grubby does not report any default kernel + resolves: rhbz#1519204 +- v2v: enhance vmx import method to access via SSH + resolves: rhbz#1523767 +- builder: fix caching of templates when using --cache-all-templates + resolves: rhbz#1523650 + +* Thu Jun 22 2017 Pino Toscano - 1:1.36.3-6 +- Rebase to libguestfs 1.36 in RHEL 7.4. + resolves: rhbz#1359086 +- v2v: always use names for libvirt pools + resolves: rhbz#1141631 +- v2v: correctly find GRUB in RHEL UEFI guests +- v2v: uninstall VMware tools packages from guests + resolves: rhbz#1155150 +- v2v: install RHEV-APT only when using -o rhev/-o vdsm + resolves: rhbz#1161019 +- New API: btrfs-filesystem-show + resolves: rhbz#1164765 +- p2v: always enable debugging when running virt-v2v + resolves: rhbz#1167623 +- libguestfs prefers virtio-pci on aarch64 + resolves: rhbz#1237250 +- v2v: make sure to copy all the driver files on Windows + resolves: rhbz#1255610 +- Better tolerate corrupted Windows hivex; bump the hivex BuildRequires and + Requires to >= 1.3.10-5.8.el7 + resolves: rhbz#1311890 +- v2v: ignore all the environment variables for proxy when exporting from + vCenter + resolves: rhbz#1354507 +- virt-sysprep can deal with full-LUKS encrypted guests + resolves: rhbz#1362649 +- All the tools have bash completion scripts. + resolves: rhbz#1367738 +- v2v: do not remove Processor and Intelppm nodes in Windows guests + resolves: rhbz#1372668 +- Fix SELinux relabelling in old RHEL 6 guests, by adjusting a broken + regular expression in file_contexts file + resolves: rhbz#1374232 +- v2v: set all the properties on creation when exporting to Glance + resolves: rhbz#1374405 +- v2v: set hw_video_model when exporting to Glance + resolves: rhbz#1374651 +- v2v: fix OVA conversion as root using the libvirt backend + resolves: rhbz#1375157 +- Various improvements and fixes to the documentation + resolves: rhbz#1377081 + resolves: rhbz#1390876 + resolves: rhbz#1398070 + resolves: rhbz#1425306 +- v2v: support and + resolves: rhbz#1378022 +- v2v: allow libvirt >= 2.1.0 for vCenter conversions + resolves: rhbz#1379240 +- p2v: enable mnemonics in the GUI + resolves: rhbz#1379289 +- Split virt-p2v, and the tools for it, in an own package: virt-p2v-maker + resolves: rhbz#1382275 +- Correctly parse mount options in btrfs entries in /etc/fstab. + resolves: rhbz#1383517 +- Read secrets from libvirt domains, when inspecting them + resolves: rhbz#1392798 +- v2v: add --vdsm-compat=1.1 flag for VDSM + resolves: rhbz#1400205 +- Fix inspection with UsrMove and /usr in a separate partition + resolves: rhbz#1401474 +- v2v: improve import compatibility with OVAs produced by AWS + resolves: rhbz#1402301 +- resize: allow URIs for the output disk + resolves: rhbz#1404182 +- Disable EDD when launching the appliance + resolves: rhbz#1404287 +- v2v: increase the memory allocated to the appliance + resolves: rhbz#1418283 +- p2v: switch from GTK+ 2 to GTK+ 3 +- p2v: add dbus-devel as BuildRequires to disable suspension during the + conversion +- libguestfs-java: bump the java-headless Require to >= 1.7.0, matching the + Build-Require, and the generated bytecode + resolves: rhbz#1364518 +- Do not try to use/write to /var/cache/yum & /var/log/yum.log +- Bump ocaml-findlib-devel BuildRequires to >= 1.3.3-7.el7, because of + RHBZ#1403897 +- v2v: remove --dcpath & --dcPath from --help output too + resolves: rhbz#1429430 +- v2v: force VNC as display for -i disk, as SDL is not supported + resolves: rhbz#1372671 +- v2v, p2v: rename rhvm network to ovirtmgmt + resolves: rhbz#1429491 +- v2v: when exporting to local disk, check that UEFI firmware is installed + before conversion + resolves: rhbz#1429506 +- dib: actually generate SHA256 checksums when using --checksum + resolves: rhbz#1430184 +- v2v: do not mention SUSE Xen hosts as supported + resolves: rhbz#1430203 +- v2v: depend on OVMF/AAVMF, for converting EFI guests + resolves: rhbz#1429643 +- v2v: use absolute path when using an OVA as backing file + resolves: rhbz#1430680 +- v2v: support Debian/Ubuntu guests + resolves: rhbz#1387213 +- sysprep: remove DHCP_HOSTNAME entries + resolves: rhbz#1427529 +- v2v: avoid repeated "run virt-v2v -v -x" message on error + resolves: rhbz#1167623 +- bash-completion: add script for virt-v2v-copy-to-local + resolves: rhbz#1367738 +- v2v: fix virtio block driver installation for Windows 10 and Windows 2016 + resolves: rhbz#1434737 +- Replace the libosinfo dependency with osinfo-db, since we are only using + the osinfo database. +- v2v: fix virtio driver installation for Windows 8 UEFI + resolves: rhbz#1431579 +- v2v: new 'vmx' import method + resolves: rhbz#1441197 +- v2v: properly identify Windows 2016 guests when exporting them to RHV-M + resolves: rhbz#1447202 +- Run pvresize in non-interactive mode + resolves: rhbz#1460692 +- resize: make sure the input disk is read-only + resolves: rhbz#1463714 +- Switch qemu-kvm-rhev dependency to qemu-kvm on aarch64 + resolves: rhbz#1463646 + +* Tue Aug 30 2016 Richard W.M. Jones - 1:1.32.7-3 +- Rebase to libguestfs 1.32 in RHEL 7.3 + resolves: rhbz#1218766 +- The full tests are now run after the package has been built. +- New tool and subpackage: virt-dib (safe diskimage-builder replacement). +- New subpackage libguestfs-inspect-icons to reduce dependencies of main pkg + (see https://bugzilla.redhat.com/1194158). +- New tool: virt-get-kernel. +- Depend on java-headless instead of full java. +- New tool: virt-v2v-copy-to-local. +- Disable virt-v2v subpackage on ppc64 etc + resolves: rhbz#1287826 +- v2v: Remove VirtualBox Additions correctly + resolves: rhbz#1296606 +- Add clearer warnings sections to all man pages + resolves: rhbz#1293527 +- v2v: Disable the --in-place option. +- v2v: Support conversion of Windows > 7 + resolves: rhbz#1190669 +- Add code to verify tarball signatures. +- General performance improvements. +- v2v: Prevent duplicate -b, -n, -oa options + resolves: rhbz#1326266 + resolves: rhbz#1325825 +- v2v: Unquote UUID and LABEL in fstab (util-linux 1335671) +- v2v: Fix alignment issues in treeviews in conversion dialog + resolves: rhbz#1340407 +- p2v: spinner should be hidden when it stops spinning + resolves: rhbz#1341564 +- p2v: ethtool command is not supported on p2v client + resolves: rhbz#1341608 +- p2v: Add ifconfig command to ISO + resolves: rhbz#1342447 +- p2v: Warn if virt-p2v-make-disk used on a partition + resolves: rhbz#1342337 +- Build using OCaml with fix for CVE-2015-8869. + resolves: rhbz#1343101 +- customize: Add --uninstall option (upstream 1343375) +- p2v: Document permissions on id_rsa file + resolves: rhbz#1343414 +- p2v: Print full curl error message + resolves: rhbz#1343423 +- get-kernel: Fix --format auto + resolves: rhbz#1341984 +- v2v: Provide better information to RHEV-M + resolves: rhbz#1342398 +- customize: Give an error if --truncate-recursive path does not exist + resolves: rhbz#1345809 +- sysprep: Add --network option so that --install option can be used + resolves: rhbz#1345813 +- p2v: Print proper error if incorrect password is given + resolves: rhbz#1227599 +- p2v: Print ssh error if incorrect hostname is given + resolves: rhbz#1167916 +- p2v: Display progress of operation in non-GUI mode + resolves: rhbz#1229386 +- p2v: Add a dialog confirming the user really means to cancel + resolves: rhbz#1340464 +- p2v: log window should process colour escapes and backspaces + resolves: rhbz#1314244 +- v2v: Fix installation of virtio drivers with *.dll files + resolves: rhbz#1311373 +- p2v: Improve error message when ssh login to conversion server fails + resolves: rhbz#1348900 +- v2v: Remove --dcpath parameter from manual + resolves: rhbz#1315237 +- v2v: Fix conversion of guests with floppy drives + resolves: rhbz#1309706 +- p2v: Better error when sudo requires a password + resolves: rhbz#1340809 +- v2v: Refuse to convert if there is < 1GB free in temporary directory + resolves: rhbz#1316479 +- inspection: Get Windows drive letters for GPT disks + resolves: rhbz#1349237 +- p2v: Add disk utils and display serial number of disks + resolves: rhbz#855058 +- p2v: Fix timeout error when connecting to unresponsive ssh server + resolves: rhbz#1350363 +- Remove external dependency generator. Use supermin RPM deps instead. + related: rhbz#1309796 +- p2v: Flush messages to the journal immediately + resolves: rhbz#1229386 +- customize: Fix --install on ppc64le + resolves: rhbz#1264835 +- lib: Fix finding icons in Windows 7 64 bit guests + resolevs: rhbz#1352761 +- v2v: Add virsh --quiet flag when running virt-v2v --quiet + resolves: rhbz#1358142 +- lib: Fix inspection of ISOs with latest libosinfo + resolves: rhbz#1359652 +- dib: Fix run_command exit handlers on failure + resolves: rhbz#1362357 +- dib: Rework run of extra-data.d hooks + resolves: rhbz#1362354 +- Miscellaneous fixes to man pages and --help output + resolves: rhbz#1362668 +- lib: Specify backing format for read-only files + resolves: rhbz#1354335 +- Fix --selinux-relabel option + resolves: rhbz#1362669 +- sparsify: Fix --in-place option with UEFI guest + resolves: rhbz#1364347 +- p2v: Use latest linux-firmware in ISO + resolves: rhbz#1364419 +- v2v: Fix guest name when using -i disk + resolves: rhbz#1365005 +- p2v: Fix GUI message. +- v2v: Make fstrim message clearer + resolves: rhbz#1366456 +- v2v: Fix conversion of UEFI guests when Secure Boot OVMF installed + resolves: rhbz#1367615 +- lib: Fix assert-fail if port is missing in libvirt XML + resolves: rhbz#1370424 + +* Mon Sep 14 2015 Richard W.M. Jones - 1:1.28.1-1.55 +- Fix previous commit by applying the patch this time (1243493) + +* Sun Sep 13 2015 Richard W.M. Jones - 1:1.28.1-1.54 +- v2v: Permit libguestfs-winsupport to be used by virt-win-reg and + virt-inspector (1243493) + +* Thu Sep 10 2015 Richard W.M. Jones - 1:1.28.1-1.53 +- v2v: Error if certain options appear twice on the command line (1261242) +- v2v: Add --dcpath parameter to allow dcPath to be overridden (1256823) +- v2v: Partially revert: Fix OVF XML to enable qxl display (1260590) +- v2v: Detect AVG Technologies as AV software (1261436) + resolves: rhbz#1261281 + +* Tue Sep 8 2015 Richard W.M. Jones - 1:1.28.1-1.52 +- v2v: Warn if Group Policy or AV software may result in 7B boot failure + (1260689) +- v2v: Fix OVF XML to enable qxl display + resolves: rhbz#1260590 + +* Tue Sep 1 2015 Richard W.M. Jones - 1:1.28.1-1.51 +- v2v: Fix handling of extra slashes in dcPath calculation + resolves: rhbz#1258342 rhbz#1256823 +- v2v: Fix -oa preallocation option + resolves: rhbz#1251909 + +* Sun Aug 30 2015 Richard W.M. Jones - 1:1.28.1-1.50 +- v2v: + * When debugging, dump OVF to stderr. + * Ignore missing kernels from grub + resolves: rhbz#1230412 + * Calculate VMware dcPath correctly (1256823) + * Map empty VMware network or bridge name to default (1257895) +- p2v: + * Wait for network to come online before testing connection + resolves: rhbz#1256222 +- Fix tests to run correctly with libguestfs-winsupport 7.2. + +* Wed Aug 05 2015 Richard W.M. Jones - 1:1.28.1-1.49 +- p2v: Closing incoming ports on the virt-p2v ISO + resolves: rhbz#1248678 + +* Tue Jul 28 2015 Richard W.M. Jones - 1:1.28.1-1.48 +- v2v: Include lsof in base appliance + resolves: rhbz#1246032 + +* Thu Jul 23 2015 Richard W.M. Jones - 1:1.28.1-1.47 +- v2v: Work around 'umount: /sysroot: target is busy' + resolves: rhbz#1246032 +- v2v: Permit libguestfs-winsupport to be used by virt-win-reg and + virt-inspector + resolves: rhbz#1243493 + +* Tue Jul 7 2015 Richard W.M. Jones - 1:1.28.1-1.46 +- v2v: Refuse to convert Windows > 7 + reverts: rhbz#1190669 +- v2v: Depend directly on libguestfs-xfs + resolves: rhbz#1240275 +- v2v: Inclusion of libguestfs-winsupport in RHEL 7.2 + resolves: rhbz#1240274, rhbz#1240276 + +* Mon Jul 6 2015 Richard W.M. Jones - 1:1.28.1-1.44 +- v2v: Fix error message when grub.conf is malformed + resolves: rhbz#1239053 +- v2v: Various fixes to conversion of UEFI systems + resolves: rhbz#1184690 + +* Thu Jul 2 2015 Richard W.M. Jones - 1:1.28.1-1.43 +- virt-sysprep: Don't delete /var/spool/at/.SEQ + resolves: rhbz#1238579 + +* Wed Jul 1 2015 Richard W.M. Jones - 1:1.28.1-1.42 +- v2v: Fix installation of virtio drivers in Windows 2008 and 2008 R2 + resolves: rhbz#1237869 + related: rhbz#1234351 + +* Tue Jun 30 2015 Richard W.M. Jones - 1:1.28.1-1.41 +- v2v: Extend the timeout when converting from VMware + resolves: rhbz#1146007 +- v2v: Fix memory safety when freeing libxml2 objects. +- v2v: Add comment to OVF output if actual_size field is estimated. + +* Thu Jun 25 2015 Richard W.M. Jones - 1:1.28.1-1.40 +- v2v: Disable support for Windows > 7. + reverts: rhbz#1190669 +- v2v: Add support for getting drivers from virtio-win ISO + resolves: rhbz#1234351 + +* Tue Jun 16 2015 Richard W.M. Jones - 1:1.28.1-1.39 +- v2v: Depend on qemu-kvm instead of qemu-kvm-rhev (except on aarch64/power). +- v2v: Don't fail if one of the input disks is blank + resolves: rhbz#1232192 +- p2v: Fix parsing of p2v.memory parameter (1229262). + +* Tue Jun 09 2015 Richard W.M. Jones - 1:1.28.1-1.38 +- p2v: Set conversion status when conversion is cancelled + resolves: rhbz#1226794 +- p2v: Fix kernel command line parsing + resolves: rhbz#1229340 +- p2v: In command line mode, power off machine after conversion + resolves: rhbz#1229385 +- Fix for rebased systemd in RHEL 7.2. + +* Fri May 29 2015 Richard W.M. Jones - 1:1.28.1-1.37 +- ppc64le: Rebuild with fixed OCaml compiler + resolves: rhbz#1224676, rhbz#1224675 +- Fix virt-sparsify on qcow2 files when using qemu-kvm + resolves: rhbz#1225467 +- Remove some perl dependencies which are no longer actually used. +- Further attempts to fix qemu-kvm dependency on aarch64, ppc64le + resolves: rhbz#1177910 + +* Tue May 19 2015 Richard W.M. Jones - 1:1.28.1-1.36 +- p2v: Fix network in virt-p2v appliance + resolves: rhbz#1222975 +- p2v: Display network card MAC and vendor in conversion dialog (855059). +- p2v: More fixes to Add Network Connection dialog + related: rhbz#1167921 +- virt-builder: Fix --selinux-relabel flag on cross-arch builds + resolves: rhbz#1222993 + +* Tue May 12 2015 Richard W.M. Jones - 1:1.28.1-1.35 +- Further attempts to fix qemu-kvm dependency on aarch64, ppc64, ppc64le + resolves: rhbz#1177910 +- v2v: Fix memory leak in earlier fix for bug 889082 + resolves: rhbz#889082 + +* Mon May 11 2015 Richard W.M. Jones - 1:1.28.1-1.33 +- p2v: Add restrictions for vCPUs and memory in client + resolves: rhbz#823758 +- v2v: Check if guest with same name already exists in libvirt + resolves: rhbz#889082 +- p2v: Add Network Connection dialog + resolves: rhbz#1167921 +- v2v: Fix list of operating system variants passed to RHEV + resolves: rhbz#1219857, rhbz#1213324, rhbz#1213691 +- ppc64: Remove part of temporary workaround + related: rhbz#1177910 + +* Thu Apr 30 2015 Richard W.M. Jones - 1:1.28.1-1.32 +- v2v: Support conversion of EFI guests + resolves: rhbz#1184690 + +* Tue Apr 28 2015 Richard W.M. Jones - 1:1.28.1-1.31 +- v2v: Keep listen address for VNC (updated fix) + resolves: rhbz#1174073 + +* Fri Apr 24 2015 Richard W.M. Jones - 1:1.28.1-1.29 +- v2v: Convert sound card of guests + resolves: rhbz#1176493 + +* Mon Apr 20 2015 Richard W.M. Jones - 1:1.28.1-1.28 +- Remove 'ssh:' URLs from documentation + resolves: rhbz#1212677 +- libguestfs-tools-c 'provides' guestfish + (NB: will be removed in RHEL 8, use 'Requires: /usr/bin/guestfish' instead) + resolves: rhbz#1212002 +- v2v: Fix: warning: unknown guest operating system: windows when converting + to RHEV targets + resolves: rhbz#1213324 +- v2v: Fix: warning: fstrim: fstrim: /sysroot/: FITRIM ioctl failed + resolves: rhbz#1168144 + +* Thu Apr 16 2015 Richard W.M. Jones - 1:1.28.1-1.26 +- v2v: Keep listen address for VNC + resolves: rhbz#1174073 +- v2v: Preserve display port configuration when converting guests +- v2v: Support conversion of guests with disk type volume + resolves: rhbz#1146832 +- v2v: Initial support for gzipped ova imports. + related: rhbz#1186800 + +* Mon Apr 13 2015 Richard W.M. Jones - 1:1.28.1-1.25 +- Enable rbd (Ceph) support. +- rbd: Implement drive secrets + resolves: rhbz#1159030 +- virt-resize: Fix 'no space left on device' when resizing extended partition + resolves: rhbz#1172660 +- v2v: Update RHEV-APT to latest + resolves: rhbz#1186850 +- v2v: Update rhsrvany.exe to latest + resolves: rhbz#1187231 +- Drop dependency on selinux-policy + resolves: rhbz#1196705 +- Depend on fuse + resolves: rhbz#1201507 +- v2v: Allow configurable location for virtio drivers [1209225] +- Various fixes for setting long labels + resolves: rhbz#1164708 +- Fix mknod APIs not stripping permission bits from mode + resolves: rhbz#1182463 +- Allow LIBGUESTFS_TRACE=0, LIBGUESTFS_DEBUG=true etc + resolves: rhbz#1175196 +- Fix typo in description of ping-daemon API + resolves: rhbz#1175676 +- Disable gfs2 subpackage on !x86-64 [1211333] + +* Mon Apr 13 2015 Richard W.M. Jones - 1:1.28.1-1.24 +- Open RHEL 7.2 branch. +- Import brew-overrides.sh into dist-git. +- copy-patches.sh: Relax arbitrary requirement to split patches into + backports and RHEL 7 specific patches. +- v2v: Add --vdsm-ovf-output option + resolves: rhbz#1176598 +- v2v: Fix -o vdsm to work with multiple data domains + resolves: rhbz#1176591 +- v2v: Support conversions of Windows >= 8 + resolves: rhbz#1190669 +- v2v: Document that vCenter >= 5.0 is required + resolves: rhbz#1174200 + +* Thu Feb 5 2015 Richard W.M. Jones - 1:1.28.1-1.23 +- Fix virt-resize (and hence virt-builder --size) on guests using + UEFI bootloaders. + +* Mon Jan 26 2015 Richard W.M. Jones - 1:1.28.1-1.22 +- aarch64: Increase default appliance memory size. +- Make gfs2-utils conditional on x86, as it will not be supported on ARM. +- inspection: aarch64: Backport fix for inspection of EFI guests. + +* Fri Jan 23 2015 Richard W.M. Jones - 1:1.28.1-1.20 +- aarch64: Depend on AAVMF package. + +* Thu Jan 22 2015 Richard W.M. Jones - 1:1.28.1-1.19 +- aarch64: Add support for AAVMF + resolves: rhbz#1184504 + +* Mon Dec 15 2014 Richard W.M. Jones - 1:1.28.1-1.18 +- v2v: Copy graphics password from source to destination + resolves: rhbz#1174123 +- p2v: Allow ports to be reused and specify source port number + resolves: rhbz#1167774 +- p2v: Fix "Conversion was successful" dialog appearing on failure + resolves: rhbz#1167601 + +* Wed Dec 10 2014 Richard W.M. Jones - 1:1.28.1-1.17 +- v2v: Fix modifications to default kernel for legacy grub. + resolves: rhbz#1170073 + +* Mon Dec 8 2014 Richard W.M. Jones - 1:1.28.1-1.16 +- p2v: Wait for qemu-nbd to start up before starting virt-v2v + resolves: rhbz#1167774 + +* Fri Dec 5 2014 Richard W.M. Jones - 1:1.28.1-1.15 +- v2v: Document Windows Group Policy problems causing 0x0000007B BSOD + resolves: rhbz#1161333 +- v2v: Fix conversion of RHEL 3 guests + resolves: rhbz#1171130 +- v2v: Fix conversion of RHEL 4 guests that use epoch + resolves: rhbz#1170685 +- v2v: Favour non-debug kernels over debug kernels + resolves: rhbz#1170073 +- p2v: Fix kickstart for virt-p2v + resolves: rhbz#1168632 +- Fixed some documentation mistakes. + +* Thu Nov 27 2014 Richard W.M. Jones - 1:1.28.1-1.14 +- p2v: Add Reboot button to the GUI + resolves: rhbz#1165564 +- p2v: Fixes to 'Cancel Conversion' button + resolves: rhbz#1165569 +- v2v: -i ova: Remove incorrect warning for disks with no parent controller + resolves: rhbz#1167302 +- resize: Capture errors from ntfsresize + resolves: rhbz#1166618 + +* Thu Nov 20 2014 Richard W.M. Jones - 1:1.28.1-1.13 +- v2v: Fix device mapping of /boot/grub2/device.map + resolves: rhbz#1165975 +- v2v: Fix 'no volume groups found' because of old LVM cache file + resolves: rhbz#1164853 + +* Tue Nov 18 2014 Richard W.M. Jones - 1:1.28.1-1.12 +- v2v: Fix device remapping for RHEL guests + resolves: rhbz#1151725 + +* Mon Nov 17 2014 Richard W.M. Jones - 1:1.28.1-1.11 +- Fix inspect-get-icon on RHEL 7 guests + resolves: rhbz#1164619 +- Fix description of set-append (append) and get-append commands + resolves: rhbz#1164732 +- Fix small typo in release notes. + resolves: rhbz#1164697 + +* Thu Nov 13 2014 Richard W.M. Jones - 1:1.28.1-1.10 +- v2v: -o glance: Fix metadata for disk type and NIC + resolves: rhbz#1161575 +- check xfs label lengths + resolves: rhbz#1162966 + +* Thu Nov 6 2014 Richard W.M. Jones - 1:1.28.1-1.9 +- v2v: Fix kernel detection when multiple kernels are installed + resolves: rhbz#1161250 + +* Thu Nov 6 2014 Richard W.M. Jones - 1:1.28.1-1.8 +- p2v: Explain in the man page why the virt-p2v ISO is used. +- p2v: Ensure we are using virt-v2v >= 1.28. +- v2v: Add bounds check to Xml.xpathobj_node function. +- v2v: Ensure --bridge and --network args are documented correctly in --help +- v2v: -i libvirt vcenter: Change 'esx:' to 'vcenter:' in errors/warnings. +- v2v: Ignore small filesystems when checking for sufficient free space. +- v2v: Document minimum free filesystem space requirements. + related: rhbz#1021149 +- customize: firstboot: make sure to run Linux scripts only once + resolves: rhbz#1160043 +- customize: firstboot: fix Linux log output + resolves: rhbz#1160199 + +* Mon Nov 3 2014 Richard W.M. Jones - 1:1.28.1-1.7 +- guestfish: Fix tab completion of filenames on XFS and elsewhere + resolves: rhbz#1153844 +- v2v: Ensure are set in output so ACPI etc works + resolves: rhbz#1159258 +- v2v: Add --password-file parameter + resolves: rhbz#1158526 + +* Wed Oct 29 2014 Richard W.M. Jones - 1:1.28.1-1.6 +- p2v: Add firmware and usb-storage module to virt-p2v-make-disk. + resolves: rhbz#1157691 + +* Fri Oct 24 2014 Richard W.M. Jones - 1:1.28.1-1.5 +- virt-sysprep & virt-customize: Fix password setting problems + resolves: rhbz#1141626, rhbz#1147065 +- virt-inspector: document that -a option can take a URI + resolves: rhbz#1156301 +- bash-completion: use symlinks instead of copying files + resolves: rhbz#1156298 + +* Thu Oct 23 2014 Richard W.M. Jones - 1:1.28.1-1.4 +- v2v: Fix handling of relative paths in -i ova + resolves: rhbz#1155121 +- v2v: disable uninstallation of VMware drivers on Linux for RHEL 7.1 + resolves: rhbz#1155610 + +* Wed Oct 22 2014 Richard W.M. Jones - 1:1.28.1-1.3 +- v2v: Fix conversion from NBD sources + resolves: rhbz#1153589 +- v2v: BR zip and unzip, and require unzip, for ZIP support in -i ova mode + related: rhbz#1152998 + +* Mon Oct 20 2014 Richard W.M. Jones - 1:1.28.1-1.2 +- v2v: Add support for ZIP and *.vmdk.gz to -i ova + resolves: rhbz#1152998 +- virt-ls: Add a field for directory files when using --csv option + resolves: rhbz#1151900 +- v2v: Mitigate hangs when run against a very slow VMware vCenter server + resolves: rhbz#1153589 +- cat, diff: Avoid double slashes in paths + resolves: rhbz#1151910 + +* Sat Oct 18 2014 Richard W.M. Jones - 1:1.28.1-1.1 +- Final rebase to stable libguestfs branch 1.28. + resolves: rhbz#1021149 +- Drop dist tag for BuildRequires, so it builds on ppc64le. + resolves: rhbz#1149640 +- Make sure we require the latest libvirt, so virt-v2v can access ESX. +- Fix guestfish colour prompts when using white-on-black terminal + resolves: rhbz#1144201 +- Disable libguestfs UML backend mode + resolves: rhbz#1144197 +- Enable ppc64, ppc64le and aarch64. + On ppc64 we currently have to disable build-time testing of qemu. + resolves: rhbz#1125575 +- Remove unnecessary BR for libnl3 in RHEL < 7.1. +- Integrate changes from Rawhide. +- Add workaround for buggy libvirt 1.2.8. +- Move virt-v2v into a separate subpackage and make it depend on qemu-kvm-rhev. +- Add rhsrvany and RHEV Application Provisioning Tool to virt-v2v. +- Change Fedora -> RHEL in description. +- Disable some more protocol tests. +- Enable tests. +- Enable guestfish colour prompts. +- Add new tool virt-log. +- Enabling bash-completions subpackage means we need to BR bash-completion. +- Package libguestfs 1.27/1.28 for RHEL 7.1. +- Enable bash-completion. + +* Mon Mar 3 2014 Richard W.M. Jones - 1:1.22.6-22 +- Fix Ruby bindings + resolves: rhbz#1072079 + +* Wed Feb 12 2014 Richard W.M. Jones - 1:1.22.6-21 +- Fix segfault in guestfs_list_filesystems when presented with a + corrupt btrfs filesystem + resolves: rhbz#1064008 + +* Tue Feb 11 2014 Richard W.M. Jones - 1:1.22.6-20 +- Valid GUIDs when used as parameter to part-set-gpt-type + resolves: rhbz#1008417 + +* Wed Feb 05 2014 Richard W.M. Jones - 1:1.22.6-19 +- Fix placement of *.py[co] files + resolves: rhbz#1061155 +- Remove bogus license file from daemon + resolves: rhbz#1061160 +- Prevent virt-sparsify from overwriting block or char devices + resolves: rhbz#1056556 +- mount-local should give a clearer error if root is not mounted + resolves: rhbz#1057492 + +* Fri Dec 27 2013 Daniel Mach - 1:1.22.6-18 +- Mass rebuild 2013-12-27 + +* Thu Dec 05 2013 Richard W.M. Jones - 1:1.22.6-17 +- Rebuild for updated procps SONAME. + resolves: rhbz#1037795 + +* Wed Nov 20 2013 Richard W.M. Jones - 1:1.22.6-16 +- Allow virt-win-reg command to work with URIs + resolves: rhbz#912193 + +* Thu Oct 31 2013 Richard W.M. Jones - 1:1.22.6-15 +- Add libguestfs-tools.conf(5) man page + resolves: rhbz#1019891 +- Drop PHP bindings + resolves: rhbz#1020021 +- Disable Haskell & Erlang (in case someone has these dependencies + installed and tries to rebuild the package). + +* Wed Oct 16 2013 Richard W.M. Jones - 1:1.22.6-12 +- Backport: "daemon: Fix xfs_info parser because of new format." + which is required to fix libguestfs tests. + related: rhbz#1019503 + +* Wed Oct 16 2013 Richard W.M. Jones - 1:1.22.6-11 +- Further fixes for kvmclock + resolves: rhbz#998109 +- Document that blockdev-setbsz is deprecated and should not be used + resolves: rhbz#1016465 + +* Wed Oct 16 2013 Richard W.M. Jones - 1:1.22.6-10 +- Fix CVE-2013-4419: insecure temporary directory handling for + guestfish's network socket + resolves: rhbz#1019503 + +* Thu Sep 26 2013 Richard W.M. Jones - 1:1.22.6-9 +- Use 'host-passthrough' instead of 'host-model' (RHBZ#1011922) +- Fix mount-loop failed to setup loop device: No such file or directory + resolves: rhbz#1011907 + +* Fri Sep 13 2013 Richard W.M. Jones - 1:1.22.6-8 +- Backport 'cachemode' property of 'add_drive' + resolves: rhbz#1003291 +- Improve error reporting from aug_init + related: rhbz# 1003685 + +* Thu Aug 29 2013 Richard W.M. Jones - 1:1.22.6-5 +- Various fixes to tar-out 'excludes' + resolves: rhbz#1001875 +- Document use of glob + rsync-out + resolves: rhbz#1001876 +- Document mke2fs blockscount + resolves: rhbz#1002032 +- Fix virt-format MBR partition type byte, add --label option to + virt-format and virt-make-fs, and allow labels to be set on DOS filesystems + resolves: rhbz#1000428 +- Fix javadoc location to use _javadocdir macro. +- Call ldconfig in java post and postun scripts. +- Do not explicitly depend on perl-devel. +- Compress the ChangeLog and *.xml files in devel package. +- Create new subpackage gobject-doc for the huge HTML documentation. +- Make javadoc, gobject-doc, bash-completion, man-pages-*, tools packages + 'noarch'. +- Enable gzip-compressed appliance. +- Note this requires supermin >= 4.1.4. + +* Tue Aug 27 2013 Richard W.M. Jones - 1:1.22.6-4 +- New upstream stable version 1.22.6. + resolves: rhbz#995712, rhbz#998750, rhbz#998485 +- Backport set-UUID API and related + resolves: rhbz#995176 +- Enable kvmclock + resolves: rhbz#998109 +- Add upstream APIs guestfs_add_drive_scratch, guestfs_remount. + +* Tue Jul 30 2013 Richard W.M. Jones - 1:1.22.5-3 +- Backport support for virt-sysprep -a URI option + resolves: rhbz#968785 + +* Mon Jul 29 2013 Richard W.M. Jones - 1:1.22.5-2 +- New upstream stable version 1.22.5. +- Fix virt-sysprep --firstboot option + resolves: rhbz#988862 +- Disable unsupported remote drives + resolves: rhbz#962113 +- cap-get-file returns empty string instead of error if no capabilities + resolves: rhbz#989356 + +* Fri Jul 19 2013 Richard W.M. Jones - 1:1.22.4-2 +- New upstream stable version 1.22.4. +- Move virt-sysprep to libguestfs-tools-c package + resolves: rhbz#975573 +- Remove 9p APIs from RHEL + resolves: rhbz#921710 +- Reenable swapon test + resolves: rhbz#911674 +- Reenable file architecture test + resolves: rhbz#911678 +- Fix mkfs blocksize option when using xfs + resolves: rhbz#976250 +- Fix double-free when kernel link fails during launch + resolves: rhbz#983691 +- Fix disk-format "JSON parse error" when target file does not exist + resolves: rhbz#980338 +- Fix documentation for acl-set-file + resolves: rhbz#985856 +- libguestfs-devel should depend on full ENVR of libguestfs-tools-c. +- Require /usr/bin/vi instead of /bin/vi for UsrMove. + +* Mon Jun 3 2013 Richard W.M. Jones - 1:1.22.2-1 +- New upstream version 1.22.2. +- Do not need to remove guestfsd man page, since libguestfs no longer + installs it. + +* Mon May 20 2013 Daniel Mach - 1:1.21.33-1.1.el7 +- Rebuild for cyrus-sasl + +* Mon Apr 29 2013 Richard W.M. Jones - 1:1.21.33-1.el7 +- New upstream version 1.21.33. +- Rebuild for renamed Kerberos library. + resolves: rhbz#957616 +- Skip gnulib tests which fail. +- Skip NBD test since there is no NBD in RHEL. + +* Wed Apr 17 2013 Richard W.M. Jones - 1:1.21.31-1.el7.1 +- Rebase RHEL 7 onto libguestfs 1.21. +- Update spec file from Rawhide. + +* Tue Apr 9 2013 Richard W.M. Jones - 1:1.20.5-4 +- In RHEL 7, 'ruby(abi)' has been replaced by 'ruby(release)' + and the version of the ruby ABI/release is now 2.0.0. + +* Fri Apr 5 2013 Richard W.M. Jones - 1:1.20.5-3 +- Remove man pages of deprecated programs. + +* Tue Apr 2 2013 Richard W.M. Jones - 1:1.20.5-2 +- Remove deprecated programs virt-tar, virt-list-filesystems and + virt-list-partitions from RHEL 7. + +* Sun Mar 31 2013 Richard W.M. Jones - 1:1.20.5-1 +- New upstream version 1.20.5. +- Remove ruby vendor patch. +- Set INSTALLDIRS=vendor on both make and make install rules. + +* Tue Mar 5 2013 Richard W.M. Jones - 1:1.20.3-1 +- New upstream version 1.20.3. + +* Fri Feb 15 2013 Richard W.M. Jones - 1:1.20.2-1 +- New upstream version 1.20.2. +- Synchronize list of tests to be skipped with local list. +- Use openjdk instead of java (GCJ). +- Add BRs: libcap. +- Ship the gobject pkgconfig file. + +* Mon Feb 11 2013 Richard W.M. Jones - 1:1.20.1-7 +- 'febootstrap' has been renamed 'supermin'. + resolves: rhbz#909573 + +* Sat Jan 19 2013 Richard W.M. Jones - 1:1.20.1-6 +- Add explicit BR on seabios-bin to work around RHBZ#901542. + +* Fri Jan 18 2013 Richard W.M. Jones - 1:1.20.1-5 +- Bump and rebuild. + +* Fri Dec 21 2012 Richard W.M. Jones - 1:1.20.1-4 +- Go over all non-upstream patches from RHEL 6 and add appropriate ones + to RHEL 7: + * Emphasize libguestfs-winsupport. + * Remove libguestfs-live ('unix' attach-method). + * Exclude iptables. + * Ignore /etc/release file if /etc/redhat-release file exists. + resolves: rhbz#889536, rhbz#889537, rhbz#889538, rhbz#873219 +- Do not number patches. + +* Thu Dec 20 2012 Richard W.M. Jones - 1:1.20.1-3 +- New upstream version 1.20.1. + +* Tue Dec 18 2012 Richard W.M. Jones - 1:1.20.0-5 +- Remove RHEL-conditionals, since I have branched spec file for RHEL 7. +- Add BR gdisk. +- Change to using git to manage patches. +- Add copy-patches.sh script. +- Disable libguestfs live (RHEL only). +- "Fedora" -> "RHEL" in replacement README file. +- "fedora" -> "rhel" in version extra field. + +* Mon Dec 17 2012 Richard W.M. Jones - 1:1.20.0-2 +- Use 'make check -k' so we get to see all test failures at once. +- For RHEL 7: + * Do not depend on perl(Expect) (only needed to test virt-rescue). + * Depend on /usr/bin/qemu-img instead of qemu-img package, since the + package name (but not the binary) is different in RHEL 7. + * Add workaround for libvirt/KVM bug RHBZ#878406. + * Do not depend on libvirt-daemon-qemu. + * Do not depend on libldm (not yet in RHEL 7: RHBZ#887894). + +* Thu Dec 13 2012 Richard W.M. Jones - 1:1.20.0-1 +- New upstream version 1.20.0. +- New source URL for this branch. +- Reconcile upstream packagelist, BRs and Requires lists. +- Requires newest SELinux policy so that SVirt works. +- Fix patch 2. Actually, remove and replace with a small script. + +* Sat Dec 01 2012 Richard W.M. Jones - 1:1.19.66-1 +- New upstream version 1.19.66. + +* Fri Nov 30 2012 Richard W.M. Jones - 1:1.19.65-2 +- Add a hack to work around glibc header bug . + +* Thu Nov 29 2012 Richard W.M. Jones - 1:1.19.65-1 +- New upstream version 1.19.65. + +* Sat Nov 24 2012 Richard W.M. Jones - 1:1.19.64-1 +- New upstream version 1.19.64. + +* Sat Nov 24 2012 Richard W.M. Jones - 1:1.19.63-3 +- Re-add: Non-upstream patch to add the noapic flag on the kernel + command line on i386 only. This works around a bug in 32-bit qemu, + https://bugzilla.redhat.com/show_bug.cgi?id=857026 + +* Fri Nov 23 2012 Richard W.M. Jones - 1:1.19.63-2 +- Remove non-upstream patch designed to work around + https://bugzilla.redhat.com/show_bug.cgi?id=857026 + to see if this has been fixed. +- Re-enable tests on i686 to see if + https://bugzilla.redhat.com/show_bug.cgi?id=870042 + has been fixed. + +* Fri Nov 23 2012 Richard W.M. Jones - 1:1.19.63-1 +- New upstream version 1.19.63. + +* Tue Nov 20 2012 Richard W.M. Jones - 1:1.19.62-1 +- New upstream version 1.19.62. + +* Mon Nov 19 2012 Richard W.M. Jones - 1:1.19.61-1 +- New upstream version 1.19.61. + +* Sat Nov 17 2012 Richard W.M. Jones - 1:1.19.60-2 +- Remove Lua bogus libtool *.la file. + +* Sat Nov 17 2012 Richard W.M. Jones - 1:1.19.60-1 +- New upstream version 1.19.60. + +* Tue Nov 13 2012 Richard W.M. Jones - 1:1.19.59-1 +- New upstream version 1.19.59. + +* Sat Nov 10 2012 Richard W.M. Jones - 1:1.19.58-1 +- New upstream version 1.19.58. + +* Thu Nov 08 2012 Richard W.M. Jones - 1:1.19.57-1 +- New upstream version 1.19.57. + +* Tue Nov 06 2012 Richard W.M. Jones - 1:1.19.56-3 +- Add upstream patch to disable virt-format test, and disable + it because wipefs utility is broken. + +* Sat Nov 03 2012 Richard W.M. Jones - 1:1.19.56-2 +- Add upstream patch to fix wipefs test. + +* Fri Nov 02 2012 Richard W.M. Jones - 1:1.19.56-1 +- New upstream version 1.19.56. + +* Tue Oct 30 2012 Richard W.M. Jones - 1:1.19.55-1 +- New upstream version 1.19.55. + +* Mon Oct 29 2012 Richard W.M. Jones - 1:1.19.54-1 +- New upstream version 1.19.54. + +* Wed Oct 24 2012 Richard W.M. Jones - 1:1.19.53-3 +- Disable tests on ix86 because qemu/kernel is broken (RHBZ#870042). + +* Wed Oct 24 2012 Richard W.M. Jones - 1:1.19.53-2 +- Add upstream patch to fix guestfish tests. + +* Fri Oct 19 2012 Richard W.M. Jones - 1:1.19.53-1 +- New upstream version 1.19.53. + +* Sun Oct 14 2012 Richard W.M. Jones - 1:1.19.52-1 +- New upstream version 1.19.52. + +* Thu Oct 11 2012 Richard W.M. Jones - 1:1.19.51-1 +- New upstream version 1.19.51. + +* Thu Oct 11 2012 Petr Pisar - 1:1.19.50-2 +- Correct perl dependencies + +* Thu Oct 11 2012 Richard W.M. Jones - 1:1.19.50-1 +- New upstream version 1.19.50. + +* Wed Oct 10 2012 Richard W.M. Jones - 1:1.19.49-3 +- Upstream patch to workaround btrfs problems with kernel 3.7.0. + +* Tue Oct 09 2012 Richard W.M. Jones - 1:1.19.49-2 +- Install all libguestfs-live-service udev rules into /usr/lib/udev/rules.d. + +* Tue Oct 09 2012 Richard W.M. Jones - 1:1.19.49-1 +- New upstream version 1.19.49. + +* Sun Oct 07 2012 Richard W.M. Jones - 1:1.19.48-1 +- New upstream version 1.19.48. + +* Mon Oct 01 2012 Richard W.M. Jones - 1:1.19.46-1 +- New upstream version 1.19.46. + +* Wed Sep 26 2012 Richard W.M. Jones - 1:1.19.45-1 +- New upstream version 1.19.45. + +* Tue Sep 25 2012 Richard W.M. Jones - 1:1.19.44-2 +- Enable sVirt (NB: requires libvirt >= 0.10.2-3, selinux-policy >= 3.11.1-23). +- Add upstream patch to label the custom $TMPDIR used in test-launch-race. + +* Mon Sep 24 2012 Richard W.M. Jones - 1:1.19.44-1 +- New upstream version 1.19.44. + +* Sat Sep 22 2012 Richard W.M. Jones - 1:1.19.43-1 +- New upstream version 1.19.43. + +* Tue Sep 18 2012 Richard W.M. Jones - 1:1.19.42-2 +- New upstream version 1.19.42. +- Rebase sVirt (disable) patch. + +* Sun Sep 16 2012 Richard W.M. Jones - 1:1.19.41-1 +- New upstream version 1.19.41. + +* Fri Sep 14 2012 Richard W.M. Jones - 1:1.19.40-3 +- Add (non-upstream) patch to add the noapic flag on the kernel + command line on i386 only. This works around a bug in 32-bit qemu. + +* Wed Sep 12 2012 Richard W.M. Jones - 1:1.19.40-2 +- Enable tests because RHBZ#853408 has been fixed in qemu-1.2.0-3.fc18. + +* Wed Sep 05 2012 Richard W.M. Jones - 1:1.19.40-1 +- New upstream version 1.19.40. + +* Tue Sep 04 2012 Richard W.M. Jones - 1:1.19.39-1 +- New upstream version 1.19.39. + +* Mon Sep 03 2012 Richard W.M. Jones - 1:1.19.38-1 +- New upstream version 1.19.38. + +* Fri Aug 31 2012 Richard W.M. Jones - 1:1.19.37-1 +- New upstream version 1.19.37. + +* Thu Aug 30 2012 Richard W.M. Jones - 1:1.19.36-2 +- New upstream version 1.19.36. +- Require libvirt-daemon-qemu (for libvirt attach method). + +* Thu Aug 30 2012 Richard W.M. Jones - 1:1.19.36-1 +- Switch to using libvirt as the backend for running the appliance. See: + https://www.redhat.com/archives/libguestfs/2012-August/msg00070.html +- Use configure RPM macro instead of ./configure. + +* Wed Aug 29 2012 Richard W.M. Jones - 1:1.19.35-1 +- New upstream version 1.19.35. + +* Wed Aug 29 2012 Richard W.M. Jones - 1:1.19.34-2 +- Add upstream patch to fix Perl bindtests on 32 bit. + +* Tue Aug 28 2012 Richard W.M. Jones - 1:1.19.34-1 +- New upstream version 1.19.34. + +* Tue Aug 28 2012 Richard W.M. Jones - 1:1.19.33-1 +- New upstream version 1.19.33. + +* Mon Aug 27 2012 Richard W.M. Jones - 1:1.19.33-3 +- Fix Perl examples directory so we only include the examples. +- Add Java examples to java-devel RPM. + +* Tue Aug 21 2012 Richard W.M. Jones - 1:1.19.33-2 +- New upstream version 1.19.33. +- Reenable tests. + +* Sat Aug 18 2012 Richard W.M. Jones - 1:1.19.32-1 +- New upstream version 1.19.32. + +* Wed Aug 15 2012 Richard W.M. Jones - 1:1.19.31-1 +- New upstream version 1.19.31. + +* Tue Aug 14 2012 Richard W.M. Jones - 1:1.19.30-1 +- New upstream version 1.19.30. + +* Sat Aug 11 2012 Richard W.M. Jones - 1:1.19.29-2 +- New upstream version 1.19.29. +- Remove RELEASE NOTES from doc section, and add equivalent man page. + +* Fri Aug 10 2012 Richard W.M. Jones - 1:1.19.28-4 +- Bump and rebuild. + +* Thu Aug 02 2012 Richard W.M. Jones - 1:1.19.28-3 +- New upstream version 1.19.28. +- Update libguestfs-find-requires to generate ordinary lib dependencies. + +* Wed Aug 1 2012 Richard W.M. Jones - 1:1.19.27-2 +- Disable tests because of RHBZ#844485. + +* Mon Jul 30 2012 Richard W.M. Jones - 1:1.19.27-1 +- New upstream version 1.19.27. + +* Thu Jul 26 2012 Richard W.M. Jones - 1:1.19.26-2 +- Remove old RPM-isms like defattr. +- Add upstream patches to fix use of 'run' script in tests. + +* Thu Jul 26 2012 Richard W.M. Jones - 1:1.19.26-1 +- New upstream version 1.19.26. + +* Tue Jul 24 2012 Richard W.M. Jones - 1:1.19.25-1 +- New upstream version 1.19.25. + +* Mon Jul 23 2012 Richard W.M. Jones - 1:1.19.24-1 +- New upstream version 1.19.24. + +* Sun Jul 22 2012 Richard W.M. Jones - 1:1.19.23-1 +- New upstream version 1.19.23. + +* Thu Jul 19 2012 Richard W.M. Jones - 1:1.19.22-2 +- Add upstream patch to skip mount-local test if /dev/fuse not writable. + +* Thu Jul 19 2012 Richard W.M. Jones - 1:1.19.22-1 +- New upstream version 1.19.22. + +* Wed Jul 18 2012 Richard W.M. Jones - 1:1.19.21-1 +- New upstream version 1.19.21. + +* Tue Jul 17 2012 Richard W.M. Jones - 1:1.19.20-1 +- New upstream version 1.19.20. + +* Mon Jul 16 2012 Richard W.M. Jones - 1:1.19.19-1 +- New upstream version 1.19.19. + +* Tue Jul 10 2012 Petr Pisar - 1:1.19.18-2 +- Perl 5.16 rebuild + +* Mon Jul 09 2012 Richard W.M. Jones - 1:1.19.18-1 +- New upstream version 1.19.18. + +* Fri Jul 06 2012 Richard W.M. Jones - 1:1.19.17-1 +- New upstream version 1.19.17. + +* Wed Jul 04 2012 Richard W.M. Jones - 1:1.19.16-1 +- New upstream version 1.19.16. + +* Fri Jun 29 2012 Richard W.M. Jones - 1:1.19.15-1 +- New upstream version 1.19.15. + +* Thu Jun 28 2012 Richard W.M. Jones - 1:1.19.14-1 +- New upstream version 1.19.14. + +* Wed Jun 27 2012 Richard W.M. Jones - 1:1.19.13-2 +- New upstream version 1.19.13. +- Add upstream patch to fix GObject/Javascript tests. + +* Tue Jun 26 2012 Richard W.M. Jones - 1:1.19.12-1 +- New upstream version 1.19.12. + +* Mon Jun 25 2012 Richard W.M. Jones - 1:1.19.11-1 +- New upstream version 1.19.11. + +* Fri Jun 22 2012 Richard W.M. Jones - 1:1.19.10-1 +- New upstream version 1.19.10. + +* Mon Jun 18 2012 Richard W.M. Jones - 1:1.19.9-1 +- New upstream version 1.19.9. + +* Thu Jun 14 2012 Richard W.M. Jones - 1:1.19.8-1 +- New upstream version 1.19.8. + +* Thu Jun 14 2012 Richard W.M. Jones - 1:1.19.7-2 +- New upstream version 1.19.7. +- Require febotstrap >= 3.17. + +* Tue Jun 12 2012 Richard W.M. Jones - 1:1.19.6-2 +- Require febootstrap >= 3.16. + +* Tue Jun 12 2012 Richard W.M. Jones - 1:1.19.6-1 +- New upstream version 1.19.6. + +* Tue Jun 12 2012 Richard W.M. Jones - 1:1.19.6-1 +- New upstream version 1.19.6. +- This version defaults to using virtio-scsi. +- Requires qemu >= 1.0. +- Requires febootstrap >= 3.15. + +* Mon Jun 11 2012 Petr Pisar - 1:1.19.5-2 +- Perl 5.16 rebuild + +* Sat Jun 09 2012 Richard W.M. Jones - 1:1.19.5-1 +- New upstream version 1.19.5. + +* Thu Jun 07 2012 Richard W.M. Jones - 1:1.19.4-1 +- New upstream version 1.19.4. + +* Fri Jun 01 2012 Richard W.M. Jones - 1:1.19.3-2 +- New upstream version 1.19.3. +- Remove patches which are now upstream. + +* Tue May 29 2012 Richard W.M. Jones - 1:1.19.2-3 +- Remove obsolete list of bugs in make check rule. +- Remove some obsolete test workarounds. +- Disable i386 tests (because of RHBZ#825944). + +* Mon May 28 2012 Richard W.M. Jones - 1:1.19.2-2 +- Include patches to fix udev. + +* Mon May 28 2012 Richard W.M. Jones - 1:1.19.2-1 +- New upstream version 1.19.2. + +* Sat May 26 2012 Richard W.M. Jones - 1:1.19.1-1 +- New upstream version 1.19.1. + +* Mon May 21 2012 Richard W.M. Jones - 1:1.19.0-1 +- New upstream version 1.19.0. + +* Thu May 17 2012 Richard W.M. Jones - 1:1.17.43-1 +- New upstream version 1.17.43. + +* Thu May 17 2012 Richard W.M. Jones - 1:1.17.42-4 +- On RHEL 7 only, remove reiserfs-utils, zerofree. + +* Thu May 17 2012 Richard W.M. Jones - 1:1.17.42-3 +- On RHEL 7 only, remove nilfs-utils. + +* Tue May 15 2012 Richard W.M. Jones - 1:1.17.42-2 +- Bundled gnulib (RHBZ#821767). + +* Mon May 14 2012 Richard W.M. Jones - 1:1.17.42-1 +- New upstream version 1.17.42. + +* Fri May 11 2012 Richard W.M. Jones - 1:1.17.41-1 +- New upstream version 1.17.41. + +* Tue May 08 2012 Richard W.M. Jones - 1:1.17.40-1 +- New upstream version 1.17.40. + +* Tue May 8 2012 Richard W.M. Jones - 1:1.17.39-3 +- Disable hfsplus-tools on RHEL 7. + +* Thu May 03 2012 Richard W.M. Jones - 1:1.17.39-2 +- BR perl-XML-XPath to run the new XML test. + +* Thu May 03 2012 Richard W.M. Jones - 1:1.17.39-1 +- New upstream version 1.17.39. + +* Wed May 02 2012 Richard W.M. Jones - 1:1.17.38-3 +- Remove explicit runtime deps for old virt-sysprep. +- Add explicit runtime dep on fuse (RHBZ#767852, thanks Pádraig Brady). +- Remove explicit versioned dep on glibc. + +* Tue May 1 2012 Peter Robinson - 1:1.17.38-2 +- Update supported filesystems for ARM + +* Tue May 01 2012 Richard W.M. Jones - 1:1.17.38-1 +- New upstream version 1.17.38. + +* Tue May 01 2012 Richard W.M. Jones - 1:1.17.37-2 +- Add guestfs-faq(1) (FAQ is now a man page). + +* Tue May 01 2012 Richard W.M. Jones - 1:1.17.37-1 +- New upstream version 1.17.37. + +* Fri Apr 27 2012 Richard W.M. Jones - 1:1.17.36-2 +- Add upstream patch to fix installation of gobject headers. + +* Thu Apr 26 2012 Richard W.M. Jones - 1:1.17.36-1 +- New upstream version 1.17.36. + +* Thu Apr 26 2012 Richard W.M. Jones - 1:1.17.35-1 +- New upstream version 1.17.35. + +* Tue Apr 24 2012 Richard W.M. Jones - 1:1.17.34-1 +- New upstream version 1.17.34. + +* Mon Apr 23 2012 Richard W.M. Jones - 1:1.17.33-1 +- New upstream version 1.17.33. + +* Tue Apr 17 2012 Richard W.M. Jones - 1:1.17.32-1 +- New upstream version 1.17.32. + +* Mon Apr 16 2012 Richard W.M. Jones - 1:1.17.31-1 +- New upstream version 1.17.31. + +* Fri Apr 13 2012 Richard W.M. Jones - 1:1.17.30-1 +- New upstream version 1.17.30. + +* Thu Apr 12 2012 Richard W.M. Jones - 1:1.17.29-1 +- New upstream version 1.17.29. + +* Thu Apr 12 2012 Richard W.M. Jones - 1:1.17.28-2 +- Enable ruby 1.9 patch in RHEL 7 (RHBZ#812139). + +* Thu Apr 12 2012 Richard W.M. Jones - 1:1.17.28-1 +- New upstream version 1.17.28. + +* Wed Apr 11 2012 Richard W.M. Jones - 1:1.17.27-2 +- Add guestfs-performance(1) manual page. + +* Tue Apr 10 2012 Richard W.M. Jones - 1:1.17.27-1 +- New upstream version 1.17.27. + +* Tue Apr 03 2012 Richard W.M. Jones - 1:1.17.26-1 +- New upstream version 1.17.26. + +* Mon Apr 02 2012 Richard W.M. Jones - 1:1.17.25-1 +- New upstream version 1.17.25. + +* Sun Apr 01 2012 Richard W.M. Jones - 1:1.17.24-1 +- New upstream version 1.17.24. + +* Sun Apr 01 2012 Richard W.M. Jones - 1:1.17.23-1 +- New upstream version 1.17.23. + +* Thu Mar 29 2012 Richard W.M. Jones - 1:1.17.22-2 +- Include all gobject header files. +- Include gtk-doc, and depend on the gtk-doc package at runtime. + +* Thu Mar 29 2012 Richard W.M. Jones - 1:1.17.22-1 +- New upstream version 1.17.22. + +* Thu Mar 29 2012 Richard W.M. Jones - 1:1.17.21-2 +- Bump and rebuild. + +* Wed Mar 21 2012 Richard W.M. Jones - 1:1.17.21-1 +- New upstream version 1.17.21. + +* Mon Mar 19 2012 Richard W.M. Jones - 1:1.17.20-3 +- Reenable LUKS, since RHBZ#804345 is reported to be fixed. + +* Sun Mar 18 2012 Richard W.M. Jones - 1:1.17.20-2 +- Disable LUKS tests because LUKS is broken in Rawhide (RHBZ#804345). + +* Sat Mar 17 2012 Richard W.M. Jones - 1:1.17.20-1 +- New upstream version 1.17.20. + +* Sat Mar 17 2012 Richard W.M. Jones - 1:1.17.19-2 +- Add libguestfs-make-fixed-appliance (with man page). + +* Fri Mar 16 2012 Richard W.M. Jones - 1:1.17.19-1 +- New upstream version 1.17.19. + +* Thu Mar 15 2012 Richard W.M. Jones - 1:1.17.18-1 +- New upstream version 1.17.18. + +* Wed Mar 14 2012 Richard W.M. Jones - 1:1.17.17-1 +- New upstream version 1.17.17. + +* Wed Mar 14 2012 Richard W.M. Jones - 1:1.17.16-2 +- Bump and rebuild. + +* Tue Mar 13 2012 Richard W.M. Jones - 1:1.17.16-1 +- New upstream version 1.17.16. + +* Mon Mar 12 2012 Richard W.M. Jones - 1:1.17.15-1 +- New upstream version 1.17.15. + +* Fri Mar 09 2012 Richard W.M. Jones - 1:1.17.14-1 +- New upstream version 1.17.14. + +* Thu Mar 08 2012 Richard W.M. Jones - 1:1.17.13-1 +- New upstream version 1.17.13. + +* Thu Mar 08 2012 Richard W.M. Jones - 1:1.17.12-2 +- Enable Japanese man pages, since these are in a better state upstream. + +* Wed Mar 07 2012 Richard W.M. Jones - 1:1.17.12-1 +- New upstream version 1.17.12. + +* Wed Mar 07 2012 Richard W.M. Jones - 1:1.17.11-2 +- Require netpbm-progs, icoutils. These are needed for icon generation + during inspection, but were not being pulled in before. + +* Mon Mar 05 2012 Richard W.M. Jones - 1:1.17.11-1 +- New upstream version 1.17.11. + +* Sat Mar 03 2012 Richard W.M. Jones - 1:1.17.10-2 +- New upstream version 1.17.10. +- Rebase Ruby patch against new libguestfs. + +* Wed Feb 29 2012 Richard W.M. Jones - 1:1.17.9-1 +- New upstream version 1.17.9. + +* Wed Feb 15 2012 Richard W.M. Jones - 1:1.17.8-1 +- New upstream version 1.17.8. + +* Mon Feb 13 2012 Richard W.M. Jones - 1:1.17.7-1 +- New upstream version 1.17.7. + +* Fri Feb 10 2012 Richard W.M. Jones - 1:1.17.6-1 +- +BR ruby-irb. +- Make virtio unconditional. It's been a very long time since disabling + virtio was a good idea. +- Disable some packages not available in RHEL 7. +- New upstream version 1.17.6. + +* Fri Feb 10 2012 Petr Pisar - 1:1.17.5-3 +- Rebuild against PCRE 8.30 + +* Thu Feb 9 2012 Richard W.M. Jones - 1:1.17.5-2 +- Rebuild with ruby(abi) = 1.9.1. + +* Wed Feb 8 2012 Richard W.M. Jones - 1:1.17.5-1 +- New upstream version 1.17.5. +- Remove usrmove workaround patch, now upstream. + +* Wed Feb 8 2012 Richard W.M. Jones - 1:1.17.4-8 +- Further Ruby 1.9 changes. + +* Tue Feb 07 2012 Richard W.M. Jones - 1:1.17.4-7 +- Bump and rebuild for Ruby update. + +* Mon Feb 6 2012 Richard W.M. Jones - 1:1.17.4-6 +- Add workaround for usrmove in Fedora. + +* Wed Feb 1 2012 Richard W.M. Jones - 1:1.17.4-1 +- New upstream version 1.17.4. +- Remove patch now upstream. + +* Sat Jan 28 2012 Richard W.M. Jones - 1:1.17.3-2 +- New upstream version 1.17.3. +- Remove patch now upstream. +- Add upstream patch to fix OCaml bytecode compilation. + +* Fri Jan 27 2012 Richard W.M. Jones - 1:1.17.2-3 +- Upstream patch to work with udev >= 176. + +* Thu Jan 26 2012 Richard W.M. Jones - 1:1.17.2-2 +- New upstream version 1.17.2. +- Use libdb-utils instead of old db4-utils. +- net-tools is no longer used; replaced by iproute (RHBZ#784647). +- Try re-enabling tests on i686. + +* Tue Jan 24 2012 Richard W.M. Jones - 1:1.17.1-1 +- New upstream version 1.17.1. + +* Mon Jan 23 2012 Richard W.M. Jones - 1:1.16.0-1 +- New upstream version 1.16.0. +- Remove patches which are now upstream. +- GObject: Move *.typelib file to base gobject package. + +* Sun Jan 22 2012 Richard W.M. Jones - 1:1.15.19-1 +- New upstream version 1.15.19. +- +BR psmisc for the appliance. +- Includes GObject bindings in libguestfs-gobject and + libguestfs-gobject-devel subpackages. +- Include upstream patches for PHP 5.4. + +* Thu Jan 19 2012 Richard W.M. Jones - 1:1.15.18-1 +- New upstream version 1.15.18. + +* Wed Jan 18 2012 Richard W.M. Jones - 1:1.15.17-1 +- New upstream version 1.15.17. +- New tool: virt-format. + +* Tue Jan 10 2012 Richard W.M. Jones - 1:1.15.16-1 +- New upstream version 1.15.16. + +* Sun Jan 8 2012 Richard W.M. Jones - 1:1.15.15-2 +- New upstream version 1.15.15. +- Updated gnulib fixes builds with gcc 4.7. +- Rebuild for OCaml 3.12.1. +- Add explicit BR perl-hivex, required for various Perl virt tools. + +* Fri Dec 23 2011 Richard W.M. Jones - 1:1.15.14-1 +- New upstream version 1.15.14. +- Remove three patches, now upstream. + +* Thu Dec 22 2011 Richard W.M. Jones - 1:1.15.13-4 +- New upstream version 1.15.13. +- Fixes Security: Mitigate possible privilege escalation via SG_IO ioctl + (CVE-2011-4127, RHBZ#757071). +- Add three upstream patches to fix 'make check'. + +* Thu Dec 22 2011 Richard W.M. Jones - 1:1.15.12-1 +- New upstream version 1.15.12. + +* Fri Dec 9 2011 Richard W.M. Jones - 1:1.15.11-1 +- New upstream version 1.15.11. + +* Tue Dec 6 2011 Richard W.M. Jones - 1:1.15.10-1 +- New upstream version 1.15.10. +- Remove patch, now upstream. + +* Sat Dec 3 2011 Richard W.M. Jones - 1:1.15.9-2 +- New upstream version 1.15.9. +- Add upstream patch to fix Augeas library detection. +- Appliance explicitly requires libxml2 (because Augeas >= 0.10 requires it), + although it was implicitly included already. + +* Tue Nov 29 2011 Richard W.M. Jones - 1:1.15.8-1 +- New upstream version 1.15.8. + +* Tue Nov 29 2011 Richard W.M. Jones - 1:1.15.7-1 +- New upstream version 1.15.7. + +* Thu Nov 24 2011 Richard W.M. Jones - 1:1.15.6-1 +- New upstream version 1.15.6. + +* Mon Nov 21 2011 Richard W.M. Jones - 1:1.15.5-1 +- New upstream version 1.15.5. +- Add guestfs-testing(1) man page. + +* Thu Nov 17 2011 Richard W.M. Jones - 1:1.15.4-2 +- New upstream version 1.15.4. +- Remove patch which is now upstream. +- libguestfs_jni.a is no longer built. + +* Fri Nov 11 2011 Richard W.M. Jones - 1:1.15.3-3 +- Add upstream patch to disable part of virt-df test. + +* Thu Nov 10 2011 Richard W.M. Jones - 1:1.15.3-1 +- New upstream version 1.15.3. +- Fix list of BuildRequires so they precisely match the appliance. + +* Thu Nov 3 2011 Richard W.M. Jones - 1:1.15.2-1 +- New upstream version 1.15.2. +- ocaml-pcre is no longer required for virt-resize. +- xmlstarlet is no longer required for virt-sysprep. + +* Tue Nov 1 2011 Richard W.M. Jones - 1:1.15.1-1 +- New upstream version 1.15.1. + +* Fri Oct 28 2011 Richard W.M. Jones - 1:1.15.0-1 +- Stable branch 1.14.0 was released. This is the new development + branch version 1.15.0. + +* Wed Oct 26 2011 Richard W.M. Jones - 1:1.13.26-1 +- New upstream version 1.13.26. + +* Wed Oct 26 2011 Richard W.M. Jones - 1:1.13.25-1 +- New upstream version 1.13.25. + +* Mon Oct 24 2011 Richard W.M. Jones - 1:1.13.24-1 +- New upstream version 1.13.24. +- This version includes upstream workarounds for broken qemu, so both + non-upstream patches have now been removed from Fedora. + +* Fri Oct 21 2011 Marcela Mašláňová - 1:1.13.23-1.1 +- rebuild with new gmp without compat lib + +* Thu Oct 20 2011 Richard W.M. Jones - 1:1.13.23-1 +- New upstream version 1.13.23. + +* Wed Oct 19 2011 Richard W.M. Jones - 1:1.13.22-2 +- New upstream version 1.13.22. +- Remove 3x upstream patches. +- Renumber the two remaining non-upstream patches as patch0, patch1. +- Rebase patch1. + +* Mon Oct 17 2011 Richard W.M. Jones - 1:1.13.21-4 +- Add upstream patch to skip FUSE tests if there is no /dev/fuse. + This allows us also to remove the Fedora-specific patch which + disabled these tests before. + +* Sat Oct 15 2011 Richard W.M. Jones - 1:1.13.21-3 +- Add upstream patch to fix virt-sysprep test. + +* Fri Oct 14 2011 Richard W.M. Jones - 1:1.13.21-2 +- New upstream version 1.13.21. +- Move virt-sysprep to libguestfs-tools, to avoid pulling in extra + dependencies for RHEV-H. This tool is not likely to be useful + for RHEV-H in its current form anyway. +- Change BR cryptsetup-luks -> cryptsetup since that package changed. + +* Wed Oct 12 2011 Peter Schiffer - 1:1.13.20-1.1 +- rebuild with new gmp + +* Tue Oct 11 2011 Richard W.M. Jones - 1:1.13.20-1 +- New upstream version 1.13.20. + +* Sat Oct 8 2011 Richard W.M. Jones - 1:1.13.19-1 +- New upstream version 1.13.19. +- New tool: virt-sysprep. +- Remove the old guestfish and libguestfs-mount packages, and put these + tools into libguestfs-tools. This change is long overdue, but is also + necessitated by the new virt-sysprep tool. This new tool would pull + in guestfish anyway, so having separate packages makes no sense. +- Remove old obsoletes for virt-cat, virt-df, virt-df2 and virt-inspector, + since those packages existed only in much older Fedora. + +* Wed Oct 5 2011 Richard W.M. Jones - 1:1.13.18-1 +- New upstream version 1.13.18. +- New tool: virt-alignment-scan. + +* Tue Oct 4 2011 Richard W.M. Jones - 1:1.13.17-1 +- New upstream version 1.13.17. +- New tool: virt-sparsify. + +* Sat Oct 1 2011 Richard W.M. Jones - 1:1.13.16-1 +- New upstream version 1.13.16. + +* Thu Sep 29 2011 Richard W.M. Jones - 1:1.13.15-2 +- Rearrange description to make it clearer. +- virt-resize was written in OCaml. Move it to libguestfs-tools-c + subpackage since it doesn't require Perl. + +* Wed Sep 28 2011 Richard W.M. Jones - 1:1.13.15-1 +- New upstream version 1.13.15. +- Add lzop program to the appliance (for compress-out API). +- Remove upstream patch. + +* Mon Sep 26 2011 Richard W.M. Jones - 1:1.13.14-2 +- Upstream patch to fix timer check failures during boot (RHBZ#502058). + +* Sat Sep 24 2011 Richard W.M. Jones - 1:1.13.14-1 +- New upstream version 1.13.14. + +* Wed Sep 21 2011 Richard W.M. Jones - 1:1.13.13-1 +- Add Erlang bindings in erlang-libguestfs subpackage. +- Remove upstream patch. + +* Fri Sep 16 2011 Richard W.M. Jones - 1:1.13.12-4 +- Don't require grub. See RHBZ#737261. +- Note this (hopefully temporarily) breaks guestfs_grub_install API. +- Include upstream patch to add guestfs_grub_install into an optional group. + +* Wed Sep 14 2011 Richard W.M. Jones - 1:1.13.12-1 +- New upstream version 1.13.12. + +* Thu Sep 1 2011 Richard W.M. Jones - 1:1.13.11-1 +- New upstream version 1.13.11. + +* Tue Aug 30 2011 Richard W.M. Jones - 1:1.13.10-2 +- Remove MAKEDEV dependency (RHBZ#727247). + +* Sun Aug 28 2011 Richard W.M. Jones - 1:1.13.10-1 +- New upstream version 1.13.10. + +* Fri Aug 26 2011 Richard W.M. Jones - 1:1.13.9-1 +- New upstream version 1.13.9. + +* Fri Aug 26 2011 Richard W.M. Jones - 1:1.13.8-1 +- New upstream version 1.13.8. +- Static python library is no longer built, so don't rm it. + +* Tue Aug 23 2011 Richard W.M. Jones - 1:1.13.7-1 +- New upstream version 1.13.7. +- configure --with-extra version string contains Fedora release. +- Build with make V=1 to display full compile commands. +- Remove /usr/sbin PATH setting, not used for a very long time. + +* Fri Aug 19 2011 Richard W.M. Jones - 1:1.13.6-2 +- New upstream version 1.13.6. +- Rebase non-upstream patch to fix qemu -machine option. + +* Wed Aug 17 2011 Richard W.M. Jones - 1:1.13.5-1 +- New upstream version 1.13.5. + +* Thu Aug 11 2011 Richard W.M. Jones - 1:1.13.4-1 +- New upstream version 1.13.4. + +* Mon Aug 8 2011 Richard W.M. Jones - 1:1.13.3-4 +- New upstream version 1.13.3. +- 'test-getlogin_r.c:55: assertion failed' test must now be fixed in + gnulib/tests directory instead of daemon/tests (the latter directory + no longer exists). +- Only run testsuite on x86_64 because of qemu bug. + +* Tue Aug 2 2011 Richard W.M. Jones - 1:1.13.2-3 +- Switch Rawhide to use the new development branch (1.13). +- New upstream version 1.13.2. +- Remove upstream patch. +- Ensure config.log is printed, even in the error case. + +* Tue Jul 26 2011 Richard W.M. Jones - 1:1.12.1-4 +- New upstream stable branch version 1.12.1. +- Remove 5 x upstream patches. +- Add non-upstream patch to deal with broken qemu -machine option. +- Add upstream patch to fix segfault in OCaml bindings. + +* Tue Jul 26 2011 Richard W.M. Jones - 1:1.12.0-11 +- Bump and rebuild. + +* Fri Jul 22 2011 Richard W.M. Jones - 1:1.12.0-10 +- Rebuild against fixed hivex 1.2.7-7 in dist-f16-perl. + +* Thu Jul 21 2011 Richard W.M. Jones - 1:1.12.0-9 +- Attempt rebuild in dist-f16-perl. + +* Thu Jul 21 2011 Petr Sabata - 1:1.12.0-8 +- Perl mass rebuild + +* Thu Jul 21 2011 Richard W.M. Jones - 1:1.12.0-4 +- Disable tests, use quickcheck, because of RHBZ#723555, RHBZ#723822. + +* Wed Jul 20 2011 Richard W.M. Jones - 1:1.12.0-2 +- Readd patch to fix virtio-serial test for qemu 0.15. + +* Wed Jul 20 2011 Richard W.M. Jones - 1:1.12.0-1 +- New stable version 1.12.0 for Fedora 16. +- Remove upstream patch. +- Disable tests on i686 (because of RHBZ#723555). + +* Wed Jul 20 2011 Petr Sabata - 1:1.11.20-3 +- Perl mass rebuild + +* Tue Jul 19 2011 Richard W.M. Jones - 1:1.11.20-2 +- Add upstream patch to fix virtio-serial test for qemu 0.15. + +* Tue Jul 19 2011 Richard W.M. Jones - 1:1.11.20-1 +- New upstream version 1.11.20. +- Replace standard README file with one suited for Fedora. +- Add guestfs-java(3) manpage to libguestfs-java-devel package. + +* Mon Jul 18 2011 Richard W.M. Jones - 1:1.11.19-1 +- New upstream version 1.11.19. +- Remove upstream patch. +- Add Ukrainian (uk) man pages subpackage. + +* Fri Jul 15 2011 Richard W.M. Jones - 1:1.11.18-2 +- Add upstream patch to fix regression test. + +* Fri Jul 15 2011 Richard W.M. Jones - 1:1.11.18-1 +- New upstream version 1.11.18. +- Force febootstrap >= 3.7 which contains a fix for latest Rawhide. +- Use --enable-install-daemon to install guestfsd. + +* Thu Jul 14 2011 Richard W.M. Jones - 1:1.11.17-1 +- New upstream version 1.11.17. + +* Wed Jul 13 2011 Richard W.M. Jones - 1:1.11.16-1 +- New upstream version 1.11.16. + +* Tue Jul 12 2011 Richard W.M. Jones - 1:1.11.15-1 +- New upstream version 1.11.15. + +* Wed Jul 6 2011 Richard W.M. Jones - 1:1.11.14-1 +- New upstream version 1.11.14. + +* Wed Jul 6 2011 Richard W.M. Jones - 1:1.11.13-3 +- Further updates to libguestfs-live-service after feedback from + Dan Berrange and Lennart Poettering. + +* Tue Jul 5 2011 Richard W.M. Jones - 1:1.11.13-2 +- Add libguestfs-live-service subpackage. This can be installed in + virtual machines in order to enable safe editing of files in running + guests (eg. guestfish --live). + +* Thu Jun 30 2011 Richard W.M. Jones - 1:1.11.13-1 +- New upstream version 1.11.13. + +* Wed Jun 29 2011 Richard W.M. Jones - 1:1.11.12-3 +- Bump and rebuild for parted 3.0. +- Depend on fixed parted >= 3.0-2. + +* Tue Jun 28 2011 Richard W.M. Jones - 1:1.11.12-1 +- New upstream version 1.11.12. + +* Tue Jun 21 2011 Richard W.M. Jones - 1:1.11.11-1 +- New upstream version 1.11.11. + +* Mon Jun 20 2011 Richard W.M. Jones - 1:1.11.10-3 +- Temporarily stop setting CCFLAGS in perl subdirectory. + See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=628522 + +* Fri Jun 17 2011 Marcela Mašláňová - 1:1.11.10-2 +- Perl mass rebuild + +* Fri Jun 10 2011 Richard W.M. Jones - 1:1.11.10-1 +- New upstream version 1.11.10. +- Enable tests since fix for RHBZ#710921 is in Rawhide kernel package. + +* Fri Jun 10 2011 Marcela Mašláňová - 1:1.11.9-8 +- Perl 5.14 mass rebuild + +* Sun Jun 5 2011 Richard W.M. Jones - 1:1.11.9-7 +- Build against new parted. +- Disable tests on i686 because of RHBZ#710921. +- Remove recipes/ doc directory. This is no longer present because it + was replaced by a guestfs-recipes(1) man page. + +* Sat Jun 4 2011 Richard W.M. Jones - 1:1.11.9-1 +- New upstream version 1.11.9. + +* Wed May 18 2011 Richard W.M. Jones - 1:1.11.8-1 +- New upstream version 1.11.8. +- "zero" command test is fixed now, so we don't need to skip it. + +* Tue May 17 2011 Richard W.M. Jones - 1:1.11.7-3 +- New upstream version 1.11.7. +- Depends on hivex >= 1.2.7. +- Remove upstream patch. +- Skip test of "zero" command (RHBZ#705499). + +* Mon May 9 2011 Richard W.M. Jones - 1:1.11.5-2 +- configure: Use Python platform-dependent site-packages. + +* Mon May 9 2011 Richard W.M. Jones - 1:1.11.5-1 +- New upstream version 1.11.5. +- virt-edit has been rewritten in C, therefore this tool has been moved + into the libguestfs-tools-c package. + +* Sun May 8 2011 Richard W.M. Jones - 1:1.11.4-1 +- New upstream version 1.11.4. + +* Fri Apr 22 2011 Richard W.M. Jones - 1:1.11.3-1 +- New upstream version 1.11.3. + +* Mon Apr 18 2011 Richard W.M. Jones - 1:1.11.2-1 +- New upstream version 1.11.2. +- Fixes Python bindings when used in Python threads. +- Remove upstream patch. + +* Sat Apr 16 2011 Richard W.M. Jones - 1:1.11.1-2 +- New upstream version 1.11.1. +- Add upstream patch so we don't depend on libtool. + +* Fri Apr 15 2011 Richard W.M. Jones - 1:1.11.0-2 +- Bump and rebuild. + +* Tue Apr 12 2011 Richard W.M. Jones - 1:1.11.0-1 +- New upstream development branch 1.11.0. +- New Source URL. +- Remove patches which are now upstream. + +* Sun Apr 10 2011 Richard W.M. Jones - 1:1.9.18-4 +- Include further fixes to virt-resize from upstream. + +* Sat Apr 9 2011 Richard W.M. Jones - 1:1.9.18-2 +- New upstream version 1.9.18. +- Requires ocaml-pcre for new virt-resize. +- Remove libguestfs-test-tool-helper program which is no longer used. +- Include upstream fix for virt-resize build. + +* Wed Apr 6 2011 Richard W.M. Jones - 1:1.9.17-2 +- Remove partially translated Ukrainian manpages. + +* Tue Apr 5 2011 Richard W.M. Jones - 1:1.9.17-1 +- New upstream version 1.9.17. + +* Fri Apr 1 2011 Richard W.M. Jones - 1:1.9.16-1 +- New upstream version 1.9.16. + +* Fri Apr 1 2011 Richard W.M. Jones - 1:1.9.15-1 +- New upstream version 1.9.15. +- Add BR libconfig-devel. +- Add /etc/libguestfs-tools.conf (config file for guestfish, guestmount, + virt-rescue; in future for other tools as well). + +* Mon Mar 28 2011 Richard W.M. Jones - 1:1.9.14-1 +- New upstream version 1.9.14. +- Include 'acl' as BR so virt-rescue gets getfacl and setfacl programs. + +* Mon Mar 28 2011 Richard W.M. Jones - 1:1.9.13-2 +- Include 'attr' as BR (required for getfattr, setfattr programs in + virt-rescue). + +* Thu Mar 24 2011 Richard W.M. Jones - 1:1.9.13-1 +- New upstream version 1.9.13. + +* Fri Mar 18 2011 Richard W.M. Jones - 1:1.9.12-1 +- New upstream version 1.9.12. + +* Wed Mar 16 2011 Richard W.M. Jones - 1:1.9.11-2 +- Add runtime requires on minimum glibc because of newly readable binaries. + +* Tue Mar 15 2011 Richard W.M. Jones - 1:1.9.11-1 +- New upstream version 1.9.11. +- Add generated Ruby documentation (rdoc). + +* Tue Mar 8 2011 Richard W.M. Jones - 1:1.9.10-1 +- New upstream version 1.9.10. +- Remove patches (now upstream). + +* Fri Mar 4 2011 Richard W.M. Jones - 1:1.9.9-2 +- Include upstream patches to fix virt-make-fs with qemu-img 0.14. + +* Fri Mar 4 2011 Richard W.M. Jones - 1:1.9.9-1 +- New upstream version 1.9.9. + +* Tue Feb 08 2011 Fedora Release Engineering - 1:1.9.8-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Sun Feb 6 2011 Richard W.M. Jones - 1:1.9.8-1 +- New upstream version 1.9.8. + +* Sun Feb 6 2011 Richard W.M. Jones - 1:1.9.7-7 +- Rebuild against rpm-4.9.0-0.beta1.6.fc15 to fix OCaml deps. See discussion: + http://lists.fedoraproject.org/pipermail/devel/2011-February/148398.html + +* Wed Feb 2 2011 Richard W.M. Jones - 1:1.9.7-6 +- Add temporary non-upstream patch to fix /etc/mtab. + See: https://www.redhat.com/archives/libguestfs/2011-February/msg00006.html +- Add fix for regressions/rhbz557655.sh so it works when tracing is enabled. +- Add guestfs-perl(3) man page. + +* Tue Feb 1 2011 Richard W.M. Jones - 1:1.9.7-3 +- Enable trace in 'make check' section. + +* Sun Jan 30 2011 Richard W.M. Jones - 1:1.9.7-1 +- New upstream version 1.9.7. + +* Wed Jan 26 2011 Richard W.M. Jones - 1:1.9.6-2 +- Bump and rebuild. + +* Sat Jan 22 2011 Richard W.M. Jones - 1:1.9.6-1 +- New upstream version 1.9.6. + +* Tue Jan 18 2011 Richard W.M. Jones - 1:1.9.5-1 +- New upstream version 1.9.5. + +* Sat Jan 15 2011 Richard W.M. Jones - 1:1.9.4-1 +- New upstream version 1.9.4. + +* Fri Jan 14 2011 Richard W.M. Jones - 1:1.9.3-2 +- Only runtime require febootstrap-supermin-helper (not whole of + febootstrap). + +* Tue Jan 11 2011 Richard W.M. Jones - 1:1.9.3-1 +- New upstream version 1.9.3. + +* Wed Jan 05 2011 Richard W.M. Jones - 1:1.9.2-2 +- Bump and rebuild. + +* Mon Jan 3 2011 Richard W.M. Jones - 1:1.9.2-1 +- New upstream version 1.9.2. +- New tools: virt-copy-in, virt-copy-out, virt-tar-in, virt-tar-out. + These are just shell script wrappers around guestfish so they are + included in the guestfish package. + +* Fri Dec 31 2010 Richard W.M. Jones - 1:1.9.1-1 +- New upstream version 1.9.1. + +* Tue Dec 21 2010 Richard W.M. Jones - 1:1.9.0-2 +- Bump and rebuild. + +* Sun Dec 19 2010 Richard W.M. Jones - 1:1.9.0-1 +- New upstream development branch 1.9.0. +- Include ROADMAP in devel package. + +* Thu Dec 16 2010 Richard Jones - 1:1.7.24-1 +- New upstream version 1.7.24. +- Adds getxattr/lgetxattr APIs to support guestfs-browser. + +* Sat Dec 11 2010 Richard Jones - 1:1.7.23-1 +- New upstream version 1.7.23. + +* Sat Dec 11 2010 Richard Jones - 1:1.7.22-1 +- New upstream version 1.7.22. +- Depend on febootstrap 3.3 which fixes the checksum stability problem. + +* Fri Dec 10 2010 Richard Jones - 1:1.7.21-1 +- New upstream version 1.7.21. + +* Tue Dec 7 2010 Richard Jones - 1:1.7.20-1 +- New upstream version 1.7.20. +- Remove patches which are upstream. + +* Tue Dec 7 2010 Richard Jones - 1:1.7.19-15 +- Rebuild appliance with febootstrap 3.1-5 because we accidentally + reopened RHBZ#654638. + +* Mon Dec 6 2010 Richard Jones - 1:1.7.19-14 +- Rebuild appliance properly using febootstrap 3.1 and alternate yum repo. + +* Sun Dec 5 2010 Richard Jones - 1:1.7.19-1 +- New upstream development version 1.7.19. +- Appliance building in this version has been substantially rewritten + and this requires febootstrap >= 3.0 to build. +- createrepo no longer required. +- Supermin appliance is the default. + +* Wed Dec 1 2010 Richard Jones - 1:1.7.18-1 +- New upstream development version 1.7.18. + +* Tue Nov 30 2010 Richard Jones - 1:1.7.17-1 +- New upstream development version 1.7.17. + +* Fri Nov 26 2010 Richard Jones - 1:1.7.16-1 +- New upstream development version 1.7.16. +- guestfish no longer requires pod2text, hence no longer requires perl. +- Require febootstrap >= 2.11. + +* Fri Nov 26 2010 Richard Jones - 1:1.7.15-2 +- New upstream development version 1.7.15. +- Split out new libguestfs-tools-c package from libguestfs-tools. + . This is so that the -tools-c package can be pulled in by people + wanting to avoid a dependency on Perl, while -tools pulls in everything + as before. + . The C tools currently are: cat, df, filesystems, fish, inspector, ls, + mount, rescue. + . guestfish still requires pod2text which requires perl. This will be + rectified in the next release. + . libguestfs-tools no longer pulls in guestfish. +- guestfish also depends on: less, man, vi +- Add BR db4-utils (although since RPM needs it, it not really necessary). +- Runtime requires on db4-utils should be on core lib, not tools package. +- Change all "Requires: perl-Foo" to "Requires: perl(Foo)". + +* Thu Nov 25 2010 Richard Jones - 1:1.7.14-1 +- New upstream development version 1.7.14. + +* Wed Nov 24 2010 Richard Jones - 1:1.7.13-3 +- New upstream development version 1.7.13. +- New manual pages containing example code. +- Ship examples for C, OCaml, Ruby, Python. +- Don't ship HTML versions of man pages. +- Rebase no-fuse-test patch to latest version. + +* Tue Nov 23 2010 Richard Jones - 1:1.7.12-1 +- New upstream development version 1.7.12. +- New tool: virt-filesystems. virt-list-filesystems and virt-list-partitions + are deprecated, but still included in the package. + +* Wed Nov 17 2010 Richard Jones - 1:1.7.11-1 +- New upstream development version 1.7.11. +- Fix Source0 URL which had pointed to the 1.5 directory. +- virt-inspector is not a dependency of guestmount. + +* Wed Nov 17 2010 Richard Jones - 1:1.7.10-1 +- New upstream development version 1.7.10. + +* Tue Nov 16 2010 Richard Jones - 1:1.7.9-1 +- New upstream development version 1.7.9. + +* Mon Nov 15 2010 Richard Jones - 1:1.7.8-1 +- New upstream development version 1.7.8. +- Add Obsoletes so perl-Sys-Guestfs overrides perl-libguestfs (RHBZ#652587). + +* Mon Nov 15 2010 Richard Jones - 1:1.7.7-1 +- New upstream development version 1.7.7. +- Rename perl-libguestfs as perl-Sys-Guestfs (RHBZ#652587). + +* Sat Nov 13 2010 Richard Jones - 1:1.7.6-1 +- New upstream development version 1.7.6. + +* Sat Nov 13 2010 Richard Jones - 1:1.7.5-2 +- New upstream development version 1.7.5. +- Remove hand-installation of Ruby bindings. +- Remove upstream patch. + +* Thu Nov 11 2010 Richard Jones - 1:1.7.4-2 +- New upstream development version 1.7.4. +- ocaml-xml-light is no longer required. +- Remove guestfs-actions.h and guestfs-structs.h. Libguestfs now + only exports a single header file. +- Add patch to fix broken Perl test. +- Remove workaround for RHBZ#563103. + +* Mon Nov 8 2010 Richard Jones - 1:1.7.3-1 +- New upstream development version 1.7.3. +- Add AUTHORS file from tarball. + +* Fri Nov 5 2010 Richard Jones - 1:1.7.2-1 +- New upstream development version 1.7.2. +- Add requires ruby to ruby-libguestfs package. + +* Wed Nov 3 2010 Richard Jones - 1:1.7.1-1 +- New upstream development version 1.7.1. +- Add BR gperf. + +* Tue Nov 2 2010 Richard Jones - 1:1.7.0-1 +- New upstream development branch and version 1.7.0. + +* Fri Oct 29 2010 Richard Jones - 1:1.5.26-1 +- New upstream development version 1.5.26. + +* Thu Oct 28 2010 Richard Jones - 1:1.5.25-1 +- New upstream development version 1.5.25. +- Rewritten virt-inspector. +- Requires febootstrap >= 2.10. +- New virt-inspector requires db_dump program. + +* Wed Oct 27 2010 Richard Jones - 1:1.5.24-2 +- Attempt to run tests. + +* Wed Oct 27 2010 Richard Jones - 1:1.5.24-1 +- New upstream development version 1.5.24. + +* Sat Oct 23 2010 Richard Jones - 1:1.5.23-1 +- Fix for libguestfs: missing disk format specifier when adding a disk + (RHBZ#642934, CVE-2010-3851). + +* Tue Oct 19 2010 Richard Jones - 1:1.5.22-1 +- New upstream development version 1.5.22. + +* Sat Oct 9 2010 Richard Jones - 1:1.5.21-2 +- guestfish no longer requires virt-inspector. + +* Fri Oct 1 2010 Richard Jones - 1:1.5.21-1 +- New upstream development version 1.5.21. + +* Sun Sep 26 2010 Richard Jones - 1:1.5.20-1 +- New upstream development version 1.5.20. + +* Wed Sep 22 2010 Richard Jones - 1:1.5.18-1 +- New upstream development version 1.5.18. +- Note that guestfish '-a' and '-d' options were broken in 1.5.17, so + upgrading to this version is highly recommended. + +* Tue Sep 21 2010 Richard Jones - 1:1.5.17-1 +- New upstream development version 1.5.17. + +* Wed Sep 15 2010 Richard Jones - 1:1.5.16-1 +- New upstream development version 1.5.16. + +* Wed Sep 15 2010 Richard Jones - 1:1.5.15-1 +- New upstream development version 1.5.15. + +* Tue Sep 14 2010 Richard Jones - 1:1.5.14-1 +- New upstream development version 1.5.14. + +* Mon Sep 13 2010 Richard Jones - 1:1.5.13-1 +- New upstream version 1.5.13. +- Removed the patch workaround for RHBZ#630583. The same workaround + is now upstream (the bug is not fixed). + +* Sat Sep 11 2010 Richard Jones - 1:1.5.12-1 +- New upstream version 1.5.12. + +* Fri Sep 10 2010 Richard Jones - 1:1.5.11-1 +- New upstream version 1.5.11. +- Note: fixes a serious bug in guestfish 'copy-out' command. + +* Thu Sep 9 2010 Richard Jones - 1:1.5.10-1 +- New upstream version 1.5.10. + +* Wed Sep 8 2010 Richard Jones - 1:1.5.9-2 +- Disable tests, still failing because of RHBZ#630777. + +* Wed Sep 8 2010 Richard Jones - 1:1.5.9-1 +- New upstream version 1.5.9. + +* Mon Sep 6 2010 Richard Jones - 1:1.5.8-2 +- Add patch to work around RHBZ#630583 and reenable tests. + +* Sat Sep 4 2010 Richard Jones - 1:1.5.8-1 +- New upstream version 1.5.8. +- Add BR po4a for translations of man pages. +- Add PHP bindings. +- Remove partially-translated Japanese webpages. + +* Wed Sep 1 2010 Richard Jones - 1:1.5.7-1 +- New upstream version 1.5.7. +- 'debug' command is enabled by default now. + +* Fri Aug 27 2010 Richard Jones - 1:1.5.6-1 +- New upstream version 1.5.6. + +* Fri Aug 27 2010 Richard Jones - 1:1.5.5-2 +- Use bug-fixed febootstrap 2.9. + +* Thu Aug 26 2010 Richard Jones - 1:1.5.5-1 +- New upstream version 1.5.5. + +* Tue Aug 24 2010 Richard Jones - 1:1.5.4-2 +- Disable tests again, because the Rawhide kernel still won't boot. + +* Tue Aug 24 2010 Richard Jones - 1:1.5.4-1 +- New upstream development version 1.5.4. +- Now requires febootstrap >= 2.8 and qemu >= 0.12. +- Re-enable tests because RHBZ#624854 is supposed to be fixed. +- Upstream Source URL has changed. + +* Wed Aug 18 2010 Richard Jones - 1:1.5.3-2 +- Disable tests because of RHBZ#624854. + +* Tue Aug 17 2010 Richard Jones - 1:1.5.3-1 +- New upstream development version 1.5.3. + +* Wed Aug 11 2010 Richard Jones - 1:1.5.2-6 +- Bump and rebuild. + +* Thu Aug 05 2010 Richard Jones - 1:1.5.2-5 +- Bump and rebuild. + +* Fri Jul 23 2010 David Malcolm - 1:1.5.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild + +* Fri Jul 23 2010 David Malcolm - 1:1.5.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild + +* Thu Jul 22 2010 Richard W.M. Jones - 1:1.5.2-2 +- New upstream development version 1.5.2. +- +BuildRequires: cryptsetup-luks. + +* Wed Jul 21 2010 Richard W.M. Jones - 1:1.5.1-1 +- New upstream development version 1.5.1. + +* Tue Jul 20 2010 Richard W.M. Jones - 1:1.5.0-7 +- Requires binutils (RHBZ#616437). + +* Mon Jul 19 2010 Richard W.M. Jones - 1:1.5.0-6 +- Fix libguestfs-find-requires.sh for new location of hostfiles (RHBZ#615946). + +* Thu Jul 8 2010 Richard W.M. Jones - 1:1.5.0-5 +- Include RELEASE-NOTES in devel package. + +* Thu Jul 8 2010 Richard W.M. Jones - 1:1.5.0-4 +- New development branch 1.5.0. +- Remove two upstream patches. +- Work around permanently broken test-getlogin_r Gnulib test. + +* Mon Jun 28 2010 Richard W.M. Jones - 1:1.3.21-4 +- Explicitly depend on e2fsprogs. +- Add patch to add e2fsprogs to the appliance. +- Add patch to fix GFS kernel module problem. + +* Fri Jun 25 2010 Mamoru Tasaka - 1:1.3.21-2 +- Rebuild + +* Wed Jun 16 2010 Richard W.M. Jones - 1:1.3.21-1 +- New upstream version 1.3.21. + +* Tue Jun 8 2010 Richard W.M. Jones - 1:1.3.20-1 +- New upstream version 1.3.20. +- Since upstream commit a043b6854a0c4 we don't need to run make install + twice. + +* Fri Jun 4 2010 Richard W.M. Jones - 1:1.3.19-1 +- New upstream version 1.3.19. + +* Wed Jun 2 2010 Richard W.M. Jones - 1:1.3.18-1 +- New upstream version 1.3.18. + +* Thu May 27 2010 Richard W.M. Jones - 1:1.3.17-1 +- New upstream version 1.3.17. +- Change repo name to 'fedora-14'. + +* Wed May 26 2010 Richard W.M. Jones - 1:1.3.16-6 +- Co-own bash_completion.d directory. + +* Tue May 25 2010 Richard W.M. Jones - 1:1.3.16-4 +- New upstream version 1.3.16. +- Add guestfish bash tab completion script. + +* Mon May 24 2010 Richard W.M. Jones - 1:1.3.14-1 +- New upstream version 1.3.14. + +* Sun May 16 2010 Richard W.M. Jones - 1:1.3.13-1 +- New upstream version 1.3.13. +- Add BUGS to documentation. +- Force update of hivex dependency to 1.2.2 since it contains + important registry import fixes. +- Remove patch1, now upstream. + +* Fri May 14 2010 Richard W.M. Jones - 1:1.3.12-3 +- Backport supermin build fix from upstream. +- Further changes required for new layout of supermin appliance. + +* Fri May 14 2010 Richard W.M. Jones - 1:1.3.12-1 +- New upstream version 1.3.12. +- febootstrap >= 2.7 is required at compile time and at runtime (at runtime + because of the new febootstrap-supermin-helper). +- Bugs fixed: 591155 591250 576879 591142 588651 507810 521674 559963 516096. + +* Sat May 8 2010 Richard W.M. Jones - 1:1.3.11-1 +- New upstream version 1.3.11. + +* Fri May 7 2010 Richard W.M. Jones - 1:1.3.10-2 +- New upstream version 1.3.10. + +* Thu May 06 2010 Richard W.M. Jones - 1:1.3.9-2 +- Bump and rebuild against updated libconfig + +* Fri Apr 30 2010 Richard W.M. Jones - 1:1.3.9-1 +- New upstream version 1.3.9. + +* Thu Apr 29 2010 Marcela Maslanova - 1:1.3.8-2 +- Mass rebuild with perl-5.12.0 + +* Tue Apr 27 2010 Richard W.M. Jones - 1:1.3.8-1 +- New upstream version 1.3.8. + +* Fri Apr 23 2010 Richard W.M. Jones - 1:1.3.7-1 +- New upstream version 1.3.7. +- NOTE: fixes a segfault in guestfish 1.3.6 when using the -a option. + +* Thu Apr 22 2010 Richard W.M. Jones - 1:1.3.6-1 +- New upstream version 1.3.6. + +* Mon Apr 19 2010 Richard W.M. Jones - 1:1.3.5-1 +- New upstream version 1.3.5. + +* Sat Apr 17 2010 Richard W.M. Jones - 1:1.3.4-1 +- New upstream version 1.3.4. + +* Sun Apr 11 2010 Richard W.M. Jones - 1:1.3.3-1 +- New upstream version 1.3.3. +- New virt-resize option --LV-expand. +- New API: lvresize-free. +- Fixes RHBZ#581501. + +* Sun Apr 11 2010 Richard W.M. Jones - 1:1.3.2-3 +- Disable checksum-device test. + +* Sat Apr 10 2010 Richard W.M. Jones - 1:1.3.2-2 +- Bump and rebuild. + +* Sat Apr 10 2010 Richard W.M. Jones - 1:1.3.2-1 +- New upstream version 1.3.2. +- New APIs: checksum-device, part-del, part-get-bootable, part-get-mbr-id, + part-set-mbr-id, vgscan, ntfsresize, txz-in, txz-out. +- Enhanced/fixed virt-resize tool. +- Enhanced virt-list-partitions tool. +- Fixes: 580016, 580650, 579155, 580556. + +* Sat Apr 10 2010 Richard W.M. Jones - 1:1.3.1-4 +- Bump and rebuild. + +* Thu Apr 8 2010 Richard W.M. Jones - 1:1.3.1-3 +- Runtime requires should only be on libguestfs-tools subpackage. + +* Thu Apr 8 2010 Richard W.M. Jones - 1:1.3.1-2 +- Missing BR on qemu-img package. + +* Thu Apr 8 2010 Richard W.M. Jones - 1:1.3.1-1 +- New upstream version 1.3.1. +- For explanation of apparently large version jump, see: + https://www.redhat.com/archives/libguestfs/2010-April/msg00057.html +- New tool: virt-make-fs. +- New API: guestfs_zero_device. +- Fixes RHBZ#580246 (tar-in command hangs if uploading more than + available space) +- Fixes RHBZ#579664 (guestfish doesn't report error when there is not + enough space for image allocation) +- +BR perl-String-ShellQuote (for virt-make-fs). + +* Tue Mar 30 2010 Richard W.M. Jones - 1:1.0.89-1 +- New upstream version 1.0.89. +- Improved version of virt-win-reg. +- Many smaller bugfixes. +- Requires hivex >= 1.2.1. +- Remove TERM=dumb patch which is now upstream. + +* Tue Mar 30 2010 Richard W.M. Jones - 1:1.0.88-7 +- Backport of TERM=dumb patch from upstream. +- Workaround failure caused by RHBZ#575734. +- Workaround unknown failure of test_swapon_label_0. + +* Tue Mar 30 2010 Richard W.M. Jones - 1:1.0.88-5 +- Attempted workaround for RHBZ#563103, so we can reenable tests. + +* Fri Mar 26 2010 Richard W.M. Jones - 1:1.0.88-2 +- Remember to check in the new sources. + +* Fri Mar 26 2010 Richard W.M. Jones - 1:1.0.88-1 +- New upstream version 1.0.88. +- Mainly small bugfixes. +- Update Spanish translation of libguestfs (RHBZ#576876). +- Use ext4 dev tools on RHEL 5 (RHBZ#576688). +- Add support for minix filesystem (RHBZ#576689). + +* Fri Mar 26 2010 Richard W.M. Jones - 1:1.0.87-2 +- Add vim-minimal to BR, it is now required by the appliance. + +* Tue Mar 23 2010 Richard W.M. Jones - 1:1.0.87-1 +- New upstream version 1.0.87. +- New tools: virt-resize and virt-list-partitions. +- New APIs: guestfs_copy_size; APIs for querying the relationship between + LVM objects. +- Add vim to the virt-rescue appliance. + +* Fri Mar 12 2010 Richard W.M. Jones - 1:1.0.86-1 +- New upstream version 1.0.86. +- libguestfs-supermin-helper rewritten in C (from shell), reduces + appliance boot time by 2-3 seconds. +- Fix parsing of integers in guestfish on 32 bit platforms (RHBZ#569757 + and RHBZ#567567). +- Enhance virt-inspector output for Windows guests. +- Add product_name field to virt-inspector output for all guests. +- Weaken dependencies on libntfs-3g.so, don't include SONAME in dep. +- Remove false dependency on libply (plymouth libraries). +- Spanish translation (RHBZ#570181). +- Fix bash regexp quoting bug. + +* Fri Mar 12 2010 Richard W.M. Jones - 1:1.0.85-4 +- Bump and rebuild. + +* Thu Mar 11 2010 Richard W.M. Jones - 1:1.0.85-3 +- Bump and rebuild. + +* Sat Mar 06 2010 Richard W.M. Jones - 1:1.0.85-2 +- Bump and rebuild. + +* Mon Mar 1 2010 Richard W.M. Jones - 1:1.0.85-1 +- New upstream version 1.0.85. +- Remove hivex, now a separate upstream project and package. +- Remove supermin quoting patch, now upstream. + +* Mon Mar 1 2010 Richard W.M. Jones - 1:1.0.84-6 +- Fix quoting in supermin-split script (RHBZ#566511). +- Don't include bogus './builddir' entries in supermin hostfiles + (RHBZ#566512). + +* Mon Feb 22 2010 Richard W.M. Jones - 1:1.0.84-4 +- Don't include generator.ml in rpm. It's 400K and almost no one will need it. +- Add comments to spec file about how repo building works. +- Whitespace changes in the spec file. + +* Mon Feb 22 2010 Richard W.M. Jones - 1:1.0.84-3 +- Bump and rebuild. + +* Tue Feb 16 2010 Richard W.M. Jones - 1:1.0.84-2 +- Bump and rebuild. + +* Fri Feb 12 2010 Richard W.M. Jones - 1:1.0.84-1 +- New upstream version 1.0.84. + +* Fri Feb 12 2010 Richard W.M. Jones - 1:1.0.83-8 +- Bump and rebuild. + +* Thu Feb 11 2010 Richard W.M. Jones - 1.0.83-7 +- Disable tests. These fail in Koji (on RHEL 5 kernel) because of a + bug in preadv/pwritev emulation in glibc (RHBZ#563103). + +* Tue Feb 9 2010 Matthew Booth - 1.0.83-6 +- Change buildnonet to buildnet +- Allow buildnet, mirror, updates, virtio and runtests to be configured by user + macros. + +* Mon Feb 8 2010 Richard W.M. Jones - 1.0.83-5 +- libguestfs-tools should require perl-XML-Writer (RHBZ#562858). + +* Mon Feb 8 2010 Richard W.M. Jones - 1.0.83-4 +- Use virtio for block device access (RHBZ#509383 is fixed). + +* Fri Feb 5 2010 Richard W.M. Jones - 1.0.83-3 +- Rebuild: possible timing-related build problem in Koji. + +* Fri Feb 5 2010 Richard W.M. Jones - 1.0.83-2 +- New upstream release 1.0.83. +- This release fixes: + Add Marathi translations (RHBZ#561671). + Polish translations (RHBZ#502533). + Add Gujarti translations (Sweta Kothari) (RHBZ#560918). + Update Oriya translations (thanks Manoj Kumar Giri) (RHBZ#559498). + Set locale in C programs so l10n works (RHBZ#559962). + Add Tamil translation (RHBZ#559877) (thanks to I.Felix) + Update Punjabi translation (RHBZ#559480) (thanks Jaswinder Singh) +- There are significant fixes to hive file handling. +- Add hivexsh and manual page. +- Remove two patches, now upstream. + +* Sun Jan 31 2010 Richard W.M. Jones - 1:1.0.82-7 +- Bump and rebuild. + +* Fri Jan 29 2010 Richard W.M. Jones - 1.0.82-6 +- Backport a better fix for RHBZ557655 test from upstream. +- Backport fix for unreadable yum.log from upstream. + +* Thu Jan 28 2010 Richard W.M. Jones - 1.0.82-3 +- Backport RHBZ557655 test fix from upstream. + +* Thu Jan 28 2010 Richard W.M. Jones - 1.0.82-1 +- New upstream version 1.0.82. This includes the two patches + we were carrying, so those are now removed. +- This release fixes: + RHBZ#559498 (Oriya translation). + RHBZ#559480 (Punjabi translation). + RHBZ#558593 (Should prevent corruption by multilib). + RHBZ#559237 (Telugu translation). + RHBZ#557655 (Use xstrtol/xstrtoll to parse integers in guestfish). + RHBZ#557195 (Missing crc kernel modules for recent Linux). +- In addition this contains numerous fixes to the hivex library + for parsing Windows Registry files, making hivex* and virt-win-reg + more robust. +- New API call 'filesize'. + +* Thu Jan 28 2010 Richard W.M. Jones - 1.0.81-8 +- Backport special handling of libgcc_s.so. +- Backport unreadable files patch from RHEL 6 / upstream. + +* Fri Jan 22 2010 Richard W.M. Jones - 1.0.81-5 +- Require febootstrap >= 2.6 (RHBZ#557262). + +* Thu Jan 21 2010 Richard W.M. Jones - 1.0.81-4 +- Rebuild for unannounced soname bump (libntfs-3g.so). + +* Fri Jan 15 2010 Richard W.M. Jones - 1.0.81-3 +- Rebuild for unannounced soname bump (libplybootsplash.so). + +* Thu Jan 14 2010 Richard W.M. Jones - 1.0.81-2 +- Rebuild for broken dependency (iptables soname bump). + +* Wed Jan 13 2010 Richard W.M. Jones - 1.0.81-1 +- New upstream version 1.0.81. +- Remove two upstream patches. +- virt-inspector: Make RPM application data more specific (RHBZ#552718). + +* Tue Jan 12 2010 Richard W.M. Jones - 1.0.80-14 +- Reenable tests because RHBZ#553689 is fixed. + +* Tue Jan 12 2010 Richard W.M. Jones - 1.0.80-13 +- Rebuild because of libparted soname bump (1.9 -> 2.1). + +* Fri Jan 8 2010 Richard W.M. Jones - 1.0.80-12 +- qemu in Rawhide is totally broken (RHBZ#553689). Disable tests. + +* Thu Jan 7 2010 Richard W.M. Jones - 1.0.80-11 +- Remove gfs-utils (deprecated and removed from Fedora 13 by the + upstream Cluster Suite developers). +- Include patch to fix regression in qemu -serial stdio option. + +* Tue Dec 29 2009 Richard W.M. Jones - 1.0.80-10 +- Remove some debugging statements which were left in the requires + script by accident. + +* Mon Dec 21 2009 Richard W.M. Jones - 1.0.80-9 +- Generate additional requires for supermin (RHBZ#547496). + +* Fri Dec 18 2009 Richard W.M. Jones - 1.0.80-3 +- Work around udevsettle command problem (RHBZ#548121). +- Enable tests. + +* Wed Dec 16 2009 Richard W.M. Jones - 1.0.80-2 +- Disable tests because of RHBZ#548121. + +* Wed Dec 16 2009 Richard W.M. Jones - 1.0.80-1 +- New upstream release 1.0.80. +- New Polish translations (RHBZ#502533). +- Give a meaningful error if no usable kernels are found (RHBZ#539746). +- New tool: virt-list-filesystems + +* Fri Dec 4 2009 Stepan Kasal - 1:1.0.79-3 +- rebuild against perl 5.10.1 + +* Wed Nov 18 2009 Richard W.M. Jones - 1.0.79-2 +- New upstream release 1.0.79. +- Adds FUSE test script and multiple fixes for FUSE (RHBZ#538069). +- Fix virt-df in Xen (RHBZ#538041). +- Improve speed of supermin appliance. +- Disable FUSE-related tests because Koji doesn't currently allow them. + fuse: device not found, try 'modprobe fuse' first + +* Tue Nov 10 2009 Richard W.M. Jones - 1.0.78-2 +- New upstream release 1.0.78. +- Many more filesystem types supported by this release - add them + as dependencies. + +* Tue Nov 3 2009 Richard W.M. Jones - 1.0.77-1 +- New upstream release 1.0.77. +- Support for mounting guest in host using FUSE (guestmount command). +- hivex*(1) man pages should be in main package, not -devel, since + they are user commands. +- libguestfs-tools: Fix "self-obsoletion" issue raised by rpmlint. +- perl: Remove bogus script Sys/bindtests.pl. + +* Thu Oct 29 2009 Richard W.M. Jones - 1.0.75-2 +- New upstream release 1.0.75. +- New library: libhivex. +- New tools: virt-win-reg, hivexml, hivexget. +- Don't require chntpw. +- Add BR libxml2-devel, accidentally omitted before. + +* Tue Oct 20 2009 Richard W.M. Jones - 1.0.74-1 +- New upstream release 1.0.74. +- New API call: guestfs_find0. +- New tools: virt-ls, virt-tar. + +* Wed Oct 14 2009 Richard W.M. Jones - 1.0.73-1 +- New upstream release 1.0.73. +- OCaml library now depends on xml-light. +- Deal with installed documentation. + +* Tue Sep 29 2009 Richard W.M. Jones - 1.0.72-2 +- Force rebuild. + +* Wed Sep 23 2009 Richard W.M. Jones - 1.0.72-1 +- New upstream release 1.0.72. +- New tools: virt-edit, virt-rescue. +- Combine virt-cat, virt-df, virt-edit, virt-inspector and virt-rescue + into a single package called libguestfs-tools. + +* Tue Sep 22 2009 Richard W.M. Jones - 1.0.71-2 +- New upstream release 1.0.71. + +* Fri Sep 18 2009 Richard W.M. Jones - 1.0.70-2 +- Perl bindings require perl-XML-XPath (fixed RHBZ#523547). + +* Tue Sep 15 2009 Richard W.M. Jones - 1.0.70-1 +- New upstream release 1.0.70. +- Fixes build problem related to old version of GNU gettext. + +* Tue Sep 15 2009 Richard W.M. Jones - 1.0.69-1 +- New upstream release 1.0.69. +- Reenable the tests (because RHBZ#516543 is supposed to be fixed). +- New main loop code should fix RHBZ#501888, RHBZ#504418. +- Add waitpid along guestfs_close path (fixes RHBZ#518747). + +* Wed Aug 19 2009 Richard W.M. Jones - 1.0.68-2 +- New upstream release 1.0.68. +- BR genisoimage. + +* Thu Aug 13 2009 Richard W.M. Jones - 1.0.67-2 +- New upstream release 1.0.67. + +* Fri Aug 7 2009 Richard W.M. Jones - 1.0.66-5 +- Set network interface to ne2k_pci (workaround for RHBZ#516022). +- Rerun autoconf because patch touches configure script. + +* Thu Aug 6 2009 Richard W.M. Jones - 1.0.66-1 +- New upstream release 1.0.66. + +* Wed Jul 29 2009 Richard W.M. Jones - 1.0.65-1 +- New upstream release 1.0.65. +- Add Obsoletes for virt-df2 (RHBZ#514309). +- Disable tests because of ongoing TCG problems with newest qemu in Rawhide. + +* Thu Jul 23 2009 Richard W.M. Jones - 1.0.64-3 +- RHBZ#513249 bug in qemu is now fixed, so try to rebuild and run tests. +- However RHBZ#503236 still prevents us from testing on i386. + +* Thu Jul 23 2009 Richard W.M. Jones - 1.0.64-1 +- New upstream release 1.0.64. +- New tool 'libguestfs-test-tool'. + +* Wed Jul 15 2009 Richard W.M. Jones - 1.0.61-1 +- New upstream release 1.0.61. +- New tool / subpackage 'virt-cat'. +- New BR perl-libintl. + +* Wed Jul 15 2009 Richard W.M. Jones - 1.0.60-2 +- Fix runtime Requires so they use epoch correctly. + +* Tue Jul 14 2009 Richard W.M. Jones - 1.0.60-1 +- New upstream release 1.0.60. + +* Fri Jul 10 2009 Richard W.M. Jones - 1.0.58-2 +- New upstream release 1.0.58. + +* Fri Jul 10 2009 Richard W.M. Jones - 1.0.57-1 +- New upstream release 1.0.57. +- New tool virt-df (obsoletes existing package with this name). +- RHBZ#507066 may be fixed, so reenable tests. + +* Tue Jul 7 2009 Richard W.M. Jones - 1.0.56-2 +- New upstream release 1.0.56. +- Don't rerun generator. + +* Thu Jul 2 2009 Richard W.M. Jones - 1.0.55-1 +- New upstream release 1.0.55. +- New manual page libguestfs(3). + +* Mon Jun 29 2009 Richard W.M. Jones - 1.0.54-2 +- New upstream release 1.0.54. +- +BR perl-XML-Writer. + +* Wed Jun 24 2009 Richard W.M. Jones - 1.0.53-1 +- New upstream release 1.0.53. +- Disable all tests (because of RHBZ#507066). + +* Wed Jun 24 2009 Richard W.M. Jones - 1.0.52-1 +- New upstream release 1.0.52. + +* Mon Jun 22 2009 Richard W.M. Jones - 1.0.51-1 +- New upstream release 1.0.51. +- Removed patches which are now upstream. + +* Sat Jun 20 2009 Richard W.M. Jones - 1.0.49-5 +- Remove workaround for RHBZ#507007, since bug is now fixed. +- Pull in upstream patch to fix pclose checking + (testing as possible fix for RHBZ#507066). +- Pull in upstream patch to check waitpid return values + (testing as possible fix for RHBZ#507066). + +* Fri Jun 19 2009 Richard W.M. Jones - 1.0.49-2 +- New upstream release 1.0.49. +- Add workaround for RHBZ#507007. + +* Tue Jun 16 2009 Richard W.M. Jones - 1.0.48-2 +- Accidentally omitted the supermin image from previous version. + +* Tue Jun 16 2009 Richard W.M. Jones - 1.0.48-1 +- New upstream release 1.0.48. +- Should fix all the brokenness from 1.0.47. +- Requires febootstrap >= 2.3. + +* Mon Jun 15 2009 Richard W.M. Jones - 1.0.47-2 +- New upstream release 1.0.47. +- Enable experimental supermin appliance build. +- Fix path to appliance. + +* Fri Jun 12 2009 Richard W.M. Jones - 1.0.45-2 +- New upstream release 1.0.45. + +* Wed Jun 10 2009 Richard W.M. Jones - 1.0.44-2 +- Disable ppc/ppc64 tests again because of RHBZ#505109. + +* Wed Jun 10 2009 Richard W.M. Jones - 1.0.44-1 +- New upstream version 1.0.44. +- Try enabling tests on ppc & ppc64 since it looks like the bug(s?) + in qemu which might have caused them to fail have been fixed. + +* Tue Jun 9 2009 Richard W.M. Jones - 1.0.43-1 +- New upstream version 1.0.43. +- New upstream URL. +- Requires chntpw program. + +* Sat Jun 6 2009 Richard W.M. Jones - 1.0.42-1 +- New upstream version 1.0.42. + +* Thu Jun 4 2009 Richard W.M. Jones - 1.0.41-1 +- New upstream version 1.0.41. +- Fixes a number of regressions in RHBZ#503169. + +* Thu Jun 4 2009 Richard W.M. Jones - 1.0.40-1 +- New upstream version 1.0.40. + +* Thu Jun 4 2009 Richard W.M. Jones - 1.0.39-1 +- New upstream version 1.0.39. +- Fixes: + . libguestfs /dev is too sparse for kernel installation/upgrade (RHBZ#503169) + . OCaml bindings build failure (RHBZ#502309) + +* Tue Jun 2 2009 Richard W.M. Jones - 1.0.38-2 +- Disable tests on ix86 because of RHBZ#503236. + +* Tue Jun 2 2009 Richard W.M. Jones - 1.0.38-1 +- New upstream version 1.0.38. + +* Fri May 29 2009 Richard W.M. Jones - 1.0.37-1 +- New upstream version 1.0.37. +- Fixes: + . "mkdir-p" should not throw errors on preexisting directories (RHBZ#503133) + . cramfs and squashfs modules should be available in libguestfs appliances + (RHBZ#503135) + +* Thu May 28 2009 Richard W.M. Jones - 1.0.36-2 +- New upstream version 1.0.36. +- Rerun the generator in prep section. + +* Thu May 28 2009 Richard W.M. Jones - 1.0.35-1 +- New upstream version 1.0.35. +- Fixes multiple bugs in bindings parameters (RHBZ#501892). + +* Wed May 27 2009 Richard W.M. Jones - 1.0.34-1 +- New upstream version 1.0.34. + +* Wed May 27 2009 Richard W.M. Jones - 1.0.33-1 +- New upstream version 1.0.33. +- --with-java-home option is no longer required. +- Upstream contains potential fixes for: + 501878 built-in commands like 'alloc' and 'help' don't autocomplete + 501883 javadoc messed up in libguestfs java documentation + 501885 Doesn't detect missing Java, --with-java-home=no should not be needed + 502533 Polish translation of libguestfs + n/a Allow more ext filesystem kmods (Charles Duffy) + +* Tue May 26 2009 Richard W.M. Jones - 1.0.32-2 +- New upstream version 1.0.32. +- Use %%find_lang macro. + +* Sat May 23 2009 Richard W.M. Jones - 1.0.31-1 +- Rebuild for OCaml 3.11.1. +- New upstream version 1.0.31. + +* Thu May 21 2009 Richard Jones - 1.0.30-1 +- New upstream version 1.0.30. Now includes test-bootbootboot.sh script. + +* Thu May 21 2009 Richard Jones - 1.0.29-3 +- New upstream version 1.0.29 (fixes RHBZ#502007 RHBZ#502018). +- This should allow us to enable tests for i386 and x86-64. +- Added test-bootbootboot.sh script which was missed from 1.0.29 tarball. +- Pass kernel noapic flag to workaround RHBZ#502058. + +* Thu May 21 2009 Richard Jones - 1.0.28-1 +- New upstream version 1.0.28. Nothing has visibly changed, but + the source has been gettextized and we want to check that doesn't + break anything. + +* Thu May 21 2009 Richard Jones - 1.0.27-3 +- Change requirement from qemu -> qemu-kvm (RHBZ#501761). + +* Tue May 19 2009 Richard Jones - 1.0.27-2 +- New upstream version 1.0.27. + +* Mon May 18 2009 Richard Jones - 1.0.26-6 +- Experimentally try to reenable ppc and ppc64 builds. +- Note BZ numbers which are causing tests to fail. + +* Mon May 18 2009 Richard Jones - 1.0.26-1 +- New upstream version 1.0.26. + +* Tue May 12 2009 Richard Jones - 1.0.25-4 +- New upstream version 1.0.25. +- Enable debugging when running the tests. +- Disable tests - don't work correctly in Koji. + +* Tue May 12 2009 Richard Jones - 1.0.24-1 +- New upstream version 1.0.24. +- BRs glibc-static for the new command tests. +- Enable tests. + +* Mon May 11 2009 Richard Jones - 1.0.23-2 +- New upstream version 1.0.23. +- Don't try to use updates during build. + +* Fri May 8 2009 Richard Jones - 1.0.21-3 +- New upstream version 1.0.21. + +* Thu May 7 2009 Richard Jones - 1.0.20-2 +- New upstream version 1.0.20. + +* Thu May 7 2009 Richard Jones - 1.0.19-1 +- New upstream version 1.0.19. + +* Tue Apr 28 2009 Richard Jones - 1.0.15-1 +- New upstream version 1.0.15. + +* Fri Apr 24 2009 Richard Jones - 1.0.12-1 +- New upstream version 1.0.12. + +* Wed Apr 22 2009 Richard Jones - 1.0.6-1 +- New upstream version 1.0.6. + +* Mon Apr 20 2009 Richard Jones - 1.0.2-1 +- New upstream version 1.0.2. + +* Thu Apr 16 2009 Richard Jones - 0.9.9-12 +- Multiple fixes to get it to scratch build in Koji. + +* Sat Apr 4 2009 Richard Jones - 0.9.9-1 +- Initial build.