src/k8s/groups/Tekton/TaskRun/index.ts (102 lines of code) (raw):
import { ApiProxy, K8s } from '@kinvolk/headlamp-plugin/lib';
import { STATUS_COLOR } from '../../../../constants/colors';
import { ICONS } from '../../../../icons/iconify-icons-mapping';
import { ValueOf } from '../../../../types/global';
import { streamResults } from '../../../common/streamResults';
import { TaskRunKubeObjectConfig } from './config';
import {
TASK_RUN_REASON,
TASK_RUN_STATUS,
TASK_RUN_STEP_REASON,
TASK_RUN_STEP_STATUS,
} from './constants';
import { TASK_RUN_LABEL_SELECTOR_PARENT_PIPELINE_RUN } from './labels';
import { StreamTaskRunListByPipelineNameProps, TaskRunKubeObjectInterface } from './types';
const {
name: { singularForm, pluralForm },
group,
version,
} = TaskRunKubeObjectConfig;
export class TaskRunKubeObject extends K8s.cluster.makeKubeObject<TaskRunKubeObjectInterface>(
singularForm
) {
static apiEndpoint = ApiProxy.apiFactoryWithNamespace(group, version, pluralForm);
static get className(): string {
return singularForm;
}
get spec(): any {
return this.jsonData!.spec;
}
get status(): any {
return this.jsonData!.status;
}
static parseStatus(taskRun: TaskRunKubeObjectInterface): ValueOf<typeof TASK_RUN_STATUS> {
return taskRun?.status?.conditions?.[0]?.status || 'Unknown';
}
static parseStatusReason(taskRun: TaskRunKubeObjectInterface): ValueOf<typeof TASK_RUN_REASON> {
return taskRun?.status?.conditions?.[0]?.reason || 'Unknown';
}
static getStatusIcon(
status: ValueOf<typeof TASK_RUN_STATUS>,
reason: ValueOf<typeof TASK_RUN_REASON>
): [string, string, boolean?] {
if (status === undefined || reason === undefined) {
return [ICONS.UNKNOWN, STATUS_COLOR.UNKNOWN];
}
const _status = status.toLowerCase();
const _reason = reason.toLowerCase();
switch (_status) {
case TASK_RUN_STATUS.UNKNOWN:
if (_reason === TASK_RUN_REASON.STARTED) {
return [ICONS.LOADER_CIRCLE, STATUS_COLOR.IN_PROGRESS, true];
}
if (_reason === TASK_RUN_REASON.RUNNING || _reason === TASK_RUN_REASON.PENDING) {
return [ICONS.LOADER_CIRCLE, STATUS_COLOR.IN_PROGRESS, true];
}
if (_reason === TASK_RUN_REASON.TASK_RUN_CANCELLED) {
return [ICONS.CROSS_CIRCLE, STATUS_COLOR.SUSPENDED];
}
return [ICONS.UNKNOWN, STATUS_COLOR.UNKNOWN];
case TASK_RUN_STATUS.TRUE:
return [ICONS.CHECK_CIRCLE_FILLED, STATUS_COLOR.SUCCESS];
case TASK_RUN_STATUS.FALSE:
return [ICONS.CROSS_CIRCLE, STATUS_COLOR.ERROR];
default:
return [ICONS.UNKNOWN, STATUS_COLOR.UNKNOWN];
}
}
static getStepStatusIcon(
status: ValueOf<typeof TASK_RUN_STEP_STATUS>,
reason: ValueOf<typeof TASK_RUN_STEP_REASON>
): [string, string, boolean?] {
if (status === undefined) {
return [ICONS.UNKNOWN, STATUS_COLOR.UNKNOWN];
}
const _status = status.toLowerCase();
const _reason = reason && reason.toLowerCase();
switch (_status) {
case TASK_RUN_STEP_STATUS.RUNNING:
return [ICONS.LOADER_CIRCLE, STATUS_COLOR.IN_PROGRESS, true];
case TASK_RUN_STEP_STATUS.WAITING:
return [ICONS.QUEUE, STATUS_COLOR.UNKNOWN];
case TASK_RUN_STEP_STATUS.TERMINATED:
if (_reason === TASK_RUN_STEP_REASON.COMPLETED) {
return [ICONS.CHECK_CIRCLE, STATUS_COLOR.SUCCESS];
}
return [ICONS.CROSS_CIRCLE, STATUS_COLOR.ERROR];
default:
return [ICONS.UNKNOWN, STATUS_COLOR.UNKNOWN];
}
}
static streamListByPipelineRunName = ({
namespace,
parentPipelineRunName,
dataHandler,
errorHandler,
}: StreamTaskRunListByPipelineNameProps) => {
const url = `/apis/${group}/${version}/namespaces/${namespace}/${pluralForm}`;
return streamResults(url, dataHandler, errorHandler, {
labelSelector: `${TASK_RUN_LABEL_SELECTOR_PARENT_PIPELINE_RUN}=${parentPipelineRunName}`,
});
};
}