pcm-hpc/slurm/job_impl.go

121 lines
3.2 KiB
Go

package slurm
import (
"encoding/json"
"fmt"
"github.com/go-resty/resty/v2"
"github.com/pkg/errors"
"io"
"log"
"net/http"
"sync"
)
type job struct {
sync.RWMutex
client *client
options *JobOptions
log log.Logger
}
func newJob(client *client, options *JobOptions) (*job, error) {
job := &job{
RWMutex: sync.RWMutex{},
client: client,
options: options,
log: log.Logger{},
}
return job, nil
}
func (j *job) ListJob() (getJobResp GetJobResp, err error) {
httpClient := resty.New().R()
result, _ := httpClient.SetHeader("Content-Type", "application/json").
SetHeader("X-SLURM-USER-NAME", j.client.restUsername).
SetHeader("X-SLURM-USER-TOKEN", j.client.token).
Get(j.client.url + "/slurm/" + j.client.clientVersion + "/jobs")
json.Unmarshal(result.Body(), &getJobResp)
if len(getJobResp.Errors) > 0 {
return getJobResp, errors.New(getJobResp.Errors[0].Error)
}
return getJobResp, nil
}
func (j *job) GetJob(getJobReq GetJobReq) (getJobResp GetJobResp, err error) {
httpClient := resty.New().R()
result, _ := httpClient.SetHeader("Content-Type", "application/json").
SetHeader("X-SLURM-USER-NAME", j.client.restUsername).
SetHeader("X-SLURM-USER-TOKEN", j.client.token).
Get(j.client.url + "/slurm/" + j.client.clientVersion + "/job/" + getJobReq.JobId)
json.Unmarshal(result.Body(), &getJobResp)
if len(getJobResp.Errors) > 0 {
return getJobResp, errors.New(getJobResp.Errors[0].Error)
}
return getJobResp, nil
}
func (j *job) ListDbJob() (getJobResp GetJobResp, err error) {
httpClient := resty.New().R()
result, _ := httpClient.SetHeader("Content-Type", "application/json").
SetHeader("X-SLURM-USER-NAME", j.client.restUsername).
SetHeader("X-SLURM-USER-TOKEN", j.client.token).
Get(j.client.url + "/slurm/" + j.client.clientVersion + "/jobs")
json.Unmarshal(result.Body(), &getJobResp)
if len(getJobResp.Errors) > 0 {
return getJobResp, errors.New(getJobResp.Errors[0].Error)
}
return getJobResp, nil
}
func (j *job) SubmitJob(jobOptions JobOptions) (submitJobResp SubmitJobResp, err error) {
url := j.client.url + "/slurm/" + j.client.clientVersion + "/job/submit"
httpClient := resty.New().R()
httpResp, err := httpClient.
SetHeader("Accept", "application/json").
SetHeader("X-SLURM-USER-NAME", j.client.restUsername).
SetHeader("X-SLURM-USER-TOKEN", j.client.token).
SetBody(&jobOptions).
SetResult(&submitJobResp).
Post(url)
if err != nil {
return SubmitJobResp{}, err
}
if httpResp.IsError() {
return SubmitJobResp{}, errors.Errorf(httpResp.String())
}
if len(submitJobResp.Errors) > 0 {
strErr, _ := submitJobResp.Errors[0].(string)
return submitJobResp, errors.New(strErr)
}
return submitJobResp, nil
}
func (j *job) CancelJob(cancelJobReq CancelJobReq) error {
url := j.client.url + "/slurm/" + j.client.clientVersion + fmt.Sprintf("/job/%s", cancelJobReq.JobId)
method := "DELETE"
client := &http.Client{}
req, _ := http.NewRequest(method, url, nil)
req.Header.Add("Content-Type", "application/json")
req.Header.Add("X-SLURM-USER-NAME", j.client.restUsername)
req.Header.Add("X-SLURM-USER-TOKEN", j.client.token)
res, err := client.Do(req)
if err != nil {
return err
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
}
}(res.Body)
return nil
}