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:
172
internal/slurm/slurm_jobs.go
Normal file
172
internal/slurm/slurm_jobs.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user