Files
hpc/internal/model/job.go
dailz f4177dd287 feat(service): add GetJob fallback to SlurmDBD history and expand query params
GetJob now falls back to SlurmDBD history when active queue returns 404 or empty jobs. Expand JobHistoryQuery from 7 to 16 filter params (add SubmitTime, Cluster, Qos, Constraints, ExitCode, Node, Reservation, Groups, Wckey).

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-10 13:43:31 +08:00

90 lines
4.2 KiB
Go

package model
// SubmitJobRequest is the API request for submitting a job.
type SubmitJobRequest struct {
Script string `json:"script"`
Partition string `json:"partition,omitempty"`
QOS string `json:"qos,omitempty"`
CPUs int32 `json:"cpus,omitempty"`
Memory string `json:"memory,omitempty"`
TimeLimit string `json:"time_limit,omitempty"`
JobName string `json:"job_name,omitempty"`
Environment map[string]string `json:"environment,omitempty"`
}
// JobResponse is the API response for a job.
type JobResponse struct {
// Identity
JobID int32 `json:"job_id"` // Slurm 作业 ID
Name string `json:"name"` // 作业名称
State []string `json:"job_state"` // 作业当前状态 (e.g. ["RUNNING"], ["PENDING","REQUEUED"])
StateReason string `json:"state_reason,omitempty"` // 作业等待/失败的原因
// Scheduling
Partition string `json:"partition"` // 所属分区
QOS string `json:"qos,omitempty"` // 使用的 QOS 策略
Priority *int32 `json:"priority,omitempty"` // 作业优先级
TimeLimit string `json:"time_limit,omitempty"` // 运行时间限制 (分钟,"UNLIMITED" 表示无限)
// Ownership
Account string `json:"account,omitempty"` // 计费账户
User string `json:"user,omitempty"` // 提交用户
Cluster string `json:"cluster,omitempty"` // 所属集群
// Resources
Cpus *int32 `json:"cpus,omitempty"` // 分配/请求的 CPU 核数
Tasks *int32 `json:"tasks,omitempty"` // 任务数
NodeCount *int32 `json:"node_count,omitempty"` // 节点数
Nodes string `json:"nodes,omitempty"` // 分配的节点列表
BatchHost string `json:"batch_host,omitempty"` // 批处理主节点
// Timing (Unix timestamp)
SubmitTime *int64 `json:"submit_time,omitempty"` // 提交时间
StartTime *int64 `json:"start_time,omitempty"` // 开始运行时间
EndTime *int64 `json:"end_time,omitempty"` // 结束/预计结束时间
// Result
ExitCode *int32 `json:"exit_code,omitempty"` // 退出码 (nil 表示未结束)
// IO Paths
StdOut string `json:"standard_output,omitempty"` // 标准输出文件路径
StdErr string `json:"standard_error,omitempty"` // 标准错误文件路径
StdIn string `json:"standard_input,omitempty"` // 标准输入文件路径
WorkDir string `json:"working_directory,omitempty"` // 工作目录
Command string `json:"command,omitempty"` // 执行的命令
// Array Job
ArrayJobID *int32 `json:"array_job_id,omitempty"` // 数组作业的父 Job ID
ArrayTaskID *int32 `json:"array_task_id,omitempty"` // 数组作业中的子任务 ID
}
// JobListResponse is the paginated response for job listings.
type JobListResponse struct {
Jobs []JobResponse `json:"jobs"`
Total int `json:"total"`
Page int `json:"page"`
PageSize int `json:"page_size"`
}
// JobHistoryQuery contains query parameters for job history.
type JobHistoryQuery struct {
Users string `form:"users" json:"users,omitempty"`
StartTime string `form:"start_time" json:"start_time,omitempty"`
EndTime string `form:"end_time" json:"end_time,omitempty"`
SubmitTime string `form:"submit_time" json:"submit_time,omitempty"`
Account string `form:"account" json:"account,omitempty"`
Partition string `form:"partition" json:"partition,omitempty"`
State string `form:"state" json:"state,omitempty"`
JobName string `form:"job_name" json:"job_name,omitempty"`
Cluster string `form:"cluster" json:"cluster,omitempty"`
Qos string `form:"qos" json:"qos,omitempty"`
Constraints string `form:"constraints" json:"constraints,omitempty"`
ExitCode string `form:"exit_code" json:"exit_code,omitempty"`
Node string `form:"node" json:"node,omitempty"`
Reservation string `form:"reservation" json:"reservation,omitempty"`
Groups string `form:"groups" json:"groups,omitempty"`
Wckey string `form:"wckey" json:"wckey,omitempty"`
Page int `form:"page,default=1" json:"page,omitempty"`
PageSize int `form:"page_size,default=20" json:"page_size,omitempty"`
}