perftests/scheduler_simulator/fake_worker_cli.go (121 lines of code) (raw):
package scheduler_simulator
import (
"fmt"
"strconv"
"time"
"github.com/twitter/scoot/cloud/cluster"
"github.com/twitter/scoot/common/errors"
"github.com/twitter/scoot/common/log/tags"
"github.com/twitter/scoot/runner"
)
/*
FakeWorker sleeps for the amount of time defined in the command's argv[1] entry then
returns exit code defined in argv[2]
*/
type FakeWorker struct {
node cluster.Node
doneCh chan bool
state runner.RunState
cmdId string
}
func makeFakeWorker(n cluster.Node) *FakeWorker {
return &FakeWorker{
node: n,
doneCh: make(chan bool),
state: runner.PENDING,
}
}
func (fw *FakeWorker) Run(cmd *runner.Command) (runner.RunStatus, error) {
fw.cmdId = cmd.TaskID
if len(cmd.Argv) != 3 {
return runner.RunStatus{
RunID: runner.RunID(fw.cmdId),
State: fw.state,
LogTags: tags.LogTags{},
StdoutRef: "",
StderrRef: "",
SnapshotID: "",
ExitCode: 1,
Error: "",
}, fmt.Errorf("expected cmd's Argv to have 3 entries: <anything>, <task duration>")
}
duration, err := strconv.Atoi(cmd.Argv[1])
if err != nil {
return runner.RunStatus{
RunID: runner.RunID(fw.cmdId),
State: fw.state,
LogTags: tags.LogTags{},
StdoutRef: "",
StderrRef: "",
SnapshotID: "",
ExitCode: 1,
Error: "",
}, fmt.Errorf("didn't get a valid (int) task duration value from cmd.Argv's first param:%s", cmd.Argv[1])
}
exitCode, err := strconv.Atoi(cmd.Argv[2])
if err != nil {
return runner.RunStatus{
RunID: runner.RunID(fw.cmdId),
State: fw.state,
LogTags: tags.LogTags{},
StdoutRef: "",
StderrRef: "",
SnapshotID: "",
ExitCode: 1,
Error: "",
}, fmt.Errorf("didn't get a valid (int) exit code value from cmd.Argv's first param:%s", cmd.Argv[2])
}
fw.state = runner.RUNNING
go func(fw *FakeWorker) {
t := time.NewTicker(time.Duration(duration) * time.Second)
<-t.C
t.Stop()
fw.doneCh <- true
}(fw)
<-fw.doneCh // pause till done
fw.state = runner.COMPLETE
rs := runner.RunStatus{
RunID: runner.RunID(fw.cmdId),
State: fw.state,
LogTags: tags.LogTags{},
StdoutRef: "",
StderrRef: "",
SnapshotID: "",
ExitCode: errors.ExitCode(exitCode),
Error: "",
}
return rs, nil
}
func (fw *FakeWorker) Abort(run runner.RunID) (runner.RunStatus, error) {
fw.doneCh <- true
rs := runner.RunStatus{
RunID: runner.RunID(fw.cmdId),
State: runner.ABORTED,
LogTags: tags.LogTags{},
StdoutRef: "",
StderrRef: "",
SnapshotID: "",
ExitCode: 0,
Error: "",
}
return rs, nil
}
func (fw *FakeWorker) Release() {}
func (fw *FakeWorker) Query(q runner.Query, w runner.Wait) ([]runner.RunStatus, runner.ServiceStatus, error) {
return make([]runner.RunStatus, 0), runner.ServiceStatus{Initialized: false, Error: nil}, nil
}
func (fw *FakeWorker) QueryNow(q runner.Query) ([]runner.RunStatus, runner.ServiceStatus, error) {
return nil, runner.ServiceStatus{Initialized: false, Error: nil}, nil
}
func (fw *FakeWorker) Status(run runner.RunID) (runner.RunStatus, runner.ServiceStatus, error) {
rs := runner.RunStatus{
RunID: runner.RunID(fw.cmdId),
State: fw.state,
LogTags: tags.LogTags{},
StdoutRef: "",
StderrRef: "",
SnapshotID: "",
ExitCode: 0,
Error: "",
}
return rs, runner.ServiceStatus{Initialized: false, Error: nil}, nil
}
func (fw *FakeWorker) StatusAll() ([]runner.RunStatus, runner.ServiceStatus, error) {
return nil, runner.ServiceStatus{Initialized: false, Error: nil}, nil
}