-
Notifications
You must be signed in to change notification settings - Fork 956
/
Copy pathexecutor.go
90 lines (77 loc) · 2.51 KB
/
executor.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
83
84
85
86
87
88
89
90
/*
* Copyright 1999-2020 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package os
import (
"context"
"fmt"
"github.com/chaosblade-io/chaosblade-exec-os/exec"
"github.com/chaosblade-io/chaosblade-spec-go/log"
"github.com/chaosblade-io/chaosblade-spec-go/spec"
"github.com/chaosblade-io/chaosblade-spec-go/util"
os_exec "os/exec"
"path"
"syscall"
)
type Executor struct {
}
func NewExecutor() spec.Executor {
return &Executor{}
}
func (*Executor) Name() string {
return "os"
}
func (e *Executor) Exec(uid string, ctx context.Context, model *spec.ExpModel) *spec.Response {
if model.ActionFlags[exec.ChannelFlag.Name] == "ssh" {
sshExecutor := &exec.SSHExecutor{}
return sshExecutor.Exec(uid, ctx, model)
}
var mode string
var argsArray []string
_, isDestroy := spec.IsDestroy(ctx)
if isDestroy {
mode = spec.Destroy
} else {
mode = spec.Create
}
argsArray = append(argsArray, mode, model.Target, model.ActionName, fmt.Sprintf("--uid=%s", uid))
for k, v := range model.ActionFlags {
if v == "" || k == "timeout" {
continue
}
argsArray = append(argsArray, fmt.Sprintf("--%s=%s", k, v))
}
chaosOsBin := path.Join(util.GetProgramPath(), "bin", spec.ChaosOsBin)
command := os_exec.CommandContext(ctx, chaosOsBin, argsArray...)
log.Debugf(ctx, "run command, %s %v", chaosOsBin, argsArray)
if model.ActionProcessHang && !isDestroy {
if err := command.Start(); err != nil {
sprintf := fmt.Sprintf("create experiment command start failed, %v", err)
return spec.ReturnFail(spec.OsCmdExecFailed, sprintf)
}
command.SysProcAttr = &syscall.SysProcAttr{}
return spec.ReturnSuccess(command.Process.Pid)
} else {
output, err := command.CombinedOutput()
outMsg := string(output)
log.Debugf(ctx, "Command Result, output: %v, err: %v", outMsg, err)
if err != nil {
return spec.ReturnFail(spec.OsCmdExecFailed, fmt.Sprintf("command exec failed, %s", err.Error()))
}
return spec.Decode(outMsg, nil)
}
}
func (*Executor) SetChannel(channel spec.Channel) {
}