From 0f261b4e8f7d442fce0e089a27266b51ee1303bb Mon Sep 17 00:00:00 2001 From: Sarthak Date: Thu, 1 Oct 2026 22:56:29 +0530 Subject: [PATCH] fix(controller): skip reaping succeeded Job pods (#127) Signed-off-by: Sarthak --- .../controller/pod_placement_controller_test.go | 14 ++++++++++++++ internal/controller/pod_placement_helpers.go | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/internal/controller/pod_placement_controller_test.go b/internal/controller/pod_placement_controller_test.go index 98b5696..24358cb 100644 --- a/internal/controller/pod_placement_controller_test.go +++ b/internal/controller/pod_placement_controller_test.go @@ -960,3 +960,17 @@ func TestReap_NonNebulaTerminalPodIsIgnored(t *testing.T) { t.Fatal("must not reap a non-Nebula Pod") } } + +func TestReap_SucceededJobPodIsKept(t *testing.T) { + // Deleting a Succeeded Job pod makes the Job lose its success record and read as Failed. + pod := terminalOwnedPod("p1", "default", "uid-1", corev1.PodSucceeded, true) + pod.OwnerReferences[0].APIVersion = "batch/v1" + pod.OwnerReferences[0].Kind = "Job" + r, c := newPlacementReconciler(t, []client.Object{pod}) + + reconcilePod(t, r, "default", "p1") + + if !podPresent(c, "default", "p1") { + t.Fatal("expected a Succeeded Job Pod to be kept") + } +} diff --git a/internal/controller/pod_placement_helpers.go b/internal/controller/pod_placement_helpers.go index 7bc5b43..1331d9f 100644 --- a/internal/controller/pod_placement_helpers.go +++ b/internal/controller/pod_placement_helpers.go @@ -431,6 +431,12 @@ func (r *PodPlacementReconciler) reapTerminalPod(ctx context.Context, pod *corev if !util.IsTerminalPodPhase(pod.Status.Phase) { return false, nil } + // Do not delete succeeded Pods owned by Jobs; keep for status reporting. + if pod.Status.Phase == corev1.PodSucceeded { + if owner := metav1.GetControllerOf(pod); owner != nil && owner.Kind == "Job" { + return false, nil + } + } if !isControllerOwned(pod) { return false, nil // bare Pod: leave it as a record }