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 c6408d227b8..81e2c0c850b 100644 --- a/pkg/api/v1/testkube/model_test_workflow_result_extended.go +++ b/pkg/api/v1/testkube/model_test_workflow_result_extended.go @@ -1,6 +1,7 @@ package testkube import ( + "fmt" "slices" "time" @@ -157,7 +158,46 @@ func (r *TestWorkflowResult) UpdateStepResult(sig []TestWorkflowSignature, ref s func (r *TestWorkflowResult) RecomputeDuration() { if !r.FinishedAt.IsZero() { r.PausedMs = 0 + + // Get unique pause periods + pauses := make([]TestWorkflowPause, 0) + loop: for _, p := range r.Pauses { + // Finalize the pause if it's not + step := r.Steps[p.Ref] + if !step.FinishedAt.IsZero() && p.ResumedAt.IsZero() { + p.ResumedAt = step.FinishedAt + } + + for i := range pauses { + // They don't overlap + if p.PausedAt.After(pauses[i].ResumedAt) || p.ResumedAt.Before(pauses[i].PausedAt) { + continue + } + + // The existing pause period may take some period before + if pauses[i].PausedAt.After(p.PausedAt) { + pauses[i].PausedAt = p.PausedAt + p.PausedAt = pauses[i].ResumedAt + if p.ResumedAt.Before(p.PausedAt) { + p.ResumedAt = p.PausedAt + } + } + + // The existing pause period may take some period after + if pauses[i].ResumedAt.Before(p.ResumedAt) { + pauses[i].ResumedAt = p.ResumedAt + p.ResumedAt = pauses[i].PausedAt + } + + // The pause is already enclosed in existing list + continue loop + } + + pauses = append(pauses, p) + } + + for _, p := range pauses { resumedAt := p.ResumedAt if resumedAt.IsZero() { resumedAt = r.FinishedAt @@ -167,6 +207,7 @@ func (r *TestWorkflowResult) RecomputeDuration() { r.PausedMs += milli } } + totalDuration := r.FinishedAt.Sub(r.QueuedAt) duration := totalDuration - time.Duration(1e3*r.PausedMs) if totalDuration < 0 { @@ -202,8 +243,10 @@ func (r *TestWorkflowResult) HasUnfinishedPause(ref string) bool { func (r *TestWorkflowResult) PauseStart(sig []TestWorkflowSignature, scheduledAt time.Time, ref string, start time.Time) { if r.HasPauseAt(ref, start) { + fmt.Println(" Already had a pause") return } + fmt.Println(" Added a pause entry") r.Pauses = append(r.Pauses, TestWorkflowPause{Ref: ref, PausedAt: start}) r.Recompute(sig, scheduledAt) } @@ -213,12 +256,15 @@ func (r *TestWorkflowResult) PauseEnd(sig []TestWorkflowSignature, scheduledAt t if p.Ref != ref { continue } + fmt.Println(" Found pause for ref possibly to resume", ref) if !p.PausedAt.After(end) && !p.ResumedAt.Before(end) { // It's already covered by another period + fmt.Println(" It's already covered", p.PausedAt, p.ResumedAt) return } if !p.PausedAt.After(end) && (p.ResumedAt.IsZero() || p.ResumedAt.Equal(end)) { // It found a period to fulfill + fmt.Println(" Filling the pause from", p.PausedAt) r.Pauses[i].ResumedAt = end r.Recompute(sig, scheduledAt) return diff --git a/pkg/testworkflows/testworkflowcontroller/notifier.go b/pkg/testworkflows/testworkflowcontroller/notifier.go index eef9767e65b..1b27ae0e2dd 100644 --- a/pkg/testworkflows/testworkflowcontroller/notifier.go +++ b/pkg/testworkflows/testworkflowcontroller/notifier.go @@ -343,9 +343,6 @@ func (n *notifier) Pause(ref string, ts time.Time) { } func (n *notifier) Resume(ref string, ts time.Time) { - if n.result.Steps[ref].Status == nil || *n.result.Steps[ref].Status != testkube.PAUSED_TestWorkflowStepStatus { - return - } n.result.PauseEnd(n.sig, n.scheduledAt, ref, ts) n.emit() }