Skip to content

Commit 03cecd0

Browse files
Merge pull request #13614 from Lucifergene/OCPBUGS-29513-PLR-Custom-Status
OCPBUGS-29513: Update the Pipeline List and Details Pages to acknowledge Custom Task
2 parents 77d383d + be338ae commit 03cecd0

6 files changed

Lines changed: 158 additions & 31 deletions

File tree

frontend/packages/pipelines-plugin/locales/en/pipelines-plugin.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@
153153
"No workspaces are associated with this pipeline.": "No workspaces are associated with this pipeline.",
154154
"{{triggerBindingLabel}} details": "{{triggerBindingLabel}} details",
155155
"TriggerTemplate details": "TriggerTemplate details",
156+
"Approval Task": "Approval Task",
157+
"Custom Task": "Custom Task",
156158
"Embedded task": "Embedded task",
157159
"Embedded PipelineResource": "Embedded PipelineResource",
158160
"Embedded Pipeline": "Embedded Pipeline",

frontend/packages/pipelines-plugin/src/components/pipelines/detail-page-tabs/utils.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,26 @@ export const getPipelineTaskLinks = (pipeline: PipelineKind): PipelineTaskLinks
4646
if (!tasks) return [];
4747
return tasks?.map((task) =>
4848
task.taskRef
49-
? {
50-
resourceKind: getSafeTaskResourceKind(task.taskRef.kind),
51-
name: task.taskRef.name,
52-
qualifier: task.name,
53-
}
49+
? task.taskRef.kind === 'ClusterTask' || task.taskRef.kind === 'Task'
50+
? {
51+
resourceKind: getSafeTaskResourceKind(task.taskRef.kind),
52+
name: task.taskRef.name,
53+
qualifier: task.name,
54+
}
55+
: {
56+
resourceKind: task.taskRef?.kind,
57+
name:
58+
task.taskRef?.kind === 'ApprovalTask'
59+
? i18next.t('pipelines-plugin~Approval Task')
60+
: i18next.t('pipelines-plugin~Custom Task'),
61+
qualifier: task.name,
62+
disableLink: true,
63+
}
5464
: {
5565
resourceKind: 'EmbeddedTask',
5666
name: i18next.t('pipelines-plugin~Embedded task'),
5767
qualifier: task.name,
68+
disableLink: true,
5869
},
5970
);
6071
};

frontend/packages/pipelines-plugin/src/components/pipelines/resource-overview/DynamicResourceLinkList.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export type ResourceModelLink = {
88
resourceKind: string;
99
name: string;
1010
qualifier?: string;
11+
disableLink?: boolean;
1112
};
1213

