Files
hpc/internal/model/task.go

174 lines
11 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package model
import (
"encoding/json"
"time"
"gorm.io/gorm"
)
// 任务状态常量
const (
TaskStatusSubmitted = "submitted"
TaskStatusPreparing = "preparing"
TaskStatusDownloading = "downloading"
TaskStatusReady = "ready"
TaskStatusQueued = "queued"
TaskStatusRunning = "running"
TaskStatusCompleted = "completed"
TaskStatusFailed = "failed"
)
// 任务步骤常量,用于步骤级重试追踪
const (
TaskStepPreparing = "preparing"
TaskStepDownloading = "downloading"
TaskStepSubmitting = "submitting"
)
// 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"` // 所属应用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 是创建任务的 API 请求。
type CreateTaskRequest struct {
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 是任务列表/详情 API 响应中的任务项。
type TaskResponse struct {
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 是任务列表分页响应。
type TaskListResponse struct {
Items []TaskResponse `json:"items"` // 任务列表
Total int64 `json:"total"` // 总数
}
// 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"` // 按状态过滤
}