Skip to content

Commit

Permalink
Merge pull request #3637 from abhinandan13jan/failed-cancelled
Browse files Browse the repository at this point in the history
fix(pipeline-tasks): Cancelled tasks
  • Loading branch information
openshift-merge-robot committed Dec 14, 2019
2 parents 9c3af77 + 2c1f356 commit 59ade4c
Show file tree
Hide file tree
Showing 11 changed files with 273 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,18 @@ import { PipelineRunModel } from '../../../models';
export const runFilters = [
{
type: 'pipelinerun-status',
selected: [ListFilterId.Succeeded, ListFilterId.Running, ListFilterId.Failed],
selected: [
ListFilterId.Succeeded,
ListFilterId.Running,
ListFilterId.Failed,
ListFilterId.Cancelled,
],
reducer: pipelineRunFilterReducer,
items: [
{ id: ListFilterId.Succeeded, title: ListFilterLabels[ListFilterId.Succeeded] },
{ id: ListFilterId.Running, title: ListFilterLabels[ListFilterId.Running] },
{ id: ListFilterId.Failed, title: ListFilterLabels[ListFilterId.Failed] },
{ id: ListFilterId.Cancelled, title: ListFilterLabels[ListFilterId.Cancelled] },
],
filter: pipelineRunStatusFilter,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export const PipelineVisualizationTask: React.FC<PipelineVisualizationTaskProp>
duration: '',
reason: runStatus.Idle,
};
if (pipelineRunStatus === runStatus.Failed) {
if (pipelineRunStatus === runStatus.Failed || pipelineRunStatus === runStatus.Cancelled) {
if (
task.status &&
task.status.reason !== runStatus.Succeeded &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ interface StatusIconProps {
export const StatusIcon: React.FC<StatusIconProps> = ({ status, ...props }) => {
switch (status) {
case runStatus['In Progress']:
case runStatus.Running:
return <SyncAltIcon {...props} className="fa-spin" />;

case runStatus.Succeeded:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,18 @@ interface ListPipelineData extends K8sKind {
export const filters = [
{
type: 'pipeline-status',
selected: [ListFilterId.Succeeded, ListFilterId.Running, ListFilterId.Failed],
selected: [
ListFilterId.Succeeded,
ListFilterId.Running,
ListFilterId.Failed,
ListFilterId.Cancelled,
],
reducer: pipelineFilterReducer,
items: [
{ id: ListFilterId.Succeeded, title: ListFilterLabels[ListFilterId.Succeeded] },
{ id: ListFilterId.Running, title: ListFilterLabels[ListFilterId.Running] },
{ id: ListFilterId.Failed, title: ListFilterLabels[ListFilterId.Failed] },
{ id: ListFilterId.Cancelled, title: ListFilterLabels[ListFilterId.Cancelled] },
],
filter: pipelineStatusFilter,
},
Expand Down
153 changes: 151 additions & 2 deletions frontend/packages/dev-console/src/test/pipeline-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ import { Pipeline, PipelineRun } from '../utils/pipeline-augment';
export enum DataState {
IN_PROGRESS = 'In Progress',
SUCCESS = 'Completed Successfully',
CANCELLED = 'Cancelled',
CANCELLED1 = 'Cancelled at stage1',
CANCELLED2 = 'Cancelled at stage2 paralell task',
CANCELLED3 = 'Cancelled at stage3 single task',
FAILED = 'Completed But Failed',
}

Expand Down Expand Up @@ -218,7 +220,7 @@ export const pipelineTestData: PipelineTestData = {
},
},
pipelineRuns: {
[DataState.CANCELLED]: {
[DataState.CANCELLED1]: {
apiVersion: 'tekton.dev/v1alpha1',
kind: 'PipelineRun',
metadata: {
Expand Down Expand Up @@ -251,6 +253,153 @@ export const pipelineTestData: PipelineTestData = {
},
},
},
[DataState.CANCELLED2]: {
apiVersion: 'tekton.dev/v1alpha1',
kind: 'PipelineRun',
metadata: {
name: 'complex-pipeline-fm4hax',
namespace: 'tekton-pipelines',
},
spec: {
params: [{ name: 'APP_NAME', value: '' }],
pipelineRef: { name: 'complex-pipeline' },
resources: [
{ name: 'app-git', resourceRef: { name: 'mapit-git' } },
{ name: 'app-image', resourceRef: { name: 'mapit-image' } },
],
status: 'PipelineRunCancelled',
},
status: {
conditions: [
{
reason: 'PipelineRunCancelled',
status: 'False',
type: 'Succeeded',
},
],
startTime: '2019-12-09T08:59:05Z',
taskRuns: {
'simple-pipeline-7ergyh-build-1-cht9h': {
pipelineTaskName: 'build-1',
status: {
conditions: [
{
reason: 'TaskRunCancelled',
status: 'False',
type: 'Succeeded',
},
],
},
},
'simple-pipeline-7ergyh-build-2-x8jq2': {
pipelineTaskName: 'build-2',
status: {
conditions: [
{
reason: 'TaskRunCancelled',
status: 'False',
type: 'Succeeded',
},
],
},
},
'simple-pipeline-7ergyh-push-n2r2q': {
pipelineTaskName: 'push',
status: {
completionTime: '2019-12-09T08:59:26Z',
conditions: [
{
reason: 'Succeeded',
status: 'True',
type: 'Succeeded',
},
],
},
},
},
},
},
[DataState.CANCELLED3]: {
apiVersion: 'tekton.dev/v1alpha1',
kind: 'PipelineRun',
metadata: {
name: 'complex-pipeline-fm4hax',
namespace: 'tekton-pipelines',
},
spec: {
params: [{ name: 'APP_NAME', value: '' }],
pipelineRef: { name: 'complex-pipeline' },
resources: [
{ name: 'app-git', resourceRef: { name: 'mapit-git' } },
{ name: 'app-image', resourceRef: { name: 'mapit-image' } },
],
status: 'PipelineRunCancelled',
},
status: {
conditions: [
{
reason: 'PipelineRunCancelled',
status: 'False',
type: 'Succeeded',
},
],
startTime: '2019-12-10T11:18:38Z',
taskRuns: {
'simple-pipeline-haeml4-build-1-fddrb': {
pipelineTaskName: 'build-1',
status: {
completionTime: '2019-12-10T11:19:18Z',
conditions: [
{
reason: 'Succeeded',
status: 'True',
type: 'Succeeded',
},
],
},
},
'simple-pipeline-haeml4-build-2-l5scg': {
pipelineTaskName: 'build-2',
status: {
completionTime: '2019-12-10T11:19:19Z',
conditions: [
{
reason: 'Succeeded',
status: 'True',
type: 'Succeeded',
},
],
startTime: '2019-12-10T11:18:58Z',
},
},
'simple-pipeline-haeml4-deploy-qtpnz': {
pipelineTaskName: 'deploy',
status: {
conditions: [
{
reason: 'TaskRunCancelled',
status: 'False',
type: 'Succeeded',
},
],
},
},
'simple-pipeline-haeml4-push-4gj8n': {
pipelineTaskName: 'push',
status: {
completionTime: '2019-12-10T11:18:58Z',
conditions: [
{
reason: 'Succeeded',
status: 'True',
type: 'Succeeded',
},
],
},
},
},
},
},
[DataState.IN_PROGRESS]: {
apiVersion: 'tekton.dev/v1alpha1',
kind: 'PipelineRun',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,10 @@ describe('PipelineAugment test correct task status state is pulled from pipeline

describe('Failed / Cancelled pipelines', () => {
// When a pipeline run fails or is cancelled - all not-started tasks are cancelled and any on-going tasks fail
const sumFailedTaskStatus = (status: TaskStatus): number => status.Failed + status.Cancelled;
const sumFailedTaskStatus = (status: TaskStatus): number => status.Failed;
const sumCancelledTaskStatus = (status: TaskStatus): number => status.Cancelled;
const sumSuccededTaskStatus = (status: TaskStatus): number => status.Succeeded;
const complexTestData = pipelineTestData[PipelineExampleNames.COMPLEX_PIPELINE];

it('expect a partial pipeline to have task-count equal to Failed and Cancelled states', () => {
const partialTestData = pipelineTestData[PipelineExampleNames.PARTIAL_PIPELINE];
Expand All @@ -197,20 +200,54 @@ describe('PipelineAugment test correct task status state is pulled from pipeline
partialTestData.pipeline,
);

expect(sumFailedTaskStatus(taskStatus)).toEqual(taskCount);
expect(sumFailedTaskStatus(taskStatus)).toEqual(0);
expect(sumCancelledTaskStatus(taskStatus)).toEqual(taskCount);
expect(sumTaskStatuses(taskStatus)).toEqual(taskCount);
});

it('expect a cancelled complex pipeline to have task-count equal to Failed and Cancelled states', () => {
const complexTestData = pipelineTestData[PipelineExampleNames.COMPLEX_PIPELINE];
it(`expect correct task status for PipelineRun Failed at beginning`, () => {
const expected = { succeeded: 0, failed: 1 };
const taskCount = getExpectedTaskCount(complexTestData.pipeline);
const taskStatus = getTaskStatus(
complexTestData.pipelineRuns[DataState.CANCELLED1],
complexTestData.pipeline,
);

expect(sumFailedTaskStatus(taskStatus)).toEqual(expected.failed);
expect(sumSuccededTaskStatus(taskStatus)).toEqual(expected.succeeded);
expect(sumCancelledTaskStatus(taskStatus)).toEqual(
taskCount - (expected.failed + expected.succeeded),
);
expect(sumTaskStatuses(taskStatus)).toEqual(taskCount);
});

it(`expect correct task status for PLR failed at stage 2 parallel`, () => {
const expected = { succeeded: 1, failed: 0 };
const taskCount = getExpectedTaskCount(complexTestData.pipeline);
const taskStatus = getTaskStatus(
complexTestData.pipelineRuns[DataState.CANCELLED],
complexTestData.pipelineRuns[DataState.CANCELLED2],
complexTestData.pipeline,
);
expect(sumFailedTaskStatus(taskStatus)).toEqual(expected.failed);
expect(sumSuccededTaskStatus(taskStatus)).toEqual(expected.succeeded);
expect(sumCancelledTaskStatus(taskStatus)).toEqual(
taskCount - (expected.failed + expected.succeeded),
);
expect(sumTaskStatuses(taskStatus)).toEqual(taskCount);
});

expect(sumFailedTaskStatus(taskStatus)).toEqual(taskCount);
it(`expect correct task status for PLR failed at stage 3`, () => {
const expected = { succeeded: 3, failed: 0 };
const taskCount = getExpectedTaskCount(complexTestData.pipeline);
const taskStatus = getTaskStatus(
complexTestData.pipelineRuns[DataState.CANCELLED3],
complexTestData.pipeline,
);
expect(sumFailedTaskStatus(taskStatus)).toEqual(expected.failed);
expect(sumSuccededTaskStatus(taskStatus)).toEqual(expected.succeeded);
expect(sumCancelledTaskStatus(taskStatus)).toEqual(
taskCount - (expected.succeeded + expected.failed),
);
expect(sumTaskStatuses(taskStatus)).toEqual(taskCount);
});
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { pipelineRunFilterReducer } from '../pipeline-filter-reducer';
import { pipelineRunStatus, pipelineRunFilterReducer } from '../pipeline-filter-reducer';

const mockPipelineRuns = [
{ status: {} },
Expand Down Expand Up @@ -26,43 +26,65 @@ const mockPipelineRuns = [
},
},
{ status: { conditions: [{ status: 'Unknown', type: 'Succeeded' }] } },
{ status: { conditions: [{ reason: 'PipelineRunCancelled' }] } },
{ status: { conditions: [{ reason: 'TaskRunCancelled' }] } },
];

describe('Check PipelineRun Filter Reducer applied to the following:', () => {
it('1. Pipelinerun with empty status object', () => {
describe('Check PipelineRun Status | Filter Reducer applied to the following:', () => {
it('Pipelinerun with empty status object', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[0]);
expect(reducerOutput).toBeNull();
});
it('Pipelinerun with empty status object', () => {
const reducerOutput = pipelineRunFilterReducer(mockPipelineRuns[0]);
expect(reducerOutput).toBe('-');
});
it('2. Pipelinerun with empty conditions array', () => {
it('Pipelinerun with empty status object', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[1]);
expect(reducerOutput).toBeNull();
});
it('Pipelinerun with empty status object', () => {
const reducerOutput = pipelineRunFilterReducer(mockPipelineRuns[1]);
expect(reducerOutput).toBe('-');
});
it('3. Pipelinerun with first element of condition array without status', () => {
it('Pipelinerun with empty status object', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[2]);
expect(reducerOutput).toBeNull();
});
it('Pipelinerun with empty conditions array', () => {
const reducerOutput = pipelineRunFilterReducer(mockPipelineRuns[2]);
expect(reducerOutput).toBe('-');
});
it('4. Pipelinerun with first element of condition array with type as "Succeeded" & status as "False"', () => {
const reducerOutput = pipelineRunFilterReducer(mockPipelineRuns[3]);
it('Pipelinerun with first element of condition array with type as "Succeeded" & status as "False"', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[3]);
expect(reducerOutput).toBe('Failed');
});
it('5. Pipelinerun with first element of condition array with type as "Succeeded" & status as "True"', () => {
const reducerOutput = pipelineRunFilterReducer(mockPipelineRuns[4]);
it('Pipelinerun with first element of condition array with type as "Succeeded" & status as "True"', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[4]);
expect(reducerOutput).toBe('Succeeded');
});
it('6. Pipelinerun with second element of condition array with type as "Succeeded" & status as "False"', () => {
const reducerOutput = pipelineRunFilterReducer(mockPipelineRuns[5]);
it('Pipelinerun with second element of condition array with type as "Succeeded" & status as "False"', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[5]);
expect(reducerOutput).toBe('Failed');
});
it('7. Pipelinerun with second element of condition array with type as "Succeeded" & status as "True"', () => {
const reducerOutput = pipelineRunFilterReducer(mockPipelineRuns[6]);
it('Pipelinerun with second element of condition array with type as "Succeeded" & status as "True"', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[6]);
expect(reducerOutput).toBe('Succeeded');
});
it('8. Pipelinerun with second element of condition array with type as "Succeeded" & status as "True" and additional condition with type as "Failure"', () => {
const reducerOutput = pipelineRunFilterReducer(mockPipelineRuns[7]);
it('Pipelinerun with second element of condition array with type as "Succeeded" & status as "True" and additional condition with type as "Failure"', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[7]);
expect(reducerOutput).toBe('Succeeded');
});
it('9. Pipelinerun with first element of condition array with type as "Succeeded" & status as "Unknown"', () => {
const reducerOutput = pipelineRunFilterReducer(mockPipelineRuns[8]);
it('Pipelinerun with first element of condition array with type as "Succeeded" & status as "Unknown"', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[8]);
expect(reducerOutput).toBe('Running');
});
it('Pipelinerun with first element of condition array with type as "Succeeded" & status as "Unknown"', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[9]);
expect(reducerOutput).toBe('Cancelled');
});
it('Pipelinerun with first element of condition array with type as "Succeeded" & status as "Unknown"', () => {
const reducerOutput = pipelineRunStatus(mockPipelineRuns[10]);
expect(reducerOutput).toBe('Cancelled');
});
});

0 comments on commit 59ade4c

Please sign in to comment.