1314
type DynamicResourceLinkListProps = {
@@ -35,10 +36,10 @@ const DynamicResourceLinkList: React.FC<DynamicResourceLinkListProps> = ({
3536
<dl>
3637
{title && <dt>{title}</dt>}
3738
<dd>
38-
{links.map(({ name, resourceKind, qualifier = '' }) => {
39-
let linkName = name;
39+
{links.map(({ name, resourceKind, qualifier = '', disableLink = false }) => {
40+
let linkName = qualifier;
4041
if (qualifier?.length > 0 && name !== qualifier) {
41-
linkName += ` (${qualifier})`;
42+
linkName += ` (${name})`;
4243
}
4344
return (
4445
<div key={`${resourceKind}/${linkName}`}>
@@ -47,6 +48,7 @@ const DynamicResourceLinkList: React.FC<DynamicResourceLinkListProps> = ({
4748
resourceName={name}
4849
displayName={linkName}
4950
namespace={namespace}
51+
disableLink={disableLink}
5052
/>
5153
</div>
5254
);

frontend/packages/pipelines-plugin/src/test-data/pipeline-data.ts

Lines changed: 104 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export enum PipelineExampleNames {
3434
EMBEDDED_PIPELINE_SPEC = 'embedded-pipeline-spec',
3535
PIPELINE_WITH_FINALLY = 'pipeline-with-finally',
3636
RESULTS = 'results-pipeline',
37+
CUSTOM_TASK_PIPELINE = 'custom-task-pipeline',
3738
}
3839

3940
type CombinedPipelineTestData = {
@@ -54,42 +55,88 @@ const pipelineSpec: PipelineSpecData = {
5455
tasks: [
5556
{
5657
name: 'hello-world-1',
57-
taskRef: { name: 'hello-world-1' },
58+
taskRef: { kind: 'Task', name: 'hello-world-1' },
5859
},
5960
{
6061
name: 'hello-world-truncate-more-than-20-char',
61-
taskRef: { name: 'hello-world-truncate-more-than-20-char' },
62+
taskRef: { kind: 'Task', name: 'hello-world-truncate-more-than-20-char' },
6263
},
6364
],
6465
},
6566
[PipelineExampleNames.PARTIAL_PIPELINE]: {
6667
tasks: [
67-
{ name: 'hello-world-1', taskRef: { name: 'hello-world-1' } },
68+
{ name: 'hello-world-1', taskRef: { kind: 'Task', name: 'hello-world-1' } },
6869
{
6970
name: 'hello-world-truncate-more-than-20-char',
70-
taskRef: { name: 'hello-world-truncate-more-than-20-char' },
71+
taskRef: { kind: 'Task', name: 'hello-world-truncate-more-than-20-char' },
7172
},
72-
{ name: 'hello-world-3', taskRef: { name: 'hello-world-3' } },
73+
{ name: 'hello-world-3', taskRef: { kind: 'Task', name: 'hello-world-3' } },
74+
],
75+
},
76+
[PipelineExampleNames.CUSTOM_TASK_PIPELINE]: {
77+
tasks: [
78+
{ name: 'hello-world-1', taskRef: { kind: 'Task', name: 'hello-world-1' } },
79+
{
80+
name: 'hello-world-custom-task-2',
81+
taskRef: { kind: 'ApprovalTask', name: 'hello-world-custom-task-2' },
82+
},
83+
{ name: 'hello-world-3', taskRef: { kind: 'Task', name: 'hello-world-3' } },
7384
],
7485
},
7586
[PipelineExampleNames.COMPLEX_PIPELINE]: {
7687
tasks: [
77-
{ name: 'build-app', taskRef: { name: 'noop-task' } },
78-
{ name: 'analyse-code', runAfter: ['build-app'], taskRef: { name: 'noop-task' } },
79-
{ name: 'style-checks', runAfter: ['build-app'], taskRef: { name: 'noop-task' } },
80-
{ name: 'find-bugs', runAfter: ['build-app'], taskRef: { name: 'noop-task' } },
88+
{ name: 'build-app', taskRef: { kind: 'Task', name: 'noop-task' } },
89+
{
90+
name: 'analyse-code',
91+
runAfter: ['build-app'],
92+
taskRef: { kind: 'Task', name: 'noop-task' },
93+
},
94+
{
95+
name: 'style-checks',
96+
runAfter: ['build-app'],
97+
taskRef: { kind: 'Task', name: 'noop-task' },
98+
},
99+
{ name: 'find-bugs', runAfter: ['build-app'], taskRef: { kind: 'Task', name: 'noop-task' } },
81100
{
82101
name: 'build-image',
83102
runAfter: ['find-bugs', 'style-checks', 'analyse-code'],
84-
taskRef: { name: 'noop-task' },
85-
},
86-
{ name: 'deploy-image', runAfter: ['build-image'], taskRef: { name: 'noop-task' } },
87-
{ name: 'test-suite-1', runAfter: ['deploy-image'], taskRef: { name: 'noop-task' } },
88-
{ name: 'test-suite-2', runAfter: ['deploy-image'], taskRef: { name: 'noop-task' } },
89-
{ name: 'test-suite-3', runAfter: ['deploy-image'], taskRef: { name: 'noop-task' } },
90-
{ name: 'test-suite-4', runAfter: ['deploy-image'], taskRef: { name: 'noop-task' } },
91-
{ name: 'test-suite-5', runAfter: ['deploy-image'], taskRef: { name: 'noop-task' } },
92-
{ name: 'test-suite-6', runAfter: ['deploy-image'], taskRef: { name: 'noop-task' } },
103+
taskRef: { kind: 'Task', name: 'noop-task' },
104+
},
105+
{
106+
name: 'deploy-image',
107+
runAfter: ['build-image'],
108+
taskRef: { kind: 'Task', name: 'noop-task' },
109+
},
110+
{
111+
name: 'test-suite-1',
112+
runAfter: ['deploy-image'],
113+
taskRef: { kind: 'Task', name: 'noop-task' },
114+
},
115+
{
116+
name: 'test-suite-2',
117+
runAfter: ['deploy-image'],
118+
taskRef: { kind: 'Task', name: 'noop-task' },
119+
},
120+
{
121+
name: 'test-suite-3',
122+
runAfter: ['deploy-image'],
123+
taskRef: { kind: 'Task', name: 'noop-task' },
124+
},
125+
{
126+
name: 'test-suite-4',
127+
runAfter: ['deploy-image'],
128+
taskRef: { kind: 'Task', name: 'noop-task' },
129+
},
130+
{
131+
name: 'test-suite-5',
132+
runAfter: ['deploy-image'],
133+
taskRef: { kind: 'Task', name: 'noop-task' },
134+
},
135+
{
136+
name: 'test-suite-6',
137+
runAfter: ['deploy-image'],
138+
taskRef: { kind: 'Task', name: 'noop-task' },
139+
},
93140
{
94141
name: 'verify',
95142
runAfter: [
@@ -100,7 +147,7 @@ const pipelineSpec: PipelineSpecData = {
100147
'test-suite-5',
101148
'test-suite-6',
102149
],
103-
taskRef: { name: 'noop-task' },
150+
taskRef: { kind: 'Task', name: 'noop-task' },
104151
},
105152
],
106153
finally: [],
@@ -388,17 +435,17 @@ const pipelineSpec: PipelineSpecData = {
388435
tasks: [
389436
{
390437
name: 'hello-world-1',
391-
taskRef: { name: 'hello-world-1' },
438+
taskRef: { kind: 'Task', name: 'hello-world-1' },
392439
},
393440
{
394441
name: 'hello-world-2',
395-
taskRef: { name: 'hello-world-2' },
442+
taskRef: { kind: 'Task', name: 'hello-world-2' },
396443
},
397444
],
398445
finally: [
399446
{
400447
name: 'run-anyway',
401-
taskRef: { name: 'run-anyway' },
448+
taskRef: { kind: 'Task', name: 'run-anyway' },
402449
},
403450
],
404451
},
@@ -733,6 +780,41 @@ export const pipelineTestData: PipelineTestData = {
733780
},
734781
},
735782
},
783+
[PipelineExampleNames.CUSTOM_TASK_PIPELINE]: {
784+
dataSource: 'custom-task-pipeline',
785+
pipeline: {
786+
apiVersion: 'tekton.dev/v1alpha1',
787+
kind: 'Pipeline',
788+
metadata: {
789+
name: 'custom-task-pipeline',
790+
namespace: 'tekton-pipelines',
791+
},
792+
spec: pipelineSpec[PipelineExampleNames.CUSTOM_TASK_PIPELINE],
793+
},
794+
pipelineRuns: {
795+
[DataState.PIPELINE_RUN_PENDING]: {
796+
apiVersion: 'tekton.dev/v1alpha1',
797+
kind: 'PipelineRun',
798+
metadata: {
799+
name: 'custom-task-pipeline-3tt7aw',
800+
namespace: 'tekton-pipelines',
801+
labels: { [TektonResourceLabel.pipeline]: 'custom-task-pipeline' },
802+
},
803+
spec: {
804+
pipelineRef: { name: 'custom-task-pipeline' },
805+
},
806+
status: {
807+
pipelineSpec: pipelineSpec[PipelineExampleNames.CUSTOM_TASK_PIPELINE],
808+
conditions: [
809+
{
810+
status: 'True',
811+
type: 'Succeeded',
812+
},
813+
],
814+
},
815+
},
816+
},
817+
},
736818
[PipelineExampleNames.COMPLEX_PIPELINE]: {
737819
dataSource: 'complex-pipeline',
738820
pipeline: {

frontend/packages/pipelines-plugin/src/utils/__tests__/pipeline-augment.spec.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
getResourceModelFromBindingKind,
2323
shouldHidePipelineRunStop,
2424
shouldHidePipelineRunCancel,
25+
totalPipelineRunCustomTasks,
2526
} from '../pipeline-augment';
2627
import { testData } from './pipeline-augment-test-data';
2728

@@ -503,3 +504,17 @@ describe('getResourceModelFromBindingKind', () => {
503504
expect(getResourceModelFromBindingKind('Nothing special')).toBe(null);
504505
});
505506
});
507+
508+
describe('PipelineAugment test correct task status state is shown when there is custom tasks', () => {
509+
it('should not count custom tasks in TaskStatus', () => {
510+
const customTaskPipeline = pipelineTestData[PipelineExampleNames.CUSTOM_TASK_PIPELINE];
511+
const taskStatus = getTaskStatus(
512+
customTaskPipeline.pipelineRuns[DataState.PIPELINE_RUN_PENDING],
513+
customTaskPipeline.pipeline,
514+
[],
515+
);
516+
const totalTasks = totalPipelineRunTasks(customTaskPipeline.pipeline);
517+
const customTaskCount = totalPipelineRunCustomTasks(customTaskPipeline.pipeline);
518+
expect(taskStatus.Pending).toEqual(totalTasks - customTaskCount);
519+
});
520+
});

frontend/packages/pipelines-plugin/src/utils/pipeline-augment.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,27 @@ export const totalPipelineRunTasks = (executedPipeline: PipelineKind): number =>
161161
return totalTasks + finallyTasks;
162162
};
163163

164+
export const totalPipelineRunCustomTasks = (executedPipeline: PipelineKind): number => {
165+
if (!executedPipeline) {
166+
return 0;
167+
}
168+
const totalCustomTasks =
169+
(executedPipeline.spec?.tasks || []).filter(
170+
(task) => task.taskRef?.kind !== 'Task' && task.taskRef?.kind !== 'ClusterTask',
171+
).length ?? 0;
172+
const finallyCustomTasks =
173+
(executedPipeline.spec?.finally || []).filter(
174+
(task) => task.taskRef?.kind !== 'Task' && task.taskRef?.kind !== 'ClusterTask',
175+
).length ?? 0;
176+
return totalCustomTasks + finallyCustomTasks;
177+
};
178+
164179
export const getTaskStatus = (
165180
pipelinerun: PipelineRunKind,
166181
pipeline: PipelineKind,
167182
taskRuns: TaskRunKind[],
168183
): TaskStatus => {
169-
const totalTasks = totalPipelineRunTasks(pipeline);
184+
const totalTasks = totalPipelineRunTasks(pipeline) - totalPipelineRunCustomTasks(pipeline);
170185
const plrTasks = (): string[] => {
171186
if (pipelinerun?.status?.taskRuns) {
172187
return Object.keys(pipelinerun.status.taskRuns);

0 commit comments

Comments
 (0)