mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
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:
@@ -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())
|
||||
}
|
||||
@@ -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
38
api/runner/task.go
Normal 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())
|
||||
}
|
||||
Reference in New Issue
Block a user