diff --git a/config/config-feature-flags.yaml b/config/config-feature-flags.yaml index 68319eb2389..2e631373eba 100644 --- a/config/config-feature-flags.yaml +++ b/config/config-feature-flags.yaml @@ -89,7 +89,7 @@ data: # `PipelineRun` status. Set it to "minimal" to populate the `ChildReferences` field in the # `PipelineRun` status with name, kind, and API version information for each `TaskRun` and # `Run` in the `PipelineRun` instead. Set it to "both" to do both. - embedded-status: "full" + embedded-status: "minimal" # Setting this flag will determine the version for custom tasks created by PipelineRuns. # Acceptable values are "v1beta1" and "v1alpha1". # The default is "v1beta1". diff --git a/docs/deprecations.md b/docs/deprecations.md index 01e13c211d9..40ea75ede76 100644 --- a/docs/deprecations.md +++ b/docs/deprecations.md @@ -20,7 +20,7 @@ being deprecated. | Feature Being Deprecated | Deprecation Announcement | [API Compatibility Policy](https://github.com/tektoncd/pipeline/tree/main/api_compatibility_policy.md) | Earliest Date or Release of Removal | |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|-------------------------------------| | [`PipelineResources` are deprecated.](https://github.com/tektoncd/community/blob/main/teps/0074-deprecate-pipelineresources.md) | [v0.30.0](https://github.com/tektoncd/pipeline/releases/tag/v0.30.0) | Alpha | Dec 20 2021 | -| [The `PipelineRun.Status.TaskRuns` and `PipelineRun.Status.Runs` fields are deprecated and will be removed.](https://github.com/tektoncd/community/blob/main/teps/0100-embedded-taskruns-and-runs-status-in-pipelineruns.md) | v0.35.0 | Beta | Jan 25, 2023 | +| [The `PipelineRun.Status.TaskRuns` and `PipelineRun.Status.Runs` fields; the `full` and `both` `embedded-status` values along with their functionalities are deprecated and will be removed in v0.45.](https://github.com/tektoncd/community/blob/main/teps/0100-embedded-taskruns-and-runs-status-in-pipelineruns.md) | v0.35.0 | Beta | Jan 25, 2023 | | [PipelineRun.Timeout is deprecated and will be removed](https://github.com/tektoncd/community/blob/main/teps/0046-finallytask-execution-post-timeout.md) | v0.36.0 | Beta | Feb 25, 2023 | | [Several fields of Task.Step are deprecated](https://github.com/tektoncd/pipeline/issues/4737) | v0.36.0 | Beta | Feb 25, 2023 | | [`v1alpha1.Run` is deprecated](https://github.com/tektoncd/community/blob/main/teps/0114-custom-tasks-beta.md) | v0.43.0 | Alpha | April 10, 2023 or v0.47.0 | diff --git a/docs/pipelineruns.md b/docs/pipelineruns.md index 1f9e0b077d4..23f30a872ac 100644 --- a/docs/pipelineruns.md +++ b/docs/pipelineruns.md @@ -1392,18 +1392,19 @@ Your `PipelineRun`'s `status` field can contain the following fields: ### Configuring usage of `TaskRun` and `Run` embedded statuses -Currently, the default behavior is for the statuses of `TaskRun`s and `Run`s within this `PipelineRun` -to be embedded in the `status.taskRuns` and `status.runs` fields. This will change in the future to -instead default to `status.childReferences` being populated with references to the `TaskRun`s and +Currently, the default behavior is to pupulate `status.childReferences` with references to the `TaskRun`s and `Run`s, which can be used to look up their statuses. This behavior can be controlled by changing the `embedded-status` feature flag in the `feature-flags` config map. See [`install.md`](./install.md#customizing-the-pipelines-controller-behavior) for more information on feature flags. The possible values for `embedded-status` are: -- `full` - The current default behavior of populating `status.taskRuns` and `status.runs`, without populating `status.childReferences`. -- `minimal` - Just populate `status.childReferences`, not `status.taskRuns` or `status.runs`. +- `minimal` - The current default behavior, populate `status.childReferences`, not `status.taskRuns` or `status.runs`. +- `full` - Populating `status.taskRuns` and `status.runs`, without populating `status.childReferences`. - `both` - Populate `status.childReferences` as well as `status.taskRuns` and `status.runs`. +*Note that after the `PipelineRunStatus` migration as planned in [TEP-100](https://github.com/tektoncd/community/blob/main/teps/0100-embedded-taskruns-and-runs-status-in-pipelineruns.md#2-deprecate-and-remove-full-embedded-status), +[the `full` and `both` `embedded-status` options will be removed](https://github.com/tektoncd/pipeline/blob/main/docs/deprecations.md). + ### Monitoring execution status As your `PipelineRun` executes, its `status` field accumulates information on the execution of each `TaskRun` diff --git a/pkg/apis/config/feature_flags.go b/pkg/apis/config/feature_flags.go index 1b2e2de3662..3955589284d 100644 --- a/pkg/apis/config/feature_flags.go +++ b/pkg/apis/config/feature_flags.go @@ -77,7 +77,7 @@ const ( // DefaultSendCloudEventsForRuns is the default value for "send-cloudevents-for-runs". DefaultSendCloudEventsForRuns = false // DefaultEmbeddedStatus is the default value for "embedded-status". - DefaultEmbeddedStatus = FullEmbeddedStatus + DefaultEmbeddedStatus = MinimalEmbeddedStatus // DefaultEnableSpire is the default value for "enable-spire". DefaultEnableSpire = false // DefaultResourceVerificationMode is the default value for "resource-verification-mode". diff --git a/pkg/apis/config/feature_flags_test.go b/pkg/apis/config/feature_flags_test.go index 4eb27d696ac..b2f7f86395a 100644 --- a/pkg/apis/config/feature_flags_test.go +++ b/pkg/apis/config/feature_flags_test.go @@ -138,7 +138,7 @@ func TestNewFeatureFlagsFromConfigMap(t *testing.T) { { expectedConfig: &config.FeatureFlags{ EnableAPIFields: "stable", - EmbeddedStatus: "full", + EmbeddedStatus: config.DefaultEmbeddedStatus, EnableSpire: true, ResourceVerificationMode: config.DefaultResourceVerificationMode, RunningInEnvWithInjectedSidecars: config.DefaultRunningInEnvWithInjectedSidecars, @@ -152,7 +152,7 @@ func TestNewFeatureFlagsFromConfigMap(t *testing.T) { { expectedConfig: &config.FeatureFlags{ EnableAPIFields: "stable", - EmbeddedStatus: "full", + EmbeddedStatus: config.DefaultEmbeddedStatus, ResourceVerificationMode: config.DefaultResourceVerificationMode, RunningInEnvWithInjectedSidecars: config.DefaultRunningInEnvWithInjectedSidecars, AwaitSidecarReadiness: config.DefaultAwaitSidecarReadiness, diff --git a/pkg/reconciler/pipelinerun/cancel_test.go b/pkg/reconciler/pipelinerun/cancel_test.go index e4f78bcd573..6791760004e 100644 --- a/pkg/reconciler/pipelinerun/cancel_test.go +++ b/pkg/reconciler/pipelinerun/cancel_test.go @@ -46,8 +46,8 @@ func TestCancelPipelineRun(t *testing.T) { customRuns []*v1beta1.CustomRun wantErr bool }{{ - name: "no-resolved-taskrun", - embeddedStatus: config.DefaultEmbeddedStatus, + name: "no-resolved-taskrun-with-full", + embeddedStatus: config.FullEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-cancelled"}, Spec: v1beta1.PipelineRunSpec{ @@ -55,8 +55,8 @@ func TestCancelPipelineRun(t *testing.T) { }, }, }, { - name: "one-taskrun", - embeddedStatus: config.DefaultEmbeddedStatus, + name: "one-taskrun-with-full", + embeddedStatus: config.FullEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-cancelled"}, Spec: v1beta1.PipelineRunSpec{ @@ -72,8 +72,8 @@ func TestCancelPipelineRun(t *testing.T) { {ObjectMeta: metav1.ObjectMeta{Name: "t1"}}, }, }, { - name: "multiple-taskruns-one-missing", - embeddedStatus: config.DefaultEmbeddedStatus, + name: "multiple-taskruns-one-missing-with-full", + embeddedStatus: config.FullEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-cancelled"}, Spec: v1beta1.PipelineRunSpec{ @@ -90,8 +90,8 @@ func TestCancelPipelineRun(t *testing.T) { {ObjectMeta: metav1.ObjectMeta{Name: "t2"}}, }, }, { - name: "multiple-taskruns", - embeddedStatus: config.DefaultEmbeddedStatus, + name: "multiple-taskruns-with-full", + embeddedStatus: config.FullEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-cancelled"}, Spec: v1beta1.PipelineRunSpec{ @@ -109,8 +109,8 @@ func TestCancelPipelineRun(t *testing.T) { {ObjectMeta: metav1.ObjectMeta{Name: "t2"}}, }, }, { - name: "multiple-runs", - embeddedStatus: config.DefaultEmbeddedStatus, + name: "multiple-runs-with-full", + embeddedStatus: config.FullEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-cancelled"}, Spec: v1beta1.PipelineRunSpec{ @@ -128,8 +128,8 @@ func TestCancelPipelineRun(t *testing.T) { {ObjectMeta: metav1.ObjectMeta{Name: "t2"}}, }, }, { - name: "multiple-runs-one-missing", - embeddedStatus: config.DefaultEmbeddedStatus, + name: "multiple-runs-one-missing-with-full", + embeddedStatus: config.FullEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-cancelled"}, Spec: v1beta1.PipelineRunSpec{ @@ -227,7 +227,7 @@ func TestCancelPipelineRun(t *testing.T) { }, }, { name: "child-references-with-minimal", - embeddedStatus: config.MinimalEmbeddedStatus, + embeddedStatus: config.DefaultEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-cancelled"}, Spec: v1beta1.PipelineRunSpec{ @@ -268,7 +268,7 @@ func TestCancelPipelineRun(t *testing.T) { }, }, { name: "child-references-with-minimal-some-missing", - embeddedStatus: config.MinimalEmbeddedStatus, + embeddedStatus: config.DefaultEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-cancelled"}, Spec: v1beta1.PipelineRunSpec{ @@ -458,8 +458,8 @@ func TestGetChildObjectsFromPRStatusForTaskNames(t *testing.T) { hasError bool }{ { - name: "single taskrun, default embedded", - embeddedStatus: config.DefaultEmbeddedStatus, + name: "single taskrun, full embedded", + embeddedStatus: config.FullEmbeddedStatus, prStatus: v1beta1.PipelineRunStatus{PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ "t1": {PipelineTaskName: "task-1"}, @@ -470,8 +470,8 @@ func TestGetChildObjectsFromPRStatusForTaskNames(t *testing.T) { expectedCustomRunNames: nil, hasError: false, }, { - name: "single run, default embedded", - embeddedStatus: config.DefaultEmbeddedStatus, + name: "single run, full embedded", + embeddedStatus: config.FullEmbeddedStatus, prStatus: v1beta1.PipelineRunStatus{PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ Runs: map[string]*v1beta1.PipelineRunRunStatus{ "r1": {PipelineTaskName: "run-1"}, @@ -481,8 +481,8 @@ func TestGetChildObjectsFromPRStatusForTaskNames(t *testing.T) { expectedCustomRunNames: []string{"r1"}, hasError: false, }, { - name: "taskrun and run, default embedded", - embeddedStatus: config.DefaultEmbeddedStatus, + name: "taskrun and run, full embedded", + embeddedStatus: config.FullEmbeddedStatus, prStatus: v1beta1.PipelineRunStatus{PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ "t1": {PipelineTaskName: "task-1"}, @@ -495,8 +495,8 @@ func TestGetChildObjectsFromPRStatusForTaskNames(t *testing.T) { expectedCustomRunNames: []string{"r1"}, hasError: false, }, { - name: "taskrun and run, default embedded, just want taskrun", - embeddedStatus: config.DefaultEmbeddedStatus, + name: "taskrun and run, full embedded, just want taskrun", + embeddedStatus: config.FullEmbeddedStatus, prStatus: v1beta1.PipelineRunStatus{PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ "t1": {PipelineTaskName: "task-1"}, @@ -548,7 +548,7 @@ func TestGetChildObjectsFromPRStatusForTaskNames(t *testing.T) { expectedRunNames: []string{"r1"}, hasError: false, }, { - name: "minimal embedded", + name: "default minimal embedded", embeddedStatus: config.MinimalEmbeddedStatus, prStatus: v1beta1.PipelineRunStatus{PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ diff --git a/pkg/reconciler/pipelinerun/pipelinerun_test.go b/pkg/reconciler/pipelinerun/pipelinerun_test.go index e7602c7c0e5..4e4a3ab94cc 100644 --- a/pkg/reconciler/pipelinerun/pipelinerun_test.go +++ b/pkg/reconciler/pipelinerun/pipelinerun_test.go @@ -2159,12 +2159,16 @@ spec: status: CancelledRunFinally status: startTime: "2022-01-01T00:00:00Z" - taskRuns: - test-pipeline-run-cancelled-run-finally-final-task: - pipelineTaskName: final-task-1 - test-pipeline-run-cancelled-run-finally-hello-world: - pipelineTaskName: hello-world-1 - status: + childReferences: + - apiVersion: tekton.dev/v1beta1 + kind: TaskRun + name: test-pipeline-run-cancelled-run-finally-final-task + pipelineTaskName: final-task-1 + - apiVersion: tekton.dev/v1beta1 + kind: TaskRun + name: test-pipeline-run-cancelled-run-finally-hello-world + pipelineTaskName: hello-world-1 + status: conditions: - lastTransitionTime: null status: "True" @@ -2222,8 +2226,8 @@ spec: } // There should be 2 task runs, one for already completed "hello-world-1" task and one for the "final-task-1" final task - if len(reconciledRun.Status.TaskRuns) != 2 { - t.Errorf("Expected PipelineRun status to have 2 task runs, but was %v", len(reconciledRun.Status.TaskRuns)) + if len(reconciledRun.Status.ChildReferences) != 2 { + t.Errorf("Expected PipelineRun status to have 2 child references, but was %v", len(reconciledRun.Status.ChildReferences)) } actions := clients.Pipeline.Actions() @@ -2476,26 +2480,26 @@ status: startTime: %s`, v1beta1.PipelineRunSpecStatusStoppedRunFinally, now.Format(time.RFC3339)) testCases := []struct { - name string - pipeline *v1beta1.Pipeline - taskRuns []*v1beta1.TaskRun - initialTaskRunStatus map[string]*v1beta1.PipelineRunTaskRunStatus - expectedEvents []string - hasNilCompletionTime bool - isFailed bool - trInStatusCount int - skippedTasks []v1beta1.SkippedTask + name string + pipeline *v1beta1.Pipeline + taskRuns []*v1beta1.TaskRun + initialChildReferences []v1beta1.ChildStatusReference + expectedEvents []string + hasNilCompletionTime bool + isFailed bool + childRefInStatusCount int + skippedTasks []v1beta1.SkippedTask }{ { - name: "stopped PipelineRun", - pipeline: simpleHelloWorldPipeline, - taskRuns: nil, - initialTaskRunStatus: nil, - expectedEvents: []string{"Warning Failed PipelineRun \"test-pipeline-run-stopped-run-finally\" was cancelled"}, - hasNilCompletionTime: false, - isFailed: true, - trInStatusCount: 0, - skippedTasks: []v1beta1.SkippedTask{{Name: "hello-world-1", Reason: v1beta1.GracefullyStoppedSkip}}, + name: "stopped PipelineRun", + pipeline: simpleHelloWorldPipeline, + taskRuns: nil, + initialChildReferences: nil, + expectedEvents: []string{"Warning Failed PipelineRun \"test-pipeline-run-stopped-run-finally\" was cancelled"}, + hasNilCompletionTime: false, + isFailed: true, + childRefInStatusCount: 0, + skippedTasks: []v1beta1.SkippedTask{{Name: "hello-world-1", Reason: v1beta1.GracefullyStoppedSkip}}, }, { name: "with running task", pipeline: simpleHelloWorldPipeline, @@ -2507,17 +2511,19 @@ status: "hello-world", corev1.ConditionUnknown, )}, - initialTaskRunStatus: map[string]*v1beta1.PipelineRunTaskRunStatus{ - "test-pipeline-run-stopped-run-finally-hello-world": { - PipelineTaskName: "hello-world-1", - Status: &v1beta1.TaskRunStatus{}, + initialChildReferences: []v1beta1.ChildStatusReference{{ + TypeMeta: runtime.TypeMeta{ + APIVersion: v1beta1.SchemeGroupVersion.String(), + Kind: "TaskRun", }, - }, - expectedEvents: []string{"Normal Started"}, - hasNilCompletionTime: true, - isFailed: false, - trInStatusCount: 1, - skippedTasks: nil, + Name: "test-pipeline-run-stopped-run-finally-hello-world", + PipelineTaskName: "hello-world-1", + }}, + expectedEvents: []string{"Normal Started"}, + hasNilCompletionTime: true, + isFailed: false, + childRefInStatusCount: 1, + skippedTasks: nil, }, { name: "with completed task", pipeline: helloWorldPipelineWithRunAfter(t), @@ -2529,25 +2535,28 @@ status: "hello-world", corev1.ConditionTrue, )}, - initialTaskRunStatus: map[string]*v1beta1.PipelineRunTaskRunStatus{ - "test-pipeline-run-stopped-run-finally-hello-world": { - PipelineTaskName: "hello-world-1", - Status: &v1beta1.TaskRunStatus{}, + initialChildReferences: []v1beta1.ChildStatusReference{{ + TypeMeta: runtime.TypeMeta{ + APIVersion: v1beta1.SchemeGroupVersion.String(), + Kind: "TaskRun", }, + Name: "test-pipeline-run-stopped-run-finally-hello-world", + PipelineTaskName: "hello-world-1", }, - expectedEvents: []string{"Warning Failed PipelineRun \"test-pipeline-run-stopped-run-finally\" was cancelled"}, - hasNilCompletionTime: false, - isFailed: true, - trInStatusCount: 1, - skippedTasks: []v1beta1.SkippedTask{{Name: "hello-world-2", Reason: v1beta1.GracefullyStoppedSkip}}, + }, + expectedEvents: []string{"Warning Failed PipelineRun \"test-pipeline-run-stopped-run-finally\" was cancelled"}, + hasNilCompletionTime: false, + isFailed: true, + childRefInStatusCount: 1, + skippedTasks: []v1beta1.SkippedTask{{Name: "hello-world-2", Reason: v1beta1.GracefullyStoppedSkip}}, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { pr := parse.MustParseV1beta1PipelineRun(t, basePRYAML) - if tc.initialTaskRunStatus != nil { - pr.Status.TaskRuns = tc.initialTaskRunStatus + if tc.initialChildReferences != nil { + pr.Status.ChildReferences = tc.initialChildReferences } ps := []*v1beta1.Pipeline{tc.pipeline} ts := []*v1beta1.Task{simpleHelloWorldTask} @@ -2574,8 +2583,8 @@ status: t.Errorf("Expected PipelineRun status to be complete and unknown, but was %v", reconciledRun.Status.GetCondition(apis.ConditionSucceeded)) } - if len(reconciledRun.Status.TaskRuns) != tc.trInStatusCount { - t.Fatalf("Expected %d TaskRuns in status but got %d", tc.trInStatusCount, len(reconciledRun.Status.TaskRuns)) + if len(reconciledRun.Status.ChildReferences) != tc.childRefInStatusCount { + t.Fatalf("Expected %d ChildRerences in status but got %d", tc.childRefInStatusCount, len(reconciledRun.Status.ChildReferences)) } if d := cmp.Diff(tc.skippedTasks, reconciledRun.Status.SkippedTasks); d != "" { @@ -2906,21 +2915,25 @@ spec: status: finallyStartTime: "2021-12-31T23:44:59Z" startTime: "2021-12-31T23:40:00Z" - taskRuns: - test-pipeline-run-with-timeout-hello-world: - pipelineTaskName: task1 - status: - conditions: - - lastTransitionTime: null - status: "True" - type: Succeeded - test-pipeline-run-with-timeout-finaltask-1: - pipelineTaskName: finaltask-1 - status: - conditions: - - lastTransitionTime: null - status: "Unknown" - type: Succeeded + childReferences: + - name: test-pipeline-run-with-timeout-hello-world + apiVersion: tekton.dev/v1beta1 + kind: TaskRun + pipelineTaskName: task1 + status: + conditions: + - lastTransitionTime: null + status: "True" + type: Succeeded + - name: test-pipeline-run-with-timeout-finaltask-1 + apiVersion: tekton.dev/v1beta1 + kind: TaskRun + pipelineTaskName: finaltask-1 + status: + conditions: + - lastTransitionTime: null + status: "Unknown" + type: Succeeded `)} ts := []*v1beta1.Task{simpleHelloWorldTask} trs := []*v1beta1.TaskRun{ @@ -3076,9 +3089,11 @@ status: status: Unknown type: Succeeded startTime: "2022-01-01T00:00:00Z" - taskRuns: - test-pipeline-fails-to-cancelhello-world-1: - pipelineTaskName: hello-world-1 + childReferences: + - apiVersion: tekton.dev/v1beta1 + kind: TaskRun + name: test-pipeline-fails-to-cancelhello-world-1 + pipelineTaskName: hello-world-1 `, tc.specStatus))} ps := []*v1beta1.Pipeline{parse.MustParseV1beta1Pipeline(t, ` metadata: @@ -3192,9 +3207,11 @@ status: status: Unknown type: Succeeded startTime: "2021-12-31T22:59:00Z" - taskRuns: - test-pipeline-fails-to-timeouthello-world-1: - pipelineTaskName: hello-world-1 + childReferences: + - apiVersion: tekton.dev/v1beta1 + kind: TaskRun + name: test-pipeline-fails-to-timeouthello-world-1 + pipelineTaskName: hello-world-1 `)} ps := []*v1beta1.Pipeline{parse.MustParseV1beta1Pipeline(t, ` metadata: @@ -5154,7 +5171,7 @@ status: case embeddedStatus == config.BothEmbeddedStatus: expectedPr = expectedPrBothStatus case embeddedStatus == config.DefaultEmbeddedStatus: - expectedPr = expectedPrFullStatus + expectedPr = expectedPrMinimalStatus case embeddedStatus == config.FullEmbeddedStatus: expectedPr = expectedPrFullStatus case embeddedStatus == config.MinimalEmbeddedStatus: @@ -5475,7 +5492,7 @@ status: case embeddedStatus == config.BothEmbeddedStatus: expectedPr = expectedPrBothStatus case embeddedStatus == config.DefaultEmbeddedStatus: - expectedPr = expectedPrFullStatus + expectedPr = expectedPrMinimalStatus case embeddedStatus == config.FullEmbeddedStatus: expectedPr = expectedPrFullStatus case embeddedStatus == config.MinimalEmbeddedStatus: @@ -6198,6 +6215,7 @@ func TestReconcilePipeline_FinalTasks(t *testing.T) { ts []*v1beta1.Task trs []*v1beta1.TaskRun expectedTaskRuns map[string]*v1beta1.PipelineRunTaskRunStatus + expectedChildReferences []v1beta1.ChildStatusReference pipelineRunStatusUnknown bool pipelineRunStatusFalse bool }{{ @@ -6461,11 +6479,21 @@ func TestReconcilePipeline_FinalTasks(t *testing.T) { ), }, - expectedTaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ - "task-run-dag-task-1": getTaskRunStatus("dag-task-1", corev1.ConditionFalse), - "task-run-dag-task-2": getTaskRunStatus("dag-task-2", corev1.ConditionUnknown), - }, - + expectedChildReferences: []v1beta1.ChildStatusReference{{ + TypeMeta: runtime.TypeMeta{ + APIVersion: v1beta1.SchemeGroupVersion.String(), + Kind: "TaskRun", + }, + Name: "task-run-dag-task-1", + PipelineTaskName: "dag-task-1", + }, { + TypeMeta: runtime.TypeMeta{ + APIVersion: v1beta1.SchemeGroupVersion.String(), + Kind: "TaskRun", + }, + Name: "task-run-dag-task-2", + PipelineTaskName: "dag-task-2", + }}, pipelineRunStatusUnknown: true, }, { // pipeline run should not schedule final tasks until dag tasks are done i.e. @@ -6519,15 +6547,22 @@ func TestReconcilePipeline_FinalTasks(t *testing.T) { ), }, - expectedTaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ - "task-run-dag-task-1": getTaskRunStatus("dag-task-1", corev1.ConditionUnknown), - }, + expectedChildReferences: []v1beta1.ChildStatusReference{{ + TypeMeta: runtime.TypeMeta{ + APIVersion: v1beta1.SchemeGroupVersion.String(), + Kind: "TaskRun", + }, + Name: "task-run-dag-task-1", + PipelineTaskName: "dag-task-1", + }}, pipelineRunStatusUnknown: true, }} for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + withOwnerReference(tt.trs, tt.prs[0].Name) + d := test.Data{ PipelineRuns: tt.prs, Pipelines: tt.ps, @@ -6572,12 +6607,18 @@ func TestReconcilePipeline_FinalTasks(t *testing.T) { t.Errorf("Expected PipelineRun status to be failed, but was %v for %s", reconciledRun.Status.GetCondition(apis.ConditionSucceeded), tt.name) } + if d := cmp.Diff(reconciledRun.Status.TaskRuns, tt.expectedTaskRuns); d != "" { + t.Fatalf("Expected PipelineRunTaskRun status to match TaskRun(s) status, but got a mismatch for %s: %s", tt.name, d) + } } else if tt.pipelineRunStatusUnknown { // This PipelineRun should still be running and the status should reflect that if !reconciledRun.Status.GetCondition(apis.ConditionSucceeded).IsUnknown() { t.Errorf("Expected PipelineRun status to be unknown (running), but was %v for %s", reconciledRun.Status.GetCondition(apis.ConditionSucceeded), tt.name) } + if d := cmp.Diff(reconciledRun.Status.ChildReferences, tt.expectedChildReferences); d != "" { + t.Fatalf("Expected PipelineRunTaskRun status to match TaskRun(s) status, but got a mismatch for %s: %s", tt.name, d) + } } if d := cmp.Diff(reconciledRun.Status.TaskRuns, tt.expectedTaskRuns); d != "" { @@ -6614,6 +6655,15 @@ func getPipelineRun(pr, p string, status corev1.ConditionStatus, reason string, return []*v1beta1.PipelineRun{pRun} } +// withOwnerReference adds the PipelineRun name to each TaskRun as their OwnerReference +// TODO: This shall be removed along with the refactor of `getTaskRun` to populate matched +// OwnerReference with the PipelineRun at https://github.com/tektoncd/pipeline/issues/6008 +func withOwnerReference(trs []*v1beta1.TaskRun, prName string) { + for _, tr := range trs { + tr.OwnerReferences = []metav1.OwnerReference{{Name: prName}} + } +} + func getPipeline(p string, spec v1beta1.PipelineSpec) []*v1beta1.Pipeline { ps := []*v1beta1.Pipeline{{ ObjectMeta: baseObjectMeta(p, "foo"), diff --git a/pkg/reconciler/pipelinerun/timeout_test.go b/pkg/reconciler/pipelinerun/timeout_test.go index 9ff95a415e7..a57da88d05d 100644 --- a/pkg/reconciler/pipelinerun/timeout_test.go +++ b/pkg/reconciler/pipelinerun/timeout_test.go @@ -42,14 +42,14 @@ func TestTimeoutPipelineRun(t *testing.T) { wantErr bool }{{ name: "no-resolved-taskrun", - embeddedStatus: config.DefaultEmbeddedStatus, + embeddedStatus: config.FullEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-timedout"}, Spec: v1beta1.PipelineRunSpec{}, }, }, { name: "one-taskrun", - embeddedStatus: config.DefaultEmbeddedStatus, + embeddedStatus: config.FullEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-timedout"}, Spec: v1beta1.PipelineRunSpec{}, @@ -64,7 +64,7 @@ func TestTimeoutPipelineRun(t *testing.T) { }, }, { name: "multiple-taskruns", - embeddedStatus: config.DefaultEmbeddedStatus, + embeddedStatus: config.FullEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-timedout"}, Spec: v1beta1.PipelineRunSpec{}, @@ -81,7 +81,7 @@ func TestTimeoutPipelineRun(t *testing.T) { }, }, { name: "multiple-runs", - embeddedStatus: config.DefaultEmbeddedStatus, + embeddedStatus: config.FullEmbeddedStatus, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-timedout"}, Spec: v1beta1.PipelineRunSpec{}, @@ -98,7 +98,7 @@ func TestTimeoutPipelineRun(t *testing.T) { }, }, { name: "multiple-runs-beta-custom-tasks", - embeddedStatus: config.DefaultEmbeddedStatus, + embeddedStatus: config.FullEmbeddedStatus, useV1Beta1CustomTasks: true, pipelineRun: &v1beta1.PipelineRun{ ObjectMeta: metav1.ObjectMeta{Name: "test-pipeline-run-timedout"},