约 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>
173 lines
4.4 KiB
Go
173 lines
4.4 KiB
Go
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
|
|
}
|