diff --git a/pkg/api/v1/testkube/model_test_workflow_result_extended.go b/pkg/api/v1/testkube/model_test_workflow_result_extended.go index 0ac3192d0f5..4909d47a1c3 100644 --- a/pkg/api/v1/testkube/model_test_workflow_result_extended.go +++ b/pkg/api/v1/testkube/model_test_workflow_result_extended.go @@ -404,8 +404,12 @@ func (r *TestWorkflowResult) Recompute(sig []TestWorkflowSignature, scheduledAt r.Status = common.Ptr(RUNNING_TestWorkflowStatus) } - if r.FinishedAt.IsZero() && r.Status != nil && *r.Status == ABORTED_TestWorkflowStatus { - r.FinishedAt = r.LatestTimestamp() + // Ensure the finish time is after all other timestamps + if !r.FinishedAt.IsZero() || (r.Status != nil && *r.Status == ABORTED_TestWorkflowStatus) { + lastTs := r.LatestTimestamp() + if r.FinishedAt.Before(lastTs) { + r.FinishedAt = lastTs + } } // Compute the duration diff --git a/pkg/testworkflows/testworkflowcontroller/notifier.go b/pkg/testworkflows/testworkflowcontroller/notifier.go index 7892c3eb10d..567355efbdb 100644 --- a/pkg/testworkflows/testworkflowcontroller/notifier.go +++ b/pkg/testworkflows/testworkflowcontroller/notifier.go @@ -292,11 +292,11 @@ func (n *notifier) Output(ref string, ts time.Time, output *instructions.Instruc } func (n *notifier) Finish(ts time.Time) { - n.resultMu.Lock() - defer n.resultMu.Unlock() - if !n.result.FinishedAt.Before(ts) { + if ts.IsZero() { return } + n.resultMu.Lock() + defer n.resultMu.Unlock() n.result.FinishedAt = ts n.emit() } diff --git a/pkg/testworkflows/testworkflowcontroller/watchinstrumentedpod.go b/pkg/testworkflows/testworkflowcontroller/watchinstrumentedpod.go index 8aa03509879..107009f5d66 100644 --- a/pkg/testworkflows/testworkflowcontroller/watchinstrumentedpod.go +++ b/pkg/testworkflows/testworkflowcontroller/watchinstrumentedpod.go @@ -269,13 +269,16 @@ func WatchInstrumentedPod(parentCtx context.Context, clientSet kubernetes.Interf Status: testkube.ABORTED_TestWorkflowStepStatus, ExitCode: -1, Details: result.Details, - FinishedAt: result.FinishedAt, + FinishedAt: s.GetStepResult(ref).FinishedAt, + } + if status.FinishedAt.IsZero() { + status.FinishedAt = result.FinishedAt } if status.FinishedAt.IsZero() { status.FinishedAt = state.FinishedAt("") - if status.FinishedAt.IsZero() { - status.FinishedAt = s.GetLastTimestamp(lastStarted) - } + } + if status.FinishedAt.IsZero() { + status.FinishedAt = s.GetLastTimestamp(lastStarted) } if len(result.Steps) > i { @@ -283,6 +286,10 @@ func WatchInstrumentedPod(parentCtx context.Context, clientSet kubernetes.Interf if status.Details == "" { status.Details = result.Details } + finishedAt := s.GetStepResult(ref).FinishedAt + if !finishedAt.IsZero() { + status.FinishedAt = finishedAt + } } s.FinishStep(ref, status) if status.Status == testkube.ABORTED_TestWorkflowStepStatus {