feat: 添加数据模型和存储层
- model: JobTemplate、SubmitJobRequest、JobHistoryQuery 等模型定义 - store: NewGormDB MySQL 连接池,使用 zap 日志替代 GORM 默认日志 - store: TemplateStore CRUD 操作,支持 GORM AutoMigrate - NewGormDB 接受 gormLevel 参数,由上层传入配置值 - 完整 TDD 测试覆盖 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
23
internal/model/cluster.go
Normal file
23
internal/model/cluster.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package model
|
||||
|
||||
// NodeResponse is the simplified API response for a node.
|
||||
type NodeResponse struct {
|
||||
Name string `json:"name"`
|
||||
State []string `json:"state"`
|
||||
CPUs int32 `json:"cpus"`
|
||||
RealMemory int64 `json:"real_memory"`
|
||||
AllocMem int64 `json:"alloc_memory,omitempty"`
|
||||
Arch string `json:"architecture,omitempty"`
|
||||
OS string `json:"operating_system,omitempty"`
|
||||
}
|
||||
|
||||
// PartitionResponse is the simplified API response for a partition.
|
||||
type PartitionResponse struct {
|
||||
Name string `json:"name"`
|
||||
State []string `json:"state"`
|
||||
Nodes string `json:"nodes,omitempty"`
|
||||
TotalCPUs int32 `json:"total_cpus,omitempty"`
|
||||
TotalNodes int32 `json:"total_nodes,omitempty"`
|
||||
MaxTime string `json:"max_time,omitempty"`
|
||||
Default bool `json:"default,omitempty"`
|
||||
}
|
||||
47
internal/model/job.go
Normal file
47
internal/model/job.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package model
|
||||
|
||||
// SubmitJobRequest is the API request for submitting a job.
|
||||
type SubmitJobRequest struct {
|
||||
Script string `json:"script" binding:"required"`
|
||||
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 simplified API response for a job.
|
||||
type JobResponse struct {
|
||||
JobID int32 `json:"job_id"`
|
||||
Name string `json:"name"`
|
||||
State []string `json:"job_state"`
|
||||
Partition string `json:"partition"`
|
||||
SubmitTime *int64 `json:"submit_time,omitempty"`
|
||||
StartTime *int64 `json:"start_time,omitempty"`
|
||||
EndTime *int64 `json:"end_time,omitempty"`
|
||||
ExitCode *int32 `json:"exit_code,omitempty"`
|
||||
Nodes string `json:"nodes,omitempty"`
|
||||
}
|
||||
|
||||
// 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"`
|
||||
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"`
|
||||
Page int `form:"page,default=1" json:"page,omitempty"`
|
||||
PageSize int `form:"page_size,default=20" json:"page_size,omitempty"`
|
||||
}
|
||||
45
internal/model/template.go
Normal file
45
internal/model/template.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package model
|
||||
|
||||
import "time"
|
||||
|
||||
// JobTemplate represents a saved job template.
|
||||
type JobTemplate struct {
|
||||
ID int64 `json:"id" gorm:"primaryKey;autoIncrement"`
|
||||
Name string `json:"name" gorm:"uniqueIndex;size:255;not null"`
|
||||
Description string `json:"description,omitempty" gorm:"type:text"`
|
||||
Script string `json:"script" gorm:"type:text;not null"`
|
||||
Partition string `json:"partition,omitempty" gorm:"size:255"`
|
||||
QOS string `json:"qos,omitempty" gorm:"column:qos;size:255"`
|
||||
CPUs int `json:"cpus,omitempty" gorm:"column:cpus"`
|
||||
Memory string `json:"memory,omitempty" gorm:"size:50"`
|
||||
TimeLimit string `json:"time_limit,omitempty" gorm:"column:time_limit;size:50"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// TableName specifies the database table name for GORM.
|
||||
func (JobTemplate) TableName() string { return "job_templates" }
|
||||
|
||||
// CreateTemplateRequest is the API request for creating a template.
|
||||
type CreateTemplateRequest struct {
|
||||
Name string `json:"name" binding:"required"`
|
||||
Description string `json:"description,omitempty"`
|
||||
Script string `json:"script" binding:"required"`
|
||||
Partition string `json:"partition,omitempty"`
|
||||
QOS string `json:"qos,omitempty"`
|
||||
CPUs int `json:"cpus,omitempty"`
|
||||
Memory string `json:"memory,omitempty"`
|
||||
TimeLimit string `json:"time_limit,omitempty"`
|
||||
}
|
||||
|
||||
// UpdateTemplateRequest is the API request for updating a template.
|
||||
type UpdateTemplateRequest struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
Script string `json:"script,omitempty"`
|
||||
Partition string `json:"partition,omitempty"`
|
||||
QOS string `json:"qos,omitempty"`
|
||||
CPUs int `json:"cpus,omitempty"`
|
||||
Memory string `json:"memory,omitempty"`
|
||||
TimeLimit string `json:"time_limit,omitempty"`
|
||||
}
|
||||
Reference in New Issue
Block a user