UNPKG

@kinvolk/headlamp-plugin

Version:

The needed infrastructure for building Headlamp plugins.

378 lines (344 loc) 11.8 kB
import { KubeObject, KubeObjectInterface } from '@kinvolk/headlamp-plugin/lib/k8s/cluster'; /** * Task definition inside a Volcano Job spec. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L239 */ export interface TaskSpec { /** Task name. */ name: string; /** Number of pods requested for this task. */ replicas: number; /** Minimum available pods required for this task. */ minAvailable?: number; /** Maximum retries before marking this task failed. */ maxRetry?: number; /** Task dependency configuration for scheduling order. */ dependsOn?: { /** Names of tasks this task depends on. */ name: string[]; /** Dependency strategy when multiple tasks are listed. */ iteration?: 'any' | 'all'; }; /** Pod template used to create task replicas. */ template: PodTemplateSpec; /** Lifecycle policies scoped to this task. */ policies?: LifecyclePolicy[]; /** Topology policy for NUMA-aware scheduling. */ topologyPolicy?: string; } /** * Pod template metadata used by a Volcano task. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L239 * @see https://github.com/kubernetes/api/blob/2b6c3c950fc28eddbbb7b9f98633b3be3dba97b0/core/v1/types.go#L5548 */ export interface PodTemplateMetadata { /** Labels applied to task pods. */ labels?: Record<string, string>; /** Annotations applied to task pods. */ annotations?: Record<string, string>; /** Template creation timestamp when present in the resource payload. */ creationTimestamp?: string; } /** * Environment variable specification for a container. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L239 * @see https://github.com/kubernetes/api/blob/2b6c3c950fc28eddbbb7b9f98633b3be3dba97b0/core/v1/types.go#L2473 */ export interface EnvVarSpec { /** Environment variable name. */ name: string; /** Literal value for the variable. */ value?: string; /** Value source reference when value is not literal. */ valueFrom?: Record<string, unknown>; } /** * Exposed container port definition. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L239 * @see https://github.com/kubernetes/api/blob/2b6c3c950fc28eddbbb7b9f98633b3be3dba97b0/core/v1/types.go#L2352 */ export interface ContainerPortSpec { /** Container port number. */ containerPort?: number; /** Optional port name. */ name?: string; /** Port protocol (TCP/UDP/SCTP). */ protocol?: string; } /** * Kubernetes resource requirements for a container. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L239 * @see https://github.com/kubernetes/api/blob/2b6c3c950fc28eddbbb7b9f98633b3be3dba97b0/core/v1/types.go#L2841 */ export interface ContainerResourceRequirements { /** Resource limits map. */ limits?: Record<string, string>; /** Resource requests map. */ requests?: Record<string, string>; } /** * Container specification used in a task pod template. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L239 * @see https://github.com/kubernetes/api/blob/2b6c3c950fc28eddbbb7b9f98633b3be3dba97b0/core/v1/types.go#L2909 */ export interface ContainerSpec { /** Container name. */ name: string; /** Container image reference. */ image: string; /** Optional image pull policy. */ imagePullPolicy?: string; /** Optional command override. */ command?: string[]; /** Optional arguments passed to the container entrypoint. */ args?: string[]; /** Optional working directory in the container. */ workingDir?: string; /** Optional container environment variables. */ env?: EnvVarSpec[]; /** Optional declared container ports. */ ports?: ContainerPortSpec[]; /** Optional resource requests and limits. */ resources?: ContainerResourceRequirements; } /** * Pod template spec used by a Volcano task. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L239 * @see https://github.com/kubernetes/api/blob/2b6c3c950fc28eddbbb7b9f98633b3be3dba97b0/core/v1/types.go#L5548 */ export interface PodTemplateSpec { /** Optional pod template metadata. */ metadata?: PodTemplateMetadata; /** Pod spec for the task template. */ spec?: { /** Container templates for task pods. */ containers?: ContainerSpec[]; /** Secrets used for pulling images. */ imagePullSecrets?: Array<{ name?: string }>; /** Pod restart policy for this task template. */ restartPolicy?: string; /** Scheduler name for task pods. */ schedulerName?: string; }; } /** * Lifecycle action policy for Volcano Jobs and Tasks. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L199 */ export interface LifecyclePolicy { /** Action taken when the policy is triggered. */ action?: string; /** Single scheduler/controller event trigger. */ event?: string; /** Multiple scheduler/controller event triggers. */ events?: string[]; /** Exit code trigger for policy activation. */ exitCode?: number; /** Delay before applying the policy action. */ timeout?: string; } /** * Volume settings for Volcano Job task templates. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L161 */ export interface VolumeSpec { /** Container mount path for the volume. */ mountPath: string; /** Name of an existing PersistentVolumeClaim to mount. */ volumeClaimName?: string; /** Inline PVC template spec. */ volumeClaim?: Record<string, unknown>; } /** * Desired configuration for a Volcano Job. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L54 */ export interface VolcanoJobSpec { /** Default scheduler assigned to task pod templates. */ schedulerName?: string; /** Minimum available pods required to run the job. */ minAvailable?: number; /** Minimum successful pods required for job success. */ minSuccess?: number; /** Volcano queue name. */ queue?: string; /** Maximum retries before marking the job failed. */ maxRetry?: number; /** Time-to-live in seconds after job completion. */ ttlSecondsAfterFinished?: number; /** Priority class for job pods. */ priorityClassName?: string; /** User-provided running duration estimate. */ runningEstimate?: string; /** Task definitions for this job. */ tasks?: TaskSpec[]; /** Job-level lifecycle policies. */ policies?: LifecyclePolicy[]; /** Volcano scheduler plugins and their arguments. */ plugins?: Record<string, string[]>; /** Volumes mounted by tasks in this job. */ volumes?: VolumeSpec[]; } export type JobPhase = | 'Pending' | 'Aborting' | 'Aborted' | 'Running' | 'Restarting' | 'Completing' | 'Completed' | 'Terminating' | 'Terminated' | 'Failed'; const volcanoJobTypeLabel = 'volcano.sh/job-type'; /** * Current state details for a Volcano Job. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L333 */ export interface JobState { /** Current job lifecycle phase. */ phase: JobPhase; /** Short machine-friendly reason for this state. */ reason?: string; /** Human-readable description for this state. */ message?: string; /** Timestamp for the last state transition. */ lastTransitionTime?: string; } /** * Condition entry describing a Volcano Job transition. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L442-L447 */ export interface JobCondition { /** Volcano job phase. */ status: JobPhase; /** Timestamp for the last condition transition. */ lastTransitionTime?: string; } /** * Observed status reported for a Volcano Job. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L360 */ export interface VolcanoJobStatus { /** Aggregated current state object. */ state?: JobState; /** Current minimum available pod requirement in status. */ minAvailable?: number; /** Number of pending pods. */ pending?: number; /** Number of running pods. */ running?: number; /** Number of succeeded pods. */ succeeded?: number; /** Number of failed pods. */ failed?: number; /** Number of terminating pods. */ terminating?: number; /** Number of pods in unknown phase. */ unknown?: number; /** Number of retries attempted by the job. */ retryCount?: number; /** Internal job status version. */ version?: number; /** Duration from running to completion, when available. */ runningDuration?: string; /** Resources created and controlled by this job. */ controlledResources?: Record<string, string>; /** Per-task pod phase counters. */ taskStatusCount?: Record<string, { phase?: Record<string, number> }>; /** Condition history for job transitions. */ conditions?: JobCondition[]; } /** * Kubernetes object wrapper for Volcano Job CRDs. * @see https://github.com/volcano-sh/apis/blob/ae35b8b12bc5ccb6ff5a62fcd9dca06234197e63/pkg/apis/batch/v1alpha1/job.go#L38 */ export interface KubeVolcanoJob extends KubeObjectInterface { /** Desired job configuration. */ spec: VolcanoJobSpec; /** Observed runtime status. */ status?: VolcanoJobStatus; } export class VolcanoJob extends KubeObject<KubeVolcanoJob> { static kind = 'VolcanoJob'; static apiName = 'jobs'; static apiVersion = 'batch.volcano.sh/v1alpha1'; static isNamespaced = true; static get detailsRoute() { return '/volcano/jobs/:namespace/:name'; } static getBaseObject() { return { apiVersion: 'batch.volcano.sh/v1alpha1', kind: 'Job', metadata: { name: '', namespace: '', }, spec: { schedulerName: 'volcano', minAvailable: 1, queue: 'default', tasks: [ { replicas: 1, name: 'task', template: { spec: { containers: [ { name: 'container', image: '', }, ], restartPolicy: 'Never', }, }, }, ], }, }; } get spec() { return this.jsonData.spec; } get status() { return this.jsonData.status; } get phase(): JobPhase { return this.status?.state?.phase || 'Pending'; } get queue(): string { return this.spec.queue || 'default'; } get minAvailable(): number { return this.status?.minAvailable ?? this.spec.minAvailable ?? 0; } get runningCount(): number { return this.status?.running || 0; } get pendingCount(): number { return this.status?.pending || 0; } get succeededCount(): number { return this.status?.succeeded || 0; } get failedCount(): number { return this.status?.failed || 0; } get unknownCount(): number { return this.status?.unknown || 0; } get retryCount(): number { return this.status?.retryCount || 0; } get replicaCount(): number { return this.spec.tasks?.reduce((total, task) => total + task.replicas, 0) ?? 0; } get jobType(): string { return this.metadata.labels?.[volcanoJobTypeLabel] || 'Batch'; } get taskCount(): number { return this.spec.tasks?.length || 0; } }