multiple ajustments

- renamed WrapperJob (not exported anymore)
- removed need for temp log file
- not using titan models
- using gin.Context as runner context
This commit is contained in:
Pedro Nasser
2016-07-28 17:45:57 -03:00
parent a92dffb3fc
commit d7f1ea037b
5 changed files with 65 additions and 86 deletions

View File

@@ -1,43 +0,0 @@
package runner
import (
"io"
"os"
dockercli "github.com/fsouza/go-dockerclient"
"github.com/iron-io/titan/runner/tasker"
titan_models "github.com/iron-io/titan/runner/tasker/client/models"
)
type WrapperJob struct {
auth tasker.Auther
log *os.File
m *titan_models.Job
}
func (f *WrapperJob) Command() string { return "" }
func (f *WrapperJob) EnvVars() map[string]string {
m := map[string]string{
"JOB_ID": f.Id(),
"PAYLOAD": f.m.Payload,
}
for k, v := range f.m.EnvVars {
m[k] = v
}
return m
}
func (f *WrapperJob) Id() string { return f.m.ID }
func (f *WrapperJob) Group() string { return f.m.GroupName }
func (f *WrapperJob) Image() string { return *f.m.Image }
func (f *WrapperJob) Timeout() uint { return uint(*f.m.Timeout) }
func (f *WrapperJob) Logger() (stdout, stderr io.Writer) { return f.log, f.log }
func (f *WrapperJob) Volumes() [][2]string { return [][2]string{} }
func (f *WrapperJob) WorkDir() string { return "" }
func (f *WrapperJob) Close() {}
func (f *WrapperJob) DockerAuth() []dockercli.AuthConfiguration {
return f.auth.Auth(f.Image())
}

View File

@@ -1,9 +1,8 @@
package runner
import (
"bytes"
"fmt"
"io/ioutil"
"os"
"time"
"golang.org/x/net/context"
@@ -15,10 +14,10 @@ import (
"github.com/iron-io/titan/runner/drivers"
"github.com/iron-io/titan/runner/drivers/docker"
"github.com/iron-io/titan/runner/drivers/mock"
titan_models "github.com/iron-io/titan/runner/tasker/client/models"
)
type Config struct {
Ctx context.Context
Route *models.Route
Endpoint string
Payload string
@@ -28,7 +27,8 @@ type Config struct {
type Runner struct {
cfg *Config
status string
result []byte
out bytes.Buffer
err bytes.Buffer
}
func New(cfg *Config) *Runner {
@@ -37,70 +37,52 @@ func New(cfg *Config) *Runner {
}
}
func (r *Runner) Start() error {
image := r.cfg.Route.Image
payload := r.cfg.Payload
timeout := int32(r.cfg.Timeout.Seconds())
func (r *Runner) Run() error {
var err error
runnerConfig := configloader.RunnerConfiguration()
au := agent.ConfigAuth{runnerConfig.Registries}
// TODO: Is this really required for Titan's driver?
// Can we remove it?
env := common.NewEnvironment(func(e *common.Environment) {})
// TODO: Create a drivers.New(runnerConfig) in Titan
driver, err := selectDriver(env, runnerConfig)
if err != nil {
return err
}
job := &titan_models.Job{
NewJob: titan_models.NewJob{
Image: &image,
Payload: payload,
Timeout: &timeout,
},
ctask := &containerTask{
cfg: r.cfg,
auth: &au,
stdout: &r.out,
stderr: &r.err,
}
tempLog, err := ensureLogFile(job)
if err != nil {
return err
}
defer tempLog.Close()
wjob := &WrapperJob{
auth: &au,
m: job,
log: tempLog,
}
result, err := driver.Run(context.Background(), wjob)
result, err := driver.Run(r.cfg.Ctx, ctask)
if err != nil {
return err
}
b, _ := ioutil.ReadFile(tempLog.Name())
r.result = b
r.status = result.Status()
return nil
}
func (r Runner) Result() []byte {
return r.result
func (r *Runner) ReadOut() []byte {
return r.out.Bytes()
}
func (r Runner) ReadErr() []byte {
return r.err.Bytes()
}
func (r Runner) Status() string {
return r.status
}
func ensureLogFile(job *titan_models.Job) (*os.File, error) {
log, err := ioutil.TempFile("", fmt.Sprintf("titan-log-%s", job.ID))
if err != nil {
return nil, fmt.Errorf("couldn't open task log for writing: %v", err)
}
return log, nil
}
func selectDriver(env *common.Environment, conf *agent.Config) (drivers.Driver, error) {
switch conf.Driver {
case "docker":

38
api/runner/task.go Normal file
View File

@@ -0,0 +1,38 @@
package runner
import (
"io"
dockercli "github.com/fsouza/go-dockerclient"
"github.com/iron-io/titan/runner/tasker"
)
type containerTask struct {
auth tasker.Auther
stdout io.Writer
stderr io.Writer
cfg *Config
}
func (t *containerTask) Command() string { return "" }
func (t *containerTask) EnvVars() map[string]string {
env := map[string]string{
"PAYLOAD": t.cfg.Payload,
}
return env
}
func (t *containerTask) Id() string { return "" }
func (t *containerTask) Group() string { return "" }
func (t *containerTask) Image() string { return t.cfg.Route.Image }
func (t *containerTask) Timeout() uint { return uint(t.cfg.Timeout.Seconds()) }
func (t *containerTask) Logger() (stdout, stderr io.Writer) { return t.stdout, t.stderr }
func (t *containerTask) Volumes() [][2]string { return [][2]string{} }
func (t *containerTask) WorkDir() string { return "" }
func (t *containerTask) Close() {}
func (t *containerTask) DockerAuth() []dockercli.AuthConfiguration {
return t.auth.Auth(t.Image())
}