This repository has been archived by the owner on Jun 16, 2023. It is now read-only.
forked from Mirantis/virtlet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
localcmd_interface.go
82 lines (65 loc) · 1.59 KB
/
localcmd_interface.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package framework
import (
"context"
"errors"
"io"
"os/exec"
"syscall"
)
type LocalCmd struct {
ctx context.Context
}
func LocalExecutor(ctx context.Context) *LocalCmd {
return &LocalCmd{ctx: ctx}
}
var _ Executor = &LocalCmd{}
func (l *LocalCmd) Run(stdin io.Reader, stdout, stderr io.Writer, command ...string) error {
cmd := exec.CommandContext(l.ctx, command[0], command[1:]...)
cmd.Stdin = stdin
cmd.Stdout = stdout
cmd.Stderr = stderr
if err := cmd.Run(); err != nil {
if exiterr, ok := err.(*exec.ExitError); ok {
if s, ok := exiterr.Sys().(syscall.WaitStatus); ok {
return CommandError{ExitCode: s.ExitStatus()}
}
}
return err
}
return nil
}
func (l *LocalCmd) Start(stdin io.Reader, stdout, stderr io.Writer, command ...string) (Command, error) {
cmd := exec.CommandContext(l.ctx, command[0], command[1:]...)
cmd.Stdin = stdin
cmd.Stdout = stdout
cmd.Stderr = stderr
if err := cmd.Start(); err != nil {
return nil, err
}
return localCommand{cmd: cmd}, nil
}
func (l *LocalCmd) Close() error {
return nil
}
// Logs is a placeholder for fulfilling Executor interface
func (l *LocalCmd) Logs() (string, error) {
return "", errors.New("not implemented")
}
type localCommand struct {
cmd *exec.Cmd
}
var _ Command = &localCommand{}
func (c localCommand) Wait() error {
if err := c.cmd.Wait(); err != nil {
if exiterr, ok := err.(*exec.ExitError); ok {
if s, ok := exiterr.Sys().(syscall.WaitStatus); ok {
return CommandError{ExitCode: s.ExitStatus()}
}
}
return err
}
return nil
}
func (c localCommand) Kill() error {
return c.cmd.Process.Kill()
}