UNPKG

@janus-idp/shared-react

Version:

Shared code for utils, types, and React components for the Janus frontend plugins.

193 lines (189 loc) 7.8 kB
'use strict'; var common = require('../../consts/common.cjs.js'); var computedStatus = require('../../types/pipeline/computedStatus.cjs.js'); var taskRun = require('./task-run.cjs.js'); const getRunStatusColor = (status) => { switch (status) { case computedStatus.ComputedStatus.Succeeded: return { message: "Succeeded", color: common.successColor }; case computedStatus.ComputedStatus.Failed: return { message: "Failed", color: common.failureColor }; case computedStatus.ComputedStatus.FailedToStart: return { message: "PipelineRun failed to start", color: common.failureColor }; case computedStatus.ComputedStatus.Running: case computedStatus.ComputedStatus["In Progress"]: return { message: "Running", color: common.runningColor }; case computedStatus.ComputedStatus.Skipped: return { message: "Skipped", color: common.skippedColor }; case computedStatus.ComputedStatus.Cancelled: return { message: "Cancelled", color: common.cancelledColor }; case computedStatus.ComputedStatus.Cancelling: return { message: "Cancelling", color: common.cancelledColor }; case computedStatus.ComputedStatus.Idle: case computedStatus.ComputedStatus.Pending: return { message: "Pending", color: common.pendingColor }; default: return { message: "PipelineRun not started yet", color: common.pendingColor }; } }; const getDate = (run, field) => { if (field === "creationTimestamp") { return run?.metadata?.creationTimestamp ?? ""; } if (field === "startTime" || field === "completionTime") { return run?.status?.[field] ?? ""; } return ""; }; const getLatestRun = (runs, field) => { let latestRun = runs[0]; for (let i = 1; i < runs.length; i++) { latestRun = new Date(getDate(runs?.[i], field)) > new Date(getDate(latestRun, field)) ? runs[i] : latestRun; } return latestRun; }; const getLatestPipelineRun = (runs, field) => { if (runs?.length > 0 && field) { let latestRun; if (field === "completionTime" || field === "startTime" || field === "creationTimestamp") { latestRun = getLatestRun(runs, field); } else { latestRun = runs[runs.length - 1]; } return latestRun; } return null; }; const getSucceededStatus = (status) => { if (status === "True") { return computedStatus.ComputedStatus.Succeeded; } else if (status === "False") { return computedStatus.ComputedStatus.Failed; } return computedStatus.ComputedStatus.Running; }; const pipelineRunStatus = (pipelineRun) => { const conditions = pipelineRun?.status?.conditions || []; if (conditions.length === 0) return null; const succeedCondition = conditions.find((c) => c.type === "Succeeded"); const cancelledCondition = conditions.find( (c) => c.reason === "Cancelled" ); const failedCondition = conditions.find((c) => c.reason === "Failed"); if ([ computedStatus.SucceedConditionReason.PipelineRunStopped, computedStatus.SucceedConditionReason.PipelineRunCancelled ].includes( pipelineRun?.spec?.status ) && !cancelledCondition && !failedCondition) { return computedStatus.ComputedStatus.Cancelling; } if (!succeedCondition?.status) { return null; } const status = getSucceededStatus(succeedCondition.status); if (succeedCondition.reason && succeedCondition.reason !== status) { switch (succeedCondition.reason) { case computedStatus.SucceedConditionReason.PipelineRunCancelled: case computedStatus.SucceedConditionReason.TaskRunCancelled: case computedStatus.SucceedConditionReason.Cancelled: case computedStatus.SucceedConditionReason.PipelineRunStopped: return computedStatus.ComputedStatus.Cancelled; case computedStatus.SucceedConditionReason.PipelineRunStopping: case computedStatus.SucceedConditionReason.TaskRunStopping: return computedStatus.ComputedStatus.Failed; case computedStatus.SucceedConditionReason.CreateContainerConfigError: case computedStatus.SucceedConditionReason.ExceededNodeResources: case computedStatus.SucceedConditionReason.ExceededResourceQuota: case computedStatus.SucceedConditionReason.PipelineRunPending: return computedStatus.ComputedStatus.Pending; case computedStatus.SucceedConditionReason.ConditionCheckFailed: return computedStatus.ComputedStatus.Skipped; default: return status; } } return status; }; const pipelineRunFilterReducer = (pipelineRun) => { const status = pipelineRunStatus(pipelineRun); return status || computedStatus.ComputedStatus.Other; }; const updateTaskStatus = (pipelinerun, taskRuns) => { const skippedTaskLength = pipelinerun?.status?.skippedTasks?.length || 0; const PLRTaskRuns = taskRun.getTaskRunsForPipelineRun(pipelinerun, taskRuns); const taskStatus = { PipelineNotStarted: 0, Pending: 0, Running: 0, Succeeded: 0, Failed: 0, Cancelled: 0, Skipped: skippedTaskLength }; if (!PLRTaskRuns || PLRTaskRuns.length === 0) { return taskStatus; } PLRTaskRuns.forEach((taskRun) => { const status = taskRun && pipelineRunFilterReducer(taskRun); if (status === "Succeeded") { taskStatus[computedStatus.ComputedStatus.Succeeded]++; } else if (status === "Running") { taskStatus[computedStatus.ComputedStatus.Running]++; } else if (status === "Failed") { taskStatus[computedStatus.ComputedStatus.Failed]++; } else if (status === "Cancelled") { taskStatus[computedStatus.ComputedStatus.Cancelled]++; } else { taskStatus[computedStatus.ComputedStatus.Pending]++; } }); return { ...taskStatus }; }; const totalPipelineRunTasks = (pipelinerun) => { if (!pipelinerun?.status?.pipelineSpec) { return 0; } const totalTasks = (pipelinerun.status.pipelineSpec?.tasks || []).length; const finallyTasks = (pipelinerun.status.pipelineSpec?.finally || []).length ?? 0; return totalTasks + finallyTasks; }; const getTaskStatus = (pipelinerun, taskRuns) => { const totalTasks = totalPipelineRunTasks(pipelinerun); const plrTaskLength = taskRuns.length; const skippedTaskLength = pipelinerun?.status?.skippedTasks?.length || 0; const taskStatus = updateTaskStatus(pipelinerun, taskRuns); if (taskRuns?.length > 0) { const pipelineRunHasFailure = taskStatus[computedStatus.ComputedStatus.Failed] > 0; const pipelineRunIsCancelled = pipelineRunFilterReducer(pipelinerun) === computedStatus.ComputedStatus.Cancelled; const unhandledTasks = totalTasks >= plrTaskLength ? totalTasks - plrTaskLength - skippedTaskLength : totalTasks; if (pipelineRunHasFailure || pipelineRunIsCancelled) { taskStatus[computedStatus.ComputedStatus.Cancelled] += unhandledTasks; } else { taskStatus[computedStatus.ComputedStatus.Pending] += unhandledTasks; } } else if (pipelinerun?.status?.conditions?.[0]?.status === "False" || pipelinerun?.spec.status === computedStatus.SucceedConditionReason.PipelineRunCancelled) { taskStatus[computedStatus.ComputedStatus.Cancelled] = totalTasks; } else if (pipelinerun?.spec.status === computedStatus.SucceedConditionReason.PipelineRunPending) { taskStatus[computedStatus.ComputedStatus.Pending] += totalTasks; } else { taskStatus[computedStatus.ComputedStatus.PipelineNotStarted]++; } return taskStatus; }; exports.getLatestPipelineRun = getLatestPipelineRun; exports.getRunStatusColor = getRunStatusColor; exports.getTaskStatus = getTaskStatus; exports.pipelineRunFilterReducer = pipelineRunFilterReducer; exports.pipelineRunStatus = pipelineRunStatus; exports.totalPipelineRunTasks = totalPipelineRunTasks; exports.updateTaskStatus = updateTaskStatus; //# sourceMappingURL=pipeline.cjs.js.map