feat: 添加 Job 领域类型和 JobsService

约 93 个结构体覆盖 JobInfo、JobDescMsg、SlurmDBD Job/Step/QOS/Account/User 等类型。JobsService 提供 GetJobs、GetJob、PostJob、DeleteJob、SubmitJob 5 个方法,并定义 JobFlag* 和 JobSignalFlag* 常量。

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-08 18:29:07 +08:00
parent 5873dc5b72
commit 2c84930983
4 changed files with 2384 additions and 0 deletions

View File

@@ -0,0 +1,172 @@
package slurm
import (
"context"
"fmt"
"net/url"
)
// Job query flags for GetJobsOptions.Flags and GetNodeOptions.Flags.
const (
JobFlagAll = "ALL"
JobFlagDetail = "DETAIL"
JobFlagMixed = "MIXED"
JobFlagLocal = "LOCAL"
JobFlagSibling = "SIBLING"
JobFlagFederation = "FEDERATION"
JobFlagFuture = "FUTURE"
)
// GetJobsOptions specifies optional parameters for GetJobs.
type GetJobsOptions struct {
UpdateTime *string `url:"update_time,omitempty"`
Flags *string `url:"flags,omitempty"` // Use JobFlag* constants (e.g. JobFlagDetail)
}
// Job signal flags for DeleteJobOptions.Flags.
const (
JobSignalFlagBatchJob = "BATCH_JOB"
JobSignalFlagArrayTask = "ARRAY_TASK"
JobSignalFlagFullStepsOnly = "FULL_STEPS_ONLY"
JobSignalFlagFullJob = "FULL_JOB"
JobSignalFlagFederationRequeue = "FEDERATION_REQUEUE"
JobSignalFlagHurry = "HURRY"
JobSignalFlagOutOfMemory = "OUT_OF_MEMORY"
JobSignalFlagNoSiblingJobs = "NO_SIBLING_JOBS"
JobSignalFlagReservationJob = "RESERVATION_JOB"
JobSignalFlagWarningSent = "WARNING_SENT"
)
// DeleteJobOptions specifies optional parameters for DeleteJob.
type DeleteJobOptions struct {
Signal *string `url:"signal,omitempty"`
Flags *string `url:"flags,omitempty"` // Use JobSignalFlag* constants (e.g. JobSignalFlagHurry)
}
// GetJobs lists all jobs.
func (s *JobsService) GetJobs(ctx context.Context, opts *GetJobsOptions) (*OpenapiJobInfoResp, *Response, error) {
path := "slurm/v0.0.40/jobs"
req, err := s.client.NewRequest("GET", path, nil)
if err != nil {
return nil, nil, err
}
if opts != nil {
u, parseErr := url.Parse(req.URL.String())
if parseErr != nil {
return nil, nil, parseErr
}
q := u.Query()
if opts.UpdateTime != nil {
q.Set("update_time", *opts.UpdateTime)
}
if opts.Flags != nil {
q.Set("flags", *opts.Flags)
}
u.RawQuery = q.Encode()
req.URL = u
}
var result OpenapiJobInfoResp
resp, err := s.client.Do(ctx, req, &result)
if err != nil {
return nil, resp, err
}
return &result, resp, nil
}
// GetJob gets a single job by ID.
func (s *JobsService) GetJob(ctx context.Context, jobID string, opts *GetJobsOptions) (*OpenapiJobInfoResp, *Response, error) {
path := fmt.Sprintf("slurm/v0.0.40/job/%s", jobID)
req, err := s.client.NewRequest("GET", path, nil)
if err != nil {
return nil, nil, err
}
if opts != nil {
u, parseErr := url.Parse(req.URL.String())
if parseErr != nil {
return nil, nil, parseErr
}
q := u.Query()
if opts.UpdateTime != nil {
q.Set("update_time", *opts.UpdateTime)
}
if opts.Flags != nil {
q.Set("flags", *opts.Flags)
}
u.RawQuery = q.Encode()
req.URL = u
}
var result OpenapiJobInfoResp
resp, err := s.client.Do(ctx, req, &result)
if err != nil {
return nil, resp, err
}
return &result, resp, nil
}
// PostJob updates a job.
func (s *JobsService) PostJob(ctx context.Context, jobID string, desc *JobDescMsg) (*OpenapiJobPostResponse, *Response, error) {
path := fmt.Sprintf("slurm/v0.0.40/job/%s", jobID)
req, err := s.client.NewRequest("POST", path, desc)
if err != nil {
return nil, nil, err
}
var result OpenapiJobPostResponse
resp, err := s.client.Do(ctx, req, &result)
if err != nil {
return nil, resp, err
}
return &result, resp, nil
}
// DeleteJob cancels (signals) a job.
func (s *JobsService) DeleteJob(ctx context.Context, jobID string, opts *DeleteJobOptions) (*OpenapiResp, *Response, error) {
path := fmt.Sprintf("slurm/v0.0.40/job/%s", jobID)
req, err := s.client.NewRequest("DELETE", path, nil)
if err != nil {
return nil, nil, err
}
if opts != nil {
u, parseErr := url.Parse(req.URL.String())
if parseErr != nil {
return nil, nil, parseErr
}
q := u.Query()
if opts.Signal != nil {
q.Set("signal", *opts.Signal)
}
if opts.Flags != nil {
q.Set("flags", *opts.Flags)
}
u.RawQuery = q.Encode()
req.URL = u
}
var result OpenapiResp
resp, err := s.client.Do(ctx, req, &result)
if err != nil {
return nil, resp, err
}
return &result, resp, nil
}
// SubmitJob submits a new job.
func (s *JobsService) SubmitJob(ctx context.Context, reqBody *JobSubmitReq) (*OpenapiJobSubmitResponse, *Response, error) {
path := "slurm/v0.0.40/job/submit"
req, err := s.client.NewRequest("POST", path, reqBody)
if err != nil {
return nil, nil, err
}
var result OpenapiJobSubmitResponse
resp, err := s.client.Do(ctx, req, &result)
if err != nil {
return nil, resp, err
}
return &result, resp, nil
}