From a1cbe4cc7564755186735d5efbc7b410e1df056b Mon Sep 17 00:00:00 2001 From: Giovanni Ferri Date: Fri, 11 Sep 2026 23:57:55 +0100 Subject: [PATCH] test: inject ImpVM deletion deadline clock --- internal/controller/impvm_controller.go | 11 ++++++++++- internal/controller/impvm_coverage_test.go | 10 +++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/internal/controller/impvm_controller.go b/internal/controller/impvm_controller.go index af46b7a..a4b2ecf 100644 --- a/internal/controller/impvm_controller.go +++ b/internal/controller/impvm_controller.go @@ -52,6 +52,15 @@ type ImpVMReconciler struct { client.Client Scheme *runtime.Scheme Recorder record.EventRecorder + // Now is an optional clock for deadline evaluation. Production uses time.Now. + Now func() time.Time +} + +func (r *ImpVMReconciler) now() time.Time { + if r.Now != nil { + return r.Now() + } + return time.Now() } // +kubebuilder:rbac:groups=imp.dev,resources=impvms,verbs=get;list;watch;create;update;patch;delete @@ -368,7 +377,7 @@ func (r *ImpVMReconciler) handleDeletion(ctx context.Context, vm *impdevv1alpha1 // Check for termination timeout. deadline := vm.DeletionTimestamp.Add(terminationTimeout) - if time.Now().After(deadline) { + if r.now().After(deadline) { r.Recorder.Event(vm, corev1.EventTypeWarning, EventReasonTerminationTimeout, "Finalizer force-removed after 2min termination timeout") patch := client.MergeFrom(vm.DeepCopy()) diff --git a/internal/controller/impvm_coverage_test.go b/internal/controller/impvm_coverage_test.go index 1c7b92d..31dec09 100644 --- a/internal/controller/impvm_coverage_test.go +++ b/internal/controller/impvm_coverage_test.go @@ -566,10 +566,6 @@ var _ = Describe("ImpVM handleDeletion with nodeName", func() { }) It("force-removes finalizer after termination timeout", func() { - origTimeout := terminationTimeout - terminationTimeout = 0 // trigger immediately - DeferCleanup(func() { terminationTimeout = origTimeout }) - vm := &impdevv1alpha1.ImpVM{ ObjectMeta: metav1.ObjectMeta{ Name: "del-timeout", @@ -581,7 +577,11 @@ var _ = Describe("ImpVM handleDeletion with nodeName", func() { Expect(k8sClient.Create(ctx, vm)).To(Succeed()) Expect(k8sClient.Delete(ctx, vm)).To(Succeed()) - _, err := newReconciler().Reconcile(ctx, reconcile.Request{ + deleting := &impdevv1alpha1.ImpVM{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "del-timeout", Namespace: "default"}, deleting)).To(Succeed()) + r := newReconciler() + r.Now = func() time.Time { return deleting.DeletionTimestamp.Add(terminationTimeout).Add(time.Nanosecond) } + _, err := r.Reconcile(ctx, reconcile.Request{ NamespacedName: types.NamespacedName{Name: "del-timeout", Namespace: "default"}, }) Expect(err).NotTo(HaveOccurred())