Skip to content

Commit

Permalink
TEP-0090: Matrix - Implement isSuccessful for Runs
Browse files Browse the repository at this point in the history
[TEP-0090: Matrix][tep-0090] proposed executing a `PipelineTask` in
parallel `TaskRuns` and `Runs` with substitutions from combinations
of `Parameters` in a `Matrix`.

In this change, we implement the `isSuccessful` member function
of `ResolvedPipelineRunTask` for matrixed `Runs`.

If the `ResolvedPipelineRunTask` is matrixed, it is successful only if
all of its `Runs` completed successfully.

[tep-0090]: https://github.com/tektoncd/community/blob/main/teps/0090-matrix.md
  • Loading branch information
jerop authored and tekton-robot committed Jun 24, 2022
1 parent 8330224 commit 4c021dc
Show file tree
Hide file tree
Showing 2 changed files with 154 additions and 0 deletions.
11 changes: 11 additions & 0 deletions pkg/reconciler/pipelinerun/resources/pipelinerunresolution.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ type ResolvedPipelineTask struct {
CustomTask bool
RunName string
Run *v1alpha1.Run
Runs []*v1alpha1.Run
PipelineTask *v1beta1.PipelineTask
ResolvedTaskResources *resources.ResolvedTaskResources
}
Expand Down Expand Up @@ -108,6 +109,16 @@ func (t ResolvedPipelineTask) IsMatrixed() bool {
// If the PipelineTask has a Matrix, isSuccessful returns true if all runs have completed successfully
func (t ResolvedPipelineTask) isSuccessful() bool {
switch {
case t.IsCustomTask() && t.IsMatrixed():
if len(t.Runs) == 0 {
return false
}
for _, run := range t.Runs {
if !run.IsSuccessful() {
return false
}
}
return true
case t.IsCustomTask():
return t.Run.IsSuccessful()
case t.IsMatrixed():
Expand Down
143 changes: 143 additions & 0 deletions pkg/reconciler/pipelinerun/resources/pipelinerunresolution_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3365,125 +3365,268 @@ func TestIsSuccessful(t *testing.T) {
PipelineTask: matrixedPipelineTask,
},
want: false,
}, {
name: "matrixed runs not started",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
},
want: false,
}, {
name: "matrixed taskruns running",
rpt: ResolvedPipelineTask{
PipelineTask: matrixedPipelineTask,
TaskRuns: []*v1beta1.TaskRun{makeStarted(trs[0]), makeStarted(trs[1])},
},
want: false,
}, {
name: "matrixed runs running",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
Runs: []*v1alpha1.Run{makeRunStarted(runs[0]), makeRunStarted(runs[1])},
},
want: false,
}, {
name: "one matrixed taskrun running",
rpt: ResolvedPipelineTask{
PipelineTask: matrixedPipelineTask,
TaskRuns: []*v1beta1.TaskRun{makeStarted(trs[0]), makeSucceeded(trs[1])},
},
want: false,
}, {
name: "one matrixed run running",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
Runs: []*v1alpha1.Run{makeRunStarted(runs[0]), makeRunSucceeded(runs[1])},
},
want: false,
}, {
name: "matrixed taskruns succeeded",
rpt: ResolvedPipelineTask{
PipelineTask: matrixedPipelineTask,
TaskRuns: []*v1beta1.TaskRun{makeSucceeded(trs[0]), makeSucceeded(trs[1])},
},
want: true,
}, {
name: "matrixed runs succeeded",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
Runs: []*v1alpha1.Run{makeRunSucceeded(runs[0]), makeRunSucceeded(runs[1])},
},
want: true,
}, {
name: "one matrixed taskrun succeeded",
rpt: ResolvedPipelineTask{
PipelineTask: matrixedPipelineTask,
TaskRuns: []*v1beta1.TaskRun{makeSucceeded(trs[0]), makeStarted(trs[1])},
},
want: false,
}, {
name: "one matrixed run succeeded",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
Runs: []*v1alpha1.Run{makeRunSucceeded(runs[0]), makeRunStarted(runs[1])},
},
want: false,
}, {
name: "matrixed taskruns failed",
rpt: ResolvedPipelineTask{
PipelineTask: matrixedPipelineTask,
TaskRuns: []*v1beta1.TaskRun{makeFailed(trs[0]), makeFailed(trs[1])},
},
want: false,
}, {
name: "matrixed runs failed",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
Runs: []*v1alpha1.Run{makeRunFailed(runs[0]), makeRunFailed(runs[1])},
},
want: false,
}, {
name: "one matrixed taskrun failed, one matrixed taskrun running",
rpt: ResolvedPipelineTask{
PipelineTask: matrixedPipelineTask,
TaskRuns: []*v1beta1.TaskRun{makeFailed(trs[0]), makeStarted(trs[1])},
},
want: false,
}, {
name: "one matrixed run failed, one matrixed run running",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
Runs: []*v1alpha1.Run{makeRunFailed(runs[0]), makeRunStarted(runs[1])},
},
want: false,
}, {
name: "matrixed taskruns failed: retries remaining",
rpt: ResolvedPipelineTask{
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
TaskRuns: []*v1beta1.TaskRun{makeFailed(trs[0]), makeFailed(trs[1])},
},
want: false,
}, {
name: "matrixed runs failed: retries remaining",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
Runs: []*v1alpha1.Run{makeRunFailed(runs[0]), makeRunFailed(runs[1])},
},
want: false,
}, {
name: "matrixed taskruns failed: one taskrun with retries remaining",
rpt: ResolvedPipelineTask{
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
TaskRuns: []*v1beta1.TaskRun{makeFailed(trs[0]), withRetries(makeFailed(trs[1]))},
},
want: false,
}, {
name: "matrixed runs failed: one run with retries remaining",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
Runs: []*v1alpha1.Run{makeRunFailed(runs[0]), withRunRetries(makeRunFailed(runs[1]))},
},
want: false,
}, {
name: "matrixed taskruns failed: no retries remaining",
rpt: ResolvedPipelineTask{
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
TaskRuns: []*v1beta1.TaskRun{withRetries(makeFailed(trs[0])), withRetries(makeFailed(trs[1]))},
},
want: false,
}, {
name: "matrixed runs failed: no retries remaining",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
Runs: []*v1alpha1.Run{withRunRetries(makeRunFailed(runs[0])), withRunRetries(makeRunFailed(runs[1]))},
},
want: false,
}, {
name: "matrixed taskruns cancelled",
rpt: ResolvedPipelineTask{
PipelineTask: matrixedPipelineTask,
TaskRuns: []*v1beta1.TaskRun{withCancelled(makeFailed(trs[0])), withCancelled(makeFailed(trs[1]))},
},
want: false,
}, {
name: "matrixed runs cancelled",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
Runs: []*v1alpha1.Run{withRunCancelled(makeRunFailed(runs[0])), withRunCancelled(makeRunFailed(runs[1]))},
},
want: false,
}, {
name: "one matrixed taskrun cancelled, one matrixed taskrun running",
rpt: ResolvedPipelineTask{
PipelineTask: matrixedPipelineTask,
TaskRuns: []*v1beta1.TaskRun{withCancelled(makeFailed(trs[0])), makeStarted(trs[1])},
},
want: false,
}, {
name: "one matrixed run cancelled, one matrixed run running",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
Runs: []*v1alpha1.Run{withRunCancelled(makeRunFailed(runs[0])), makeRunStarted(runs[1])},
},
want: false,
}, {
name: "matrixed taskruns cancelled but not failed",
rpt: ResolvedPipelineTask{
PipelineTask: matrixedPipelineTask,
TaskRuns: []*v1beta1.TaskRun{withCancelled(newTaskRun(trs[0])), withCancelled(newTaskRun(trs[1]))},
},
want: false,
}, {
name: "matrixed runs cancelled but not failed",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
Runs: []*v1alpha1.Run{withRunCancelled(newRun(runs[0])), withRunCancelled(newRun(runs[1]))},
},
want: false,
}, {
name: "one matrixed taskrun cancelled but not failed",
rpt: ResolvedPipelineTask{
PipelineTask: matrixedPipelineTask,
TaskRuns: []*v1beta1.TaskRun{withCancelled(newTaskRun(trs[0])), makeStarted(trs[1])},
},
want: false,
}, {
name: "one matrixed run cancelled but not failed",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: matrixedPipelineTask,
Runs: []*v1alpha1.Run{withRunCancelled(newRun(runs[0])), makeRunStarted(runs[1])},
},
want: false,
}, {
name: "matrixed taskruns cancelled: retries remaining",
rpt: ResolvedPipelineTask{
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
TaskRuns: []*v1beta1.TaskRun{withCancelled(makeFailed(trs[0])), withCancelled(makeFailed(trs[1]))},
},
want: false,
}, {
name: "matrixed runs cancelled: retries remaining",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
Runs: []*v1alpha1.Run{withRunCancelled(makeRunFailed(runs[0])), withRunCancelled(makeRunFailed(runs[1]))},
},
want: false,
}, {
name: "one matrixed taskrun cancelled: retries remaining, one matrixed taskrun running",
rpt: ResolvedPipelineTask{
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
TaskRuns: []*v1beta1.TaskRun{withCancelled(makeFailed(trs[0])), makeStarted(trs[1])},
},
want: false,
}, {
name: "one matrixed run cancelled: retries remaining, one matrixed run running",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
Runs: []*v1alpha1.Run{withRunCancelled(makeRunFailed(runs[0])), makeRunStarted(runs[1])},
},
want: false,
}, {
name: "matrixed taskruns cancelled: no retries remaining",
rpt: ResolvedPipelineTask{
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
TaskRuns: []*v1beta1.TaskRun{withCancelled(withRetries(makeFailed(trs[0]))), withCancelled(withRetries(makeFailed(trs[1])))},
},
want: false,
}, {
name: "matrixed runs cancelled: no retries remaining",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
Runs: []*v1alpha1.Run{withRunCancelled(withRunRetries(makeRunFailed(runs[0]))), withRunCancelled(withRunRetries(makeRunFailed(runs[1])))},
},
want: false,
}, {
name: "one matrixed taskrun cancelled: no retries remaining, one matrixed taskrun running",
rpt: ResolvedPipelineTask{
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
TaskRuns: []*v1beta1.TaskRun{withCancelled(withRetries(makeFailed(trs[0]))), makeStarted(trs[1])},
},
want: false,
}, {
name: "one matrixed run cancelled: no retries remaining, one matrixed run running",
rpt: ResolvedPipelineTask{
CustomTask: true,
PipelineTask: withPipelineTaskRetries(*matrixedPipelineTask, 1),
Runs: []*v1alpha1.Run{withRunCancelled(withRunRetries(makeRunFailed(runs[0]))), makeRunStarted(runs[1])},
},
want: false,
}} {
t.Run(tc.name, func(t *testing.T) {
if got := tc.rpt.isSuccessful(); got != tc.want {
Expand Down

0 comments on commit 4c021dc

Please sign in to comment.