import virt-v2v-1.42.0-21.module+el8.7.0+15868+7d816fcd
This commit is contained in:
parent
0982042d86
commit
b10c838fd9
@ -37,5 +37,5 @@ index 7df17b29..4d0b8639 100644
|
||||
let get_domain conn name =
|
||||
let dom =
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -210,5 +210,5 @@ index 120a52f7..3cbca9d7 100644
|
||||
-val input_libvirt_xen_ssh : Libvirt.rw Libvirt.Connect.t Lazy.t -> string option -> Xml.uri -> string -> string -> Types.input
|
||||
+val input_libvirt_xen_ssh : Libvirt.rw Libvirt.Connect.t Lazy.t -> string -> string option -> Xml.uri -> string -> string -> Types.input
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -30,5 +30,5 @@ index c28a4ced..4c128b0c 100644
|
||||
let headers =
|
||||
List.map (
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -93,5 +93,5 @@ index 05553c4f..5a1fba0f 100644
|
||||
(match pool with
|
||||
| None ->
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -47,5 +47,5 @@ index 979c3773..402dfd0e 100644
|
||||
)
|
||||
else cmd, [] in
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -45,5 +45,5 @@ index 402dfd0e..bfda91a7 100644
|
||||
(* Caching extents speeds up qemu-img, especially its consecutive
|
||||
* block_status requests with req_one=1.
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -112,5 +112,5 @@ index bfda91a7..47832011 100644
|
||||
let run cmd =
|
||||
let sock, _ = Nbdkit.run_unix cmd in
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -53,5 +53,5 @@ index 47832011..f5e91911 100644
|
||||
Nbdkit.add_arg cmd "password" ("+" ^ password_file) in
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -40,5 +40,5 @@ index 1ab6bb4d..497840c2 100644
|
||||
typedef OsinfoDb *OsinfoDb_t;
|
||||
typedef OsinfoOs *OsinfoOs_t;
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -56,5 +56,5 @@ index a00fa8af..74934eb4 100644
|
||||
=item B<--mac> aa:bb:cc:dd:ee:ffB<:network:>out
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -22,5 +22,5 @@ index 03c5339..8379039 100644
|
||||
+If there are multiple encrypted devices then you may need to supply
|
||||
+multiple keys on stdin, one per line.
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -122,5 +122,5 @@ index 249137ab..3b74f307 100644
|
||||
|
||||
let no_trim_warning _ =
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -29,5 +29,5 @@ index 4d0b8639..1a24b049 100644
|
||||
function
|
||||
| { Libvirt.Connect.typ = Libvirt.Connect.CredentialPassphrase } -> password
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -29,5 +29,5 @@ index be3a3c5e..85d08265 100644
|
||||
let flag = Qemuopts.flag cmd
|
||||
and arg = Qemuopts.arg cmd
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -101,5 +101,5 @@ index 3b74f307..df69e2e0 100644
|
||||
output_format, output_alloc
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -30,5 +30,5 @@ index ccbb9d68..c2940582 100644
|
||||
(* Find the UEFI firmware. *)
|
||||
let find_uefi_firmware guest_arch =
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -75,5 +75,5 @@ index f1da222a..ff94fe39 100755
|
||||
|
||||
# We also update the Registry several times, for firstboot, and (ONLY
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -282,5 +282,5 @@ index df69e2e0..7b79d462 100644
|
||||
let error_option_cannot_be_used_in_output_mode mode opt =
|
||||
error (f_"-o %s: %s option cannot be used in this output mode") mode opt
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -22,5 +22,5 @@ index d146e84c..4e403003 100644
|
||||
s_video = None;
|
||||
s_sound = None;
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -22,5 +22,5 @@ index 3b3cf0f0..32da2848 100644
|
||||
=head1 INPUT FROM XEN
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -85,5 +85,5 @@ index d3e6260e..471102da 100644
|
||||
types.StorageDomain(
|
||||
name=params['output_storage'],
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -23,5 +23,5 @@ index 33c5e9a2..b1ea8f9d 100644
|
||||
type script = {
|
||||
tmpdir : string; (* Temporary directory. *)
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -121,5 +121,5 @@ index 8333366b..a5150907 100644
|
||||
=head2 Guest firmware
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -384,5 +384,5 @@ index 73edff2c..a58ff433 100644
|
||||
info (f_"Overlay saved as %s [--debug-overlays]") saved_filename
|
||||
) overlays
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -30,5 +30,5 @@ index 179b0edf..fdc04b02 100644
|
||||
(* List of Cinder volume IDs. *)
|
||||
val mutable volume_ids = []
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -40,5 +40,5 @@ index ba26949f..f2f7b95c 100644
|
||||
(*----------------------------------------------------------------------*)
|
||||
(* Perform the conversion of the Windows guest. *)
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -133,5 +133,5 @@ index f2f7b95c..84db742f 100644
|
||||
(*----------------------------------------------------------------------*)
|
||||
(* Perform the conversion of the Windows guest. *)
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -58,5 +58,5 @@ index 84db742f..44cef5ed 100644
|
||||
(*----------------------------------------------------------------------*)
|
||||
(* Perform the conversion of the Windows guest. *)
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -79,5 +79,5 @@ index 471102da..7cd6dea6 100644
|
||||
except:
|
||||
cancel_transfer(connection, transfer)
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -33,5 +33,5 @@ index 44cef5ed..4d844e2d 100644
|
||||
msi_path msi_path msi_path in
|
||||
Firstboot.add_firstboot_script g inspect.i_root
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -28,5 +28,5 @@ index 4d844e2d..33fbd410 100644
|
||||
(* Install RHEV-APT only if appropriate for the output hypervisor. *)
|
||||
if output#install_rhev_apt then (
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -23,5 +23,5 @@ index a5150907..1ffc0f9d 100644
|
||||
=item UEFI on oVirt or RHV
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -43,5 +43,5 @@ index 78623d97..f5a3abad 100644
|
||||
Virt-v2v adds metadata for the guest to Glance, describing such things
|
||||
as the guest operating system and what drivers it requires. The
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -148,5 +148,5 @@ index a58ff433..1f8d0138 100644
|
||||
| TargetURI _ ->
|
||||
(* XXX For the moment we assume that qemu URI outputs
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -38,5 +38,5 @@ index f5e91911..7c177e35 100644
|
||||
(* Caching extents speeds up qemu-img, especially its consecutive
|
||||
* block_status requests with req_one=1.
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -33,5 +33,5 @@ index e4df920e..ae8964dd 100644
|
||||
|
||||
L<virt-v2v(1)>.
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -127,5 +127,5 @@ index 1f8d0138..bde51885 100644
|
||||
if files > 0L && ffree < needed_inodes then
|
||||
error (f_"not enough available inodes for conversion on filesystem ‘%s’. %Ld inodes available < %Ld inodes needed")
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -26,5 +26,5 @@ index 4e00cd61..b8256bad 100644
|
||||
| Some QXL, false ->
|
||||
error (f_"there is no QXL driver for this version of Windows (%d.%d %s). virt-v2v looks for this driver in %s")
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -24,5 +24,5 @@ index 1ffc0f9d..a9bfffab 100644
|
||||
=item UEFI on oVirt or RHV
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -56,5 +56,5 @@ index bde51885..8af86687 100644
|
||||
| _ -> 10
|
||||
in
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -175,5 +175,5 @@ index 7cd6dea6..61ade1a8 100644
|
||||
|
||||
def transfer_supports_format():
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -76,5 +76,5 @@ index 33fbd410..13de10cb 100644
|
||||
)
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -271,5 +271,5 @@ index 4c128b0c..ead03364 100644
|
||||
|
||||
(* Return the struct. *)
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -40,5 +40,5 @@ index 13de10cb..6c7440aa 100644
|
||||
msi_path msi_path msi_path in
|
||||
Firstboot.add_firstboot_script g inspect.i_root
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -207,5 +207,5 @@ index 8af86687..203b93f1 100644
|
||||
(* What really happens here is that the call to #disk_create
|
||||
* below fails if the format is not raw or qcow2. We would
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
@ -40,5 +40,5 @@ index 27e08135..e65fbf4a 100644
|
||||
(match xpath_string "/volume/@type" with
|
||||
| None | Some "file" ->
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
||||
|
182
SOURCES/0048-o-rhv-upload-wait-for-VM-creation-task.patch
Normal file
182
SOURCES/0048-o-rhv-upload-wait-for-VM-creation-task.patch
Normal file
@ -0,0 +1,182 @@
|
||||
From 8036ab4bc8f37030fcaceda14678cb14dbbed547 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= <tgolembi@redhat.com>
|
||||
Date: Wed, 20 Apr 2022 17:14:26 +0200
|
||||
Subject: [PATCH] -o rhv-upload: wait for VM creation task
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
oVirt API call for VM creation finishes before the VM is actually
|
||||
created. Entities may be still locked after virt-v2v terminates and if
|
||||
user tries to perform (scripted) actions after virt-v2v those operations
|
||||
may fail. To prevent this it is useful to monitor the task and wait for
|
||||
the completion. This will also help to prevent some corner case
|
||||
scenarios (that would be difficult to debug) when the VM creation job
|
||||
fails after virt-v2v already termintates with success.
|
||||
|
||||
Thanks: Nir Soffer
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1985827
|
||||
Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
|
||||
Reviewed-by: Arik Hadas <ahadas@redhat.com>
|
||||
Reviewed-by: Nir Soffer <nsoffer@redhat.com>
|
||||
(cherry picked from commit 291edb363e841e1c555954a070def671a651cfab)
|
||||
---
|
||||
.../ovirtsdk4/__init__.py | 10 +++-
|
||||
.../ovirtsdk4/types.py | 19 +++++++
|
||||
v2v/rhv-upload-createvm.py | 57 ++++++++++++++++++-
|
||||
3 files changed, 84 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py b/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py
|
||||
index abb7050c..ba0649cb 100644
|
||||
--- a/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py
|
||||
+++ b/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py
|
||||
@@ -63,6 +63,9 @@ class SystemService(object):
|
||||
def disks_service(self):
|
||||
return DisksService()
|
||||
|
||||
+ def jobs_service(self):
|
||||
+ return JobsService()
|
||||
+
|
||||
def image_transfers_service(self):
|
||||
return ImageTransfersService()
|
||||
|
||||
@@ -108,6 +111,11 @@ class DisksService(object):
|
||||
return DiskService(disk_id)
|
||||
|
||||
|
||||
+class JobsService(object):
|
||||
+ def list(self, search=None):
|
||||
+ return [types.Job()]
|
||||
+
|
||||
+
|
||||
class ImageTransferService(object):
|
||||
def __init__(self):
|
||||
self._finalized = False
|
||||
@@ -139,7 +147,7 @@ class StorageDomainsService(object):
|
||||
|
||||
|
||||
class VmsService(object):
|
||||
- def add(self, vm):
|
||||
+ def add(self, vm, query=None):
|
||||
return vm
|
||||
|
||||
def list(self, search=None):
|
||||
diff --git a/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py b/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py
|
||||
index 732887aa..8e734756 100644
|
||||
--- a/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py
|
||||
+++ b/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py
|
||||
@@ -138,6 +138,25 @@ class Initialization(object):
|
||||
pass
|
||||
|
||||
|
||||
+class JobStatus(Enum):
|
||||
+ ABORTED = "aborted"
|
||||
+ FAILED = "failed"
|
||||
+ FINISHED = "finished"
|
||||
+ STARTED = "started"
|
||||
+ UNKNOWN = "unknown"
|
||||
+
|
||||
+ def __init__(self, image):
|
||||
+ self._image = image
|
||||
+
|
||||
+ def __str__(self):
|
||||
+ return self._image
|
||||
+
|
||||
+
|
||||
+class Job(object):
|
||||
+ description = "Fake job"
|
||||
+ status = JobStatus.FINISHED
|
||||
+
|
||||
+
|
||||
class StorageDomain(object):
|
||||
def __init__(self, name=None):
|
||||
pass
|
||||
diff --git a/v2v/rhv-upload-createvm.py b/v2v/rhv-upload-createvm.py
|
||||
index 50bb7e34..8887c52b 100644
|
||||
--- a/v2v/rhv-upload-createvm.py
|
||||
+++ b/v2v/rhv-upload-createvm.py
|
||||
@@ -19,12 +19,54 @@
|
||||
import json
|
||||
import logging
|
||||
import sys
|
||||
+import time
|
||||
+import uuid
|
||||
|
||||
from urllib.parse import urlparse
|
||||
|
||||
import ovirtsdk4 as sdk
|
||||
import ovirtsdk4.types as types
|
||||
|
||||
+
|
||||
+def debug(s):
|
||||
+ if params['verbose']:
|
||||
+ print(s, file=sys.stderr)
|
||||
+ sys.stderr.flush()
|
||||
+
|
||||
+
|
||||
+def jobs_completed(system_service, correlation_id):
|
||||
+ jobs_service = system_service.jobs_service()
|
||||
+
|
||||
+ try:
|
||||
+ jobs = jobs_service.list(
|
||||
+ search="correlation_id=%s" % correlation_id)
|
||||
+ except sdk.Error as e:
|
||||
+ debug(
|
||||
+ "Error searching for jobs with correlation id %s: %s" %
|
||||
+ (correlation_id, e))
|
||||
+ # We don't know, assume that jobs did not complete yet.
|
||||
+ return False
|
||||
+
|
||||
+ # STARTED is the only "in progress" status, anything else means the job
|
||||
+ # has already terminated.
|
||||
+ if all(job.status != types.JobStatus.STARTED for job in jobs):
|
||||
+ failed_jobs = [(job.description, str(job.status))
|
||||
+ for job in jobs
|
||||
+ if job.status != types.JobStatus.FINISHED]
|
||||
+ if failed_jobs:
|
||||
+ raise RuntimeError(
|
||||
+ "Failed to create a VM! Failed jobs: %r" % failed_jobs)
|
||||
+ return True
|
||||
+ else:
|
||||
+ running_jobs = [(job.description, str(job.status)) for job in jobs]
|
||||
+ debug("Some jobs with correlation id %s are running: %s" %
|
||||
+ (correlation_id, running_jobs))
|
||||
+ return False
|
||||
+
|
||||
+
|
||||
+# Seconds to wait for the VM import job to complete in oVirt.
|
||||
+timeout = 3 * 60
|
||||
+
|
||||
# Parameters are passed in via a JSON doc from the OCaml code.
|
||||
# Because this Python code ships embedded inside virt-v2v there
|
||||
# is no formal API here.
|
||||
@@ -67,6 +109,7 @@ system_service = connection.system_service()
|
||||
cluster = system_service.clusters_service().cluster_service(params['rhv_cluster_uuid'])
|
||||
cluster = cluster.get()
|
||||
|
||||
+correlation_id = str(uuid.uuid4())
|
||||
vms_service = system_service.vms_service()
|
||||
vm = vms_service.add(
|
||||
types.Vm(
|
||||
@@ -77,5 +120,17 @@ vm = vms_service.add(
|
||||
data=ovf,
|
||||
)
|
||||
)
|
||||
- )
|
||||
+ ),
|
||||
+ query={'correlation_id': correlation_id},
|
||||
)
|
||||
+
|
||||
+# Wait for the import job to finish.
|
||||
+endt = time.monotonic() + timeout
|
||||
+while True:
|
||||
+ time.sleep(10)
|
||||
+ if jobs_completed(system_service, correlation_id):
|
||||
+ break
|
||||
+ if time.monotonic() > endt:
|
||||
+ raise RuntimeError(
|
||||
+ "Timed out waiting for VM creation!"
|
||||
+ " Jobs still running for correlation id %s" % correlation_id)
|
||||
--
|
||||
2.31.1
|
||||
|
96
SOURCES/0049-tests-Add-test-of-i-ova-from-a-directory.patch
Normal file
96
SOURCES/0049-tests-Add-test-of-i-ova-from-a-directory.patch
Normal file
@ -0,0 +1,96 @@
|
||||
From 7748be2af952898c9c38d02e9a539c71cbfbb56b Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 25 May 2021 10:13:00 +0100
|
||||
Subject: [PATCH] tests: Add test of -i ova from a directory.
|
||||
|
||||
This was not tested previously.
|
||||
|
||||
(cherry picked from commit a00ce662cb33c33706a013ff98ff89244cd14667)
|
||||
---
|
||||
tests/Makefile.am | 2 ++
|
||||
tests/test-v2v-i-ova-directory.sh | 53 +++++++++++++++++++++++++++++++
|
||||
2 files changed, 55 insertions(+)
|
||||
create mode 100755 tests/test-v2v-i-ova-directory.sh
|
||||
|
||||
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
||||
index eee4e1af..e4b907fe 100644
|
||||
--- a/tests/Makefile.am
|
||||
+++ b/tests/Makefile.am
|
||||
@@ -58,6 +58,7 @@ TESTS = \
|
||||
test-v2v-copy-to-local.sh \
|
||||
test-v2v-i-ova-bad-sha1.sh \
|
||||
test-v2v-i-ova-bad-sha256.sh \
|
||||
+ test-v2v-i-ova-directory.sh \
|
||||
test-v2v-i-ova-formats.sh \
|
||||
test-v2v-i-ova-good-checksums.sh \
|
||||
test-v2v-i-ova-gz.sh \
|
||||
@@ -185,6 +186,7 @@ EXTRA_DIST += \
|
||||
test-v2v-i-ova-bad-sha1.sh \
|
||||
test-v2v-i-ova-bad-sha256.sh \
|
||||
test-v2v-i-ova-checksums.ovf \
|
||||
+ test-v2v-i-ova-directory.sh \
|
||||
test-v2v-i-ova-formats.expected \
|
||||
test-v2v-i-ova-formats.ovf \
|
||||
test-v2v-i-ova-formats.sh \
|
||||
diff --git a/tests/test-v2v-i-ova-directory.sh b/tests/test-v2v-i-ova-directory.sh
|
||||
new file mode 100755
|
||||
index 00000000..7c593139
|
||||
--- /dev/null
|
||||
+++ b/tests/test-v2v-i-ova-directory.sh
|
||||
@@ -0,0 +1,53 @@
|
||||
+#!/bin/bash -
|
||||
+# libguestfs virt-v2v test script
|
||||
+# Copyright (C) 2014-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.
|
||||
+
|
||||
+# Test -i ova option with a directory.
|
||||
+
|
||||
+set -e
|
||||
+
|
||||
+$TEST_FUNCTIONS
|
||||
+skip_if_skipped
|
||||
+skip_if_backend uml
|
||||
+skip_unless_phony_guest windows.img
|
||||
+
|
||||
+skip_unless_libvirt_minimum_version 3 1 0
|
||||
+
|
||||
+export VIRT_TOOLS_DATA_DIR="$top_srcdir/test-data/fake-virt-tools"
|
||||
+export VIRTIO_WIN="$top_srcdir/test-data/fake-virtio-win"
|
||||
+
|
||||
+d=test-v2v-i-ova-directory.d
|
||||
+rm -rf $d
|
||||
+mkdir $d
|
||||
+
|
||||
+vmdk=test-ova.vmdk
|
||||
+ovf=test-v2v-i-ova.ovf
|
||||
+mf=test-ova.mf
|
||||
+
|
||||
+qemu-img convert $top_builddir/test-data/phony-guests/windows.img \
|
||||
+ -O vmdk $d/$vmdk
|
||||
+cp "$srcdir/$ovf" $d/$ovf
|
||||
+sha1=`do_sha1 $d/$ovf`
|
||||
+echo "SHA1($ovf)= $sha1" > $d/$mf
|
||||
+sha256=`do_sha256 $d/$vmdk`
|
||||
+echo "SHA256($vmdk)= $sha256" >> $d/$mf
|
||||
+
|
||||
+$VG virt-v2v --debug-gc \
|
||||
+ -i ova $d \
|
||||
+ -o null
|
||||
+
|
||||
+rm -rf $d
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,66 @@
|
||||
From 9e52e90cf8d570516d4098584c263c9d8b76c447 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 25 May 2021 10:27:53 +0100
|
||||
Subject: [PATCH] v2v: -i ova: Fix parsing if OVA directory name has a trailing
|
||||
"/"
|
||||
|
||||
If you use an OVA directory with a trailing "/" in the name, virt-v2v
|
||||
would fail with:
|
||||
|
||||
virt-v2v: error: internal error: assertion failed at parse_ova.ml, line 273, char 15
|
||||
|
||||
The fix for this is to knock off the trailing "/" if present.
|
||||
|
||||
Reported-by: Xiaodai Wang
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1964324
|
||||
(cherry picked from commit f8428f5eaaff6dedc54a40138f760298a7a3a965)
|
||||
---
|
||||
v2v/parse_ova.ml | 18 +++++++++++++++++-
|
||||
1 file changed, 17 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/v2v/parse_ova.ml b/v2v/parse_ova.ml
|
||||
index 568ac5fa..fc413d2a 100644
|
||||
--- a/v2v/parse_ova.ml
|
||||
+++ b/v2v/parse_ova.ml
|
||||
@@ -57,6 +57,13 @@ and ova_type =
|
||||
*)
|
||||
| TarOptimized of string (* tarball *)
|
||||
|
||||
+let string_of_t { orig_ova; top_dir; ova_type } =
|
||||
+ sprintf "orig_ova = %s, top_dir = %s, ova_type = %s"
|
||||
+ orig_ova top_dir
|
||||
+ (match ova_type with
|
||||
+ | Directory -> "Directory"
|
||||
+ | TarOptimized tarball -> "TarOptimized " ^ tarball)
|
||||
+
|
||||
type file_ref =
|
||||
| LocalFile of string
|
||||
| TarFile of string * string
|
||||
@@ -122,6 +129,13 @@ let rec parse_ova ova =
|
||||
(* Exploded path must be absolute (RHBZ#1155121). *)
|
||||
let top_dir = absolute_path top_dir in
|
||||
|
||||
+ (* top_dir must not end with / except if it == "/" (which is
|
||||
+ * likely not what you want). (RHBZ#1964324)
|
||||
+ *)
|
||||
+ let top_dir =
|
||||
+ if top_dir = "/" || not (String.is_suffix top_dir "/") then top_dir
|
||||
+ else String.sub top_dir 0 (String.length top_dir - 1) in
|
||||
+
|
||||
(* If virt-v2v is running as root, and the backend is libvirt, then
|
||||
* we have to chmod the directory to 0755 and files to 0644
|
||||
* so it is readable by qemu.qemu. This is libvirt bug RHBZ#890291.
|
||||
@@ -136,7 +150,9 @@ let rec parse_ova ova =
|
||||
ignore (run_command cmd)
|
||||
);
|
||||
|
||||
- { orig_ova = ova; top_dir; ova_type }
|
||||
+ let ova = { orig_ova = ova; top_dir; ova_type } in
|
||||
+ debug "ova: %s" (string_of_t ova);
|
||||
+ ova
|
||||
|
||||
(* Return true if [libvirt] supports ["json:"] pseudo-URLs and accepts the
|
||||
* ["raw"] driver. Function also returns true if [libvirt] backend is not
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,98 @@
|
||||
From 87e5404d20ec54d16d22a7bb8f06ea91076c91f7 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Wed, 25 May 2022 16:47:04 +0100
|
||||
Subject: [PATCH] convert: If listing RPM applications fails, rebuild DB and
|
||||
retry
|
||||
|
||||
In libguestfs before commit 488245ed6c ("daemon: rpm: Check return
|
||||
values from librpm calls") we didn't bother to check the return values
|
||||
from any librpm calls. In some cases where the RPM database is
|
||||
faulty, this caused us to return a zero-length array of applications
|
||||
(but no error indication). Libguestfs has subsequently been fixed so
|
||||
now it returns an error if the RPM database is corrupt.
|
||||
|
||||
This commit changes virt-v2v behaviour so that if either
|
||||
guestfs_inspect_list_applications2 returns a zero-length list (ie. old
|
||||
libguestfs) or it throws an error (new libguestfs) then we attempt to
|
||||
rebuild the RPM database and retry the operation. Rebuilding the
|
||||
database can recover from some but not all RPM DB corruption.
|
||||
|
||||
See-also: https://bugzilla.redhat.com/show_bug.cgi?id=2089623#c12
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2089623
|
||||
Reported-by: Xiaodai Wang
|
||||
Reported-by: Ming Xie
|
||||
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
||||
(cherry picked from commit 31bf5db25bcfd8a9f5a48cc0523abae28861de9a)
|
||||
---
|
||||
v2v/inspect_source.ml | 34 ++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 32 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/v2v/inspect_source.ml b/v2v/inspect_source.ml
|
||||
index b8a3c8ad..554fde1d 100644
|
||||
--- a/v2v/inspect_source.ml
|
||||
+++ b/v2v/inspect_source.ml
|
||||
@@ -34,6 +34,7 @@ let rec inspect_source root_choice g =
|
||||
reject_if_not_installed_image g root;
|
||||
|
||||
let typ = g#inspect_get_type root in
|
||||
+ let package_format = g#inspect_get_package_format root in
|
||||
|
||||
(* Mount up the filesystems. *)
|
||||
let mps = g#inspect_get_mountpoints root in
|
||||
@@ -71,7 +72,7 @@ let rec inspect_source root_choice g =
|
||||
) mps;
|
||||
|
||||
(* Get list of applications/packages installed. *)
|
||||
- let apps = g#inspect_list_applications2 root in
|
||||
+ let apps = list_applications g root package_format in
|
||||
let apps = Array.to_list apps in
|
||||
|
||||
(* A map of app2_name -> application2, for easier lookups. Note
|
||||
@@ -106,7 +107,7 @@ let rec inspect_source root_choice g =
|
||||
i_arch = g#inspect_get_arch root;
|
||||
i_major_version = g#inspect_get_major_version root;
|
||||
i_minor_version = g#inspect_get_minor_version root;
|
||||
- i_package_format = g#inspect_get_package_format root;
|
||||
+ i_package_format = package_format;
|
||||
i_package_management = g#inspect_get_package_management root;
|
||||
i_product_name = g#inspect_get_product_name root;
|
||||
i_product_variant = g#inspect_get_product_variant root;
|
||||
@@ -186,6 +187,35 @@ and reject_if_not_installed_image g root =
|
||||
if fmt <> "installed" then
|
||||
error (f_"libguestfs thinks this is not an installed operating system (it might be, for example, an installer disk or live CD). If this is wrong, it is probably a bug in libguestfs. root=%s fmt=%s") root fmt
|
||||
|
||||
+(* Wrapper around g#inspect_list_applications2 which, for RPM
|
||||
+ * guests, on failure tries to rebuild the RPM database before
|
||||
+ * repeating the operation.
|
||||
+ *)
|
||||
+and list_applications g root = function
|
||||
+ | "rpm" ->
|
||||
+ (* RPM guest.
|
||||
+ *
|
||||
+ * In libguestfs before commit 488245ed6c ("daemon: rpm: Check
|
||||
+ * return values from librpm calls"), a corrupt RPM database
|
||||
+ * would return an empty array here with no exception. Hence
|
||||
+ * the check below which turns empty array => exception. In
|
||||
+ * libguestfs after that commit, inspect_list_applications2
|
||||
+ * will raise an exception if it detects a corrupt RPM database.
|
||||
+ *)
|
||||
+ (try
|
||||
+ let apps = g#inspect_list_applications2 root in
|
||||
+ if apps = [||] then raise (G.Error "no applications returned");
|
||||
+ apps
|
||||
+ with G.Error msg ->
|
||||
+ debug "%s" msg;
|
||||
+ debug "rebuilding RPM database and retrying ...";
|
||||
+ ignore (g#sh "rpmdb --rebuilddb");
|
||||
+ g#inspect_list_applications2 root
|
||||
+ )
|
||||
+ | _ ->
|
||||
+ (* Non-RPM guest, just do it. *)
|
||||
+ g#inspect_list_applications2 root
|
||||
+
|
||||
(* See if this guest could use UEFI to boot. It should use GPT and
|
||||
* it should have an EFI System Partition (ESP).
|
||||
*
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,53 @@
|
||||
From 5852b85eaa174dfb87ce7a03b9f70e2bffac4ca4 Mon Sep 17 00:00:00 2001
|
||||
From: Laszlo Ersek <lersek@redhat.com>
|
||||
Date: Wed, 29 Jun 2022 15:44:27 +0200
|
||||
Subject: [PATCH] update common submodule for CVE-2022-2211 fix
|
||||
|
||||
$ git shortlog 9e990f3e4530..35467027f657
|
||||
|
||||
Laszlo Ersek (1):
|
||||
options: fix buffer overflow in get_keys() [CVE-2022-2211]
|
||||
|
||||
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
|
||||
(cherry picked from commit 795d5dfcef77fc54fec4d237bda28571454a6d4e)
|
||||
---
|
||||
common | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
Submodule common be09523d..1174b443:
|
||||
diff --git a/common/options/keys.c b/common/options/keys.c
|
||||
index 798315c..d27a712 100644
|
||||
--- a/common/options/keys.c
|
||||
+++ b/common/options/keys.c
|
||||
@@ -128,17 +128,23 @@ read_first_line_from_file (const char *filename)
|
||||
char **
|
||||
get_keys (struct key_store *ks, const char *device, const char *uuid)
|
||||
{
|
||||
- size_t i, j, len;
|
||||
+ size_t i, j, nmemb;
|
||||
char **r;
|
||||
char *s;
|
||||
|
||||
/* We know the returned list must have at least one element and not
|
||||
* more than ks->nr_keys.
|
||||
*/
|
||||
- len = 1;
|
||||
- if (ks)
|
||||
- len = MIN (1, ks->nr_keys);
|
||||
- r = calloc (len+1, sizeof (char *));
|
||||
+ nmemb = 1;
|
||||
+ if (ks && ks->nr_keys > nmemb)
|
||||
+ nmemb = ks->nr_keys;
|
||||
+
|
||||
+ /* make room for the terminating NULL */
|
||||
+ if (nmemb == (size_t)-1)
|
||||
+ error (EXIT_FAILURE, 0, _("size_t overflow"));
|
||||
+ nmemb++;
|
||||
+
|
||||
+ r = calloc (nmemb, sizeof (char *));
|
||||
if (r == NULL)
|
||||
error (EXIT_FAILURE, errno, "calloc");
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -6,7 +6,7 @@ set -e
|
||||
# directory. Use it like this:
|
||||
# ./copy-patches.sh
|
||||
|
||||
rhel_version=8.6.0
|
||||
rhel_version=8.7.0
|
||||
|
||||
# Check we're in the right directory.
|
||||
if [ ! -f virt-v2v.spec ]; then
|
||||
|
@ -10,7 +10,7 @@
|
||||
Name: virt-v2v
|
||||
Epoch: 1
|
||||
Version: 1.42.0
|
||||
Release: 18%{?dist}
|
||||
Release: 21%{?dist}
|
||||
Summary: Convert a virtual machine to run on KVM
|
||||
|
||||
License: GPLv2+
|
||||
@ -83,6 +83,11 @@ Patch0044: 0044-v2v-vcenter-Implement-cookie-scripts.patch
|
||||
Patch0045: 0045-convert-convert_windows.ml-Handle-date-formats-with-.patch
|
||||
Patch0046: 0046-v2v-Force-format-of-input-to-be-specified.patch
|
||||
Patch0047: 0047-v2v-Cope-with-libvirt-vpx-esx-driver-which-does-not-.patch
|
||||
Patch0048: 0048-o-rhv-upload-wait-for-VM-creation-task.patch
|
||||
Patch0049: 0049-tests-Add-test-of-i-ova-from-a-directory.patch
|
||||
Patch0050: 0050-v2v-i-ova-Fix-parsing-if-OVA-directory-name-has-a-tr.patch
|
||||
Patch0051: 0051-convert-If-listing-RPM-applications-fails-rebuild-DB.patch
|
||||
Patch0052: 0052-update-common-submodule-for-CVE-2022-2211-fix.patch
|
||||
|
||||
# Patches which apply to the common/ submodule.
|
||||
# These have to be hand-modified.
|
||||
@ -326,6 +331,15 @@ rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-test-harness.1*
|
||||
|
||||
|
||||
%changelog
|
||||
* Tue Jul 05 2022 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-21
|
||||
- Fix assertion failure when parsing OVA dir with trailing slash
|
||||
resolves: rhbz#2028823
|
||||
- For -o rhv-upload wait for VM creation task
|
||||
resolves: rhbz#1985827
|
||||
- If listing RPM applications fails, rebuild DB and retry (2089623)
|
||||
- Fix CVE-2022-2211 Denial of Service in --key parameter
|
||||
resolves: rhbz#2102720
|
||||
|
||||
* Wed Nov 24 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-18
|
||||
- Additional fix for backing file specified without backing format
|
||||
related: rhbz#2025769
|
||||
|
Loading…
Reference in New Issue
Block a user