mrc0mmand / rpms / libguestfs

Forked from rpms/libguestfs 3 years ago
Clone

Blame SOURCES/0055-rhv-upload-Fix-waiting-for-transfer.patch

5ce0c7
From 79a7e239ca55bffb2af059e1cfe07206d37cb858 Mon Sep 17 00:00:00 2001
46b2f6
From: Nir Soffer <nsoffer@redhat.com>
46b2f6
Date: Thu, 28 Nov 2019 20:36:32 +0200
46b2f6
Subject: [PATCH] rhv-upload: Fix waiting for transfer
46b2f6
46b2f6
We were not considering failures while initializing the transfer. In
46b2f6
this case the transfer phase can change to PAUSED_SYSTEM or
46b2f6
FINISHED_FAILURE, and transfer_url will be None, which failed the
46b2f6
upload with a misleading error:
46b2f6
46b2f6
    RuntimeError: direct upload to host not supported, requires
46b2f6
    ovirt-engine >= 4.2 and only works when virt-v2v is run within the
46b2f6
    oVirt/RHV environment, eg. on an oVirt node
46b2f6
46b2f6
Change the wait loop to consider all cases:
46b2f6
- Transfer failed and was removed
46b2f6
- Transfer failed and will be removed soon
46b2f6
- Transfer paused by the system (cancel required)
46b2f6
- Unexpected transfer phase (cancel required)
46b2f6
- Timeout waiting for TRANSFERRING state (cancel required)
46b2f6
46b2f6
Reported-by: Xiaodai Wang
46b2f6
46b2f6
(cherry picked from commit 40e1844827e4d096b1919a2159f9effc41915a73
46b2f6
in virt-v2v)
46b2f6
---
46b2f6
 v2v/rhv-upload-plugin.py | 41 +++++++++++++++++++++++++++++++---------
46b2f6
 1 file changed, 32 insertions(+), 9 deletions(-)
46b2f6
46b2f6
diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py
46b2f6
index 9b83d1cfa..14d4e37fb 100644
46b2f6
--- a/v2v/rhv-upload-plugin.py
46b2f6
+++ b/v2v/rhv-upload-plugin.py
46b2f6
@@ -185,20 +185,43 @@ def open(readonly):
46b2f6
     # Get a reference to the created transfer service.
46b2f6
     transfer_service = transfers_service.image_transfer_service(transfer.id)
46b2f6
 
46b2f6
-    # After adding a new transfer for the disk, the transfer's status
46b2f6
-    # will be INITIALIZING.  Wait until the init phase is over. The
46b2f6
-    # actual transfer can start when its status is "Transferring".
46b2f6
+    # Wait until transfer's phase change from INITIALIZING to TRANSFERRING. On
46b2f6
+    # errors transfer's phase can change to PAUSED_SYSTEM or FINISHED_FAILURE.
46b2f6
+    # If the transfer was paused, we need to cancel it to remove the disk,
46b2f6
+    # otherwise the system will remove the disk and transfer shortly after.
46b2f6
+
46b2f6
     endt = time.time() + timeout
46b2f6
     while True:
46b2f6
-        transfer = transfer_service.get()
46b2f6
+        time.sleep(1)
46b2f6
+        try:
46b2f6
+            transfer = transfer_service.get()
46b2f6
+        except sdk.NotFoundError:
46b2f6
+            # The system has removed the disk and the transfer.
46b2f6
+            raise RuntimeError("transfer %s was removed" % transfer.id)
46b2f6
+
46b2f6
+        if transfer.phase == types.ImageTransferPhase.FINISHED_FAILURE:
46b2f6
+            # The system will remove the disk and the transfer soon.
46b2f6
+            raise RuntimeError(
46b2f6
+                "transfer %s has failed" % transfer.id)
46b2f6
+
46b2f6
+        if transfer.phase == types.ImageTransferPhase.PAUSED_SYSTEM:
46b2f6
+            transfer_service.cancel()
46b2f6
+            raise RuntimeError(
46b2f6
+                "transfer %s was paused by system" % transfer.id)
46b2f6
+
46b2f6
+        if transfer.phase == types.ImageTransferPhase.TRANSFERRING:
5ce0c7
+            break
46b2f6
+
5ce0c7
         if transfer.phase != types.ImageTransferPhase.INITIALIZING:
5ce0c7
-            break
5ce0c7
-        if time.time() > endt:
46b2f6
+            transfer_service.cancel()
46b2f6
             raise RuntimeError(
46b2f6
-                "timed out waiting for transfer %s status != INITIALIZING"
46b2f6
-                % transfer.id)
46b2f6
+                "unexpected transfer %s phase %s"
46b2f6
+                % (transfer.id, transfer.phase))
46b2f6
 
46b2f6
-        time.sleep(1)
46b2f6
+        if time.time() > endt:
46b2f6
+            transfer_service.cancel()
46b2f6
+            raise RuntimeError(
46b2f6
+                "timed out waiting for transfer %s" % transfer.id)
46b2f6
 
46b2f6
     # Now we have permission to start the transfer.
46b2f6
     if params['rhv_direct']:
46b2f6
-- 
5ce0c7
2.18.4
46b2f6