diff --git a/pkg/reconciler/pipelinerun/pipelinerun_test.go b/pkg/reconciler/pipelinerun/pipelinerun_test.go index a43c7f3e4cc..54c1ee02fa1 100644 --- a/pkg/reconciler/pipelinerun/pipelinerun_test.go +++ b/pkg/reconciler/pipelinerun/pipelinerun_test.go @@ -9486,3 +9486,94 @@ spec: verifyTaskRunStatusesNames(t, embeddedStatus, reconciledRun.Status, tr1Name, tr2Name) } + +func TestReconcile_CancelUnscheduled(t *testing.T) { + testCases := []struct { + name string + embeddedStatusVal string + }{ + { + name: "default embedded status", + embeddedStatusVal: config.DefaultEmbeddedStatus, + }, + { + name: "full embedded status", + embeddedStatusVal: config.FullEmbeddedStatus, + }, + { + name: "both embedded status", + embeddedStatusVal: config.BothEmbeddedStatus, + }, + { + name: "minimal embedded status", + embeddedStatusVal: config.MinimalEmbeddedStatus, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + pipelineRunName := "cancel-test-run" + prs := []*v1beta1.PipelineRun{parse.MustParsePipelineRun(t, `metadata: + name: cancel-test-run + namespace: foo +spec: + pipelineSpec: + tasks: + - name: wait-1 + taskSpec: + apiVersion: example.dev/v0 + kind: Wait + params: + - name: duration + value: 1h + - name: wait-2 + runAfter: + - wait-1 + taskSpec: + apiVersion: example.dev/v0 + kind: Wait + params: + - name: duration + value: 10s + - name: wait-3 + runAfter: + - wait-1 + taskRef: + name: hello-world +`)} + + ts := []*v1beta1.Task{simpleHelloWorldTask} + + cms := []*corev1.ConfigMap{withEmbeddedStatus(withCustomTasks(newFeatureFlagsConfigMap()), tc.embeddedStatusVal)} + + d := test.Data{ + PipelineRuns: prs, + Tasks: ts, + ConfigMaps: cms, + } + prt := newPipelineRunTest(d, t) + defer prt.Cancel() + + pr, clients := prt.reconcileRun("foo", pipelineRunName, []string{}, false) + + if tc.embeddedStatusVal != config.MinimalEmbeddedStatus { + if len(pr.Status.Runs) > 1 { + t.Errorf("Expected one Run in status, but found %d", len(pr.Status.Runs)) + } + if len(pr.Status.TaskRuns) > 0 { + t.Errorf("Expected no TaskRuns in status, but found %d", len(pr.Status.TaskRuns)) + } + } + if tc.embeddedStatusVal != config.FullEmbeddedStatus { + if len(pr.Status.ChildReferences) > 1 { + t.Errorf("Expected one Run or TaskRun in child references, but found %d", len(pr.Status.ChildReferences)) + } + } + + err := cancelPipelineRun(prt.TestAssets.Ctx, logtesting.TestLogger(t), pr, clients.Pipeline) + if err != nil { + t.Fatalf("Error found: %v", err) + } + }) + } +} diff --git a/pkg/reconciler/pipelinerun/resources/pipelinerunstate.go b/pkg/reconciler/pipelinerun/resources/pipelinerunstate.go index 365593c80d3..0ce78319ca0 100644 --- a/pkg/reconciler/pipelinerun/resources/pipelinerunstate.go +++ b/pkg/reconciler/pipelinerun/resources/pipelinerunstate.go @@ -199,21 +199,19 @@ func (state PipelineRunState) GetRunsStatus(pr *v1beta1.PipelineRun) map[string] continue } - var prrs *v1beta1.PipelineRunRunStatus - if rpt.Run != nil { - prrs = pr.Status.Runs[rpt.RunName] + if rpt.Run == nil { + continue } + prrs := pr.Status.Runs[rpt.RunName] + if prrs == nil { prrs = &v1beta1.PipelineRunRunStatus{ PipelineTaskName: rpt.PipelineTask.Name, WhenExpressions: rpt.PipelineTask.WhenExpressions, } } - - if rpt.Run != nil { - prrs.Status = &rpt.Run.Status - } + prrs.Status = &rpt.Run.Status status[rpt.RunName] = prrs } diff --git a/pkg/reconciler/pipelinerun/resources/pipelinerunstate_test.go b/pkg/reconciler/pipelinerun/resources/pipelinerunstate_test.go index f269dd27f08..b934d74a54d 100644 --- a/pkg/reconciler/pipelinerun/resources/pipelinerunstate_test.go +++ b/pkg/reconciler/pipelinerun/resources/pipelinerunstate_test.go @@ -2381,6 +2381,15 @@ spec: }}, TaskRef: &v1beta1.TaskRef{Name: "unit-test-task"}, } + unscheduledPipelineTask := v1beta1.PipelineTask{ + Name: "unit-test-2", + WhenExpressions: []v1beta1.WhenExpression{{ + Input: "foo", + Operator: selection.In, + Values: []string{"foo", "bar"}, + }}, + TaskRef: &v1beta1.TaskRef{Name: "unit-test-task"}, + } task := parse.MustParseTask(t, fmt.Sprintf(` metadata: @@ -2418,6 +2427,12 @@ status: ResolvedTaskResources: &resources.ResolvedTaskResources{ TaskSpec: &task.Spec, }, + }, { + PipelineTask: &unscheduledPipelineTask, + TaskRunName: "test-pipeline-run-success-unit-test-2", + ResolvedTaskResources: &resources.ResolvedTaskResources{ + TaskSpec: &task.Spec, + }, }} pr.Status.InitializeConditions(testClock) status := state.GetTaskRunsStatus(pr) @@ -2473,6 +2488,19 @@ spec: Name: "unit-test-run", }, } + unscheduledPipelineTask := v1beta1.PipelineTask{ + Name: "unit-test-2", + WhenExpressions: []v1beta1.WhenExpression{{ + Input: "foo", + Operator: selection.In, + Values: []string{"foo", "bar"}, + }}, + TaskRef: &v1beta1.TaskRef{ + APIVersion: "example.dev/v0", + Kind: "Example", + Name: "unit-test-run", + }, + } run := parse.MustParseRun(t, fmt.Sprintf(` metadata: @@ -2489,6 +2517,10 @@ status: CustomTask: true, RunName: "test-pipeline-run-success-unit-test-1", Run: run, + }, { + PipelineTask: &unscheduledPipelineTask, + CustomTask: true, + RunName: "test-pipeline-run-success-unit-test-2", }} pr.Status.InitializeConditions(testClock) status := state.GetRunsStatus(pr)