commit 04fa0855ca7ac455052394c60434f812080894bf Author: CentOS Sources Date: Tue Nov 15 01:33:07 2022 -0500 import virt-v2v-2.0.7-6.el9 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..923c58a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +SOURCES/libguestfs.keyring +SOURCES/virt-v2v-2.0.7.tar.gz diff --git a/.virt-v2v.metadata b/.virt-v2v.metadata new file mode 100644 index 0000000..f059275 --- /dev/null +++ b/.virt-v2v.metadata @@ -0,0 +1,2 @@ +1bbc40f501a7fef9eef2a39b701a71aee2fea7c4 SOURCES/libguestfs.keyring +2d898dc22eca44c9d73d664dc7e901fe437570bc SOURCES/virt-v2v-2.0.7.tar.gz diff --git a/SOURCES/0001-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch b/SOURCES/0001-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch new file mode 100644 index 0000000..89790ba --- /dev/null +++ b/SOURCES/0001-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch @@ -0,0 +1,30 @@ +From d7c0992dfb11982d96cac8e279c454d82787918a Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Sun, 28 Sep 2014 19:14:43 +0100 +Subject: [PATCH] RHEL: v2v: Select correct qemu binary for -o qemu mode + (RHBZ#1147313). + +RHEL 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. +--- + output/output_qemu.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/output/output_qemu.ml b/output/output_qemu.ml +index 3269fba5..7f2e9284 100644 +--- a/output/output_qemu.ml ++++ b/output/output_qemu.ml +@@ -137,7 +137,7 @@ module QEMU = struct + * 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 diff --git a/SOURCES/0002-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch b/SOURCES/0002-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch new file mode 100644 index 0000000..b5ef618 --- /dev/null +++ b/SOURCES/0002-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch @@ -0,0 +1,109 @@ +From 610f53a67a0804ee76e9213c503b7bb00dd722b8 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 30 Sep 2014 10:50:27 +0100 +Subject: [PATCH] RHEL: v2v: Disable the --qemu-boot / -oo qemu-boot option + (RHBZ#1147313). + +This cannot work because there is no Gtk or SDL output mode +in RHEL's qemu-kvm. + +In addition you will have to edit the -display option in the +qemu script. +--- + docs/virt-v2v-output-local.pod | 6 ++---- + docs/virt-v2v.pod | 12 ------------ + output/output_qemu.ml | 3 +++ + v2v/v2v.ml | 2 -- + 4 files changed, 5 insertions(+), 18 deletions(-) + +diff --git a/docs/virt-v2v-output-local.pod b/docs/virt-v2v-output-local.pod +index d2a1c270..0be37f5e 100644 +--- a/docs/virt-v2v-output-local.pod ++++ b/docs/virt-v2v-output-local.pod +@@ -9,7 +9,7 @@ or libvirt + + virt-v2v [-i* options] -o local -os DIRECTORY + +- virt-v2v [-i* options] -o qemu -os DIRECTORY [--qemu-boot] ++ virt-v2v [-i* options] -o qemu -os DIRECTORY + + virt-v2v [-i* options] -o null + +@@ -47,12 +47,10 @@ where C is the guest name. + + =item B<-o qemu -os> C + +-=item B<-o qemu -os> C B<--qemu-boot> +- + This converts the guest to files in C. Unlike I<-o local> + above, a shell script is created which contains the raw qemu command + you would need to boot the guest. However the shell script is not +-run, I you also add the I<--qemu-boot> option. ++run. + + =item B<-o null> + +diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod +index 4e912b6c..7d0bafff 100644 +--- a/docs/virt-v2v.pod ++++ b/docs/virt-v2v.pod +@@ -139,11 +139,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 -oo qemu-boot +- + =head1 OPTIONS + + =over 4 +@@ -487,9 +482,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<-oo qemu-boot> +-option which boots the guest under qemu immediately. +- + =item B<-o> B + + This is the same as I<-o rhv>. +@@ -743,10 +735,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> +- +-This is the same as I<-oo qemu-boot>. +- + =item B<-q> + + =item B<--quiet> +diff --git a/output/output_qemu.ml b/output/output_qemu.ml +index 7f2e9284..527d3c5e 100644 +--- a/output/output_qemu.ml ++++ b/output/output_qemu.ml +@@ -63,6 +63,9 @@ module QEMU = struct + ) options.output_options; + let qemu_boot = !qemu_boot in + ++ if qemu_boot then ++ error (f_"-o qemu: the -oo qemu-boot option cannot be used in RHEL"); ++ + (* -os must be set to a directory. *) + let output_storage = + match options.output_storage with +diff --git a/v2v/v2v.ml b/v2v/v2v.ml +index 9790416e..97b4e4ec 100644 +--- a/v2v/v2v.ml ++++ b/v2v/v2v.ml +@@ -270,8 +270,6 @@ let rec main () = + s_"Same as ‘-ip filename’"; + [ L"print-source" ], Getopt.Set print_source, + s_"Print source and stop"; +- [ L"qemu-boot" ], Getopt.Unit (fun () -> set_output_option_compat "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"), diff --git a/SOURCES/0003-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch b/SOURCES/0003-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch new file mode 100644 index 0000000..11b2476 --- /dev/null +++ b/SOURCES/0003-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch @@ -0,0 +1,31 @@ +From b61fc893f429eb4bec34816d667cc930e50ccd0f Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 24 Apr 2015 09:45:41 -0400 +Subject: [PATCH] RHEL: Fix list of supported sound cards to match RHEL qemu + (RHBZ#1176493). + +--- + lib/utils.ml | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/lib/utils.ml b/lib/utils.ml +index 128bb697..7116a4f9 100644 +--- a/lib/utils.ml ++++ b/lib/utils.ml +@@ -60,13 +60,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 = diff --git a/SOURCES/0004-RHEL-Fixes-for-libguestfs-winsupport.patch b/SOURCES/0004-RHEL-Fixes-for-libguestfs-winsupport.patch new file mode 100644 index 0000000..2540451 --- /dev/null +++ b/SOURCES/0004-RHEL-Fixes-for-libguestfs-winsupport.patch @@ -0,0 +1,101 @@ +From 5d70bf1302ea3f1006d87672676f86eb5d40eb85 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Sun, 30 Aug 2015 03:21:57 -0400 +Subject: [PATCH] RHEL: Fixes for libguestfs-winsupport. + +In tests we cannot use guestfish for arbitrary Windows edits. +In virt-v2v helpers we must set the program name to virt-v2v. +--- + convert/convert.ml | 1 + + convert/windows_virtio.ml | 1 + + test-data/phony-guests/make-windows-img.sh | 1 + + tests/test-v2v-virtio-win-iso.sh | 8 +++++++- + tests/test-v2v-windows-conversion.sh | 8 +++++++- + 5 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/convert/convert.ml b/convert/convert.ml +index 87fca725..5e0e6c2b 100644 +--- a/convert/convert.ml ++++ b/convert/convert.ml +@@ -51,6 +51,7 @@ let rec convert dir options source = + + message (f_"Opening the source"); + let g = open_guestfs ~identifier:"v2v" () in ++ g#set_program "virt-v2v"; + g#set_memsize (g#get_memsize () * 2); + (* Setting the number of vCPUs allows parallel mkinitrd, but make + * sure this is not too large because each vCPU consumes guest RAM. +diff --git a/convert/windows_virtio.ml b/convert/windows_virtio.ml +index a27cd6a5..183166b7 100644 +--- a/convert/windows_virtio.ml ++++ b/convert/windows_virtio.ml +@@ -241,6 +241,7 @@ and copy_from_virtio_win g inspect srcdir destdir filter missing = + let g2 = + try + let g2 = open_guestfs ~identifier:"virtio_win" () in ++ g#set_program "virt-v2v"; + g2#add_drive_opts virtio_win ~readonly:true; + g2#launch (); + g2 +diff --git a/test-data/phony-guests/make-windows-img.sh b/test-data/phony-guests/make-windows-img.sh +index 30908a91..73cf5144 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" +diff --git a/tests/test-v2v-windows-conversion.sh b/tests/test-v2v-windows-conversion.sh +index a4cf191d..1ff41f6a 100755 +--- a/tests/test-v2v-windows-conversion.sh ++++ b/tests/test-v2v-windows-conversion.sh +@@ -76,6 +76,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 diff --git a/SOURCES/0005-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch b/SOURCES/0005-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch new file mode 100644 index 0000000..2be9f81 --- /dev/null +++ b/SOURCES/0005-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch @@ -0,0 +1,23 @@ +From 37e241d6d4f22331b34c2ed0af233c73be2b0869 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 2 Mar 2017 14:21:37 +0100 +Subject: [PATCH] RHEL: v2v: -i disk: force VNC as display (RHBZ#1372671) + +The SDL output mode is not supported in RHEL's qemu-kvm. +--- + input/input_disk.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/input/input_disk.ml b/input/input_disk.ml +index 508adf9d..20f2e898 100644 +--- a/input/input_disk.ml ++++ b/input/input_disk.ml +@@ -76,7 +76,7 @@ module Disk = struct + 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_sound = None; + s_disks = s_disks; diff --git a/SOURCES/0006-RHEL-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-1430203.patch b/SOURCES/0006-RHEL-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-1430203.patch new file mode 100644 index 0000000..95dfe7c --- /dev/null +++ b/SOURCES/0006-RHEL-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-1430203.patch @@ -0,0 +1,23 @@ +From 8ee8aec8739c6c0a4024ad187be56f525e8089c0 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Wed, 8 Mar 2017 11:03:40 +0100 +Subject: [PATCH] RHEL: v2v: do not mention SUSE Xen hosts (RHBZ#1430203) + +They are not supported in RHEL. +--- + docs/virt-v2v-input-xen.pod | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/docs/virt-v2v-input-xen.pod b/docs/virt-v2v-input-xen.pod +index 8080ebea..ad5772de 100644 +--- a/docs/virt-v2v-input-xen.pod ++++ b/docs/virt-v2v-input-xen.pod +@@ -11,7 +11,7 @@ virt-v2v-input-xen - Using virt-v2v to convert guests from Xen + =head1 DESCRIPTION + + This page documents how to use L to convert guests from +-RHEL 5 Xen, or SLES and OpenSUSE Xen hosts. ++RHEL 5 Xen hosts. + + =head1 INPUT FROM XEN + diff --git a/SOURCES/0007-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch b/SOURCES/0007-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch new file mode 100644 index 0000000..922f52f --- /dev/null +++ b/SOURCES/0007-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch @@ -0,0 +1,124 @@ +From fd0c34d843bb5ba9e1b33e0dfd1250943c760a70 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 26 Mar 2019 09:42:25 +0100 +Subject: [PATCH] RHEL: point to KB for supported v2v hypervisors/guests + +--- + docs/virt-v2v-support.pod | 104 ++------------------------------------ + 1 file changed, 4 insertions(+), 100 deletions(-) + +diff --git a/docs/virt-v2v-support.pod b/docs/virt-v2v-support.pod +index 9815f51f..1ffc0f9d 100644 +--- a/docs/virt-v2v-support.pod ++++ b/docs/virt-v2v-support.pod +@@ -8,106 +8,10 @@ systems and guests in virt-v2v + This page documents which foreign hypervisors, virtualization + management systems and guest types that L can support. + +-Note this page applies to upstream virt-v2v from +-L and in downstream distributions of virt-v2v +-sometimes features are intentionally removed, or are present but not +-supported. +- +-=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 +- +-=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 ALT Linux 9 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 ++For more information on supported hypervisors, and guest types in ++RHEL, please consult the following Knowledgebase article on these ++Red Hat Customer Portal: ++L. + + =head2 Guest firmware + diff --git a/SOURCES/0008-RHEL-Disable-o-glance.patch b/SOURCES/0008-RHEL-Disable-o-glance.patch new file mode 100644 index 0000000..cbb09e1 --- /dev/null +++ b/SOURCES/0008-RHEL-Disable-o-glance.patch @@ -0,0 +1,216 @@ +From 14507902a675fd2e0356c0faf67524eb04e974d2 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Wed, 30 Jun 2021 11:15:52 +0100 +Subject: [PATCH] RHEL: Disable -o glance + +Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1977539 +--- + docs/virt-v2v-output-openstack.pod | 56 ++---------------------------- + docs/virt-v2v.pod | 20 ----------- + output/output_glance.mli | 2 +- + tests/test-v2v-o-glance.sh | 3 ++ + v2v/v2v.ml | 7 +--- + 5 files changed, 7 insertions(+), 81 deletions(-) + +diff --git a/docs/virt-v2v-output-openstack.pod b/docs/virt-v2v-output-openstack.pod +index f5a3abad..1ab356e8 100644 +--- a/docs/virt-v2v-output-openstack.pod ++++ b/docs/virt-v2v-output-openstack.pod +@@ -10,13 +10,10 @@ virt-v2v-output-openstack - Using virt-v2v to convert guests to OpenStack + [-oo verify-server-certificate=false] + [-oo os-username=admin] [-oo os-*=*] + +- virt-v2v [-i* options] -o glance +- + =head1 DESCRIPTION + + This page documents how to use L to convert guests to run +-on OpenStack. There are two output modes you can select, but only +-I<-o openstack> should be used normally. ++on OpenStack. + + =over 4 + +@@ -27,15 +24,6 @@ Full description: L + This is the modern method for uploading to OpenStack via the REST API. + Guests can be directly converted into Cinder volumes. + +-=item B<-o glance> +- +-Full description: L +- +-This is the old method for uploading to Glance. Unfortunately Glance +-is not well suited to storing converted guests (since virt-v2v deals +-with "pets" not templated "cattle"), so this method is not recommended +-unless you really know what you are doing. +- + =back + + =head1 OUTPUT TO OPENSTACK +@@ -170,50 +158,10 @@ no Cinder volume type is used. + The following options are B supported with OpenStack: I<-oa>, + I<-of>. + +-=head1 OUTPUT TO GLANCE +- +-Note this is a legacy option. In most cases you should use +-L instead. +- +-To output to OpenStack Glance, use the I<-o glance> option. +- +-This runs the L CLI program which must be installed on the +-virt-v2v conversion host. For authentication to work, you will need +-to set C environment variables. +- +-Normally there is a file called C or C +-which you can simply C to set everything up. +- +-Virt-v2v adds metadata for the guest to Glance, describing such things +-as the guest operating system and what drivers it requires. The +-command C will display the metadata as "Property" +-fields such as C and C. +- +-=head2 Glance and sparseness +- +-Glance image upload doesn't appear to correctly handle sparseness. +-For this reason, using qcow2 will be faster and use less space on the +-Glance server. Use the virt-v2v S> option. +- +-=head2 Glance and multiple disks +- +-If the guest has a single disk, then the name of the disk in Glance +-will be the name of the guest. You can control this using the I<-on> +-option. +- +-Glance doesn't have a concept of associating multiple disks with a +-single guest, and Nova doesn't allow you to boot a guest from multiple +-Glance disks either. If the guest has multiple disks, then the first +-(assumed to be the system disk) will have the name of the guest, and +-the second and subsequent data disks will be called +-C-disk2>, C-disk3> etc. It may be best to +-leave the system disk in Glance, and import the data disks to Cinder. +- + =head1 SEE ALSO + + L, +-L, +-L. ++L. + + =head1 AUTHOR + +diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod +index 7d0bafff..84e049cc 100644 +--- a/docs/virt-v2v.pod ++++ b/docs/virt-v2v.pod +@@ -416,14 +416,6 @@ See L below. + + This is the same as I<-o local>. + +-=item B<-o> B +- +-This is a legacy option. You should probably use I<-o openstack> +-instead. +- +-Set the output method to OpenStack Glance. In this mode the converted +-guest is uploaded to Glance. See L. +- + =item B<-o> B + + This option is deprecated and will be removed in S. +@@ -1148,11 +1140,6 @@ and output methods may use disk space, as outlined in the table below. + This temporarily places a full copy of the uncompressed source disks + in C<$VIRT_V2V_TMPDIR> (or F). + +-=item I<-o glance> +- +-This temporarily places a full copy of the output disks in +-C<$VIRT_V2V_TMPDIR> (or F). +- + =item I<-o local> + + =item I<-o qemu> +@@ -1336,13 +1323,6 @@ instance. + Because of how Cinder volumes are presented as F block devices, + using I<-o openstack> normally requires that virt-v2v is run as root. + +-=item Writing to Glance +- +-This does I need root (in fact it probably won’t work), but may +-require either a special user and/or for you to source a script that +-sets authentication environment variables. Consult the Glance +-documentation. +- + =item Writing to block devices + + This normally requires root. See the next section. +diff --git a/output/output_glance.mli b/output/output_glance.mli +index 972320a2..9befc461 100644 +--- a/output/output_glance.mli ++++ b/output/output_glance.mli +@@ -18,4 +18,4 @@ + + (** [-o glance] output mode. *) + +-module Glance : Output.OUTPUT ++(*module Glance : Output.OUTPUT*) +diff --git a/tests/test-v2v-o-glance.sh b/tests/test-v2v-o-glance.sh +index c0db9115..074b5e16 100755 +--- a/tests/test-v2v-o-glance.sh ++++ b/tests/test-v2v-o-glance.sh +@@ -20,6 +20,9 @@ + + set -e + ++# Feature is disabled in RHEL 9. ++exit 77 ++ + source ./functions.sh + set -e + set -x +diff --git a/v2v/v2v.ml b/v2v/v2v.ml +index 97b4e4ec..41e020cb 100644 +--- a/v2v/v2v.ml ++++ b/v2v/v2v.ml +@@ -192,7 +192,6 @@ let rec main () = + if !output_mode <> `Not_set then + error (f_"%s option used more than once on the command line") "-o"; + match mode with +- | "glance" -> output_mode := `Glance + | "libvirt" -> output_mode := `Libvirt + | "disk" | "local" -> output_mode := `Disk + | "json" -> output_mode := `JSON +@@ -250,7 +249,7 @@ let rec main () = + s_"Map network ‘in’ to ‘out’"; + [ L"no-trim" ], Getopt.String ("-", no_trim_warning), + s_"Ignored for backwards compatibility"; +- [ S 'o' ], Getopt.String ("glance|json|libvirt|local|null|openstack|qemu|rhv|rhv-upload|vdsm", set_output_mode), ++ [ S 'o' ], Getopt.String ("json|libvirt|local|null|openstack|qemu|rhv|rhv-upload|vdsm", set_output_mode), + s_"Set output mode (default: libvirt)"; + [ M"oa" ], Getopt.String ("sparse|preallocated", set_output_alloc), + s_"Set output allocation mode"; +@@ -318,8 +317,6 @@ 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 +- + There is a companion front-end called \"virt-p2v\" which comes as an + ISO or CD image that can be booted on physical machines. + +@@ -387,7 +384,6 @@ read the man page virt-v2v(1). + pr "input:libvirtxml\n"; + pr "input:ova\n"; + pr "input:vmx\n"; +- pr "output:glance\n"; + pr "output:json\n"; + pr "output:libvirt\n"; + pr "output:local\n"; +@@ -481,7 +477,6 @@ read the man page virt-v2v(1). + | `Disk -> (module Output_disk.Disk) + | `Null -> (module Output_null.Null) + | `QEmu -> (module Output_qemu.QEMU) +- | `Glance -> (module Output_glance.Glance) + | `Openstack -> (module Output_openstack.Openstack) + | `RHV_Upload -> (module Output_rhv_upload.RHVUpload) + | `RHV -> (module Output_rhv.RHV) diff --git a/SOURCES/0009-RHEL-Remove-the-in-place-option.patch b/SOURCES/0009-RHEL-Remove-the-in-place-option.patch new file mode 100644 index 0000000..b554409 --- /dev/null +++ b/SOURCES/0009-RHEL-Remove-the-in-place-option.patch @@ -0,0 +1,84 @@ +From 1176553cf7a9a7f7961887372757234ffdfae2bd Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 2 Dec 2021 11:56:05 +0000 +Subject: [PATCH] RHEL: Remove the --in-place option + +This disables the virt-v2v --in-place option which we do not +wish to support in RHEL. +--- + docs/virt-v2v.pod | 8 -------- + tests/Makefile.am | 1 - + v2v/v2v.ml | 8 -------- + 3 files changed, 17 deletions(-) + +diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod +index 84e049cc..7ad22f00 100644 +--- a/docs/virt-v2v.pod ++++ b/docs/virt-v2v.pod +@@ -21,9 +21,6 @@ There is also a companion front-end called L which comes + as an ISO, CD or PXE image that can be booted on physical machines to + virtualize those machines (physical to virtual, or p2v). + +-For in-place conversion, there is a separate tool called +-L. +- + =head2 Input and Output + + You normally run virt-v2v with several I<-i*> options controlling the +@@ -36,10 +33,6 @@ The input and output sides of virt-v2v are separate and unrelated. + Virt-v2v can read from any input and write to any output. Therefore + these sides of virt-v2v are documented separately in this manual. + +-Virt-v2v normally copies from the input to the output, called "copying +-mode". In this case the source guest is always left unchanged. +-In-place conversions may be done using L. +- + =head2 Other virt-v2v topics + + L — Supported hypervisors, virtualization +@@ -1587,7 +1580,6 @@ L, +-L, + L, + L, + L, +diff --git a/tests/Makefile.am b/tests/Makefile.am +index d36e230b..db32e42b 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -77,7 +77,6 @@ TESTS = \ + test-v2v-floppy.sh \ + test-v2v-i-disk.sh \ + test-v2v-i-ova.sh \ +- test-v2v-in-place.sh \ + test-v2v-mac.sh \ + test-v2v-machine-readable.sh \ + test-v2v-networks-and-bridges.sh \ +diff --git a/v2v/v2v.ml b/v2v/v2v.ml +index 41e020cb..e00f9814 100644 +--- a/v2v/v2v.ml ++++ b/v2v/v2v.ml +@@ -214,12 +214,6 @@ let rec main () = + warning (f_"the --vmtype option has been removed and now does nothing") + in + +- (* Options that are errors. *) +- let in_place_error _ = +- error (f_"The --in-place option has been replaced by the \ +- ‘virt-v2v-in-place’ program") +- in +- + let argspec = [ + [ L"bandwidth" ], Getopt.String ("bps", set_string_option_once "--bandwidth" bandwidth), + s_"Set bandwidth to bits per sec"; +@@ -241,8 +235,6 @@ let rec main () = + s_"Use password from file to connect to input hypervisor"; + [ M"it" ], Getopt.String ("transport", set_string_option_once "-it" input_transport), + s_"Input transport"; +- [ L"in-place" ], Getopt.Unit in_place_error, +- s_"Use virt-v2v-in-place instead"; + [ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac), + s_"Map NIC to network or bridge or assign static IP"; + [ S 'n'; L"network" ], Getopt.String ("in:out", add_network), diff --git a/SOURCES/0010-output-Remove-o-json-mode.patch b/SOURCES/0010-output-Remove-o-json-mode.patch new file mode 100644 index 0000000..355af01 --- /dev/null +++ b/SOURCES/0010-output-Remove-o-json-mode.patch @@ -0,0 +1,1125 @@ +From a1f1129dc148639ed0b05b737157268d9b824a63 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 11 Apr 2022 11:01:46 +0100 +Subject: [PATCH] output: Remove -o json mode + +This removes the -o json mode completely. + +Reviewed-by: Laszlo Ersek +(cherry picked from commit 4e6b389b4e27c8d13e57fcaf777d96ad7e08650b) +--- + docs/virt-v2v.pod | 4 - + output/Makefile.am | 51 +----- + output/create_json.ml | 338 ----------------------------------- + output/create_json.mli | 27 --- + output/output_json.ml | 153 ---------------- + output/output_json.mli | 21 --- + output/var_expander.ml | 72 -------- + output/var_expander.mli | 82 --------- + output/var_expander_tests.ml | 113 ------------ + tests/Makefile.am | 2 - + tests/test-v2v-o-json.sh | 68 ------- + v2v/v2v.ml | 7 +- + 12 files changed, 5 insertions(+), 933 deletions(-) + delete mode 100644 output/create_json.ml + delete mode 100644 output/create_json.mli + delete mode 100644 output/output_json.ml + delete mode 100644 output/output_json.mli + delete mode 100644 output/var_expander.ml + delete mode 100644 output/var_expander.mli + delete mode 100644 output/var_expander_tests.ml + delete mode 100755 tests/test-v2v-o-json.sh + +diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod +index 7ad22f00..912f1bc3 100644 +--- a/docs/virt-v2v.pod ++++ b/docs/virt-v2v.pod +@@ -409,10 +409,6 @@ See L below. + + This is the same as I<-o local>. + +-=item B<-o> B +- +-This option is deprecated and will be removed in S. +- + =item B<-o> B + + Set the output method to I. This is the default. +diff --git a/output/Makefile.am b/output/Makefile.am +index 61caf68b..dd488549 100644 +--- a/output/Makefile.am ++++ b/output/Makefile.am +@@ -39,18 +39,15 @@ EXTRA_DIST = \ + rhv-upload-precheck.py \ + rhv-upload-transfer.py \ + rhv-upload-vmcheck.py \ +- test-v2v-python-syntax.sh \ +- var_expander_tests.ml ++ test-v2v-python-syntax.sh + + SOURCES_MLI = \ + changeuid.mli \ +- create_json.mli \ + create_libvirt_xml.mli \ + openstack_image_properties.mli \ + output.mli \ + output_disk.mli \ + output_glance.mli \ +- output_json.mli \ + output_libvirt.mli \ + output_null.mli \ + output_openstack.mli \ +@@ -66,14 +63,11 @@ SOURCES_MLI = \ + output_rhv_upload_transfer_source.mli \ + output_rhv_upload_vmcheck_source.mli \ + python_script.mli \ +- qemuopts.mli \ +- var_expander.mli ++ qemuopts.mli + + SOURCES_ML = \ + changeuid.ml \ + python_script.ml \ +- var_expander.ml \ +- create_json.ml \ + create_libvirt_xml.ml \ + qemuopts.ml \ + openstack_image_properties.ml \ +@@ -87,7 +81,6 @@ SOURCES_ML = \ + output.ml \ + output_disk.ml \ + output_glance.ml \ +- output_json.ml \ + output_libvirt.ml \ + output_null.ml \ + output_openstack.ml \ +@@ -203,47 +196,9 @@ $(MLOUTPUT_CMA): $(OBJECTS) libmloutput.a + $(OCAMLFIND) mklib $(OCAMLPACKAGES) \ + $(OBJECTS) $(libmloutput_a_OBJECTS) -o mloutput + +-# Unit tests. +-TESTS = +-if HAVE_OCAML_PKG_OUNIT +-TESTS += \ +- var_expander_tests +-check_PROGRAMS = \ +- var_expander_tests +-endif +- +-var_expander_tests_BOBJECTS = \ +- var_expander.cmo \ +- var_expander_tests.cmo +-var_expander_tests_XOBJECTS = $(var_expander_tests_BOBJECTS:.cmo=.cmx) +- +-var_expander_tests_SOURCES = dummy.c +-var_expander_tests_CPPFLAGS = $(virt_v2v_CPPFLAGS) +-var_expander_tests_CFLAGS = $(virt_v2v_CFLAGS) +- +-if !HAVE_OCAMLOPT +-# Can't call this var_expander_tests_OBJECTS because automake gets confused. +-var_expander_tests_THEOBJECTS = $(var_expander_tests_BOBJECTS) +-var_expander_tests.cmo: OCAMLPACKAGES += -package ounit2 +-else +-var_expander_tests_THEOBJECTS = $(var_expander_tests_XOBJECTS) +-var_expander_tests.cmx: OCAMLPACKAGES += -package ounit2 +-endif +- +-var_expander_tests_DEPENDENCIES = \ +- $(var_expander_tests_THEOBJECTS) \ +- $(top_builddir)/common/mlpcre/mlpcre.$(MLARCHIVE) \ +- $(top_srcdir)/ocaml-link.sh +-var_expander_tests_LINK = \ +- $(top_srcdir)/ocaml-link.sh -cclib '$(OCAMLCLIBS)' -- \ +- $(OCAMLFIND) $(BEST) $(OCAMLFLAGS) \ +- $(OCAMLPACKAGES) -package ounit2 \ +- $(OCAMLLINKFLAGS) \ +- $(var_expander_tests_THEOBJECTS) -o $@ +- + # Unit tests. + TESTS_ENVIRONMENT = $(top_builddir)/run --test +-TESTS += test-v2v-python-syntax.sh ++TESTS = test-v2v-python-syntax.sh + + # Dependencies. + .depend: \ +diff --git a/output/create_json.ml b/output/create_json.ml +deleted file mode 100644 +index cbc27fdc..00000000 +--- a/output/create_json.ml ++++ /dev/null +@@ -1,338 +0,0 @@ +-(* virt-v2v +- * Copyright (C) 2019 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 Std_utils +-open C_utils +-open Tools_utils +- +-open Types +-open Utils +- +-module G = Guestfs +- +-let json_list_of_string_list = +- List.map (fun x -> JSON.String x) +- +-let json_list_of_string_string_list = +- List.map (fun (x, y) -> x, JSON.String y) +- +-let push_optional_string lst name = function +- | None -> () +- | Some v -> List.push_back lst (name, JSON.String v) +- +-let push_optional_int lst name = function +- | None -> () +- | Some v -> List.push_back lst (name, JSON.Int (Int64.of_int v)) +- +-let json_unknown_string = function +- | "unknown" -> JSON.Null +- | v -> JSON.String v +- +-let create_json_metadata source inspect +- { guestcaps; target_buses; target_firmware; target_nics } +- outdisk_name output_format output_name = +- let doc = ref [ +- "version", JSON.Int 1L; +- "name", JSON.String output_name; +- "memory", JSON.Int source.s_memory; +- "vcpu", JSON.Int (Int64.of_int source.s_vcpu); +- ] in +- +- (match source.s_genid with +- | None -> () +- | Some genid -> List.push_back doc ("genid", JSON.String genid) +- ); +- +- if source.s_cpu_vendor <> None || source.s_cpu_model <> None || +- source.s_cpu_topology <> None then ( +- let cpu = ref [] in +- +- push_optional_string cpu "vendor" source.s_cpu_vendor; +- push_optional_string cpu "model" source.s_cpu_model; +- (match source.s_cpu_topology with +- | None -> () +- | Some { s_cpu_sockets; s_cpu_cores; s_cpu_threads } -> +- let attrs = [ +- "sockets", JSON.Int (Int64.of_int s_cpu_sockets); +- "cores", JSON.Int (Int64.of_int s_cpu_cores); +- "threads", JSON.Int (Int64.of_int s_cpu_threads); +- ] in +- List.push_back cpu ("topology", JSON.Dict attrs) +- ); +- +- List.push_back doc ("cpu", JSON.Dict !cpu); +- ); +- +- let firmware = +- let firmware_type = +- match target_firmware with +- | TargetBIOS -> "bios" +- | TargetUEFI -> "uefi" in +- +- let fw = ref [ +- "type", JSON.String firmware_type; +- ] in +- +- (match target_firmware with +- | TargetBIOS -> () +- | TargetUEFI -> +- let uefi_firmware = find_uefi_firmware guestcaps.gcaps_arch in +- let flags = +- List.map ( +- function +- | Uefi.UEFI_FLAG_SECURE_BOOT_REQUIRED -> "secure_boot_required" +- ) uefi_firmware.Uefi.flags in +- +- let uefi = ref [ +- "code", JSON.String uefi_firmware.Uefi.code; +- "vars", JSON.String uefi_firmware.Uefi.vars; +- "flags", JSON.List (json_list_of_string_list flags); +- ] in +- +- push_optional_string uefi "code-debug" uefi_firmware.Uefi.code_debug; +- +- List.push_back fw ("uefi", JSON.Dict !uefi) +- ); +- +- !fw in +- List.push_back doc ("firmware", JSON.Dict firmware); +- +- List.push_back doc ("features", +- JSON.List (json_list_of_string_list source.s_features)); +- +- let machine = +- match guestcaps.gcaps_machine with +- | I440FX -> "pc" +- | Q35 -> "q35" +- | Virt -> "virt" in +- List.push_back doc ("machine", JSON.String machine); +- +- let disks, removables = +- let disks = ref [] +- and removables = ref [] in +- +- let iter_bus bus_name drive_prefix i = function +- | BusSlotEmpty -> () +- | BusSlotDisk d -> +- (* Find the corresponding target disk. *) +- let outdisk = outdisk_name d.s_disk_id in +- +- let disk = [ +- "dev", JSON.String (drive_prefix ^ drive_name i); +- "bus", JSON.String bus_name; +- "format", JSON.String output_format; +- "file", JSON.String outdisk; +- ] in +- +- List.push_back disks (JSON.Dict disk) +- +- | BusSlotRemovable { s_removable_type = CDROM } -> +- let cdrom = [ +- "type", JSON.String "cdrom"; +- "dev", JSON.String (drive_prefix ^ drive_name i); +- "bus", JSON.String bus_name; +- ] in +- +- List.push_back removables (JSON.Dict cdrom) +- +- | BusSlotRemovable { s_removable_type = Floppy } -> +- let floppy = [ +- "type", JSON.String "floppy"; +- "dev", JSON.String (drive_prefix ^ drive_name i); +- ] in +- +- List.push_back removables (JSON.Dict floppy) +- in +- +- Array.iteri (iter_bus "virtio" "vd") target_buses.target_virtio_blk_bus; +- Array.iteri (iter_bus "ide" "hd") target_buses.target_ide_bus; +- Array.iteri (iter_bus "scsi" "sd") target_buses.target_scsi_bus; +- Array.iteri (iter_bus "floppy" "fd") target_buses.target_floppy_bus; +- +- !disks, !removables in +- List.push_back doc ("disks", JSON.List disks); +- List.push_back doc ("removables", JSON.List removables); +- +- let nics = +- List.map ( +- fun { s_mac = mac; s_vnet_type = vnet_type; s_nic_model = nic_model; +- s_vnet = vnet; } -> +- let vnet_type_str = +- match vnet_type with +- | Bridge -> "bridge" +- | Network -> "network" in +- +- let nic = ref [ +- "vnet", JSON.String vnet; +- "vnet-type", JSON.String vnet_type_str; +- ] in +- +- let nic_model_str = Option.map string_of_nic_model nic_model in +- push_optional_string nic "model" nic_model_str; +- +- push_optional_string nic "mac" mac; +- +- JSON.Dict !nic +- ) target_nics in +- List.push_back doc ("nics", JSON.List nics); +- +- let guestcaps_dict = +- let block_bus = +- match guestcaps.gcaps_block_bus with +- | Virtio_blk -> "virtio-blk" +- | IDE -> "ide" in +- let net_bus = +- match guestcaps.gcaps_net_bus with +- | Virtio_net -> "virtio-net" +- | E1000 -> "e1000" +- | RTL8139 -> "rtl8139" in +- let video = "vga" in +- let machine = +- match guestcaps.gcaps_machine with +- | I440FX -> "i440fx" +- | Q35 -> "q35" +- | Virt -> "virt" in +- +- [ +- "block-bus", JSON.String block_bus; +- "net-bus", JSON.String net_bus; +- "video", JSON.String video; +- "machine", JSON.String machine; +- "arch", JSON.String guestcaps.gcaps_arch; +- "virtio-rng", JSON.Bool guestcaps.gcaps_virtio_rng; +- "virtio-balloon", JSON.Bool guestcaps.gcaps_virtio_balloon; +- "isa-pvpanic", JSON.Bool guestcaps.gcaps_isa_pvpanic; +- "virtio-socket", JSON.Bool guestcaps.gcaps_virtio_socket; +- "acpi", JSON.Bool guestcaps.gcaps_acpi; +- "virtio-1-0", JSON.Bool guestcaps.gcaps_virtio_1_0; +- ] in +- List.push_back doc ("guestcaps", JSON.Dict guestcaps_dict); +- +- (match source.s_sound with +- | None -> () +- | Some { s_sound_model = model } -> +- let sound = [ +- "model", JSON.String (string_of_source_sound_model model); +- ] in +- List.push_back doc ("sound", JSON.Dict sound) +- ); +- +- (match source.s_display with +- | None -> () +- | Some d -> +- let display_type = +- match d.s_display_type with +- | Window -> "window" +- | VNC -> "vnc" +- | Spice -> "spice" in +- +- let display = ref [ +- "type", JSON.String display_type; +- ] in +- +- push_optional_string display "keymap" d.s_keymap; +- push_optional_string display "password" d.s_password; +- +- let listen = +- match d.s_listen with +- | LNoListen -> None +- | LAddress address -> +- Some [ +- "type", JSON.String "address"; +- "address", JSON.String address; +- ] +- | LNetwork network -> +- Some [ +- "type", JSON.String "network"; +- "network", JSON.String network; +- ] +- | LSocket None -> +- Some [ +- "type", JSON.String "socket"; +- "socket", JSON.Null; +- ] +- | LSocket (Some socket) -> +- Some [ +- "type", JSON.String "socket"; +- "socket", JSON.String socket; +- ] +- | LNone -> +- Some [ +- "type", JSON.String "none"; +- ] in +- (match listen with +- | None -> () +- | Some l -> List.push_back display ("listen", JSON.Dict l) +- ); +- +- push_optional_int display "port" d.s_port; +- +- List.push_back doc ("display", JSON.Dict !display) +- ); +- +- let inspect_dict = +- let apps = +- List.map ( +- fun { G.app2_name = name; app2_display_name = display_name; +- app2_epoch = epoch; app2_version = version; +- app2_release = release; app2_arch = arch; } -> +- JSON.Dict [ +- "name", JSON.String name; +- "display-name", JSON.String display_name; +- "epoch", JSON.Int (Int64.of_int32 epoch); +- "version", JSON.String version; +- "release", JSON.String release; +- "arch", JSON.String arch; +- ] +- ) inspect.i_apps in +- +- let firmware_dict = +- match inspect.i_firmware with +- | I_BIOS -> +- [ +- "type", JSON.String "bios"; +- ] +- | I_UEFI devices -> +- [ +- "type", JSON.String "uefi"; +- "devices", JSON.List (json_list_of_string_list devices); +- ] in +- +- [ +- "root", JSON.String inspect.i_root; +- "type", JSON.String inspect.i_type; +- "distro", json_unknown_string inspect.i_distro; +- "osinfo", json_unknown_string inspect.i_osinfo; +- "arch", JSON.String inspect.i_arch; +- "major-version", JSON.Int (Int64.of_int inspect.i_major_version); +- "minor-version", JSON.Int (Int64.of_int inspect.i_minor_version); +- "package-format", json_unknown_string inspect.i_package_format; +- "package-management", json_unknown_string inspect.i_package_management; +- "product-name", json_unknown_string inspect.i_product_name; +- "product-variant", json_unknown_string inspect.i_product_variant; +- "mountpoints", JSON.Dict (json_list_of_string_string_list inspect.i_mountpoints); +- "applications", JSON.List apps; +- "windows-systemroot", JSON.String inspect.i_windows_systemroot; +- "windows-software-hive", JSON.String inspect.i_windows_software_hive; +- "windows-system-hive", JSON.String inspect.i_windows_system_hive; +- "windows-current-control-set", JSON.String inspect.i_windows_current_control_set; +- "firmware", JSON.Dict firmware_dict; +- ] in +- List.push_back doc ("inspect", JSON.Dict inspect_dict); +- +- !doc +diff --git a/output/create_json.mli b/output/create_json.mli +deleted file mode 100644 +index 97086ff5..00000000 +--- a/output/create_json.mli ++++ /dev/null +@@ -1,27 +0,0 @@ +-(* virt-v2v +- * Copyright (C) 2019 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. +- *) +- +-(** Create JSON metadata for [-o json]. *) +- +-val create_json_metadata : Types.source -> Types.inspect -> +- Types.target_meta -> +- (int -> string) -> string -> string -> +- JSON.doc +-(** [create_json_metadata source targets outdisk_map output_format output_name] +- creates the JSON with the majority of the data that virt-v2v used for the +- conversion. *) +diff --git a/output/output_json.ml b/output/output_json.ml +deleted file mode 100644 +index 6e81b639..00000000 +--- a/output/output_json.ml ++++ /dev/null +@@ -1,153 +0,0 @@ +-(* virt-v2v +- * Copyright (C) 2009-2021 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 C_utils +-open Std_utils +-open Tools_utils +-open Common_gettext.Gettext +- +-open Types +-open Utils +- +-open Output +- +-module Json = struct +- type poptions = string * Types.output_allocation * string * string * string +- +- type t = unit +- +- let to_string options = +- "-o json" ^ +- match options.output_storage with +- | Some os -> " -os " ^ os +- | None -> "" +- +- let query_output_options () = +- printf (f_"Output options (-oo) which can be used with -o json: +- +- -oo json-disks-pattern=PATTERN Pattern for the disks. +-") +- +- let parse_options options source = +- if options.output_conn <> None then +- error_option_cannot_be_used_in_output_mode "json" "-oc"; +- if options.output_password <> None then +- error_option_cannot_be_used_in_output_mode "json" "-op"; +- +- let known_pattern_variables = ["DiskNo"; "DiskDeviceName"; "GuestName"] in +- let json_disks_pattern = ref None in +- List.iter ( +- fun (k, v) -> +- match k with +- | "json-disks-pattern" -> +- if !json_disks_pattern <> None then +- error (f_"-o json: -oo json-disks-pattern set more than once"); +- let vars = +- try Var_expander.scan_variables v +- with Var_expander.Invalid_variable var -> +- error (f_"-o json: -oo json-disks-pattern: invalid variable %%{%s}") +- var in +- List.iter ( +- fun var -> +- if not (List.mem var known_pattern_variables) then +- error (f_"-o json: -oo json-disks-pattern: unhandled variable %%{%s}") +- var +- ) vars; +- json_disks_pattern := Some v +- | k -> +- error (f_"-o json: unknown output option ‘-oo %s’") k +- ) options.output_options; +- +- let json_disks_pattern = +- Option.default "%{GuestName}-%{DiskDeviceName}" !json_disks_pattern in +- +- (* -os must be set to a directory. *) +- let output_storage = +- match options.output_storage with +- | None -> +- error (f_"-o json: output directory was not specified, use '-os /dir'") +- | 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 +- +- let output_name = Option.default source.s_name options.output_name in +- +- (json_disks_pattern, +- options.output_alloc, options.output_format, output_name, output_storage) +- +- let rec setup dir options source = +- let disks = get_disks dir in +- let json_disks_pattern, +- output_alloc, output_format, output_name, +- output_storage = options in +- +- List.iter ( +- fun (i, size) -> +- let socket = sprintf "%s/out%d" dir i in +- On_exit.unlink socket; +- +- (* Create the actual output disk. *) +- let outdisk = json_path output_storage output_name +- json_disks_pattern i in +- mkdir_p (Filename.dirname outdisk) 0o755; +- +- output_to_local_file output_alloc output_format outdisk size socket +- ) disks +- +- (* For -o json, return the output disk name of the i'th disk. *) +- and json_path os output_name json_disks_pattern i = +- let outname = +- let vars_fn = function +- | "DiskNo" -> Some (string_of_int (i+1)) +- | "DiskDeviceName" -> Some (sprintf "sd%s" (drive_name i)) +- | "GuestName" -> Some output_name +- | _ -> assert false +- in +- Var_expander.replace_fn json_disks_pattern vars_fn in +- let outdisk = os // outname in +- let outdisk = absolute_path outdisk in +- outdisk +- +- let finalize dir options () source inspect target_meta = +- let json_disks_pattern, +- output_alloc, output_format, output_name, output_storage = options in +- +- let doc = +- Create_json.create_json_metadata source inspect target_meta +- (json_path output_storage output_name json_disks_pattern) +- output_format output_name in +- let doc_string = JSON.string_of_doc ~fmt:JSON.Indented doc in +- +- if verbose () then ( +- eprintf "resulting JSON:\n"; +- output_string Stdlib.stderr doc_string; +- eprintf "\n\n%!"; +- ); +- +- let file = output_storage // output_name ^ ".json" in +- with_open_out file ( +- fun chan -> +- output_string chan doc_string; +- output_char chan '\n' +- ) +- +- let request_size = None +-end +diff --git a/output/output_json.mli b/output/output_json.mli +deleted file mode 100644 +index 00786ef7..00000000 +--- a/output/output_json.mli ++++ /dev/null +@@ -1,21 +0,0 @@ +-(* virt-v2v +- * Copyright (C) 2009-2021 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 json] output mode. *) +- +-module Json : Output.OUTPUT +diff --git a/output/var_expander.ml b/output/var_expander.ml +deleted file mode 100644 +index 24b9bafe..00000000 +--- a/output/var_expander.ml ++++ /dev/null +@@ -1,72 +0,0 @@ +-(* virt-v2v +- * Copyright (C) 2019 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 Std_utils +- +-exception Invalid_variable of string +- +-let var_re = PCRE.compile "(^|[^%])%{([^}]+)}" +- +-let check_variable var = +- String.iter ( +- function +- | '0'..'9' +- | 'a'..'z' +- | 'A'..'Z' +- | '_' +- | '-' -> () +- | _ -> raise (Invalid_variable var) +- ) var +- +-let scan_variables str = +- let res = ref [] in +- let offset = ref 0 in +- while PCRE.matches ~offset:!offset var_re str; do +- let var = PCRE.sub 2 in +- check_variable var; +- let _, end_ = PCRE.subi 0 in +- List.push_back res var; +- offset := end_ +- done; +- List.remove_duplicates !res +- +-let replace_fn str fn = +- let res = ref str in +- let offset = ref 0 in +- while PCRE.matches ~offset:!offset var_re !res; do +- let var = PCRE.sub 2 in +- check_variable var; +- let start_, end_ = PCRE.subi 0 in +- match fn var with +- | None -> +- offset := end_ +- | Some text -> +- let prefix_len = +- let prefix_start, prefix_end = PCRE.subi 1 in +- prefix_end - prefix_start in +- res := (String.sub !res 0 (start_ + prefix_len)) ^ text ^ (String.sub !res end_ (String.length !res - end_)); +- offset := start_ + prefix_len + String.length text +- done; +- !res +- +-let replace_list str lst = +- let fn var = +- try Some (List.assoc var lst) +- with Not_found -> None +- in +- replace_fn str fn +diff --git a/output/var_expander.mli b/output/var_expander.mli +deleted file mode 100644 +index 80aa33c2..00000000 +--- a/output/var_expander.mli ++++ /dev/null +@@ -1,82 +0,0 @@ +-(* virt-v2v +- * Copyright (C) 2019 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. +- *) +- +-(** Simple variable expander. +- +- This module provides the support to expand variables in strings, +- specified in the form of [%{name}]. +- +- For example: +- +-{v +-let str = "variable-%{INDEX} in %{INDEX} replaced %{INDEX} times" +-let index = ref 0 +-let fn = function +- | "INDEX" -> +- incr index; +- Some (string_of_int !index) +- | _ -> None +-in +-let str = Var_expander.replace_fn str fn +-(* now str is "variable-1 in 2 replaced 3 times" *) +-v} +- +- The names of variables can contain only ASCII letters (uppercase, +- and lowercase), digits, underscores, and dashes. +- +- The replacement is done in a single pass: this means that if a +- variable is replaced with the text of a variable, that new text +- is kept as is in the final output. In practice: +- +-{v +-let str = "%{VAR}" +-let str = Var_expander.replace_list str [("VAR", "%{VAR}")] +-(* now str is "%{VAR}" *) +-v} +-*) +- +-exception Invalid_variable of string +-(** Invalid variable name error. +- +- In case a variable contains characters not allowed, then this +- exception with the actual unacceptable variable. *) +- +-val scan_variables : string -> string list +-(** Scan the pattern string for all the variables available. +- +- This can raise {!Invalid_variable} in case there are invalid +- variable names. *) +- +-val replace_fn : string -> (string -> string option) -> string +-(** Replaces a string expanding all the variables. +- +- The replacement function specify how a variable is replaced; +- if [None] is returned, then that variable is not replaced. +- +- This can raise {!Invalid_variable} in case there are invalid +- variable names. *) +- +-val replace_list : string -> (string * string) list -> string +-(** Replaces a string expanding all the variables. +- +- The replacement list specify how a variable is replaced; +- if it is not specified in the list, then that variable is not +- replaced. +- +- This can raise {!Invalid_variable} in case there are invalid +- variable names. *) +diff --git a/output/var_expander_tests.ml b/output/var_expander_tests.ml +deleted file mode 100644 +index 35b62836..00000000 +--- a/output/var_expander_tests.ml ++++ /dev/null +@@ -1,113 +0,0 @@ +-(* virt-v2v +- * Copyright (C) 2019 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 OUnit +- +-open Std_utils +- +-let assert_equal_string = assert_equal ~printer:identity +-let assert_equal_stringlist = assert_equal ~printer:(fun x -> "(" ^ (String.escaped (String.concat "," x)) ^ ")") +- +-let replace_none_fn _ = None +-let replace_empty_fn _ = Some "" +- +-let test_no_replacement () = +- assert_equal_string "" (Var_expander.replace_fn "" replace_none_fn); +- assert_equal_string "x" (Var_expander.replace_fn "x" replace_none_fn); +- assert_equal_string "%{}" (Var_expander.replace_fn "%{}" replace_none_fn); +- assert_equal_string "%{EMPTY}" (Var_expander.replace_fn "%{EMPTY}" replace_none_fn); +- assert_equal_string "%{EMPTY} %{no}" (Var_expander.replace_fn "%{EMPTY} %{no}" replace_none_fn); +- assert_equal_string "a %{EMPTY} b" (Var_expander.replace_fn "a %{EMPTY} b" replace_none_fn); +- () +- +-let test_replacements () = +- assert_equal_string "" (Var_expander.replace_fn "%{EMPTY}" replace_empty_fn); +- assert_equal_string "x " (Var_expander.replace_fn "x %{EMPTY}" replace_empty_fn); +- assert_equal_string "xy" (Var_expander.replace_fn "x%{EMPTY}y" replace_empty_fn); +- assert_equal_string "x<->y" (Var_expander.replace_fn "x%{FOO}y" (function | "FOO" -> Some "<->" | _ -> None)); +- assert_equal_string "a x b" (Var_expander.replace_fn "a %{FOO} b" (function | "FOO" -> Some "x" | _ -> None)); +- assert_equal_string "%{FOO} x" (Var_expander.replace_fn "%{FOO} %{BAR}" (function | "BAR" -> Some "x" | _ -> None)); +- assert_equal_string "%{FOO}" (Var_expander.replace_fn "%{BAR}" (function | "BAR" -> Some "%{FOO}" | _ -> None)); +- assert_equal_string "%{FOO} x" (Var_expander.replace_fn "%{BAR} %{FOO}" (function | "BAR" -> Some "%{FOO}" | "FOO" -> Some "x" | _ -> None)); +- begin +- let str = "%{INDEX}, %{INDEX}, %{INDEX}" in +- let index = ref 0 in +- let fn = function +- | "INDEX" -> +- incr index; +- Some (string_of_int !index) +- | _ -> None +- in +- assert_equal_string "1, 2, 3" (Var_expander.replace_fn str fn) +- end; +- () +- +-let test_escape () = +- assert_equal_string "%%{FOO}" (Var_expander.replace_fn "%%{FOO}" replace_empty_fn); +- assert_equal_string "x %%{FOO} x" (Var_expander.replace_fn "%{FOO} %%{FOO} %{FOO}" (function | "FOO" -> Some "x" | _ -> None)); +- () +- +-let test_list () = +- assert_equal_string "x %{NONE}" (Var_expander.replace_list "%{FOO} %{NONE}" [("FOO", "x")]); +- () +- +-let test_scan_variables () = +- let assert_invalid_variable var = +- let str = "%{" ^ var ^ "}" in +- assert_raises (Var_expander.Invalid_variable var) +- (fun () -> Var_expander.scan_variables str) +- in +- assert_equal_stringlist [] (Var_expander.scan_variables ""); +- assert_equal_stringlist [] (Var_expander.scan_variables "foo"); +- assert_equal_stringlist ["FOO"] (Var_expander.scan_variables "%{FOO}"); +- assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %{BAR}"); +- assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %{BAR} %{FOO}"); +- assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %%{ESCAPED} %{BAR}"); +- assert_invalid_variable "FOO/BAR"; +- () +- +-let test_errors () = +- let assert_invalid_variable var = +- let str = "%{" ^ var ^ "}" in +- assert_raises (Var_expander.Invalid_variable var) +- (fun () -> Var_expander.replace_fn str replace_none_fn) +- in +- assert_invalid_variable "FOO/BAR"; +- assert_invalid_variable "FOO:BAR"; +- assert_invalid_variable "FOO(BAR"; +- assert_invalid_variable "FOO)BAR"; +- assert_invalid_variable "FOO@BAR"; +- () +- +-(* Suites declaration. *) +-let suite = +- TestList ([ +- "basic" >::: [ +- "no_replacement" >:: test_no_replacement; +- "replacements" >:: test_replacements; +- "escape" >:: test_escape; +- "list" >:: test_list; +- "scan_variables" >:: test_scan_variables; +- "errors" >:: test_errors; +- ]; +- ]) +- +-let () = +- ignore (run_test_tt_main suite); +- Printf.fprintf stderr "\n" +diff --git a/tests/Makefile.am b/tests/Makefile.am +index db32e42b..e787a86c 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -81,7 +81,6 @@ TESTS = \ + test-v2v-machine-readable.sh \ + test-v2v-networks-and-bridges.sh \ + test-v2v-o-glance.sh \ +- test-v2v-o-json.sh \ + test-v2v-o-libvirt.sh \ + test-v2v-o-null.sh \ + test-v2v-o-openstack.sh \ +@@ -241,7 +240,6 @@ EXTRA_DIST += \ + test-v2v-networks-and-bridges.sh \ + test-v2v-networks-and-bridges-expected.xml \ + test-v2v-o-glance.sh \ +- test-v2v-o-json.sh \ + test-v2v-o-libvirt.sh \ + test-v2v-o-null.sh \ + test-v2v-o-openstack.sh \ +diff --git a/tests/test-v2v-o-json.sh b/tests/test-v2v-o-json.sh +deleted file mode 100755 +index 15e7ad5a..00000000 +--- a/tests/test-v2v-o-json.sh ++++ /dev/null +@@ -1,68 +0,0 @@ +-#!/bin/bash - +-# libguestfs virt-v2v test script +-# Copyright (C) 2019 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 -o json. +- +-set -e +-set -x +- +-source ./functions.sh +-set -e +-set -x +- +-skip_if_skipped +-requires test -f ../test-data/phony-guests/windows.img +-requires jq --version +- +-libvirt_uri="test://$abs_top_builddir/test-data/phony-guests/guests.xml" +- +-export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools" +- +-guestname=windows +- +-d=test-v2v-o-json.d +-rm -rf $d +-cleanup_fn rm -r $d +-mkdir $d +- +-json=$d/$guestname.json +-disk=$d/$guestname-sda +- +-$VG virt-v2v --debug-gc \ +- -i libvirt -ic "$libvirt_uri" windows \ +- -o json -os $d -on $guestname +- +-# Test the disk was created. +-test -f $disk +- +-# Test the JSON. +-test x$(jq -r '.name' $json) = xwindows +-test x$(jq -r '.inspect.type' $json) = xwindows +-test x$(jq -r '.inspect.distro' $json) = xwindows +-test $(jq -r '.disks | length' $json) -eq 1 +-test $(jq -r '.disks[0].file' $json) = $(realpath $disk) +-test $(jq -r '.nics | length' $json) -eq 1 +-test $(jq -r '.removables | length' $json) -eq 0 +- +-# libguestfs 1.40 didn't have osinfo inspection data, but we want this +-# test to work with 1.40, so ignore if jq returns this field as +-# "null". +-osinfo=$(jq -r '.inspect.osinfo' $json) +-if [ "x$osinfo" != "xnull" ]; then +- test x$osinfo = xwin7 +-fi +diff --git a/v2v/v2v.ml b/v2v/v2v.ml +index e00f9814..994982ac 100644 +--- a/v2v/v2v.ml ++++ b/v2v/v2v.ml +@@ -194,7 +194,6 @@ let rec main () = + match mode with + | "libvirt" -> output_mode := `Libvirt + | "disk" | "local" -> output_mode := `Disk +- | "json" -> output_mode := `JSON + | "null" -> output_mode := `Null + | "openstack" | "osp" | "rhosp" -> output_mode := `Openstack + | "ovirt" | "rhv" | "rhev" -> output_mode := `RHV +@@ -241,7 +240,7 @@ let rec main () = + s_"Map network ‘in’ to ‘out’"; + [ L"no-trim" ], Getopt.String ("-", no_trim_warning), + s_"Ignored for backwards compatibility"; +- [ S 'o' ], Getopt.String ("json|libvirt|local|null|openstack|qemu|rhv|rhv-upload|vdsm", set_output_mode), ++ [ S 'o' ], Getopt.String ("libvirt|local|null|openstack|qemu|rhv|rhv-upload|vdsm", set_output_mode), + s_"Set output mode (default: libvirt)"; + [ M"oa" ], Getopt.String ("sparse|preallocated", set_output_alloc), + s_"Set output allocation mode"; +@@ -376,7 +375,6 @@ read the man page virt-v2v(1). + pr "input:libvirtxml\n"; + pr "input:ova\n"; + pr "input:vmx\n"; +- pr "output:json\n"; + pr "output:libvirt\n"; + pr "output:local\n"; + pr "output:null\n"; +@@ -472,8 +470,7 @@ read the man page virt-v2v(1). + | `Openstack -> (module Output_openstack.Openstack) + | `RHV_Upload -> (module Output_rhv_upload.RHVUpload) + | `RHV -> (module Output_rhv.RHV) +- | `VDSM -> (module Output_vdsm.VDSM) +- | `JSON -> (module Output_json.Json) in ++ | `VDSM -> (module Output_vdsm.VDSM) in + + let output_options = { + Output.output_alloc = output_alloc; diff --git a/SOURCES/0011-output-Remove-unused-dummy.c.patch b/SOURCES/0011-output-Remove-unused-dummy.c.patch new file mode 100644 index 0000000..7c00d1a --- /dev/null +++ b/SOURCES/0011-output-Remove-unused-dummy.c.patch @@ -0,0 +1,27 @@ +From 42da4736c2078801c0a5ebbe3825086f9b8d25ea Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 12 Apr 2022 11:53:45 +0100 +Subject: [PATCH] output: Remove unused dummy.c +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This was removed when I removed -o json support, but I did not delete +the file from git. “make maintainer-check-extra-dist” complained +about this. + +Fixes: commit 4e6b389b4e27c8d13e57fcaf777d96ad7e08650b +(cherry picked from commit 0a1286df1725560e2789134d12022fc52572f9b0) +--- + output/dummy.c | 2 -- + 1 file changed, 2 deletions(-) + delete mode 100644 output/dummy.c + +diff --git a/output/dummy.c b/output/dummy.c +deleted file mode 100644 +index ebab6198..00000000 +--- a/output/dummy.c ++++ /dev/null +@@ -1,2 +0,0 @@ +-/* Dummy source, to be used for OCaml-based tools with no C sources. */ +-enum { foo = 1 }; diff --git a/SOURCES/0012-adopt-inversion-of-SELinux-relabeling-in-virt-custom.patch b/SOURCES/0012-adopt-inversion-of-SELinux-relabeling-in-virt-custom.patch new file mode 100644 index 0000000..dd89566 --- /dev/null +++ b/SOURCES/0012-adopt-inversion-of-SELinux-relabeling-in-virt-custom.patch @@ -0,0 +1,79 @@ +From 7b22bc65e5df2bbe9f5ccf8ab05e67afb5a4cb8f Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Tue, 10 May 2022 12:53:07 +0200 +Subject: [PATCH] adopt inversion of SELinux relabeling in virt-customize + +Remove "--selinux-relabel" options. + +Do not add any "--no-selinux-relabel" options; rely on the internal check +for SELinux support instead ("is_selinux_guest" in +"common/mlcustomize/SELinux_relabel.ml"). + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1554735 +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2075718 +Signed-off-by: Laszlo Ersek +Message-Id: <20220510105307.15402-1-lersek@redhat.com> +Acked-by: Richard W.M. Jones +[lersek@redhat.com: incorporate common submodule update] +(cherry picked from commit 0c24fc6015ce7719acff3bcead7eb227b6de3f21) +--- + common | 2 +- + tests/test-v2v-conversion-of.sh | 7 ------- + 2 files changed, 1 insertion(+), 8 deletions(-) + +Submodule common 201632e4..af6cb55b (rewind): +diff --git a/common/mlcustomize/guest_packages.ml b/common/mlcustomize/guest_packages.ml +index 7c29a2ab..4c3c34ed 100644 +--- a/common/mlcustomize/guest_packages.ml ++++ b/common/mlcustomize/guest_packages.ml +@@ -73,9 +73,9 @@ let install_command packages package_management = + | "zypper" -> sprintf "zypper -n in -l %s" quoted_args + + | "unknown" -> +- error_unknown_package_manager "--install" ++ error_unknown_package_manager (s_"--install") + | pm -> +- error_unimplemented_package_manager "--install" pm ++ error_unimplemented_package_manager (s_"--install") pm + + let update_command package_management = + match package_management with +@@ -103,9 +103,9 @@ let update_command package_management = + | "zypper" -> "zypper -n update -l" + + | "unknown" -> +- error_unknown_package_manager "--update" ++ error_unknown_package_manager (s_"--update") + | pm -> +- error_unimplemented_package_manager "--update" pm ++ error_unimplemented_package_manager (s_"--update") pm + + let uninstall_command packages package_management = + let quoted_args = String.concat " " (List.map quote packages) in +@@ -127,6 +127,6 @@ let uninstall_command packages package_management = + | "zypper" -> sprintf "zypper -n rm %s" quoted_args + + | "unknown" -> +- error_unknown_package_manager "--uninstall" ++ error_unknown_package_manager (s_"--uninstall") + | pm -> +- error_unimplemented_package_manager "--uninstall" pm ++ error_unimplemented_package_manager (s_"--uninstall") pm +diff --git a/tests/test-v2v-conversion-of.sh b/tests/test-v2v-conversion-of.sh +index 5a974d1b..5c5cae7c 100755 +--- a/tests/test-v2v-conversion-of.sh ++++ b/tests/test-v2v-conversion-of.sh +@@ -53,13 +53,6 @@ fi + # Some guests need special virt-builder parameters. + # See virt-builder --notes "$guestname" + declare -a extra +-case "$guestname" in +- fedora*|rhel*|centos*) +- extra[${#extra[*]}]='--selinux-relabel' +- ;; +- *) +- ;; +-esac + + # Don't try to update Windows versions. + case "$guestname" in diff --git a/SOURCES/0013-output-create_libvirt_xml-wire-up-the-QEMU-guest-age.patch b/SOURCES/0013-output-create_libvirt_xml-wire-up-the-QEMU-guest-age.patch new file mode 100644 index 0000000..9fa3822 --- /dev/null +++ b/SOURCES/0013-output-create_libvirt_xml-wire-up-the-QEMU-guest-age.patch @@ -0,0 +1,105 @@ +From 0699afed37343d73c6803cabec466e1c3ca229b0 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Mon, 13 Jun 2022 19:01:32 +0200 +Subject: [PATCH] output/create_libvirt_xml: wire up the QEMU guest agent + +The intent (even before RHBZ#2028764) has been to install the QEMU guest +agent in the converted domain unconditionally. Therefore, in order for the +GA to be actually accessible from the host side, augment the libvirt +output module with a "guest agent connection" also unconditionally. + +For starters, the domain needs a virtio-serial device. Then there must be +a port on the device that (in the guest) the GA identifies by name, and +that (on the host) is exposed as a listening socket (usually in the unix +address family). The adress of that port (usually a pathname, i.e., for a +unix domain socket) is then passed to whatever host-side application wants +to talk to the GA. + +The minimal domain XML fragment for that ("minimal" for our purposes) is + + + + + + +The "controller" element is needed because "controller/@model" is where we +regulate "virtio" vs. "virtio-transitional". + +Everything else is filled in by libvirt. Notably, libvirt (a) creates and +binds the unix domain socket itself (usually +"/var/lib/libvirt/qemu/channel/target/DOMAIN/org.qemu.guest_agent.0"), (b) +passes the file descriptor to QEMU, and (c) figures out the socket +pathname for commands such as + + virsh domfsinfo DOMAIN + virsh domhostname DOMAIN --source agent + virsh domifaddr DOMAIN --source agent + virsh guestinfo DOMAIN + +For QEMU, the corresponding options would be + + -chardev socket,id=agent,server=on,wait=off,path=/tmp/DOMAIN-agent \ + -device virtio-serial-pci,id=vioserial \ + -device virtserialport,bus=vioserial.0,nr=1,chardev=agent,name=org.qemu.guest_agent.0 \ + +Note the "path=/tmp/DOMAIN-agent" property of "-chardev"; virt-v2v would +have to generate that (in place of the "fd=nnnn" property that libvirt +passes to QEMU). + +Omit extending the QEMU output module for now, as the QGA protocol is +based on JSON, and one needs "virsh" or "virt-manager" (or another +management application interface) anyway, for efficiently exchanging +messages with QGA. I don't know of end-user tools that directly connect to +"/tmp/DOMAIN-agent". + +Don't modify the RHV and OpenStack outputs either; both of these +management products likely configure the virtio-serial device +automatically, for the agent access. + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2028764 +Signed-off-by: Laszlo Ersek +Message-Id: <20220613170135.12557-2-lersek@redhat.com> +Reviewed-by: Richard W.M. Jones +Tested-by: Richard W.M. Jones +(cherry picked from commit 48c6ea27c5a7053e418622f7450e3f9ef05c923f) +--- + output/create_libvirt_xml.ml | 11 +++++++++++ + tests/test-v2v-i-ova.xml | 4 ++++ + 2 files changed, 15 insertions(+) + +diff --git a/output/create_libvirt_xml.ml b/output/create_libvirt_xml.ml +index 68d0a909..531a4f75 100644 +--- a/output/create_libvirt_xml.ml ++++ b/output/create_libvirt_xml.ml +@@ -524,6 +524,17 @@ let create_libvirt_xml ?pool source inspect + e "console" ["type", "pty"] []; + ]; + ++ (* Given that we install the QEMU Guest Agent for both Linux and Windows ++ * guests unconditionally, create the virtio-serial device that's needed for ++ * communication between the host and the agent. ++ *) ++ List.push_back_list devices [ ++ e "controller" ["type", "virtio-serial"; "model", virtio_model] []; ++ e "channel" ["type", "unix"] [ ++ e "target" ["type", "virtio"; "name", "org.qemu.guest_agent.0"] [] ++ ] ++ ]; ++ + List.push_back_list body [ + e "devices" [] !devices; + ]; +diff --git a/tests/test-v2v-i-ova.xml b/tests/test-v2v-i-ova.xml +index 6b8cda62..da1db473 100644 +--- a/tests/test-v2v-i-ova.xml ++++ b/tests/test-v2v-i-ova.xml +@@ -49,5 +49,9 @@ + + + ++ ++ ++ ++ + + diff --git a/SOURCES/0014-convert_linux-extract-qemu-guest-agent-package-name.patch b/SOURCES/0014-convert_linux-extract-qemu-guest-agent-package-name.patch new file mode 100644 index 0000000..a5d7e2f --- /dev/null +++ b/SOURCES/0014-convert_linux-extract-qemu-guest-agent-package-name.patch @@ -0,0 +1,82 @@ +From 82c7526e052d2aa64a6754ff0e1082937e3ee4bc Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Mon, 13 Jun 2022 19:01:34 +0200 +Subject: [PATCH] convert_linux: extract qemu-guest-agent package name + +In commit a30383e35d34 ("v2v: linux: do not install qemu-guest-agent if +already installed", 2019-09-20), the name of the package providing the +QEMU guest agent was hard-coded as "qemu-guest-agent", regardless of +distro family. Turns out this is actually correct (and may have been +intentional, only it was not specifically documented): in all OS families +currently recognized by our "family" function (`RHEL_family, `ALT_family, +`SUSE_family, `Debian_family), the *binary* package is indeed called +"qemu-guest-agent": + +- https://brewweb.engineering.redhat.com/brew/packageinfo?packageID=47646 +- http://rpmfind.net/linux/rpm2html/search.php?query=qemu-guest-agent&submit=Search+...&system=&arch= +- https://packages.altlinux.org/en/sisyphus/srpms/qemu/ +- https://packages.debian.org/search?keywords=qemu-guest-agent&searchon=names&suite=all§ion=all + +As a way of documenting this, extract the mapping to a new helper function +named "qga_pkg_of_family". + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2028764 +Signed-off-by: Laszlo Ersek +Reviewed-by: Richard W.M. Jones +Message-Id: <20220613170135.12557-4-lersek@redhat.com> +(cherry picked from commit f65e8e68fb4eb9b8d40ac0fe7bfc3122a13e5251) +--- + convert/convert_linux.ml | 33 +++++++++++++++++++++++++-------- + 1 file changed, 25 insertions(+), 8 deletions(-) + +diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml +index 79462aa1..2ddbc07a 100644 +--- a/convert/convert_linux.ml ++++ b/convert/convert_linux.ml +@@ -56,6 +56,16 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ = + | "debian" | "ubuntu" | "linuxmint" | "kalilinux" -> `Debian_family + | _ -> assert false in + ++ (* map the OS family name to the qemu-guest-agent package name *) ++ let qga_pkg_of_family = ++ function ++ | `RHEL_family ++ | `ALT_family ++ | `SUSE_family ++ | `Debian_family -> Some "qemu-guest-agent" ++ | _ -> None ++ in ++ + assert (inspect.i_package_format = "rpm" || inspect.i_package_format = "deb"); + + (* Fail early if i_apps is empty. Certain steps such as kernel +@@ -539,14 +549,21 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ = + + and install_linux_tools () = + (* It is not fatal if we fail to install the QEMU guest agent. *) +- let has_qemu_guest_agent = +- List.exists ( +- fun { G.app2_name = name } -> +- name = "qemu-guest-agent" +- ) inspect.i_apps in +- if not has_qemu_guest_agent then +- (* FIXME -- install qemu-guest-agent here *) +- () ++ match qga_pkg_of_family family with ++ | None -> warning (f_"The name of the package that provides the QEMU Guest \ ++ Agent for this guest OS is unknown. The guest agent \ ++ will not be installed. Please consider reporting a \ ++ bug according to the BUGS section of the virt-v2v(1) \ ++ manual.") ++ | Some qga_pkg -> ++ let has_qemu_guest_agent = ++ List.exists ( ++ fun { G.app2_name = name } -> ++ name = qga_pkg ++ ) inspect.i_apps in ++ if not has_qemu_guest_agent then ++ (* FIXME -- install qemu-guest-agent here *) ++ () + + and configure_kernel () = + (* Previously this function would try to install kernels, but we diff --git a/SOURCES/0015-convert_linux-install-the-QEMU-guest-agent-with-a-fi.patch b/SOURCES/0015-convert_linux-install-the-QEMU-guest-agent-with-a-fi.patch new file mode 100644 index 0000000..5a5c7cb --- /dev/null +++ b/SOURCES/0015-convert_linux-install-the-QEMU-guest-agent-with-a-fi.patch @@ -0,0 +1,119 @@ +From e32a5ee7deb9a381ab285aba92c4de23e3c6ee2e Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Mon, 13 Jun 2022 19:01:35 +0200 +Subject: [PATCH] convert_linux: install the QEMU guest agent with a firstboot + script + +Register a firstboot script, for installing the guest agent with the +guest's own package manager -- that is, "Guest_packages.install_command". + +For installing the package, network connectivity is required. Check it +first with "nmcli" (also checking whether NetworkManager is running), then +with "systemd-networkd-wait-online" (dependent on systemd-networkd). Note +that NetworkManager and systemd-networkd are never supposed to be enabled +at the same time. + +The source domain's SELinux policy may not allow our firstboot service to +execute the package's installation scripts (if any). For that reason, +temporarily disable SELinux around package installation. + +After installation, register another script for launching the agent. + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2028764 +Signed-off-by: Laszlo Ersek +Message-Id: <20220613170135.12557-5-lersek@redhat.com> +Reviewed-by: Richard W.M. Jones +(cherry picked from commit e64356896377af1ac75a03d6a4c6a4208910bbf4) +--- + convert/convert_linux.ml | 78 ++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 76 insertions(+), 2 deletions(-) + +diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml +index 2ddbc07a..59d143bd 100644 +--- a/convert/convert_linux.ml ++++ b/convert/convert_linux.ml +@@ -562,8 +562,82 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ = + name = qga_pkg + ) inspect.i_apps in + if not has_qemu_guest_agent then +- (* FIXME -- install qemu-guest-agent here *) +- () ++ try ++ let inst_cmd = Guest_packages.install_command [qga_pkg] ++ inspect.i_package_management in ++ ++ (* Use only the portable filename character set in this. *) ++ let selinux_enforcing = "/root/virt-v2v-fb-selinux-enforcing" ++ and timeout = 30 in ++ let fbs = ++ Firstboot.add_firstboot_script g inspect.i_root ++ in ++ info (f_"The QEMU Guest Agent will be installed for this guest at \ ++ first boot."); ++ ++ (* Wait for the network to come online in the guest (best effort). ++ *) ++ fbs "wait online" ++ (sprintf "#!/bin/sh\n\ ++ if conn=$(nmcli networking connectivity); then\n\ ++ \ \ tries=0\n\ ++ \ \ while\n\ ++ \ \ \ \ test $tries -lt %d &&\n\ ++ \ \ \ \ test full != \"$conn\"\n\ ++ \ \ do\n\ ++ \ \ \ \ sleep 1\n\ ++ \ \ \ \ tries=$((tries + 1))\n\ ++ \ \ \ \ conn=$(nmcli networking connectivity)\n\ ++ \ \ done\n\ ++ elif systemctl -q is-active systemd-networkd; then\n\ ++ \ \ /usr/lib/systemd/systemd-networkd-wait-online \\\n\ ++ \ \ \ \ -q --timeout=%d\n\ ++ fi\n" timeout timeout); ++ ++ (* Disable SELinux temporarily around package installation. Refer to ++ * and ++ * . ++ *) ++ fbs "setenforce 0" ++ (sprintf "#!/bin/sh\n\ ++ rm -f %s\n\ ++ if command -v getenforce >/dev/null &&\n\ ++ \ \ test Enforcing = \"$(getenforce)\"\n\ ++ then\n\ ++ \ \ touch %s\n\ ++ \ \ setenforce 0\n\ ++ fi\n" selinux_enforcing selinux_enforcing); ++ fbs "install qga" inst_cmd; ++ fbs "setenforce restore" ++ (sprintf "#!/bin/sh\n\ ++ if test -f %s; then\n\ ++ \ \ setenforce 1\n\ ++ \ \ rm -f %s\n\ ++ fi\n" selinux_enforcing selinux_enforcing); ++ ++ (* Start the agent now and at subsequent boots. The following ++ * commands should work on both sysvinit distros / distro versions ++ * (regardless of "/etc/rc.d/" vs. "/etc/init.d/" being the scheme ++ * in use) and systemd distros (via redirection to systemctl). ++ * ++ * On distros where the chkconfig command is redirected to ++ * systemctl, the chkconfig command is likely superfluous. That's ++ * because on systemd distros, the QGA package comes with such ++ * runtime dependencies / triggers that the presence of the ++ * virtio-serial port named "org.qemu.guest_agent.0" automatically ++ * starts the agent during (second and later) boots. However, even ++ * on such distros, the chkconfig command should do no harm. ++ *) ++ fbs "start qga" ++ (sprintf "#!/bin/sh\n\ ++ service %s start\n\ ++ chkconfig %s on\n" qga_pkg qga_pkg) ++ with ++ | Guest_packages.Unknown_package_manager msg ++ | Guest_packages.Unimplemented_package_manager msg -> ++ warning (f_"The QEMU Guest Agent will not be installed. The \ ++ install command for package ‘%s’ could not be created: \ ++ %s.") qga_pkg msg + + and configure_kernel () = + (* Previously this function would try to install kernels, but we diff --git a/SOURCES/0016-RHV-outputs-limit-copied-disk-count-to-23.patch b/SOURCES/0016-RHV-outputs-limit-copied-disk-count-to-23.patch new file mode 100644 index 0000000..411ecd7 --- /dev/null +++ b/SOURCES/0016-RHV-outputs-limit-copied-disk-count-to-23.patch @@ -0,0 +1,122 @@ +From 50a74177b3577952159d87335cf40c0ad3e51b4d Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Fri, 17 Jun 2022 11:53:37 +0200 +Subject: [PATCH] RHV outputs: limit copied disk count to 23 + +We currently support virtio-blk (commonly) or IDE (unusually) for exposing +disks to the converted guest; refer to "guestcaps.gcaps_block_bus" in +"lib/create_ovf.ml". When using virtio-blk (i.e., in the common case), RHV +can deal with at most 23 disks, as it plugs each virtio-blk device in a +separate slot on the PCI(e) root bus; and the other slots are reserved for +various purposes. When a domain has too many disks, the problem only +becomes apparent once the copying finishes and an import is attempted. +Modify the RHV outputs to fail relatively early when a domain has more +than 23 disks that need to be copied. + +Notes: + +- With IDE, the theoretical limit may even be as low as 4. However, in the + "Output_module.setup" function, we don't have access to + "guestcaps.gcaps_block_bus", and in practice the IDE limitation has not + caused surprises. So for now stick with 23, assuming virtio-blk. + Modifying the "Output_module.setup" parameter list just for this seems + overkill. + +- We could move the new check to an even earlier step, namely + "Output_module.parse_options", due to the v2v directory deliberately + existing (and having been populated with input sockets) at that time. + However, even discounting the fact that "parse_options" is not a good + name for including this kind of step, "parse_options" does not have + access to the v2v directory name, and modifying the signature just for + this is (again) overkill. + +- By adding the check to "Output_module.setup", we waste *some* effort + (namely, the conversion occurs between "parse_options" and "setup"), + but: (a) the "rhv-disk-uuid" count check (against the disk count) is + already being done in the rhv-upload module's "setup" function, (b) in + practice the slowest step ought to be the copying, and placing the new + check in "setup" is early enough to prevent that. + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2051564 +Signed-off-by: Laszlo Ersek +Message-Id: <20220617095337.9122-1-lersek@redhat.com> +Reviewed-by: Richard W.M. Jones +(cherry picked from commit e186cc2bea99a077990f192953e1bf6c9ba70e79) +--- + output/output.ml | 5 +++++ + output/output.mli | 7 +++++++ + output/output_rhv.ml | 1 + + output/output_rhv_upload.ml | 1 + + output/output_vdsm.ml | 1 + + 5 files changed, 15 insertions(+) + +diff --git a/output/output.ml b/output/output.ml +index 10e685c4..5c6670b9 100644 +--- a/output/output.ml ++++ b/output/output.ml +@@ -64,6 +64,11 @@ let get_disks dir = + in + loop [] 0 + ++let error_if_disk_count_gt dir n = ++ let socket = sprintf "%s/in%d" dir n in ++ if Sys.file_exists socket then ++ error (f_"this output module doesn't support copying more than %d disks") n ++ + let output_to_local_file ?(changeuid = fun f -> f ()) + output_alloc output_format filename size socket = + (* Check nbdkit is installed and has the required plugin. *) +diff --git a/output/output.mli b/output/output.mli +index 533a0c51..8d3d6865 100644 +--- a/output/output.mli ++++ b/output/output.mli +@@ -76,6 +76,13 @@ val get_disks : string -> (int * int64) list + (** Examines the v2v directory and opens each input socket (in0 etc), + returning a list of input disk index and size. *) + ++val error_if_disk_count_gt : string -> int -> unit ++(** This function lets an output module enforce a maximum disk count. ++ [error_if_disk_count_gt dir n] checks whether the domain has more than [n] ++ disks that need to be copied, by examining the existence of input NBD socket ++ "in[n]" in the v2v directory [dir]. If the socket exists, [error] is ++ called. *) ++ + val output_to_local_file : ?changeuid:((unit -> unit) -> unit) -> + Types.output_allocation -> + string -> string -> int64 -> string -> +diff --git a/output/output_rhv.ml b/output/output_rhv.ml +index 119207fd..8571e07b 100644 +--- a/output/output_rhv.ml ++++ b/output/output_rhv.ml +@@ -56,6 +56,7 @@ module RHV = struct + (options.output_alloc, options.output_format, output_name, output_storage) + + let rec setup dir options source = ++ error_if_disk_count_gt dir 23; + let disks = get_disks dir in + let output_alloc, output_format, output_name, output_storage = options in + +diff --git a/output/output_rhv_upload.ml b/output/output_rhv_upload.ml +index 828996b3..f2ced4f4 100644 +--- a/output/output_rhv_upload.ml ++++ b/output/output_rhv_upload.ml +@@ -133,6 +133,7 @@ after their uploads (if you do, you must supply one for each disk): + else PCRE.matches (Lazy.force rex_uuid) uuid + + let rec setup dir options source = ++ error_if_disk_count_gt dir 23; + let disks = get_disks dir in + let output_conn, output_format, + output_password, output_name, output_storage, +diff --git a/output/output_vdsm.ml b/output/output_vdsm.ml +index a1e8c246..23d1b9cd 100644 +--- a/output/output_vdsm.ml ++++ b/output/output_vdsm.ml +@@ -119,6 +119,7 @@ For each disk you must supply one of each of these options: + compat, ovf_flavour) + + let setup dir options source = ++ error_if_disk_count_gt dir 23; + let disks = get_disks dir in + let output_alloc, output_format, + output_name, output_storage, diff --git a/SOURCES/0017-convert-document-networking-dependency-of-key-ID-cle.patch b/SOURCES/0017-convert-document-networking-dependency-of-key-ID-cle.patch new file mode 100644 index 0000000..c244498 --- /dev/null +++ b/SOURCES/0017-convert-document-networking-dependency-of-key-ID-cle.patch @@ -0,0 +1,49 @@ +From 81a201269e5451cd76348e0da6d0ef4c0fb4c0dd Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Fri, 1 Jul 2022 15:30:42 +0200 +Subject: [PATCH] convert: document networking dependency of "--key ID:clevis" + +Virt-v2v enables appliance networking already, for the sake of +"unconfigure_vmware". We now have a second use case for networking: "--key +ID:clevis". Update the comment in the code. + +(Short log for libguestfs-common commit range 35467027f657..af6cb55bc58a: + +Laszlo Ersek (12): + options: fix UUID comparison logic bug in get_keys() + mltools/tools_utils: remove unused function "key_store_to_cli" + mltools/tools_utils: allow multiple "--key" options for OCaml tools too + options: replace NULL-termination with number-of-elements in get_keys() + options: wrap each passphrase from get_keys() into a struct + options: add back-end for LUKS decryption with Clevis+Tang + options: introduce selector type "key_clevis" + options: generalize "--key" selector parsing for C-language utilities + mltools/tools_utils-c: handle internal type error with abort() + mltools/tools_utils: generalize "--key" selector parsing for OCaml utils + options, mltools/tools_utils: parse "--key ID:clevis" options + options, mltools/tools_utils: add helper for network dependency +). + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1809453 +Signed-off-by: Laszlo Ersek +Message-Id: <20220628115856.5820-1-lersek@redhat.com> +Reviewed-by: Richard W.M. Jones +(cherry picked from commit 98fa5ab2685371c681282ce5de704877af27be74) +--- + convert/convert.ml | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/convert/convert.ml b/convert/convert.ml +index 5e0e6c2b..b678dc92 100644 +--- a/convert/convert.ml ++++ b/convert/convert.ml +@@ -57,7 +57,8 @@ let rec convert dir options source = + * sure this is not too large because each vCPU consumes guest RAM. + *) + g#set_smp (min 8 (Sysconf.nr_processors_online ())); +- (* The network is only used by the unconfigure_vmware () function. *) ++ (* The network is used by the unconfigure_vmware () function, and the "--key ++ * ID:clevis" command line options (if any). *) + g#set_network true; + List.iter ( + fun { s_disk_id = i } -> diff --git a/SOURCES/0018-qemu-nbd-Implement-output-compression-for-qcow2-file.patch b/SOURCES/0018-qemu-nbd-Implement-output-compression-for-qcow2-file.patch new file mode 100644 index 0000000..6f57e5c --- /dev/null +++ b/SOURCES/0018-qemu-nbd-Implement-output-compression-for-qcow2-file.patch @@ -0,0 +1,142 @@ +From 80831868395d161af8c47edf2f54234c63581d8d Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 28 Jan 2022 09:30:29 +0000 +Subject: [PATCH] qemu-nbd: Implement output compression for qcow2 files + +Reviewed-by: Laszlo Ersek +(cherry picked from commit 71c4301909cb307def02ebcd0e89beee4138e7f2) +--- + lib/qemuNBD.ml | 11 +++++++++-- + lib/qemuNBD.mli | 5 +++++ + output/output.ml | 39 ++++++++++++++++++++++++++++++++++++--- + output/output.mli | 1 + + 4 files changed, 51 insertions(+), 5 deletions(-) + +diff --git a/lib/qemuNBD.ml b/lib/qemuNBD.ml +index ae21b17c..bbb65f41 100644 +--- a/lib/qemuNBD.ml ++++ b/lib/qemuNBD.ml +@@ -55,14 +55,16 @@ type cmd = { + disk : string; + mutable snapshot : bool; + mutable format : string option; ++ mutable imgopts : bool; + } + +-let create disk = { disk; snapshot = false; format = None } ++let create disk = { disk; snapshot = false; format = None; imgopts = false } + + let set_snapshot cmd snap = cmd.snapshot <- snap + let set_format cmd format = cmd.format <- format ++let set_image_opts cmd imgopts = cmd.imgopts <- imgopts + +-let run_unix socket { disk; snapshot; format } = ++let run_unix socket { disk; snapshot; format; imgopts } = + assert (disk <> ""); + + (* Create a temporary directory where we place the PID file. *) +@@ -85,6 +87,11 @@ let run_unix socket { disk; snapshot; format } = + (* -s adds a protective overlay. *) + if snapshot then List.push_back args "-s"; + ++ (* --image-opts reinterprets the filename parameter as a set of ++ * image options. ++ *) ++ if imgopts then List.push_back args "--image-opts"; ++ + if have_selinux && qemu_nbd_has_selinux_label_option () then ( + List.push_back args "--selinux-label"; + List.push_back args "system_u:object_r:svirt_socket_t:s0" +diff --git a/lib/qemuNBD.mli b/lib/qemuNBD.mli +index e10d3106..afe9d944 100644 +--- a/lib/qemuNBD.mli ++++ b/lib/qemuNBD.mli +@@ -43,6 +43,11 @@ val set_snapshot : cmd -> bool -> unit + val set_format : cmd -> string option -> unit + (** Set the format [--format] parameter. *) + ++val set_image_opts : cmd -> bool -> unit ++(** Set whether the [--image-opts] parameter is used. This changes ++ the meaning of the [filename] parameter to a set of image options. ++ Consult the qemu-nbd man page for more details. *) ++ + val run_unix : string -> cmd -> string * int + (** Start qemu-nbd command listening on a Unix domain socket, + waiting for the process to start up. +diff --git a/output/output.ml b/output/output.ml +index 5c6670b9..23c3932d 100644 +--- a/output/output.ml ++++ b/output/output.ml +@@ -69,7 +69,7 @@ let error_if_disk_count_gt dir n = + if Sys.file_exists socket then + error (f_"this output module doesn't support copying more than %d disks") n + +-let output_to_local_file ?(changeuid = fun f -> f ()) ++let output_to_local_file ?(changeuid = fun f -> f ()) ?(compressed = false) + output_alloc output_format filename size socket = + (* Check nbdkit is installed and has the required plugin. *) + if not (Nbdkit.is_installed ()) then +@@ -78,6 +78,24 @@ let output_to_local_file ?(changeuid = fun f -> f ()) + error (f_"nbdkit-file-plugin is not installed or not working"); + let nbdkit_config = Nbdkit.config () in + ++ if compressed then ( ++ (* Only allow compressed with -of qcow2. *) ++ if output_format <> "qcow2" then ++ error (f_"‘-oo compressed’ is only allowed when the output format \ ++ is a local qcow2-format file, i.e. ‘-of qcow2’"); ++ ++ (* Check nbdcopy is new enough. This assumes that the version of ++ * libnbd is the same as the version of nbdcopy, but parsing this ++ * is easier. We can remove this check when we build-depend on ++ * libnbd >= 1.14. ++ *) ++ let version = ++ NBD.create () |> NBD.get_version |> ++ String.nsplit "." |> List.map int_of_string in ++ if version < [1; 13; 5] then ++ error (f_"-oo compressed option requires nbdcopy >= 1.13.5") ++ ); ++ + let g = open_guestfs () in + let preallocation = + match output_alloc with +@@ -103,9 +121,24 @@ let output_to_local_file ?(changeuid = fun f -> f ()) + On_exit.kill pid + + | "qcow2" -> +- let cmd = QemuNBD.create filename in ++ let cmd = ++ if compressed then ( ++ let qemu_quote str = String.replace str "," ",," in ++ let image_opts = [ "driver=compress"; ++ "file.driver=qcow2"; ++ "file.file.driver=file"; ++ "file.file.filename=" ^ qemu_quote filename ] in ++ let image_opts = String.concat "," image_opts in ++ let cmd = QemuNBD.create image_opts in ++ QemuNBD.set_image_opts cmd true; ++ cmd ++ ) ++ else (* not compressed *) ( ++ let cmd = QemuNBD.create filename in ++ QemuNBD.set_format cmd (Some "qcow2"); ++ cmd ++ ) in + QemuNBD.set_snapshot cmd false; +- QemuNBD.set_format cmd (Some "qcow2"); + let _, pid = QemuNBD.run_unix socket cmd in + On_exit.kill pid + +diff --git a/output/output.mli b/output/output.mli +index 8d3d6865..c1f0f53d 100644 +--- a/output/output.mli ++++ b/output/output.mli +@@ -84,6 +84,7 @@ val error_if_disk_count_gt : string -> int -> unit + called. *) + + val output_to_local_file : ?changeuid:((unit -> unit) -> unit) -> ++ ?compressed:bool -> + Types.output_allocation -> + string -> string -> int64 -> string -> + unit diff --git a/SOURCES/0019-o-disk-o-libvirt-o-qemu-Implement-of-qcow2-oo-compre.patch b/SOURCES/0019-o-disk-o-libvirt-o-qemu-Implement-of-qcow2-oo-compre.patch new file mode 100644 index 0000000..6da1880 --- /dev/null +++ b/SOURCES/0019-o-disk-o-libvirt-o-qemu-Implement-of-qcow2-oo-compre.patch @@ -0,0 +1,272 @@ +From ca3643d06eed2de22cb81ad2eb13ba7f75c0487e Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 28 Jan 2022 09:30:58 +0000 +Subject: [PATCH] -o disk, -o libvirt, -o qemu: Implement -of qcow2 -oo + compressed + +For various output modes, implement -oo compressed which can be used +to generate compressed qcow2 files. This option was dropped when +modularizing virt-v2v, and required changes to nbdcopy which are +finally upstream in libnbd >= 1.13.5. + +Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2047660 +Fixes: commit 255722cbf39afc0b012e2ac00d16fa6ba2f8c21f +Reported-by: Xiaodai Wang +Reviewed-by: Laszlo Ersek +(cherry picked from commit 53690a0c602a4286fdb9408fdf6a01cc352697ec) +--- + TODO | 14 -------------- + output/output_disk.ml | 29 +++++++++++++++++++++-------- + output/output_libvirt.ml | 31 ++++++++++++++++++++++--------- + output/output_qemu.ml | 38 +++++++++++++++++++++----------------- + 4 files changed, 64 insertions(+), 48 deletions(-) + +diff --git a/TODO b/TODO +index f578d506..04b1dd20 100644 +--- a/TODO ++++ b/TODO +@@ -1,17 +1,3 @@ +-virt-v2v -o disk|qemu -oo compressed +------------------------------------- +- +-This was temporarily dropped when I modularized virt-v2v. It would +-not be too difficult to add it back. The following is the qemu-nbd +-command required (to be run as the output helper) which creates a +-compressed qcow2 disk image: +- +-$ qemu-nbd --image-opts driver=compress,file.driver=qcow2,file.file.driver=file,file.file.filename=new.qcow2 +- +-Note this requires fixes in nbdcopy so it obeys the advertised block +-alignment: +-https://lists.gnu.org/archive/html/qemu-block/2022-01/threads.html#00729 +- + virt-v2v -o rhv-upload + ---------------------- + +diff --git a/output/output_disk.ml b/output/output_disk.ml +index bc5b4e1c..abcfcdc0 100644 +--- a/output/output_disk.ml ++++ b/output/output_disk.ml +@@ -30,7 +30,7 @@ open Create_libvirt_xml + open Output + + module Disk = struct +- type poptions = Types.output_allocation * string * string * string ++ type poptions = bool * Types.output_allocation * string * string * string + + type t = unit + +@@ -41,11 +41,21 @@ module Disk = struct + | None -> "" + + let query_output_options () = +- printf (f_"No output options can be used in this mode.\n") ++ printf (f_"Output options that can be used with -o disk: ++ ++ -oo compressed Compress the output file (used only with -of qcow2) ++") + + let parse_options options source = +- if options.output_options <> [] then +- error (f_"no -oo (output options) are allowed here"); ++ let compressed = ref false in ++ List.iter ( ++ function ++ | "compressed", "" -> compressed := true ++ | "compressed", v -> compressed := bool_of_string v ++ | k, _ -> ++ error (f_"-o disk: unknown output option ‘-oo %s’") k ++ ) options.output_options; ++ + if options.output_password <> None then + error_option_cannot_be_used_in_output_mode "local" "-op"; + +@@ -60,11 +70,13 @@ module Disk = struct + + let output_name = Option.default source.s_name options.output_name in + +- options.output_alloc, options.output_format, output_name, output_storage ++ !compressed, options.output_alloc, options.output_format, ++ output_name, output_storage + + let setup dir options source = + let disks = get_disks dir in +- let output_alloc, output_format, output_name, output_storage = options in ++ let compressed, output_alloc, output_format, output_name, output_storage = ++ options in + + List.iter ( + fun (i, size) -> +@@ -73,11 +85,12 @@ module Disk = struct + + (* Create the actual output disk. *) + let outdisk = disk_path output_storage output_name i in +- output_to_local_file output_alloc output_format outdisk size socket ++ output_to_local_file ~compressed output_alloc output_format ++ outdisk size socket + ) disks + + let finalize dir options () source inspect target_meta = +- let output_alloc, output_format, output_name, output_storage = options in ++ let _, output_alloc, output_format, output_name, output_storage = options in + + (* Convert metadata to libvirt XML. *) + (match target_meta.target_firmware with +diff --git a/output/output_libvirt.ml b/output/output_libvirt.ml +index e0d3432d..04b4c5f8 100644 +--- a/output/output_libvirt.ml ++++ b/output/output_libvirt.ml +@@ -32,7 +32,7 @@ open Create_libvirt_xml + open Output + + module Libvirt_ = struct +- type poptions = Libvirt.rw Libvirt.Connect.t Lazy.t * ++ type poptions = Libvirt.rw Libvirt.Connect.t Lazy.t * bool * + Types.output_allocation * string * string * string + + type t = string * string +@@ -44,11 +44,21 @@ module Libvirt_ = struct + | None -> "" + + let query_output_options () = +- printf (f_"No output options can be used in this mode.\n") ++ printf (f_"Output options that can be used with -o libvirt: ++ ++ -oo compressed Compress the output file (used only with -of qcow2) ++") + + let parse_options options source = +- if options.output_options <> [] then +- error (f_"no -oo (output options) are allowed here"); ++ let compressed = ref false in ++ List.iter ( ++ function ++ | "compressed", "" -> compressed := true ++ | "compressed", v -> compressed := bool_of_string v ++ | k, _ -> ++ error (f_"-o disk: unknown output option ‘-oo %s’") k ++ ) options.output_options; ++ + if options.output_password <> None then + error_option_cannot_be_used_in_output_mode "libvirt" "-op"; + +@@ -59,12 +69,13 @@ module Libvirt_ = struct + + let output_name = Option.default source.s_name options.output_name in + +- (conn, options.output_alloc, options.output_format, output_name, +- output_pool) ++ (conn, !compressed, options.output_alloc, options.output_format, ++ output_name, output_pool) + + let setup dir options source = + let disks = get_disks dir in +- let conn, output_alloc, output_format, output_name, output_pool = options in ++ let conn, compressed, output_alloc, output_format, ++ output_name, output_pool = options in + let conn = Lazy.force conn in + + (* Get the capabilities from libvirt. *) +@@ -119,13 +130,15 @@ module Libvirt_ = struct + + (* Create the actual output disk. *) + let outdisk = target_path // output_name ^ "-sd" ^ (drive_name i) in +- output_to_local_file output_alloc output_format outdisk size socket ++ output_to_local_file ~compressed output_alloc output_format ++ outdisk size socket + ) disks; + + (capabilities_xml, pool_name) + + let rec finalize dir options t source inspect target_meta = +- let conn, output_alloc, output_format, output_name, output_pool = options in ++ let conn, _, output_alloc, output_format, output_name, output_pool = ++ options in + let capabilities_xml, pool_name = t in + + (match target_meta.target_firmware with +diff --git a/output/output_qemu.ml b/output/output_qemu.ml +index 527d3c5e..e7efbb73 100644 +--- a/output/output_qemu.ml ++++ b/output/output_qemu.ml +@@ -29,7 +29,8 @@ open Utils + open Output + + module QEMU = struct +- type poptions = bool * Types.output_allocation * string * string * string ++ type poptions = bool * bool * ++ Types.output_allocation * string * string * string + + type t = unit + +@@ -42,6 +43,7 @@ module QEMU = struct + let query_output_options () = + printf (f_"Output options (-oo) which can be used with -o qemu: + ++ -oo compressed Compress the output file (used only with -of qcow2) + -oo qemu-boot Boot the guest in qemu after conversion + ") + +@@ -49,19 +51,19 @@ module QEMU = struct + if options.output_password <> None then + error_option_cannot_be_used_in_output_mode "qemu" "-op"; + +- let qemu_boot = ref false in ++ let compressed = ref false ++ and qemu_boot = ref false in + List.iter ( +- fun (k, v) -> +- match k with +- | "qemu-boot" -> +- if v = "" || v = "true" then qemu_boot := true +- else if v = "false" then qemu_boot := false +- else +- error (f_"-o qemu: use -oo qemu-boot[=true|false]") +- | k -> +- error (f_"-o qemu: unknown output option ‘-oo %s’") k +- ) options.output_options; +- let qemu_boot = !qemu_boot in ++ function ++ | "compressed", "" -> compressed := true ++ | "compressed", v -> compressed := bool_of_string v ++ | "qemu-boot", "" -> qemu_boot := true ++ | "qemu-boot", v -> qemu_boot := bool_of_string v ++ | k, _ -> ++ error (f_"-o qemu: unknown output option ‘-oo %s’") k ++ ) options.output_options; ++ let compressed = !compressed ++ and qemu_boot = !qemu_boot in + + if qemu_boot then + error (f_"-o qemu: the -oo qemu-boot option cannot be used in RHEL"); +@@ -77,12 +79,13 @@ module QEMU = struct + + let output_name = Option.default source.s_name options.output_name in + +- (qemu_boot, options.output_alloc, options.output_format, ++ (compressed, qemu_boot, options.output_alloc, options.output_format, + output_name, output_storage) + + let setup dir options source = + let disks = get_disks dir in +- let _, output_alloc, output_format, output_name, output_storage = options in ++ let compressed, _, output_alloc, output_format, ++ output_name, output_storage = options in + + List.iter ( + fun (i, size) -> +@@ -91,11 +94,12 @@ module QEMU = struct + + (* Create the actual output disk. *) + let outdisk = disk_path output_storage output_name i in +- output_to_local_file output_alloc output_format outdisk size socket ++ output_to_local_file ~compressed output_alloc output_format ++ outdisk size socket + ) disks + + let finalize dir options () source inspect target_meta = +- let qemu_boot, output_alloc, output_format, ++ let _, qemu_boot, output_alloc, output_format, + output_name, output_storage = options in + + let { guestcaps; target_buses; target_firmware } = target_meta in diff --git a/SOURCES/0020-tests-Add-a-simple-test-of-o-local-of-qcow2-oo-compr.patch b/SOURCES/0020-tests-Add-a-simple-test-of-o-local-of-qcow2-oo-compr.patch new file mode 100644 index 0000000..7559e6c --- /dev/null +++ b/SOURCES/0020-tests-Add-a-simple-test-of-o-local-of-qcow2-oo-compr.patch @@ -0,0 +1,114 @@ +From 672b9795e85b48f337b3da2d6fa393e7788d79a1 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 1 Jul 2022 11:18:53 +0100 +Subject: [PATCH] tests: Add a simple test of -o local -of qcow2 -oo compressed + +This only tests that it doesn't completely fail, which it did before +we fixed nbdcopy. I checked the file sizes manually and with +compression the resulting file is about half the size. + +This test is a clone of tests/test-v2v-of-option.sh. In order to +compare the sizes across the two tests, and to keep the tests fairly +similar I added an ls -l command to the original test. + +Reviewed-by: Laszlo Ersek +(cherry picked from commit 7505750972b49e1a448c519a27998bd5f20be60a) +--- + tests/Makefile.am | 2 + + tests/test-v2v-o-local-qcow2-compressed.sh | 53 ++++++++++++++++++++++ + tests/test-v2v-of-option.sh | 2 + + 3 files changed, 57 insertions(+) + create mode 100755 tests/test-v2v-o-local-qcow2-compressed.sh + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index e787a86c..a26ecf7a 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -82,6 +82,7 @@ TESTS = \ + test-v2v-networks-and-bridges.sh \ + test-v2v-o-glance.sh \ + test-v2v-o-libvirt.sh \ ++ test-v2v-o-local-qcow2-compressed.sh \ + test-v2v-o-null.sh \ + test-v2v-o-openstack.sh \ + test-v2v-o-qemu.sh \ +@@ -241,6 +242,7 @@ EXTRA_DIST += \ + test-v2v-networks-and-bridges-expected.xml \ + test-v2v-o-glance.sh \ + test-v2v-o-libvirt.sh \ ++ test-v2v-o-local-qcow2-compressed.sh \ + test-v2v-o-null.sh \ + test-v2v-o-openstack.sh \ + test-v2v-o-qemu.sh \ +diff --git a/tests/test-v2v-o-local-qcow2-compressed.sh b/tests/test-v2v-o-local-qcow2-compressed.sh +new file mode 100755 +index 00000000..32c9ebbe +--- /dev/null ++++ b/tests/test-v2v-o-local-qcow2-compressed.sh +@@ -0,0 +1,53 @@ ++#!/bin/bash - ++# libguestfs virt-v2v test script ++# Copyright (C) 2014-2022 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 -o local -of qcow2 -oo compressed. ++ ++set -e ++ ++source ./functions.sh ++set -e ++set -x ++ ++skip_if_skipped ++requires test -f ../test-data/phony-guests/windows.img ++ ++# This requires fixed nbdcopy >= 1.13.5. ++requires nbdcopy --version ++nbdcopy --version | { ++ IFS=' .' read name major minor release ++ requires test \( "$major" -gt 1 \) -o \ ++ \( "$major" -eq 1 -a "$minor" -gt 13 \) -o \ ++ \( "$major" -eq 1 -a "$minor" -eq 13 -a "$release" -ge 5 \) ++} ++ ++export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools" ++ ++d=test-v2v-o-local-qcow2-compressed.d ++rm -rf $d ++cleanup_fn rm -rf $d ++mkdir $d ++ ++$VG virt-v2v --debug-gc \ ++ -i disk ../test-data/phony-guests/windows.img \ ++ -o local -of qcow2 -oo compressed -os $d ++ ++# Test the libvirt XML metadata and a disk was created. ++ls -l $d ++test -f $d/windows.xml ++test -f $d/windows-sda +diff --git a/tests/test-v2v-of-option.sh b/tests/test-v2v-of-option.sh +index bdfd3418..6c5f5938 100755 +--- a/tests/test-v2v-of-option.sh ++++ b/tests/test-v2v-of-option.sh +@@ -42,6 +42,8 @@ $VG virt-v2v --debug-gc \ + -i libvirt -ic "$libvirt_uri" windows \ + -o local -os $d -of qcow2 + ++ls -l $d ++ + # Test the disk is qcow2 format. + if [ "$(guestfish disk-format $d/windows-sda)" != qcow2 ]; then + echo "$0: test failed: output is not qcow2" diff --git a/SOURCES/0021-RHEL-9-oo-compressed-Remove-nbdcopy-version-check-an.patch b/SOURCES/0021-RHEL-9-oo-compressed-Remove-nbdcopy-version-check-an.patch new file mode 100644 index 0000000..afc8660 --- /dev/null +++ b/SOURCES/0021-RHEL-9-oo-compressed-Remove-nbdcopy-version-check-an.patch @@ -0,0 +1,47 @@ +From b61a03ad272bb08ff5ca757ade6a23bfef34fdc9 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 5 Jul 2022 11:56:54 +0100 +Subject: [PATCH] RHEL 9: -oo compressed: Remove nbdcopy version check and test + +In RHEL 9 nbdcopy 1.12.4-2 will be sufficient (vs nbdcopy 1.13.5 +upstream). We will enforce this through RPM dependencies and test it +separately. Thus remove the version check and test. +--- + output/output.ml | 11 ----------- + tests/Makefile.am | 1 - + 2 files changed, 12 deletions(-) + +diff --git a/output/output.ml b/output/output.ml +index 23c3932d..496c32b6 100644 +--- a/output/output.ml ++++ b/output/output.ml +@@ -83,17 +83,6 @@ let output_to_local_file ?(changeuid = fun f -> f ()) ?(compressed = false) + if output_format <> "qcow2" then + error (f_"‘-oo compressed’ is only allowed when the output format \ + is a local qcow2-format file, i.e. ‘-of qcow2’"); +- +- (* Check nbdcopy is new enough. This assumes that the version of +- * libnbd is the same as the version of nbdcopy, but parsing this +- * is easier. We can remove this check when we build-depend on +- * libnbd >= 1.14. +- *) +- let version = +- NBD.create () |> NBD.get_version |> +- String.nsplit "." |> List.map int_of_string in +- if version < [1; 13; 5] then +- error (f_"-oo compressed option requires nbdcopy >= 1.13.5") + ); + + let g = open_guestfs () in +diff --git a/tests/Makefile.am b/tests/Makefile.am +index a26ecf7a..47e5f10d 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -82,7 +82,6 @@ TESTS = \ + test-v2v-networks-and-bridges.sh \ + test-v2v-o-glance.sh \ + test-v2v-o-libvirt.sh \ +- test-v2v-o-local-qcow2-compressed.sh \ + test-v2v-o-null.sh \ + test-v2v-o-openstack.sh \ + test-v2v-o-qemu.sh \ diff --git a/SOURCES/0022-RHEL-9-tests-Remove-btrfs-test.patch b/SOURCES/0022-RHEL-9-tests-Remove-btrfs-test.patch new file mode 100644 index 0000000..cf4fbc8 --- /dev/null +++ b/SOURCES/0022-RHEL-9-tests-Remove-btrfs-test.patch @@ -0,0 +1,22 @@ +From 8a8ff53b7d438e82085d52199d21c980a54c733d Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 5 Jul 2022 11:58:09 +0100 +Subject: [PATCH] RHEL 9: tests: Remove btrfs test + +RHEL does not have btrfs so this test always fails. +--- + tests/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 47e5f10d..9560cc77 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -96,7 +96,6 @@ TESTS = \ + test-v2v-sound.sh \ + test-v2v-virtio-win-iso.sh \ + test-v2v-fedora-conversion.sh \ +- test-v2v-fedora-btrfs-conversion.sh \ + test-v2v-fedora-luks-on-lvm-conversion.sh \ + test-v2v-fedora-lvm-on-luks-conversion.sh \ + test-v2v-fedora-md-conversion.sh \ diff --git a/SOURCES/0023-convert-convert_linux-complete-the-remapping-of-NVMe.patch b/SOURCES/0023-convert-convert_linux-complete-the-remapping-of-NVMe.patch new file mode 100644 index 0000000..08a653f --- /dev/null +++ b/SOURCES/0023-convert-convert_linux-complete-the-remapping-of-NVMe.patch @@ -0,0 +1,80 @@ +From ba2963bc57c8c8a3d6f7cc2fd274c9ebd4ddb7d8 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 6 Jul 2022 12:32:15 +0200 +Subject: [PATCH] convert/convert_linux: complete the remapping of NVMe devices + +In commit 75872bf282d7 ("input: -i vmx: Add support for NVMe devices", +2022-04-08), we missed that pathnames such as + + /dev/nvme0n1[p1] + +would not match our "rex_device_cciss" and "rex_device" regular +expressions. + +As a consequence, we don't remap such pathnames now in the boot config +files with Augeas. + +Add a new regex and associated mapping logic for this kind of pathname. + +Notes: + +(1) "rex_device_cciss" could be extended internally with an alternative +pattern: + + ^/dev/(cciss/c\\d+d\\d+|nvme\\d+n1)(?:p(\\d+))?$ + ^^^^^^^^^^^ + +but Rich suggested we should add a separate, complete regexp for +maintainability. + +(2) Even with a separate regexp, we could reuse the existent CCISS pattern +handler: + + if PCRE.matches rex_device_cciss value || + PCRE.matches rex_device_nvme value then ( + let device = PCRE.sub 1 + and part = try PCRE.sub 2 with Not_found -> "" in + "/dev/" ^ replace device ^ part + ) + +Namely, although "PCRE.matches" creates/updates global state, and +"PCRE.sub" reads that state, the "||" operator in OCaml has short-circuit +behavior, and both regexps have the same structure. + +But, using the same maintainability argument, let's keep the handler logic +for NVMe detached. + +Fixes: 75872bf282d7f2322110caca70963717b43806b1 +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2101665 +Signed-off-by: Laszlo Ersek +Message-Id: <20220706103215.5607-1-lersek@redhat.com> +Reviewed-by: Richard W.M. Jones +(cherry picked from commit 4368b94ee1724c16aa35c0ee42ce4c51ce037b5a) +--- + convert/convert_linux.ml | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml +index 59d143bd..a66ff1e4 100644 +--- a/convert/convert_linux.ml ++++ b/convert/convert_linux.ml +@@ -1199,6 +1199,7 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ = + (* Map device names for each entry. *) + 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_nvme = PCRE.compile "^/dev/(nvme\\d+n1)(?:p(\\d+))?$" + and rex_device = PCRE.compile "^/dev/([a-z]+)(\\d*)?$" in + + let rec replace_if_device path value = +@@ -1221,6 +1222,11 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ = + and part = try PCRE.sub 2 with Not_found -> "" in + "/dev/" ^ replace device ^ part + ) ++ else if PCRE.matches rex_device_nvme value then ( ++ let device = PCRE.sub 1 ++ and part = try PCRE.sub 2 with Not_found -> "" in ++ "/dev/" ^ replace device ^ part ++ ) + else if PCRE.matches rex_device value then ( + let device = PCRE.sub 1 + and part = try PCRE.sub 2 with Not_found -> "" in diff --git a/SOURCES/0024-input-xen-sync-ip-limitations-language-from-input-vm.patch b/SOURCES/0024-input-xen-sync-ip-limitations-language-from-input-vm.patch new file mode 100644 index 0000000..9637e0b --- /dev/null +++ b/SOURCES/0024-input-xen-sync-ip-limitations-language-from-input-vm.patch @@ -0,0 +1,49 @@ +From c34fe9a52abdde05cb31c5bd2c99237652e1b0dc Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Mon, 11 Jul 2022 09:01:56 +0200 +Subject: [PATCH] input-xen: sync "-ip" limitations language from input-vmware + manual + +My analysis in +was partially wrong; I had missed that for the xen+ssh transport, the +client-side libvirt library launches a naked "ssh" utility, underneath +"Libvirt.Connect.connect_auth": + + setup [input/input_xen_ssh.ml] + Libvirt.Connect.connect_auth + no effect of "-ip" + Nbdkit_ssh.create_ssh [input/nbdkit_ssh.ml] + starts nbdkit with the ssh + plugin honoring "-ip" + +Which requires a password just the same, and ignores "-ip" just the same. + +Recommend the ssh agent in the docs. + +Fixes: 46298c6514710013c59828b4933f0b3b1a354566 +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1854275 +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2062360 +Signed-off-by: Laszlo Ersek +Message-Id: <20220711070157.5399-2-lersek@redhat.com> +Reviewed-by: Richard W.M. Jones +(cherry picked from commit ae067a9ce0eb5631940a8cc5dcc5ee056903276b) +--- + docs/virt-v2v-input-xen.pod | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/docs/virt-v2v-input-xen.pod b/docs/virt-v2v-input-xen.pod +index ad5772de..80ad94f7 100644 +--- a/docs/virt-v2v-input-xen.pod ++++ b/docs/virt-v2v-input-xen.pod +@@ -32,6 +32,11 @@ server to the Xen host. For example: + $ ssh root@xen.example.com + [ logs straight into the shell, no password is requested ] + ++Note that support for non-interactive authentication via the I<-ip> ++option is incomplete. Some operations remain that still require the ++user to enter the password manually. Therefore ssh-agent is recommended ++over the I<-ip> option. See L. ++ + With some modern ssh implementations, legacy crypto policies required + to interoperate with RHEL 5 sshd are disabled. To enable them you may + need to run this command on the conversion server (ie. ssh client), diff --git a/SOURCES/0025-input-xen-replace-enable-LEGACY-crypto-advice-with-t.patch b/SOURCES/0025-input-xen-replace-enable-LEGACY-crypto-advice-with-t.patch new file mode 100644 index 0000000..351b1f1 --- /dev/null +++ b/SOURCES/0025-input-xen-replace-enable-LEGACY-crypto-advice-with-t.patch @@ -0,0 +1,82 @@ +From 3f7f730ac9cbf38267839ffcebd6b6fd721123c5 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Mon, 11 Jul 2022 09:01:57 +0200 +Subject: [PATCH] input-xen: replace "enable LEGACY crypto" advice with + targeted ssh options + +- "KexAlgorithms": the Fedora 35 ssh binary, using the DEFAULT + crypto-policy, cannot log in to RHEL5 sshd without relaxing + "KexAlgorithms". The server offers three algorithms: + "diffie-hellman-group-exchange-sha1", "diffie-hellman-group14-sha1", + "diffie-hellman-group1-sha1"; and according to RFC 9142, + "diffie-hellman-group14-sha1" is the least deprecated from those. (The + RFC marks it as MAY be implemented, and marks the other two as SHOULD + NOT be implemented.) Recommend "diffie-hellman-group14-sha1". + +- "MACs": the Fedora 35 ssh binary, using the FUTURE crypto-policy, cannot + log in to RHEL5 sshd without relaxing "MACs". The server offers + "hmac-md5", "hmac-sha1", "hmac-ripemd160", "hmac-ripemd160@openssh.com", + "hmac-sha1-96", "hmac-md5-96". After eliminating the MD5-based algos + (MD5 is considered completely broken), and the one based on truncated + SHA1, we're left with "hmac-sha1", "hmac-ripemd160", and + "hmac-ripemd160@openssh.com". RIPEMD-160 is generally trusted, but it is + compiled out of the Fedora 35 "ssh" client binary. Therefore only + "hmac-sha1" remains. + +- "HostKeyAlgorithms", "PubkeyAcceptedAlgorithms": these options control + the usage of public key algorithms, for authenticating the server to the + client, and vice versa, respectively. RHEL5 sshd only supports "ssh-rsa" + and "ssh-dss", and from those, "ssh-rsa" is more commonly used (for + example, "ssh-keygen" defaults to creating "ssh-rsa" keys). Recommend + "ssh-rsa". + +- "PubkeyAcceptedKeyTypes": this is the old ("legacy") name for + "PubkeyAcceptedAlgorithms". As of this writing, the latest upstream + release of libssh (also packaged in Fedora 35 -- libssh-0.9.6-1.fc35) + does not recognize the new "PubkeyAcceptedAlgorithms" option name, only + the original "PubkeyAcceptedKeyTypes". openssh-8.7p1-3.fc35 recognizes + both option variants. Include "PubkeyAcceptedKeyTypes" in the + recommendation along with "PubkeyAcceptedAlgorithms", for backward and + forward compatbility. + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2062360 +Signed-off-by: Laszlo Ersek +Message-Id: <20220711070157.5399-3-lersek@redhat.com> +Reviewed-by: Richard W.M. Jones +(cherry picked from commit af4a0454cdd21bb5e86f2dbfaa153e83afca3988) +--- + docs/virt-v2v-input-xen.pod | 20 +++++++++++++++----- + 1 file changed, 15 insertions(+), 5 deletions(-) + +diff --git a/docs/virt-v2v-input-xen.pod b/docs/virt-v2v-input-xen.pod +index 80ad94f7..1775fc31 100644 +--- a/docs/virt-v2v-input-xen.pod ++++ b/docs/virt-v2v-input-xen.pod +@@ -37,12 +37,22 @@ option is incomplete. Some operations remain that still require the + user to enter the password manually. Therefore ssh-agent is recommended + over the I<-ip> option. See L. + +-With some modern ssh implementations, legacy crypto policies required +-to interoperate with RHEL 5 sshd are disabled. To enable them you may +-need to run this command on the conversion server (ie. ssh client), +-but read L first: ++With some modern ssh implementations, legacy crypto algorithms required ++to interoperate with RHEL 5 sshd are disabled. To enable them, you may ++need to add the following C stanza to your F<~/.ssh/config>: + +- # update-crypto-policies --set LEGACY ++ Host xen.example.com ++ KexAlgorithms +diffie-hellman-group14-sha1 ++ MACs +hmac-sha1 ++ HostKeyAlgorithms +ssh-rsa ++ PubkeyAcceptedKeyTypes +ssh-rsa ++ PubkeyAcceptedAlgorithms +ssh-rsa ++ ++(C and C have ++identical meaning; the former is the old option name, the latter is the ++new one. Virt-v2v uses both C and C when converting a guest ++from Xen, and on some operating systems, C and C may not ++both accept the same option variant.) + + =head2 Test libvirt connection to remote Xen host + diff --git a/SOURCES/0026-common-Adapt-to-renamed-function-On_exit.rmdir-On_ex.patch b/SOURCES/0026-common-Adapt-to-renamed-function-On_exit.rmdir-On_ex.patch new file mode 100644 index 0000000..806e3da --- /dev/null +++ b/SOURCES/0026-common-Adapt-to-renamed-function-On_exit.rmdir-On_ex.patch @@ -0,0 +1,172 @@ +From ea881513e9c15b0a816d3ba4afe471ff2f591a03 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 14 Jul 2022 12:44:27 +0100 +Subject: [PATCH] common: Adapt to renamed function On_exit.rmdir -> + On_exit.rm_rf + +This function was renamed to make it clearer what it does (and that +it's potentially dangerous). The functionality is unchanged. + +Reviewed-by: Laszlo Ersek +(cherry picked from commit 2eb6441264deb0411d36dabaf8fb2da9f07c8439) +--- + common | 2 +- + input/OVA.ml | 2 +- + input/parse_domain_from_vmx.ml | 2 +- + lib/nbdkit.ml | 2 +- + lib/qemuNBD.ml | 2 +- + lib/utils.ml | 2 +- + output/python_script.ml | 2 +- + 7 files changed, 7 insertions(+), 7 deletions(-) + +Submodule common af6cb55b..fd964c1b: +diff --git a/common/mlcustomize/guest_packages.ml b/common/mlcustomize/guest_packages.ml +index 4c3c34ed..7c29a2ab 100644 +--- a/common/mlcustomize/guest_packages.ml ++++ b/common/mlcustomize/guest_packages.ml +@@ -73,9 +73,9 @@ let install_command packages package_management = + | "zypper" -> sprintf "zypper -n in -l %s" quoted_args + + | "unknown" -> +- error_unknown_package_manager (s_"--install") ++ error_unknown_package_manager "--install" + | pm -> +- error_unimplemented_package_manager (s_"--install") pm ++ error_unimplemented_package_manager "--install" pm + + let update_command package_management = + match package_management with +@@ -103,9 +103,9 @@ let update_command package_management = + | "zypper" -> "zypper -n update -l" + + | "unknown" -> +- error_unknown_package_manager (s_"--update") ++ error_unknown_package_manager "--update" + | pm -> +- error_unimplemented_package_manager (s_"--update") pm ++ error_unimplemented_package_manager "--update" pm + + let uninstall_command packages package_management = + let quoted_args = String.concat " " (List.map quote packages) in +@@ -127,6 +127,6 @@ let uninstall_command packages package_management = + | "zypper" -> sprintf "zypper -n rm %s" quoted_args + + | "unknown" -> +- error_unknown_package_manager (s_"--uninstall") ++ error_unknown_package_manager "--uninstall" + | pm -> +- error_unimplemented_package_manager (s_"--uninstall") pm ++ error_unimplemented_package_manager "--uninstall" pm +diff --git a/common/mltools/on_exit.ml b/common/mltools/on_exit.ml +index 53ccb68a..cae12e73 100644 +--- a/common/mltools/on_exit.ml ++++ b/common/mltools/on_exit.ml +@@ -52,7 +52,7 @@ let do_actions () = + List.iter (do_action (fun file -> Unix.unlink file)) !files; + List.iter (do_action ( + fun dir -> +- let cmd = sprintf "rm -rf %s" (Filename.quote dir) in ++ let cmd = sprintf "rm -rf -- %s" (Filename.quote dir) in + ignore (Tools_utils.shell_command cmd) + ) + ) !rmdirs; +@@ -102,7 +102,7 @@ let unlink filename = + register (); + List.push_front filename files + +-let rmdir dir = ++let rm_rf dir = + register (); + List.push_front dir rmdirs + +diff --git a/common/mltools/on_exit.mli b/common/mltools/on_exit.mli +index a02e3db3..9bcf104f 100644 +--- a/common/mltools/on_exit.mli ++++ b/common/mltools/on_exit.mli +@@ -47,7 +47,7 @@ val f : (unit -> unit) -> unit + val unlink : string -> unit + (** Unlink a single temporary file on exit. *) + +-val rmdir : string -> unit ++val rm_rf : string -> unit + (** Recursively remove a temporary directory on exit (using [rm -rf]). *) + + val kill : ?signal:int -> int -> unit +diff --git a/input/OVA.ml b/input/OVA.ml +index 9e9c3712..09ceee98 100644 +--- a/input/OVA.ml ++++ b/input/OVA.ml +@@ -78,7 +78,7 @@ let rec parse_ova ova = + else ( + let tmpdir = + let t = Mkdtemp.temp_dir ~base_dir:large_tmpdir "ova." in +- On_exit.rmdir t; ++ On_exit.rm_rf t; + t in + + match detect_file_type ova with +diff --git a/input/parse_domain_from_vmx.ml b/input/parse_domain_from_vmx.ml +index 947ca414..7aca2c24 100644 +--- a/input/parse_domain_from_vmx.ml ++++ b/input/parse_domain_from_vmx.ml +@@ -375,7 +375,7 @@ and find_nics vmx = + let parse_domain_from_vmx vmx_source = + let tmpdir = + let t = Mkdtemp.temp_dir "vmx." in +- On_exit.rmdir t; ++ On_exit.rm_rf t; + t in + + (* If the transport is SSH, fetch the file from remote, else +diff --git a/lib/nbdkit.ml b/lib/nbdkit.ml +index 07896684..1137b6bb 100644 +--- a/lib/nbdkit.ml ++++ b/lib/nbdkit.ml +@@ -105,7 +105,7 @@ let add_filter_if_available cmd filter = + let run_unix socket cmd = + (* Create a temporary directory where we place the PID file. *) + let piddir = Mkdtemp.temp_dir "v2vnbdkit." in +- On_exit.rmdir piddir; ++ On_exit.rm_rf piddir; + + let id = unique () in + let pidfile = piddir // sprintf "nbdkit%d.pid" id in +diff --git a/lib/qemuNBD.ml b/lib/qemuNBD.ml +index bbb65f41..c3dd1666 100644 +--- a/lib/qemuNBD.ml ++++ b/lib/qemuNBD.ml +@@ -69,7 +69,7 @@ let run_unix socket { disk; snapshot; format; imgopts } = + + (* Create a temporary directory where we place the PID file. *) + let piddir = Mkdtemp.temp_dir "v2vqemunbd." in +- On_exit.rmdir piddir; ++ On_exit.rm_rf piddir; + + let id = unique () in + let pidfile = piddir // sprintf "qemunbd%d.pid" id in +diff --git a/lib/utils.ml b/lib/utils.ml +index 7116a4f9..84b9a93f 100644 +--- a/lib/utils.ml ++++ b/lib/utils.ml +@@ -204,7 +204,7 @@ let error_if_no_ssh_agent () = + let create_v2v_directory () = + let d = Mkdtemp.temp_dir "v2v." in + chown_for_libvirt_rhbz_1045069 d; +- On_exit.rmdir d; ++ On_exit.rm_rf d; + d + + (* Wait for a file to appear until a timeout. *) +diff --git a/output/python_script.ml b/output/python_script.ml +index 54ccd1b5..ecf46c2d 100644 +--- a/output/python_script.ml ++++ b/output/python_script.ml +@@ -33,7 +33,7 @@ type script = { + + let create ?(name = "script.py") code = + let tmpdir = Mkdtemp.temp_dir "v2v." in +- On_exit.rmdir tmpdir; ++ On_exit.rm_rf tmpdir; + let path = tmpdir // name in + with_open_out path (fun chan -> output_string chan code); + { tmpdir; path } diff --git a/SOURCES/0027-o-rhv-Unmount-the-temporary-NFS-mountpoint-as-late-a.patch b/SOURCES/0027-o-rhv-Unmount-the-temporary-NFS-mountpoint-as-late-a.patch new file mode 100644 index 0000000..7fec616 --- /dev/null +++ b/SOURCES/0027-o-rhv-Unmount-the-temporary-NFS-mountpoint-as-late-a.patch @@ -0,0 +1,171 @@ +From 0d92a42aab3fb0e7569294675666976724156128 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 14 Jul 2022 13:15:49 +0100 +Subject: [PATCH] -o rhv: Unmount the temporary NFS mountpoint as late as + possible + +To partially avoid a potential race against nbdkit or qemu-nbd +releasing files on the mountpoint before they exit, unmount as late as +we can. + +See also https://bugzilla.redhat.com/show_bug.cgi?id=1953286#c26 + +Reviewed-by: Laszlo Ersek +(cherry picked from commit e96357fc3b26aaf96eaa21afa36c894a27af6261) +--- + common | 2 +- + output/output_rhv.ml | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +Submodule common fd964c1b..1000604f: +diff --git a/common/mltools/on_exit.ml b/common/mltools/on_exit.ml +index cae12e73..f8ef74e1 100644 +--- a/common/mltools/on_exit.ml ++++ b/common/mltools/on_exit.ml +@@ -23,39 +23,39 @@ open Common_gettext.Gettext + open Unix + open Printf + +-(* List of files to unlink. *) +-let files = ref [] ++type action = ++ | Unlink of string (* filename *) ++ | Rm_rf of string (* directory *) ++ | Kill of int * int (* signal, pid *) ++ | Fn of (unit -> unit) (* generic function *) + +-(* List of directories to remove. *) +-let rmdirs = ref [] +- +-(* List of PIDs to kill. *) +-let kills = ref [] +- +-(* List of functions to call. *) +-let fns = ref [] ++(* List of (priority, action). *) ++let actions = ref [] + + (* Perform a single exit action, printing any exception but + * otherwise ignoring failures. + *) +-let do_action f arg = +- try f arg with exn -> debug "%s" (Printexc.to_string exn) ++let do_action action = ++ try ++ match action with ++ | Unlink file -> Unix.unlink file ++ | Rm_rf dir -> ++ let cmd = sprintf "rm -rf -- %s" (Filename.quote dir) in ++ ignore (Tools_utils.shell_command cmd) ++ | Kill (signal, pid) -> ++ kill pid signal ++ | Fn f -> f () ++ with exn -> debug "%s" (Printexc.to_string exn) + + (* Make sure the actions are performed only once. *) + let done_actions = ref false + +-(* Perform the exit actions. *) ++(* Perform the exit actions in priority order (lowest prio first). *) + let do_actions () = + if not !done_actions then ( +- List.iter (do_action (fun f -> f ())) !fns; +- List.iter (do_action (fun (signal, pid) -> kill pid signal)) !kills; +- List.iter (do_action (fun file -> Unix.unlink file)) !files; +- List.iter (do_action ( +- fun dir -> +- let cmd = sprintf "rm -rf -- %s" (Filename.quote dir) in +- ignore (Tools_utils.shell_command cmd) +- ) +- ) !rmdirs; ++ let actions = List.sort (fun (a, _) (b, _) -> compare a b) !actions in ++ let actions = List.map snd actions in ++ List.iter do_action actions + ); + done_actions := true + +@@ -94,18 +94,18 @@ let register () = + ); + registered := true + +-let f fn = ++let f ?(prio = 5000) fn = + register (); +- List.push_front fn fns ++ List.push_front (prio, Fn fn) actions + +-let unlink filename = ++let unlink ?(prio = 5000) filename = + register (); +- List.push_front filename files ++ List.push_front (prio, Unlink filename) actions + +-let rm_rf dir = ++let rm_rf ?(prio = 5000) dir = + register (); +- List.push_front dir rmdirs ++ List.push_front (prio, Rm_rf dir) actions + +-let kill ?(signal = Sys.sigterm) pid = ++let kill ?(prio = 5000) ?(signal = Sys.sigterm) pid = + register (); +- List.push_front (signal, pid) kills ++ List.push_front (prio, Kill (signal, pid)) actions +diff --git a/common/mltools/on_exit.mli b/common/mltools/on_exit.mli +index 9bcf104f..66a85542 100644 +--- a/common/mltools/on_exit.mli ++++ b/common/mltools/on_exit.mli +@@ -28,6 +28,12 @@ + killing another process, so we provide simple + wrappers for those common actions here. + ++ Actions can be ordered by setting the optional [?prio] ++ parameter in the range 0..9999. By default actions ++ have priority 5000. Lower numbered actions run first. ++ Higher numbered actions run last. So to have an action ++ run at the very end before exit you might use [~prio:9999] ++ + Note this module registers signal handlers for + SIGINT, SIGQUIT, SIGTERM and SIGHUP. This means + that any program that links with mltools.cmxa +@@ -39,18 +45,20 @@ + Your cleanup action might no longer run unless the + program calls {!Stdlib.exit}. *) + +-val f : (unit -> unit) -> unit ++val f : ?prio:int -> (unit -> unit) -> unit + (** Register a function [f] which runs when the program exits. + Similar to [Stdlib.at_exit] but also runs if the program is +- killed with a signal that we can catch. *) ++ killed with a signal that we can catch. + +-val unlink : string -> unit ++ [?prio] is the priority, default 5000. See the description above. *) ++ ++val unlink : ?prio:int -> string -> unit + (** Unlink a single temporary file on exit. *) + +-val rm_rf : string -> unit ++val rm_rf : ?prio:int -> string -> unit + (** Recursively remove a temporary directory on exit (using [rm -rf]). *) + +-val kill : ?signal:int -> int -> unit ++val kill : ?prio:int -> ?signal:int -> int -> unit + (** Kill [PID] on exit. The signal sent defaults to [Sys.sigterm]. + + Use this with care since you can end up unintentionally killing +diff --git a/output/output_rhv.ml b/output/output_rhv.ml +index 8571e07b..15a2c14a 100644 +--- a/output/output_rhv.ml ++++ b/output/output_rhv.ml +@@ -204,8 +204,8 @@ module RHV = struct + if run_command cmd <> 0 then + error (f_"mount command failed, see earlier errors.\n\nThis probably means you didn't specify the right %s path [-os %s], or else you need to rerun virt-v2v as root.") domain_class os; + +- (* Make sure it is unmounted at exit. *) +- On_exit.f ( ++ (* Make sure it is unmounted at exit, as late as possible (prio=9999) *) ++ On_exit.f ~prio:9999 ( + fun () -> + let cmd = [ "umount"; mp ] in + ignore (run_command cmd); diff --git a/SOURCES/0028-output-Permit-output-modes-to-wait-on-the-local-NBD-.patch b/SOURCES/0028-output-Permit-output-modes-to-wait-on-the-local-NBD-.patch new file mode 100644 index 0000000..4a02e5e --- /dev/null +++ b/SOURCES/0028-output-Permit-output-modes-to-wait-on-the-local-NBD-.patch @@ -0,0 +1,179 @@ +From 96efdcf54c887ae88d54332df12a5f5dd962fd0a Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 15 Jul 2022 11:25:45 +0100 +Subject: [PATCH] output: Permit output modes to wait on the local NBD server + +Output.output_to_local_file is used by several output modes that write +to local files or devices. It launches an instance of qemu-nbd or +nbdkit connected to the local file. + +Previously we unconditionally added an On_exit handler to kill the NBD +server. This is usually safe because nbdcopy --flush has guaranteed +that the data was written through to permanent storage, and so killing +the NBD server is just there to prevent orphaned processes. + +However for output to RHV (-o rhv) we actually need the NBD server to +be cleaned up before we exit. See the analysis here: + +https://bugzilla.redhat.com/show_bug.cgi?id=1953286#c26 + +Allow an alternate strategy of waiting for the NBD server to exit +during virt-v2v shutdown. + +We only need this in virt-v2v so implement it here instead of pushing +it all the way into the On_exit module. + +Reviewed-by: Laszlo Ersek +(cherry picked from commit e2a1a7b4dfb6a9e44260da10a7e7029c09753b5c) +--- + output/output.ml | 91 ++++++++++++++++++++++++++++------------------- + output/output.mli | 17 +++++++-- + 2 files changed, 69 insertions(+), 39 deletions(-) + +diff --git a/output/output.ml b/output/output.ml +index 496c32b6..8f83a324 100644 +--- a/output/output.ml ++++ b/output/output.ml +@@ -69,7 +69,10 @@ let error_if_disk_count_gt dir n = + if Sys.file_exists socket then + error (f_"this output module doesn't support copying more than %d disks") n + ++type on_exit_kill = Kill | KillAndWait ++ + let output_to_local_file ?(changeuid = fun f -> f ()) ?(compressed = false) ++ ?(on_exit_kill = Kill) + output_alloc output_format filename size socket = + (* Check nbdkit is installed and has the required plugin. *) + if not (Nbdkit.is_installed ()) then +@@ -94,46 +97,60 @@ let output_to_local_file ?(changeuid = fun f -> f ()) ?(compressed = false) + fun () -> g#disk_create ?preallocation filename output_format size + ); + +- match output_format with +- | "raw" -> +- let cmd = Nbdkit.create "file" in +- Nbdkit.add_arg cmd "file" filename; +- if Nbdkit.version nbdkit_config >= (1, 22, 0) then ( +- let cmd = Nbdkit.add_arg cmd "cache" "none" in +- cmd +- ); +- let _, pid = Nbdkit.run_unix socket cmd in ++ let pid = ++ match output_format with ++ | "raw" -> ++ let cmd = Nbdkit.create "file" in ++ Nbdkit.add_arg cmd "file" filename; ++ if Nbdkit.version nbdkit_config >= (1, 22, 0) then ( ++ let cmd = Nbdkit.add_arg cmd "cache" "none" in ++ cmd ++ ); ++ let _, pid = Nbdkit.run_unix socket cmd in ++ pid + +- (* --exit-with-parent should ensure nbdkit is cleaned +- * up when we exit, but it's not supported everywhere. +- *) +- On_exit.kill pid ++ | "qcow2" -> ++ let cmd = ++ if compressed then ( ++ let qemu_quote str = String.replace str "," ",," in ++ let image_opts = [ "driver=compress"; ++ "file.driver=qcow2"; ++ "file.file.driver=file"; ++ "file.file.filename=" ^ qemu_quote filename ] in ++ let image_opts = String.concat "," image_opts in ++ let cmd = QemuNBD.create image_opts in ++ QemuNBD.set_image_opts cmd true; ++ cmd ++ ) ++ else (* not compressed *) ( ++ let cmd = QemuNBD.create filename in ++ QemuNBD.set_format cmd (Some "qcow2"); ++ cmd ++ ) in ++ QemuNBD.set_snapshot cmd false; ++ let _, pid = QemuNBD.run_unix socket cmd in ++ pid + +- | "qcow2" -> +- let cmd = +- if compressed then ( +- let qemu_quote str = String.replace str "," ",," in +- let image_opts = [ "driver=compress"; +- "file.driver=qcow2"; +- "file.file.driver=file"; +- "file.file.filename=" ^ qemu_quote filename ] in +- let image_opts = String.concat "," image_opts in +- let cmd = QemuNBD.create image_opts in +- QemuNBD.set_image_opts cmd true; +- cmd +- ) +- else (* not compressed *) ( +- let cmd = QemuNBD.create filename in +- QemuNBD.set_format cmd (Some "qcow2"); +- cmd +- ) in +- QemuNBD.set_snapshot cmd false; +- let _, pid = QemuNBD.run_unix socket cmd in +- On_exit.kill pid ++ | _ -> ++ error (f_"output mode only supports raw or qcow2 format (format: %s)") ++ output_format in ++ ++ match on_exit_kill with ++ | Kill -> ++ (* Kill the NBD server on exit. (For nbdkit we use --exit-with-parent ++ * but it's not supported everywhere). ++ *) ++ On_exit.kill pid + +- | _ -> +- error (f_"output mode only supports raw or qcow2 format (format: %s)") +- output_format ++ | KillAndWait -> ++ On_exit.f ( ++ fun () -> ++ kill pid Sys.sigterm; ++ (* Errors from the NBD server don't matter. On successful ++ * completion we've already committed the data to disk. ++ *) ++ ignore (waitpid [] pid) ++ ) + + let disk_path os name i = + let outdisk = sprintf "%s/%s-sd%s" os name (drive_name i) in +diff --git a/output/output.mli b/output/output.mli +index c1f0f53d..c4486311 100644 +--- a/output/output.mli ++++ b/output/output.mli +@@ -83,14 +83,27 @@ val error_if_disk_count_gt : string -> int -> unit + "in[n]" in the v2v directory [dir]. If the socket exists, [error] is + called. *) + ++type on_exit_kill = Kill | KillAndWait ++ + val output_to_local_file : ?changeuid:((unit -> unit) -> unit) -> +- ?compressed:bool -> ++ ?compressed:bool -> ?on_exit_kill:on_exit_kill -> + Types.output_allocation -> + string -> string -> int64 -> string -> + unit + (** When an output mode wants to create a local file with a + particular format (only "raw" or "qcow2" allowed) then +- this common function can be used. *) ++ this common function can be used. ++ ++ Optional parameter [?on_exit_kill] controls how the NBD server ++ is cleaned up. The default is {!Kill} which registers an ++ {!On_exit.kill} handler that kills (but does not wait for) ++ the server when virt-v2v exits. Most callers should use this. ++ ++ Setting [~on_exit_kill:KillAndWait] should be used if the NBD ++ server must fully exit before we continue with the rest of ++ virt-v2v shut down. This is only necessary if some other action ++ (such as unmounting a host filesystem or removing a host device) ++ depends on the NBD server releasing resources. *) + + val disk_path : string -> string -> int -> string + (** For [-o disk|qemu], return the output disk name of the i'th disk, diff --git a/SOURCES/0029-o-rhv-Wait-for-the-NBD-server-to-exit-to-avoid-a-rac.patch b/SOURCES/0029-o-rhv-Wait-for-the-NBD-server-to-exit-to-avoid-a-rac.patch new file mode 100644 index 0000000..9799170 --- /dev/null +++ b/SOURCES/0029-o-rhv-Wait-for-the-NBD-server-to-exit-to-avoid-a-rac.patch @@ -0,0 +1,33 @@ +From f820585c37beb648ab856818179091349a604523 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 15 Jul 2022 11:37:46 +0100 +Subject: [PATCH] -o rhv: Wait for the NBD server to exit to avoid a race with + unmounting + +Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1953286#c26 +Reviewed-by: Laszlo Ersek +(cherry picked from commit 2fbd578b4e6884a23063ad67ee36f02c4eb6c668) +--- + output/output_rhv.ml | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/output/output_rhv.ml b/output/output_rhv.ml +index 15a2c14a..45f831e3 100644 +--- a/output/output_rhv.ml ++++ b/output/output_rhv.ml +@@ -175,7 +175,14 @@ module RHV = struct + chmod filename 0o666 + ) + in +- output_to_local_file ~changeuid ++ ++ (* We have to wait for the NBD server to exit rather than just ++ * killing it, otherwise it races with unmounting. See: ++ * https://bugzilla.redhat.com/show_bug.cgi?id=1953286#c26 ++ *) ++ let on_exit_kill = Output.KillAndWait in ++ ++ output_to_local_file ~changeuid ~on_exit_kill + output_alloc output_format filename size socket + ) (List.combine disks filenames); + diff --git a/SOURCES/0030-output-create_libvirt_xml-relax-VCPU-feature-checkin.patch b/SOURCES/0030-output-create_libvirt_xml-relax-VCPU-feature-checkin.patch new file mode 100644 index 0000000..8d856c9 --- /dev/null +++ b/SOURCES/0030-output-create_libvirt_xml-relax-VCPU-feature-checkin.patch @@ -0,0 +1,66 @@ +From 29c6ee9322da082e3be9faa94cf4a6840b49cd97 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Fri, 22 Jul 2022 09:36:27 +0200 +Subject: [PATCH] output/create_libvirt_xml: relax VCPU feature checking for + "qemu64" + +When the source domain doesn't specify a VCPU model ("s_cpu_model" is +None), and the guest OS is assumed to work with the default VCPU model +("gcaps_default_cpu" is true), we don't output any element. In that +case, libvirtd augments the domain config with: + + [1] + qemu64 + + +where the @check='none' attribute ensures that the converted domain will +be launched, for example, on an Intel host, despite the "qemu64" VCPU +model containing AMD-only feature flags such as "svm". + +However, if the source domain explicitly specifies the "qemu64" model +(mostly seen with "-i libvirt -ic qemu://..."), we presently output + + [2] + qemu64 + + +which libvirtd completes as + + [3] + qemu64 + + +In [3], cpu/@match='minimum' and cpu/model/@fallback='allow' are both +laxer than @match='exact' and @fallback='forbid', respectively, in [1]. + +However, cpu/@check='partial' in [3] is stricter than @check='none' in +[1]; it causes libvirtd to catch the "svm" feature flag on an Intel host, +and prevents the converted domain from starting. + +The "qemu64" VCPU model is supposed to run on every possible host +, +therefore make an exception for the explicitly specified "qemu64" VCPU +model, and generate the @check='none' attribute. + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2107503 +Signed-off-by: Laszlo Ersek +Message-Id: <20220722073627.6511-1-lersek@redhat.com> +Acked-by: Richard W.M. Jones +(cherry picked from commit e5297c3180fd3ebea41a40f4c5a66969a24b9ff3) +--- + output/create_libvirt_xml.ml | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/output/create_libvirt_xml.ml b/output/create_libvirt_xml.ml +index 531a4f75..bd01304d 100644 +--- a/output/create_libvirt_xml.ml ++++ b/output/create_libvirt_xml.ml +@@ -192,6 +192,8 @@ let create_libvirt_xml ?pool source inspect + List.push_back cpu_attrs ("mode", "host-passthrough"); + | Some model -> + List.push_back cpu_attrs ("match", "minimum"); ++ if model = "qemu64" then ++ List.push_back cpu_attrs ("check", "none"); + (match source.s_cpu_vendor with + | None -> () + | Some vendor -> diff --git a/SOURCES/0031-input-xen-cover-RHEL9-OpenSSL-crypto-settings.patch b/SOURCES/0031-input-xen-cover-RHEL9-OpenSSL-crypto-settings.patch new file mode 100644 index 0000000..ae3fa10 --- /dev/null +++ b/SOURCES/0031-input-xen-cover-RHEL9-OpenSSL-crypto-settings.patch @@ -0,0 +1,59 @@ +From 9e1c78a4dda8e8f504fd8f01d7ff5a02e6d3b8ff Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Fri, 29 Jul 2022 12:57:03 +0200 +Subject: [PATCH] input-xen: cover RHEL9 OpenSSL crypto settings + +In [master] commit af4a0454cdd2 ("input-xen: replace "enable LEGACY +crypto" advice with targeted ssh options", 2022-07-11), we documented how +the libssh / openssh crypto settings needed to be relaxed, for connecting +to RHEL5 sshd. [rhel-9.1 commit: 3f7f730ac9cb.] + +It turns out that in RHEL9, the non-LEGACY crypto policies disable SHA1 in +signature algorithms even at the OpenSSL level. Explain how the user can +re-enable that separately, for individual virt-v2v invocations. + +The method depends on Rich's libvirt commit 45912ac399ab ("rpc: Pass +OPENSSL_CONF through to ssh invocations", 2022-07-25), which is is going +to be released in upstream libvirt v8.6.0. + +Thanks: Dmitry Belyavskiy & Rich Jones +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2062360 +Signed-off-by: Laszlo Ersek +Message-Id: <20220729105703.10150-1-lersek@redhat.com> +Reviewed-by: Richard W.M. Jones +(cherry picked from commit ddab06d5eb99696f5fd1073b8ec91efbc8c3e4ab) +--- + docs/virt-v2v-input-xen.pod | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +diff --git a/docs/virt-v2v-input-xen.pod b/docs/virt-v2v-input-xen.pod +index 1775fc31..9c3981e1 100644 +--- a/docs/virt-v2v-input-xen.pod ++++ b/docs/virt-v2v-input-xen.pod +@@ -54,6 +54,26 @@ new one. Virt-v2v uses both C and C when converting a guest + from Xen, and on some operating systems, C and C may not + both accept the same option variant.) + ++When connecting to RHEL 5 sshd from RHEL 9, the SHA1 algorithm's use in ++signatures has to be re-enabled at the OpenSSL level, in addition to the ++above SSH configuration. Create a file called F<$HOME/openssl-sha1.cnf> ++with the following contents: ++ ++ .include /etc/ssl/openssl.cnf ++ [openssl_init] ++ alg_section = evp_properties ++ [evp_properties] ++ rh-allow-sha1-signatures = yes ++ ++and export the following variable into the environment of the ++C process: ++ ++ OPENSSL_CONF=$HOME/openssl-sha1.cnf ++ ++Note that the C environment variable will only take effect ++if the libvirt client library used by virt-v2v is at least version ++8.6.0. ++ + =head2 Test libvirt connection to remote Xen host + + Use the L command to list the guests on the remote Xen host: diff --git a/SOURCES/0032-convert_linux-remove-LVM2-devices-file.patch b/SOURCES/0032-convert_linux-remove-LVM2-devices-file.patch new file mode 100644 index 0000000..9f35ee7 --- /dev/null +++ b/SOURCES/0032-convert_linux-remove-LVM2-devices-file.patch @@ -0,0 +1,46 @@ +From 83fc438139c49ffae330d5caeece1e52bcb1d18e Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Fri, 5 Aug 2022 10:44:26 +0200 +Subject: [PATCH] convert_linux: remove LVM2 "devices file" + +A recent feature of LVM2 is the "devices file" +. It speeds up +LVM2 PV discovery on a normal system, but an old devices file in a +converted domain (with different hardware) can prevent the assembly of +volume groups. + +In particular, when converting a physical system to a guest with virt-p2v, +the original system will have used "sys_wwid"-type identifiers in the LVM2 +devices file, and those are guaranteed not to match any virtio-blk disks +in the output domain. + +We've seen a similar issue in the past under RHBZ#1164853, so just extend +the same scrubbing with the new pathname. + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2112801 +Signed-off-by: Laszlo Ersek +Message-Id: <20220805084426.9200-1-lersek@redhat.com> +Acked-by: Richard W.M. Jones +(cherry picked from commit 8e4b732e8b4343c169c658338da53fb0ede7e512) +--- + convert/convert_linux.ml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml +index a66ff1e4..2aaa438e 100644 +--- a/convert/convert_linux.ml ++++ b/convert/convert_linux.ml +@@ -1402,11 +1402,11 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ = + * device names. blkid will rebuild these on demand. + * + * Delete the LVM cache since it will contain references to the +- * old devices (RHBZ#1164853). ++ * old devices (RHBZ#1164853, RHBZ#2112801). + *) + List.iter g#rm_f [ + "/etc/blkid/blkid.tab"; "/etc/blkid.tab"; +- "/etc/lvm/cache/.cache" ++ "/etc/lvm/cache/.cache"; "/etc/lvm/devices/system.devices" + ]; + in + diff --git a/SOURCES/0033-convert-linux-Add-support-for-Zstandard-compressed-k.patch b/SOURCES/0033-convert-linux-Add-support-for-Zstandard-compressed-k.patch new file mode 100644 index 0000000..2f1bcd4 --- /dev/null +++ b/SOURCES/0033-convert-linux-Add-support-for-Zstandard-compressed-k.patch @@ -0,0 +1,48 @@ +From 380fa6663e9b373d87e446fc03601e9e44f985f6 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 9 Aug 2022 19:09:08 +0100 +Subject: [PATCH] convert: linux: Add support for Zstandard compressed kernel + modules + +OpenSUSE uses *.ko.zst for kernel modules. This commit adds support +in the same way as the existing support for *.ko.xz. Note this +requires a corresponding change to libguestfs to support Zstandard +compression in the guestfs_file_architecture API: + +https://github.com/libguestfs/libguestfs/commit/0e784824e82a88e522873fec5db1a11943d637ed + +Reported-by: Xiaodai Wang +Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2116811 +(cherry picked from commit 315c016dbea899587649a4bbf1865390cb4e1d3c) +--- + convert/linux_kernels.ml | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/convert/linux_kernels.ml b/convert/linux_kernels.ml +index 307de572..6e9d2bdd 100644 +--- a/convert/linux_kernels.ml ++++ b/convert/linux_kernels.ml +@@ -65,8 +65,8 @@ let print_kernel_info chan prefix ki = + ki.ki_supports_isa_pvpanic ki.ki_supports_virtio_socket + ki.ki_is_xen_pv_only_kernel ki.ki_is_debug + +-let rex_ko = PCRE.compile "\\.k?o(?:\\.xz)?$" +-let rex_ko_extract = PCRE.compile "/([^/]+)\\.k?o(?:\\.xz)?$" ++let rex_ko = PCRE.compile "\\.k?o(?:\\.(?:xz|zst))?$" ++let rex_ko_extract = PCRE.compile "/([^/]+)\\.k?o(?:\\.(?:xz|zst))?$" + + let detect_kernels (g : G.guestfs) inspect family bootloader = + (* What kernel/kernel-like packages are installed on the current guest? *) +@@ -203,7 +203,11 @@ let detect_kernels (g : G.guestfs) inspect family bootloader = + let all_candidates = List.flatten ( + List.map ( + fun f -> +- [ "/" ^ f ^ ".o"; "/" ^ f ^ ".ko"; "/" ^ f ^ ".ko.xz" ] ++ [ "/" ^ f ^ ".o"; ++ "/" ^ f ^ ".ko"; ++ "/" ^ f ^ ".ko.xz"; ++ "/" ^ f ^ ".ko.zst"; ++ ] + ) candidates + ) in + let candidate = diff --git a/SOURCES/0034-convert_linux-start-the-QEMU-guest-agent-in-a-distro.patch b/SOURCES/0034-convert_linux-start-the-QEMU-guest-agent-in-a-distro.patch new file mode 100644 index 0000000..eb69a96 --- /dev/null +++ b/SOURCES/0034-convert_linux-start-the-QEMU-guest-agent-in-a-distro.patch @@ -0,0 +1,98 @@ +From 7dd396af54df3f7563aa3a42b3c17547710aec67 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 17 Aug 2022 16:47:36 +0200 +Subject: [PATCH] convert_linux: start the QEMU guest agent in a + distro-specific way + +The current command "service start" does not apply to +RHEL-6; the service name ("qemu-ga") differs from the package name +("qemu-guest-agent") there. + +Overhaul the logic -- detach the command from the package name; cover the +RHEL, ALT, SUSE and Debian families separately. Remove the "chkconfig" +command, as in all tested / investigated cases, it is unnecessary. + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2028764 +Signed-off-by: Laszlo Ersek +Message-Id: <20220817144736.18850-1-lersek@redhat.com> +Acked-by: Richard W.M. Jones +(cherry picked from commit ad2b4f2e50950a5798a75359badb526290aa92e7) +--- + convert/convert_linux.ml | 56 ++++++++++++++++++++++++++++------------ + 1 file changed, 40 insertions(+), 16 deletions(-) + +diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml +index 2aaa438e..b8e9ad15 100644 +--- a/convert/convert_linux.ml ++++ b/convert/convert_linux.ml +@@ -66,6 +66,34 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ = + | _ -> None + in + ++ let qga_svc_start_cmd family distro major = ++ match family, distro, major with ++ | `RHEL_family, ( "rhel" | "centos" | "scientificlinux" | "redhat-based" | ++ "oraclelinux" ), 6 -> ++ (* https://bugzilla.redhat.com/show_bug.cgi?id=2028764#c52 *) ++ Some "service qemu-ga start" ++ ++ | `RHEL_family, _, _ -> ++ (* https://bugzilla.redhat.com/show_bug.cgi?id=2028764#c52 *) ++ Some "systemctl start qemu-guest-agent" ++ ++ | `ALT_family, _, _ -> ++ (* https://bugzilla.redhat.com/show_bug.cgi?id=2028764#c45 *) ++ Some "systemctl start qemu-guest-agent" ++ ++ | `SUSE_family, _, _ -> ++ (* https://bugzilla.redhat.com/show_bug.cgi?id=2028764#c51 *) ++ None ++ ++ | `Debian_family, _, _ -> ++ (* https://bugzilla.redhat.com/show_bug.cgi?id=2028764#c42 *) ++ Some "service qemu-guest-agent start" ++ ++ | _ -> ++ (* should never be called when "qga_pkg_of_family" returns None *) ++ assert false ++ in ++ + assert (inspect.i_package_format = "rpm" || inspect.i_package_format = "deb"); + + (* Fail early if i_apps is empty. Certain steps such as kernel +@@ -615,23 +643,19 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ = + \ \ rm -f %s\n\ + fi\n" selinux_enforcing selinux_enforcing); + +- (* Start the agent now and at subsequent boots. The following +- * commands should work on both sysvinit distros / distro versions +- * (regardless of "/etc/rc.d/" vs. "/etc/init.d/" being the scheme +- * in use) and systemd distros (via redirection to systemctl). +- * +- * On distros where the chkconfig command is redirected to +- * systemctl, the chkconfig command is likely superfluous. That's +- * because on systemd distros, the QGA package comes with such +- * runtime dependencies / triggers that the presence of the +- * virtio-serial port named "org.qemu.guest_agent.0" automatically +- * starts the agent during (second and later) boots. However, even +- * on such distros, the chkconfig command should do no harm. ++ (* On all the distro families covered by "qga_pkg_of_family" and ++ * "qga_svc_start_cmd", the QEMU guest agent service is always ++ * enabled by package installation for *subsequent* boots. Package ++ * installation may or may not enable the service for the current ++ * (i.e., first) boot, however, so try that here manually. + *) +- fbs "start qga" +- (sprintf "#!/bin/sh\n\ +- service %s start\n\ +- chkconfig %s on\n" qga_pkg qga_pkg) ++ match qga_svc_start_cmd family inspect.i_distro inspect.i_major_version ++ with ++ | None -> () ++ | Some start_cmd -> ++ fbs "start qga" ++ (sprintf "#!/bin/sh\n\ ++ %s\n" start_cmd) + with + | Guest_packages.Unknown_package_manager msg + | Guest_packages.Unimplemented_package_manager msg -> diff --git a/SOURCES/copy-patches.sh b/SOURCES/copy-patches.sh new file mode 100755 index 0000000..6a3c4f6 --- /dev/null +++ b/SOURCES/copy-patches.sh @@ -0,0 +1,65 @@ +#!/bin/bash - + +set -e + +# Maintainer script to copy patches from the git repo to the current +# directory. Use it like this: +# ./copy-patches.sh + +project=virt-v2v +rhel_version=9.1 + +# Check we're in the right directory. +if [ ! -f $project.spec ]; then + echo "$0: run this from the directory containing '$project.spec'" + exit 1 +fi + +case `id -un` in + rjones) git_checkout=$HOME/d/$project-rhel-$rhel_version ;; + lacos) git_checkout=$HOME/src/v2v/$project ;; + *) git_checkout=$HOME/d/$project-rhel-$rhel_version ;; +esac +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 "$project release on RHEL." + exit 1 +fi + +# Get the base version of the project. +version=`grep '^Version:' $project.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 -c core.abbrev=8 format-patch -O/dev/null --subject-prefix=PATCH -N \ + --submodule=diff --no-signature --patience $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 $project.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/virt-v2v-2.0.7.tar.gz.sig b/SOURCES/virt-v2v-2.0.7.tar.gz.sig new file mode 100644 index 0000000..a1a6ee1 --- /dev/null +++ b/SOURCES/virt-v2v-2.0.7.tar.gz.sig @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNATURE----- + +iQJFBAABCAAvFiEE93dPsa0HSn6Mh2fqkXOPc+G3aKAFAmLFq4sRHHJpY2hAYW5u +ZXhpYS5vcmcACgkQkXOPc+G3aKCdDg/+LQr8ro5P9iKSDRNwLJ4jHmoXOqZVkSqO +KHk+kHuqFwSruEHxVGZwf9jYBNOuGD9K1d6AFWfYbRS2jEZpiA22ZX1Ym67PF5Fp +dw72BmWHBOzJ8YO6vauvpaRNLPypSgr3RwJUPlRYw847MFDrn71EVOBv7dqwVp0q +LqBk1wj/M3wKVV2DL8u0JE+CArSmqYSCCnyl2oq0VfIlhYbPQ4iprqTr5HWdd2fs +Mc0JkQiuYLoV3V7MP8U0qncktABZ/6gNuTSiUAsWLGSLaH67MNEfqjF4OyEU95cA +qivB53LEIebIAO07E9bLeFeXx7WLZsPI3Ms5m+aFWqjCLHl7h0qarHsrMMe+SBI6 +aSK+BzPzVHfzrqGRnL+95EQI0Vw9g5yLkxkm69KYGbukMulFdGgI24cGqHKEFadu +NbrSE/6ydkdKS8NGKeyM+Y5RMoWh379nQcksj8dB6Vv2NV31KQvde9mFxnV92FOn +1gYbIRwKPM1cc3VF6E3qlmIuBq59vagsJ/rcKg8fe8LNpNiOfi+Cmk8gYs9WuDFH +/RWCYd3XMWxYQ5ZGi3rCVw4ijZbdHGwc1+sH9/ExLGDVuUJQfJ0fpdjR4mYnghav +tFKc6EjxJknCR7D4HahVdzFbT/XrD0KpQ5JxToLDA3o7ecPJ42ExfKL53OwYjM/t +LUUDntYK6sk= +=Grra +-----END PGP SIGNATURE----- diff --git a/SPECS/virt-v2v.spec b/SPECS/virt-v2v.spec new file mode 100644 index 0000000..58a5b21 --- /dev/null +++ b/SPECS/virt-v2v.spec @@ -0,0 +1,611 @@ +%undefine _package_note_flags +# If we should verify tarball signature with GPGv2. +%global verify_tarball_signature 1 + +# If there are patches which touch autotools files, set this to 1. +%if !0%{?rhel} +%global patches_touch_autotools %{nil} +%else +# On RHEL the downstream patches always touch autotools files. +%global patches_touch_autotools 1 +%endif + +# The source directory. +%global source_directory 2.0-stable + +Name: virt-v2v +Epoch: 1 +Version: 2.0.7 +Release: 6%{?dist} +Summary: Convert a virtual machine to run on KVM + +License: GPLv2+ +URL: https://github.com/libguestfs/virt-v2v + +Source0: http://download.libguestfs.org/virt-v2v/%{source_directory}/%{name}-%{version}.tar.gz +%if 0%{verify_tarball_signature} +Source1: http://download.libguestfs.org/virt-v2v/%{source_directory}/%{name}-%{version}.tar.gz.sig +# Keyring used to verify tarball signature. +Source2: libguestfs.keyring +%endif + +# Maintainer script which helps with handling patches. +Source3: copy-patches.sh + +# Patches. +Patch0001: 0001-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch +Patch0002: 0002-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch +Patch0003: 0003-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch +Patch0004: 0004-RHEL-Fixes-for-libguestfs-winsupport.patch +Patch0005: 0005-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch +Patch0006: 0006-RHEL-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-1430203.patch +Patch0007: 0007-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch +Patch0008: 0008-RHEL-Disable-o-glance.patch +Patch0009: 0009-RHEL-Remove-the-in-place-option.patch +Patch0010: 0010-output-Remove-o-json-mode.patch +Patch0011: 0011-output-Remove-unused-dummy.c.patch +Patch0012: 0012-adopt-inversion-of-SELinux-relabeling-in-virt-custom.patch +Patch0013: 0013-output-create_libvirt_xml-wire-up-the-QEMU-guest-age.patch +Patch0014: 0014-convert_linux-extract-qemu-guest-agent-package-name.patch +Patch0015: 0015-convert_linux-install-the-QEMU-guest-agent-with-a-fi.patch +Patch0016: 0016-RHV-outputs-limit-copied-disk-count-to-23.patch +Patch0017: 0017-convert-document-networking-dependency-of-key-ID-cle.patch +Patch0018: 0018-qemu-nbd-Implement-output-compression-for-qcow2-file.patch +Patch0019: 0019-o-disk-o-libvirt-o-qemu-Implement-of-qcow2-oo-compre.patch +Patch0020: 0020-tests-Add-a-simple-test-of-o-local-of-qcow2-oo-compr.patch +Patch0021: 0021-RHEL-9-oo-compressed-Remove-nbdcopy-version-check-an.patch +Patch0022: 0022-RHEL-9-tests-Remove-btrfs-test.patch +Patch0023: 0023-convert-convert_linux-complete-the-remapping-of-NVMe.patch +Patch0024: 0024-input-xen-sync-ip-limitations-language-from-input-vm.patch +Patch0025: 0025-input-xen-replace-enable-LEGACY-crypto-advice-with-t.patch +Patch0026: 0026-common-Adapt-to-renamed-function-On_exit.rmdir-On_ex.patch +Patch0027: 0027-o-rhv-Unmount-the-temporary-NFS-mountpoint-as-late-a.patch +Patch0028: 0028-output-Permit-output-modes-to-wait-on-the-local-NBD-.patch +Patch0029: 0029-o-rhv-Wait-for-the-NBD-server-to-exit-to-avoid-a-rac.patch +Patch0030: 0030-output-create_libvirt_xml-relax-VCPU-feature-checkin.patch +Patch0031: 0031-input-xen-cover-RHEL9-OpenSSL-crypto-settings.patch +Patch0032: 0032-convert_linux-remove-LVM2-devices-file.patch +Patch0033: 0033-convert-linux-Add-support-for-Zstandard-compressed-k.patch +Patch0034: 0034-convert_linux-start-the-QEMU-guest-agent-in-a-distro.patch + +%if !0%{?rhel} +# libguestfs hasn't been built on i686 for a while since there is no +# kernel built for this architecture any longer and libguestfs rather +# fundamentally depends on the kernel. Therefore we must exclude this +# arch. Note there is no bug filed for this because we do not ever +# expect that libguestfs or virt-v2v will be available on i686 so +# there is nothing that needs fixing. +ExcludeArch: %{ix86} +%else +# Architectures where virt-v2v is shipped on RHEL: +# +# 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 +ExclusiveArch: x86_64 +%endif + +%if 0%{patches_touch_autotools} +BuildRequires: autoconf, automake, libtool +%endif + +BuildRequires: git +BuildRequires: make +BuildRequires: /usr/bin/pod2man +BuildRequires: gcc +BuildRequires: ocaml >= 4.04 + +BuildRequires: libguestfs-devel >= 1:1.44 +BuildRequires: augeas-devel +BuildRequires: bash-completion +BuildRequires: file-devel +BuildRequires: gettext-devel +BuildRequires: jansson-devel +BuildRequires: libnbd-devel +BuildRequires: libosinfo-devel +BuildRequires: libvirt-daemon-kvm +BuildRequires: libvirt-devel +BuildRequires: libxml2-devel +BuildRequires: pcre2-devel +BuildRequires: perl(Sys::Guestfs) +BuildRequires: po4a +BuildRequires: /usr/bin/virsh +BuildRequires: xorriso + +BuildRequires: ocaml-findlib-devel +BuildRequires: ocaml-libguestfs-devel +BuildRequires: ocaml-libnbd-devel +BuildRequires: ocaml-fileutils-devel +BuildRequires: ocaml-gettext-devel +%if !0%{?rhel} +BuildRequires: ocaml-ounit-devel +%endif + +BuildRequires: nbdkit-python-plugin + +%if 0%{verify_tarball_signature} +BuildRequires: gnupg2 +%endif + +Requires: libguestfs%{?_isa} >= 1:1.48.4-2.el9 +Requires: guestfs-tools >= 1.42 + +# XFS is the default filesystem in Fedora and RHEL. +Requires: libguestfs-xfs + +%if 0%{?rhel} +# For Windows conversions on RHEL. +Requires: libguestfs-winsupport >= 7.2 +%endif + +Requires: gawk +Requires: gzip +Requires: unzip +Requires: curl +Requires: openssh-clients >= 8.7p1 +Requires: %{_bindir}/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 + +%if !0%{?rhel} +Requires: python3 +%else +Requires: platform-python +%endif +Requires: libnbd >= 1.12.4-2.el9 +Requires: %{_bindir}/qemu-nbd +Requires: %{_bindir}/nbdcopy +Requires: %{_bindir}/nbdinfo +Requires: nbdkit-server >= 1.28.3-1.el9 +Requires: nbdkit-curl-plugin +Requires: nbdkit-file-plugin +Requires: nbdkit-nbd-plugin +Requires: nbdkit-null-plugin +Requires: nbdkit-python-plugin +Requires: nbdkit-ssh-plugin +%ifarch x86_64 +Requires: nbdkit-vddk-plugin +%endif +Requires: nbdkit-blocksize-filter +Requires: nbdkit-cacheextents-filter +Requires: nbdkit-cow-filter >= 1.28.3-1.el9 +Requires: nbdkit-multi-conn-filter +Requires: nbdkit-rate-filter +Requires: nbdkit-retry-filter + +# For rhsrvany.exe, used to install firstboot scripts in Windows guests. +Requires: mingw32-srvany >= 1.0-13 + +# On RHEL, virtio-win should be used to install virtio drivers +# and qemu-ga in converted guests. (RHBZ#1972644) +%if 0%{?rhel} +Recommends: virtio-win +%endif + + +%description +Virt-v2v converts a single guest from a foreign hypervisor to run on +KVM. It can read Linux and Windows guests running on VMware, Xen, +Hyper-V and some other hypervisors, and convert them to KVM managed by +libvirt, OpenStack, oVirt, Red Hat Virtualisation (RHV) or several +other targets. It can modify the guest to make it bootable on KVM and +install virtio drivers so it will run quickly. + + +%package bash-completion +Summary: Bash tab-completion for %{name} +BuildArch: noarch +Requires: bash-completion >= 2.0 +Requires: %{name} = %{epoch}:%{version}-%{release} + + +%description bash-completion +Install this package if you want intelligent bash tab-completion +for %{name}. + + +%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} +%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}' +%endif +%autosetup -p1 -S git + +%if 0%{patches_touch_autotools} +autoreconf -i +%endif + + +%build +%configure \ +%if !0%{?rhel} + --with-extra="fedora=%{fedora},release=%{release}" \ +%else + --with-extra="rhel=%{rhel},release=%{release}" \ +%endif + +make V=1 %{?_smp_mflags} + + +%install +%make_install + +# Delete libtool crap. +find $RPM_BUILD_ROOT -name '*.la' -delete + +# Virt-tools data directory. This contains symlinks to rhsrvany.exe +# and pnp_wait.exe which are satisfied by the dependency on +# mingw32-srvany. +mkdir -p $RPM_BUILD_ROOT%{_datadir}/virt-tools +pushd $RPM_BUILD_ROOT%{_datadir}/virt-tools +ln -sf ../../i686-w64-mingw32/sys-root/mingw/bin/rhsrvany.exe +ln -sf ../../i686-w64-mingw32/sys-root/mingw/bin/pnp_wait.exe +popd + +%if 0%{?rhel} +# On RHEL remove virt-v2v-in-place. +rm $RPM_BUILD_ROOT%{_bindir}/virt-v2v-in-place +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-in-place.1* +%endif + +# Find locale files. +%find_lang %{name} + + +%check +# All tests fail at the moment because of bugs in libvirt blockdev. +# # Tests fail on both armv7 and ppc64le in Fedora 31 because the kernel +# # cannot boot on qemu. +# %ifnarch %{arm} ppc64le + +# # On x86_64 this single test fails with: "virt-v2v: warning: the +# # target hypervisor does not support a x86_64 KVM guest". Missing +# # BuildRequires? +# %ifarch x86_64 +# truncate -s 0 tests/test-v2v-o-libvirt.sh +# %endif + +# # This test fails in mock. +# truncate -s 0 tests/test-v2v-oa-option.sh + +# # Make sure we can see the debug messages (RHBZ#1230160). +# export LIBGUESTFS_DEBUG=1 +# export LIBGUESTFS_TRACE=1 + +# make %{?_smp_mflags} check || { +# cat tests/test-suite.log +# exit 1 +# } + +# %endif + + +%files -f %{name}.lang +%license COPYING +%doc README +%{_bindir}/virt-v2v +%if !0%{?rhel} +%{_bindir}/virt-v2v-in-place +%endif +%{_mandir}/man1/virt-v2v.1* +%{_mandir}/man1/virt-v2v-hacking.1* +%{_mandir}/man1/virt-v2v-input-vmware.1* +%{_mandir}/man1/virt-v2v-input-xen.1* +%if !0%{?rhel} +%{_mandir}/man1/virt-v2v-in-place.1* +%endif +%{_mandir}/man1/virt-v2v-output-local.1* +%{_mandir}/man1/virt-v2v-output-openstack.1* +%{_mandir}/man1/virt-v2v-output-rhv.1* +%{_mandir}/man1/virt-v2v-release-notes-1.42.1* +%{_mandir}/man1/virt-v2v-release-notes-2.0.1* +%{_mandir}/man1/virt-v2v-support.1* +%{_datadir}/virt-tools + + +%files bash-completion +%license COPYING +%{_datadir}/bash-completion/completions/virt-v2v + + +%files man-pages-ja +%license COPYING +%lang(ja) %{_mandir}/ja/man1/*.1* + + +%files man-pages-uk +%license COPYING +%lang(uk) %{_mandir}/uk/man1/*.1* + + +%changelog +* Thu Aug 18 2022 Laszlo Ersek - 1:2.0.7-6 +- Install qemu-ga package during conversion + resolves: rhbz#2028764 + +* Wed Aug 10 2022 Richard W.M. Jones - 1:2.0.7-5 +- Remove LVM2 "devices file" during conversion + resolves: rhbz#2112801 +- Add support for Zstandard compressed kernel modules + resolves: rhbz#2116811 + +* Fri Jul 29 2022 Laszlo Ersek - 1:2.0.7-4 +- Remove legacy crypto advice and replace with targeted mechanism + resolves: rhbz#2062360 + +* Mon Jul 25 2022 Laszlo Ersek - 1:2.0.7-3 +- relax qemu64 VCPU feature checking in the libvirt output + resolves rhbz#2107503 + +* Fri Jul 15 2022 Richard W.M. Jones - 1:2.0.7-2 +- Rebase to stable branch version 2.0.7 + resolves: rhbz#2059287, rhbz#1658126, rhbz#1788823, rhbz#1854275 +- Fix openssh-clients dependency + resolves: rhbz#2064178 +- Fix security issue when running virt-v2v as root + resolves: rhbz#2066773 +- Remove -o json mode + resolves: rhbz#2074026 +- Allow conversion of guests with NVMe drives from VMX files + resolves: rhbz#2070530 +- Cleanly reject guests with snapshots when using -it ssh + resolves: rhbz#1774386 +- Document that vmx+ssh "-ip" auth doesn't cover ssh / scp shell commands + resolves: rhbz#1854275 +- Fix conversion if swap partition isn't encrypted with root directory + resolves: rhbz#1658128 +- Document permissions when importing OVA using RHV UI + resolves: rhbz#2039597 +- Multiple fixes for -o qemu mode + resolves: rhbz#2074805 +- Work around blocking bug in OpenStack + resolves: rhbz#2074801 +- If multiple open-vm-tools packages are installed, remove all (2076436) +- For -o rhv-upload wait for VM creation task + resolves: rhbz#1985830 +- For -i vmx add full support for SATA hard disks + resolves: rhbz#1883802 +- Fix booting of RHEL 9.1 guests after conversion + resolves: rhbz#2076013 +- Fix -o qemu warning + resolves: rhbz#2082603 +- If listing RPM applications fails, rebuild DB and retry (2089623) +- Document -i vmx -it ssh percent encoding in ssh URIs + resolves: rhbz#1938954 +- Document extra permissions needed for VMware 7 (1817050) +- Remove osprober devices left around by grub2 + resolves: rhbz#2003503 +- Add Requires python3 / platform-python + resolves: rhbz#2094779 +- Fix CVE-2022-2211 Denial of Service in --key parameter + resolves: rhbz#2102719 +- Add -oo compressed support + resolves: rhbz#2047660 +- Limit the maximum of disks per guest + resolves: rhbz#2051564 +- Add support for LUKS encrypted guests using Clevis & Tang + resolves: rhbz#1809453 +- Fix remapping of nvme devices in /boot/grub2/device.map + resolves: rhbz#2101665 +- Improve documentation of vmx+ssh and -ip option + resolves: rhbz#1854275 +- Fix race condition when unmounting in -o rhv mode (1953286#c26) + +* Tue Feb 15 2022 Richard W.M. Jones - 1:1.45.99-1 +- Rebase to upstream 1.45.99. +- Add check for sufficient free space in the host + resolves: rhbz#2051394 +- Update documentation of -ip for conversions from VMware over HTTPS + related: rhbz#1960087 +- -o rhv-upload: Keep connections alive + resolves: rhbz#2032324 +- -o rhv-upload: Improve conversion performance + resolves: rhbz#2039255 +- -o rhv-upload: Replace -oo rhv-direct with -oo rhv-proxy + resolves: rhbz#2033096 +- Fix log line wrapping making log parsing difficult (1820221) + +* Wed Feb 2 2022 Laszlo Ersek - 1:1.45.97-4 +- v2v import from vCenter fails when using interactive password because + cookie-script tries to be interactive + (pick commit 8abc07a8589a) + resolves: rhbz#1960087 +- model='virtio-transitional' is wrongly added when converting windows + guest to local by rhel9 v2v + (pick commit range commit range 8abc07a8589a..cacedec64072) + resolves: rhbz#2043333 + +* Wed Jan 26 2022 Richard W.M. Jones - 1:1.45.97-3 +- Rebase to upstream 1.45.97. + resolves: rhbz#2011713 +- Add virtio-transitional for older guests when converting to q35 + resolves: rhbz#1942325 +- Fix -o rhv mode + resolves: rhbz#2027598 +- input: xen: Fix assertion error when importing from remote block device + resolves: rhbz#2041852 +- output: -o json: Allow -oo (output options) to work + resolves: rhbz#2041850 +- Fix virt-v2v hang when given incorrect vpx:// URL + resolves: rhbz#2041886 +- Fix hang when converting with virt-p2v + resolves: rhbz#2044911 +- Send nbdinfo debugging information to stderr + resolves: rhbz#2044922 +- Explicitly require platform-python + resolves: rhbz#2046178 + +* Thu Dec 23 2021 Laszlo Ersek - 1:1.45.95-3 +- output_rhv: restrict block status collection to the old RHV output +- Rebase from upstream commit 702a511b7f33 to direct child commit 07b12fe99fb9 + resolves: rhbz#2034240 + +* Sat Dec 18 2021 Richard W.M. Jones - 1:1.45.95-2 +- Rebase to upstream 1.45.95. +- Change video type to VGA (instead of QXL). +- Remove --in-place support properly. +- Remove -o glance support properly. +- Fix quoting with openssh >= 8.7 (RHEL) / 8.8 +- Fix q35 error "IDE controllers are unsupported" +- Add virt-v2v and libvirt version in debug output +- Fix -o rhv output mode showing no guests listed + resolves: rhbz#2011713, rhbz#1961107, rhbz#2027673, + rhbz#1637857, rhbz#2032112, rhbz#2027598 + +* Wed Aug 18 2021 Richard W.M. Jones - 1:1.45.3-3 +- Fix conversion of Windows BitLocker guests + resolves: rhbz#1994984 + +* Tue Aug 10 2021 Mohan Boddu - 1:1.45.3-2 +- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags + Related: rhbz#1991688 + +* Fri Aug 06 2021 Richard W.M. Jones - 1:1.45.3-1 +- New upstream development version 1.45.3. +- Rebase RHEL patches. + resolves: rhbz#1950634 + +* Wed Jun 30 2021 Richard W.M. Jones - 1:1.45.2-1 +- New upstream development version 1.45.2. +- Remove --debug-overlays and --print-estimate options. +- Remove -o glance option on RHEL 9 (RHBZ#1977539). +- Remove support for RHEV-APT (RHBZ#1945549). + +* Wed Jun 16 2021 Richard W.M. Jones - 1:1.45.1-1.el9.1 +- New upstream development version 1.45.1. +- Require virtio-win on RHEL (RHBZ#1972644). +- v2v-test-harness, virt-v2v-copy-to-local have been removed upstream. + +* Thu Jun 10 2021 Richard W.M. Jones - 1:1.44.0-2 +- nbdkit-vddk-plugin dep only exists on x86-64. + +* Mon May 10 2021 Richard W.M. Jones - 1:1.44.0-1.el9.1 +- Rebuild in RHEL 9 against libguestfs 1.45.5 + resolves: rhbz#1959042 + +* Fri Apr 30 2021 Richard W.M. Jones - 1:1.44.0-1 +- New upstream stable branch version 1.44.0. + +* Wed Apr 14 2021 Richard W.M. Jones - 1:1.43.5-1 +- New upstream version 1.43.5. + +* Thu Apr 01 2021 Richard W.M. Jones - 1:1.43.4-5 +- Add upstream patch to depend on xorriso. +- Change libguestfs-tools-c -> guestfs-tools. + +* Tue Mar 30 2021 Richard W.M. Jones - 1:1.43.4-3 +- Add downstream (RHEL-only) patches (RHBZ#1931724). + +* Mon Mar 8 2021 Richard W.M. Jones - 1:1.43.4-2 +- Bump and rebuild for ocaml-gettext update. + +* Wed Mar 3 2021 Richard W.M. Jones - 1:1.43.4-1 +- New upstream version 1.43.4. + +* Tue Mar 2 2021 Richard W.M. Jones - 1:1.43.3-4 +- OCaml 4.12.0 build + +* Tue Mar 2 2021 Richard W.M. Jones - 1:1.43.3-3 +- Add fix for OCaml 4.12. + +* Wed Jan 27 2021 Fedora Release Engineering - 1:1.43.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Jan 05 2021 Richard W.M. Jones - 1:1.43.3-1 +- New upstream version 1.43.3. + +* Thu Dec 03 2020 Richard W.M. Jones - 1:1.43.2-3 +- Drop obsolete virt-v2v-copy-to-local tool for Fedora 34 and RHEL 9. + +* Wed Dec 02 2020 Richard W.M. Jones - 1:1.43.2-2 +- Unify Fedora and RHEL spec files. + +* Tue Dec 01 2020 Richard W.M. Jones - 1:1.43.2-1 +- New upstream version 1.43.2. + +* Tue Sep 01 2020 Richard W.M. Jones - 1:1.43.1-5 +- OCaml 4.11.1 rebuild + +* Fri Aug 21 2020 Richard W.M. Jones - 1:1.43.1-4 +- OCaml 4.11.0 rebuild + +* Sat Aug 01 2020 Fedora Release Engineering - 1:1.43.1-3 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jul 29 2020 Fedora Release Engineering - 1:1.43.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Mon Jul 06 2020 Richard W.M. Jones - 1.43.1-1 +- New development branch 1.43. + +* Wed May 06 2020 Richard W.M. Jones - 1.42.0-4 +- Re-add Epoch. Forgotten when we split this package from libguestfs. + +* Tue May 05 2020 Richard W.M. Jones - 1.42.0-2 +- OCaml 4.11.0+dev2-2020-04-22 rebuild + +* Thu Apr 16 2020 Richard W.M. Jones - 1.42.0-1 +- New upstream stable version 1.42.0. + +* Sat Apr 04 2020 Richard W.M. Jones - 1.41.8-11 +- Update all OCaml dependencies for RPM 4.16. + +* Thu Feb 27 2020 Richard W.M. Jones - 1.41.8-10 +- OCaml 4.10.0 final. + +* Fri Jan 31 2020 Fedora Release Engineering - 1.41.8-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Sun Jan 19 2020 Richard W.M. Jones - 1.41.8-8 +- Bump release and rebuild. + +* Sun Jan 19 2020 Richard W.M. Jones - 1.41.8-7 +- Bump release and rebuild. + +* Sun Jan 19 2020 Richard W.M. Jones - 1.41.8-6 +- Bump release and rebuild. + +* Sun Jan 19 2020 Richard W.M. Jones - 1.41.8-5 +- OCaml 4.10.0+beta1 rebuild. +- Use nbdkit-python-plugin (now all Python 3 in Rawhide). + +* Wed Nov 27 2019 Richard W.M. Jones - 1.41.8-4 +- Use license instead of doc for COPYING file. +- Include license in all subpackages. +- Use gpgverify macro. +- Don't own bash-completion directory because we Require the + bash-completion package which owns it already. + +* Tue Nov 26 2019 Richard W.M. Jones - 1.41.8-2 +- Fix permissions on .sig file. +- Disable -oa preallocated test since it fails in reviewers mock environment. + +* Fri Nov 15 2019 Richard W.M. Jones - 1.41.8-1 +- Initial release of separate virt-v2v program, was part of libguestfs.