feat(model): add task defaults, job queries, and refine file/task DTOs

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
dailz
2026-04-20 10:37:58 +08:00
parent 0c7a282386
commit db06e99967
5 changed files with 299 additions and 199 deletions

View File

@@ -7,7 +7,7 @@ import (
"gorm.io/gorm"
)
// Task status constants.
// 任务状态常量
const (
TaskStatusSubmitted = "submitted"
TaskStatusPreparing = "preparing"
@@ -19,75 +19,155 @@ const (
TaskStatusFailed = "failed"
)
// Task step constants for step-level retry tracking.
// 任务步骤常量,用于步骤级重试追踪
const (
TaskStepPreparing = "preparing"
TaskStepDownloading = "downloading"
TaskStepSubmitting = "submitting"
)
// Task represents an HPC task submitted through the application framework.
// Task 表示通过应用框架提交的 HPC 任务记录。
type Task struct {
ID int64 `gorm:"primaryKey;autoIncrement" json:"id"`
TaskName string `gorm:"size:255" json:"task_name"`
AppID int64 `json:"app_id"`
AppName string `gorm:"size:255" json:"app_name"`
Status string `json:"status"`
CurrentStep string `json:"current_step"`
RetryCount int `json:"retry_count"`
Values json.RawMessage `gorm:"type:text" json:"values,omitempty"`
InputFileIDs json.RawMessage `json:"input_file_ids" gorm:"column:input_file_ids;type:text"`
Script string `json:"script,omitempty"`
SlurmJobID *int32 `json:"slurm_job_id,omitempty"`
WorkDir string `json:"work_dir,omitempty"`
Partition string `json:"partition,omitempty"`
ErrorMessage string `json:"error_message,omitempty"`
UserID string `json:"user_id"`
SubmittedAt time.Time `json:"submitted_at"`
StartedAt *time.Time `json:"started_at,omitempty"`
FinishedAt *time.Time `json:"finished_at,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"deleted_at,omitempty"`
ID int64 `gorm:"primaryKey;autoIncrement" json:"id"` // 主键
TaskName string `gorm:"size:255" json:"task_name"` // 任务名称
AppID int64 `json:"app_id"` // 所属应用ID
AppName string `gorm:"size:255" json:"app_name"` // 应用名称
Status string `json:"status"` // 任务状态
CurrentStep string `json:"current_step"` // 当前执行步骤
RetryCount int `json:"retry_count"` // 重试次数
Values json.RawMessage `gorm:"type:text" json:"values,omitempty"` // 业务参数JSON
InputFileIDs json.RawMessage `json:"input_file_ids" gorm:"column:input_file_ids;type:text"` // 输入文件ID列表JSON
Script string `json:"script,omitempty"` // 渲染后的脚本内容
SlurmJobID *int32 `json:"slurm_job_id,omitempty"` // Slurm作业ID
WorkDir string `json:"work_dir,omitempty"` // 工作目录
Partition string `json:"partition,omitempty"` // 提交到的分区(空字符串表示未设置)
ErrorMessage string `json:"error_message,omitempty"` // 错误信息
UserID string `json:"user_id"` // 提交用户ID
SubmittedAt time.Time `json:"submitted_at"` // 提交时间
StartedAt *time.Time `json:"started_at,omitempty"` // 开始运行时间
FinishedAt *time.Time `json:"finished_at,omitempty"` // 完成时间
CreatedAt time.Time `json:"created_at"` // 创建时间
UpdatedAt time.Time `json:"updated_at"` // 更新时间
DeletedAt gorm.DeletedAt `gorm:"index" json:"deleted_at,omitempty"` // 软删除时间
Cpus *int32 // 请求的CPU核数
MemoryPerNode *int64 // 每节点内存(MB)
MemoryPerCpu *int64 // 每CPU内存(MB)
TimeLimit *int32 // 运行时间限制(分钟)
QOS *string // 服务质量策略
JobName *string // 作业名称
Nodes *string // 请求的节点数(支持范围如"2-4"
Tasks *int32 // 任务数
CpusPerTask *int32 // 每任务CPU核数
Constraints *string // 节点特性约束
Reservation *string // 预约名称
Account *string // 计费账户
Nice *int32 // nice调整值
MailType *string // 邮件通知类型(逗号分隔)
MailUser *string // 邮件地址
StandardOutput *string // 标准输出路径
StandardError *string // 标准错误路径
StandardInput *string // 标准输入路径
RequiredNodes *string // 指定运行的节点(逗号分隔)
ExcludedNodes *string // 排除的节点(逗号分隔)
BeginTime *int64 // 最早开始时间(Unix时间戳)
Deadline *int64 // 截止时间(Unix时间戳)
Array *string // 数组作业规格
Dependency *string // 作业依赖关系
Requeue *bool // 失败后是否重新排队
KillOnNodeFail *bool // 节点故障时是否终止作业
}
func (Task) TableName() string {
return "hpc_tasks"
}
// CreateTaskRequest is the DTO for creating a new task.
// CreateTaskRequest 是创建任务的 API 请求。
type CreateTaskRequest struct {
AppID int64 `json:"app_id" binding:"required"`
TaskName string `json:"task_name"`
Values map[string]string `json:"values"`
InputFileIDs []int64 `json:"file_ids"`
AppID int64 `json:"app_id" binding:"required"` // 所属应用ID必填
TaskName string `json:"task_name"` // 任务名称
Values map[string]string `json:"values"` // 脚本业务参数键值对
InputFileIDs []int64 `json:"file_ids"` // 输入文件ID列表
Partition *string `json:"partition,omitempty"` // 提交到的分区
Cpus *int32 `json:"cpus,omitempty"` // 请求的CPU核数
MemoryPerNode *int64 `json:"memory_per_node,omitempty"` // 每节点内存(MB)
MemoryPerCpu *int64 `json:"memory_per_cpu,omitempty"` // 每CPU内存(MB)
TimeLimit *int32 `json:"time_limit,omitempty"` // 运行时间限制(分钟)
QOS *string `json:"qos,omitempty"` // 服务质量策略
JobName *string `json:"job_name,omitempty"` // 作业名称
Nodes *string `json:"nodes,omitempty"` // 请求的节点数(支持范围如"2-4"
Tasks *int32 `json:"tasks,omitempty"` // 任务数
CpusPerTask *int32 `json:"cpus_per_task,omitempty"` // 每任务CPU核数
Constraints *string `json:"constraints,omitempty"` // 节点特性约束
Reservation *string `json:"reservation,omitempty"` // 预约名称
Account *string `json:"account,omitempty"` // 计费账户
Nice *int32 `json:"nice,omitempty"` // nice调整值
MailType *string `json:"mail_type,omitempty"` // 邮件通知类型(逗号分隔)
MailUser *string `json:"mail_user,omitempty"` // 邮件地址
StandardOutput *string `json:"standard_output,omitempty"` // 标准输出路径
StandardError *string `json:"standard_error,omitempty"` // 标准错误路径
StandardInput *string `json:"standard_input,omitempty"` // 标准输入路径
RequiredNodes *string `json:"required_nodes,omitempty"` // 指定运行的节点(逗号分隔)
ExcludedNodes *string `json:"excluded_nodes,omitempty"` // 排除的节点(逗号分隔)
BeginTime *int64 `json:"begin_time,omitempty"` // 最早开始时间(Unix时间戳)
Deadline *int64 `json:"deadline,omitempty"` // 截止时间(Unix时间戳)
Array *string `json:"array,omitempty"` // 数组作业规格
Dependency *string `json:"dependency,omitempty"` // 作业依赖关系
Requeue *bool `json:"requeue,omitempty"` // 失败后是否重新排队
KillOnNodeFail *bool `json:"kill_on_node_fail,omitempty"` // 节点故障时是否终止作业
}
// TaskResponse is the DTO returned in API responses.
// TaskResponse 是任务列表/详情 API 响应中的任务项。
type TaskResponse struct {
ID int64 `json:"id"`
TaskName string `json:"task_name"`
AppID int64 `json:"app_id"`
AppName string `json:"app_name"`
Status string `json:"status"`
CurrentStep string `json:"current_step"`
RetryCount int `json:"retry_count"`
SlurmJobID *int32 `json:"slurm_job_id"`
WorkDir string `json:"work_dir"`
ErrorMessage string `json:"error_message"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
ID int64 `json:"id"` // 主键
TaskName string `json:"task_name"` // 任务名称
AppID int64 `json:"app_id"` // 所属应用ID
AppName string `json:"app_name"` // 应用名称
Status string `json:"status"` // 任务状态
CurrentStep string `json:"current_step"` // 当前执行步骤
RetryCount int `json:"retry_count"` // 重试次数
SlurmJobID *int32 `json:"slurm_job_id"` // Slurm作业ID
WorkDir string `json:"work_dir"` // 工作目录
ErrorMessage string `json:"error_message"` // 错误信息
CreatedAt time.Time `json:"created_at"` // 创建时间
UpdatedAt time.Time `json:"updated_at"` // 更新时间
Partition string `json:"partition,omitempty"` // 提交到的分区
Cpus *int32 `json:"cpus,omitempty"` // 请求的CPU核数
MemoryPerNode *int64 `json:"memory_per_node,omitempty"` // 每节点内存(MB)
MemoryPerCpu *int64 `json:"memory_per_cpu,omitempty"` // 每CPU内存(MB)
TimeLimit *int32 `json:"time_limit,omitempty"` // 运行时间限制(分钟)
QOS *string `json:"qos,omitempty"` // 服务质量策略
JobName *string `json:"job_name,omitempty"` // 作业名称
Nodes *string `json:"nodes,omitempty"` // 请求的节点数(支持范围如"2-4"
Tasks *int32 `json:"tasks,omitempty"` // 任务数
CpusPerTask *int32 `json:"cpus_per_task,omitempty"` // 每任务CPU核数
Constraints *string `json:"constraints,omitempty"` // 节点特性约束
Reservation *string `json:"reservation,omitempty"` // 预约名称
Account *string `json:"account,omitempty"` // 计费账户
Nice *int32 `json:"nice,omitempty"` // nice调整值
MailType *string `json:"mail_type,omitempty"` // 邮件通知类型(逗号分隔)
MailUser *string `json:"mail_user,omitempty"` // 邮件地址
StandardOutput *string `json:"standard_output,omitempty"` // 标准输出路径
StandardError *string `json:"standard_error,omitempty"` // 标准错误路径
StandardInput *string `json:"standard_input,omitempty"` // 标准输入路径
RequiredNodes *string `json:"required_nodes,omitempty"` // 指定运行的节点(逗号分隔)
ExcludedNodes *string `json:"excluded_nodes,omitempty"` // 排除的节点(逗号分隔)
BeginTime *int64 `json:"begin_time,omitempty"` // 最早开始时间(Unix时间戳)
Deadline *int64 `json:"deadline,omitempty"` // 截止时间(Unix时间戳)
Array *string `json:"array,omitempty"` // 数组作业规格
Dependency *string `json:"dependency,omitempty"` // 作业依赖关系
Requeue *bool `json:"requeue,omitempty"` // 失败后是否重新排队
KillOnNodeFail *bool `json:"kill_on_node_fail,omitempty"` // 节点故障时是否终止作业
}
// TaskListResponse is the paginated response for listing tasks.
// TaskListResponse 是任务列表分页响应。
type TaskListResponse struct {
Items []TaskResponse `json:"items"`
Total int64 `json:"total"`
Items []TaskResponse `json:"items"` // 任务列表
Total int64 `json:"total"` // 总数
}
// TaskListQuery contains query parameters for listing tasks.
// TaskListQuery 是任务列表查询参数。
type TaskListQuery struct {
Page int `form:"page" json:"page,omitempty"`
PageSize int `form:"page_size" json:"page_size,omitempty"`
Status string `form:"status" json:"status,omitempty"`
Page int `form:"page" json:"page,omitempty"` // 页码
PageSize int `form:"page_size" json:"page_size,omitempty"` // 每页条数
Status string `form:"status" json:"status,omitempty"` // 按状态过滤
}