UNPKG

@janus-idp/shared-react

Version:

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

185 lines (182 loc) 6.96 kB
import { pendingColor, cancelledColor, skippedColor, runningColor, failureColor, successColor } from '../../consts/common.esm.js'; import { ComputedStatus, SucceedConditionReason } from '../../types/pipeline/computedStatus.esm.js'; import { getTaskRunsForPipelineRun } from './task-run.esm.js'; const getRunStatusColor = (status) => { switch (status) { case ComputedStatus.Succeeded: return { message: "Succeeded", color: successColor }; case ComputedStatus.Failed: return { message: "Failed", color: failureColor }; case ComputedStatus.FailedToStart: return { message: "PipelineRun failed to start", color: failureColor }; case ComputedStatus.Running: case ComputedStatus["In Progress"]: return { message: "Running", color: runningColor }; case ComputedStatus.Skipped: return { message: "Skipped", color: skippedColor }; case ComputedStatus.Cancelled: return { message: "Cancelled", color: cancelledColor }; case ComputedStatus.Cancelling: return { message: "Cancelling", color: cancelledColor }; case ComputedStatus.Idle: case ComputedStatus.Pending: return { message: "Pending", color: pendingColor }; default: return { message: "PipelineRun not started yet", color: 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.Succeeded; } else if (status === "False") { return ComputedStatus.Failed; } return 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 ([ SucceedConditionReason.PipelineRunStopped, SucceedConditionReason.PipelineRunCancelled ].includes( pipelineRun?.spec?.status ) && !cancelledCondition && !failedCondition) { return ComputedStatus.Cancelling; } if (!succeedCondition?.status) { return null; } const status = getSucceededStatus(succeedCondition.status); if (succeedCondition.reason && succeedCondition.reason !== status) { switch (succeedCondition.reason) { case SucceedConditionReason.PipelineRunCancelled: case SucceedConditionReason.TaskRunCancelled: case SucceedConditionReason.Cancelled: case SucceedConditionReason.PipelineRunStopped: return ComputedStatus.Cancelled; case SucceedConditionReason.PipelineRunStopping: case SucceedConditionReason.TaskRunStopping: return ComputedStatus.Failed; case SucceedConditionReason.CreateContainerConfigError: case SucceedConditionReason.ExceededNodeResources: case SucceedConditionReason.ExceededResourceQuota: case SucceedConditionReason.PipelineRunPending: return ComputedStatus.Pending; case SucceedConditionReason.ConditionCheckFailed: return ComputedStatus.Skipped; default: return status; } } return status; }; const pipelineRunFilterReducer = (pipelineRun) => { const status = pipelineRunStatus(pipelineRun); return status || ComputedStatus.Other; }; const updateTaskStatus = (pipelinerun, taskRuns) => { const skippedTaskLength = pipelinerun?.status?.skippedTasks?.length || 0; const PLRTaskRuns = 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.Succeeded]++; } else if (status === "Running") { taskStatus[ComputedStatus.Running]++; } else if (status === "Failed") { taskStatus[ComputedStatus.Failed]++; } else if (status === "Cancelled") { taskStatus[ComputedStatus.Cancelled]++; } else { taskStatus[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.Failed] > 0; const pipelineRunIsCancelled = pipelineRunFilterReducer(pipelinerun) === ComputedStatus.Cancelled; const unhandledTasks = totalTasks >= plrTaskLength ? totalTasks - plrTaskLength - skippedTaskLength : totalTasks; if (pipelineRunHasFailure || pipelineRunIsCancelled) { taskStatus[ComputedStatus.Cancelled] += unhandledTasks; } else { taskStatus[ComputedStatus.Pending] += unhandledTasks; } } else if (pipelinerun?.status?.conditions?.[0]?.status === "False" || pipelinerun?.spec.status === SucceedConditionReason.PipelineRunCancelled) { taskStatus[ComputedStatus.Cancelled] = totalTasks; } else if (pipelinerun?.spec.status === SucceedConditionReason.PipelineRunPending) { taskStatus[ComputedStatus.Pending] += totalTasks; } else { taskStatus[ComputedStatus.PipelineNotStarted]++; } return taskStatus; }; export { getLatestPipelineRun, getRunStatusColor, getTaskStatus, pipelineRunFilterReducer, pipelineRunStatus, totalPipelineRunTasks, updateTaskStatus }; //# sourceMappingURL=pipeline.esm.js.map