1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
15 type Slurm interface {
16 Cancel(name string) error
17 Renice(name string, nice int) error
18 QueueCommand(args []string) *exec.Cmd
19 Batch(script io.Reader, args []string) error
22 type slurmCLI struct{}
24 func (scli *slurmCLI) Batch(script io.Reader, args []string) error {
25 return scli.run(script, "sbatch", args)
28 func (scli *slurmCLI) Cancel(name string) error {
29 return scli.run(nil, "scancel", []string{"--name=" + name})
32 func (scli *slurmCLI) QueueCommand(args []string) *exec.Cmd {
33 return exec.Command("squeue", args...)
36 func (scli *slurmCLI) Renice(name string, nice int) error {
37 return scli.run(nil, "scontrol", []string{"update", "JobName=" + name, fmt.Sprintf("Nice=%d", nice)})
40 func (scli *slurmCLI) run(stdin io.Reader, prog string, args []string) error {
41 cmd := exec.Command(prog, args...)
43 out, err := cmd.CombinedOutput()
44 outTrim := strings.TrimSpace(string(out))
45 if err != nil || len(out) > 0 {
46 log.Printf("%q %q: %q", cmd.Path, cmd.Args, outTrim)
49 err = fmt.Errorf("%s: %s (%q)", cmd.Path, err, outTrim)