From 89d0443e40b3a5e9355ef444d6165b6729269c13 Mon Sep 17 00:00:00 2001
From: motive <motive@openwow.dev>
Date: Thu, 3 Apr 2025 23:58:28 -0400
Subject: [PATCH] fix runner watch expiry

---
 internal/runner.go | 52 ++++++++++++++++++++++++----------------------
 1 file changed, 27 insertions(+), 25 deletions(-)

diff --git a/internal/runner.go b/internal/runner.go
index 62f3ec2..75978ce 100644
--- a/internal/runner.go
+++ b/internal/runner.go
@@ -192,37 +192,39 @@ func (rc *KubevirtRunner) WaitForVirtualMachineInstance(ctx context.Context, vir
 
 	const reportingElapse = 5.0
 
-	watch, err := rc.virtClient.VirtualMachineInstance(rc.namespace).Watch(ctx, k8smetav1.ListOptions{})
-	if err != nil {
-		return errors.Wrap(err, "failed to watch the virtual machine instance")
-	}
-	defer watch.Stop()
+	for rc.currentStatus != v1.Succeeded && rc.currentStatus != v1.Failed {
+		watch, err := rc.virtClient.VirtualMachineInstance(rc.namespace).Watch(ctx, k8smetav1.ListOptions{})
+		if err != nil {
+			return errors.Wrap(err, "failed to watch the virtual machine instance")
+		}
+		defer watch.Stop()
 
-	lastTimeChecked := time.Now()
+		lastTimeChecked := time.Now()
 
-	for event := range watch.ResultChan() {
-		vmi, ok := event.Object.(*v1.VirtualMachineInstance)
-		if ok && vmi.Name == rc.virtualMachineInstance {
-			if vmi.Status.Phase != rc.currentStatus {
-				rc.currentStatus = vmi.Status.Phase
-				lastTimeChecked = time.Now()
+		for event := range watch.ResultChan() {
+			vmi, ok := event.Object.(*v1.VirtualMachineInstance)
+			if ok && vmi.Name == rc.virtualMachineInstance {
+				if vmi.Status.Phase != rc.currentStatus {
+					rc.currentStatus = vmi.Status.Phase
+					lastTimeChecked = time.Now()
 
-				switch rc.currentStatus {
-				case v1.Succeeded:
-					log.Printf("%s has successfully completed\n", virtualMachineInstance)
+					switch rc.currentStatus {
+					case v1.Succeeded:
+						log.Printf("%s has successfully completed\n", virtualMachineInstance)
 
-					return nil
-				case v1.Failed:
-					log.Printf("%s has failed\n", virtualMachineInstance)
+						return nil
+					case v1.Failed:
+						log.Printf("%s has failed\n", virtualMachineInstance)
 
-					return ErrRunnerFailed
-				default:
-					log.Printf("%s has transitioned to %s phase \n", virtualMachineInstance, rc.currentStatus)
-				}
-			} else if time.Since(lastTimeChecked).Minutes() > reportingElapse {
-				log.Printf("%s is in %s phase \n", virtualMachineInstance, rc.currentStatus)
+						return ErrRunnerFailed
+					default:
+						log.Printf("%s has transitioned to %s phase \n", virtualMachineInstance, rc.currentStatus)
+					}
+				} else if time.Since(lastTimeChecked).Minutes() > reportingElapse {
+					log.Printf("%s is in %s phase \n", virtualMachineInstance, rc.currentStatus)
 
-				lastTimeChecked = time.Now()
+					lastTimeChecked = time.Now()
+				}
 			}
 		}
 	}