Engine: Receiver and Sender preserve Job.Env
When sending a new job to a `engine.Sender`, the corresponding `engine.Receiver` will receive that job with its environment preserved. Previously the job name, arguments and streams were preserved but the env was lost. Docker-DCO-1.1-Signed-off-by: Solomon Hykes <solomon@docker.com> (github: shykes)
This commit is contained in:
parent
c7978c9809
commit
a1754c7e46
2 changed files with 52 additions and 2 deletions
|
@ -25,7 +25,9 @@ func (s *Sender) Install(eng *Engine) error {
|
|||
}
|
||||
|
||||
func (s *Sender) Handle(job *Job) Status {
|
||||
msg := data.Empty().Set("cmd", append([]string{job.Name}, job.Args...)...)
|
||||
cmd := append([]string{job.Name}, job.Args...)
|
||||
env := data.Encode(job.Env().MultiMap())
|
||||
msg := data.Empty().Set("cmd", cmd...).Set("env", env)
|
||||
peer, err := beam.SendConn(s, msg.Bytes())
|
||||
if err != nil {
|
||||
return job.Errorf("beamsend: %v", err)
|
||||
|
@ -99,8 +101,15 @@ func (rcv *Receiver) Run() error {
|
|||
}
|
||||
f.Close()
|
||||
defer peer.Close()
|
||||
cmd := data.Message(p).Get("cmd")
|
||||
msg := data.Message(p)
|
||||
cmd := msg.Get("cmd")
|
||||
job := rcv.Engine.Job(cmd[0], cmd[1:]...)
|
||||
// Decode env
|
||||
env, err := data.Decode(msg.GetOne("env"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("error decoding 'env': %v", err)
|
||||
}
|
||||
job.Env().InitMultiMap(env)
|
||||
stdout, err := beam.SendRPipe(peer, data.Empty().Set("cmd", "log", "stdout").Bytes())
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
@ -82,6 +82,47 @@ func TestStdin(t *testing.T) {
|
|||
)
|
||||
}
|
||||
|
||||
func TestEnv(t *testing.T) {
|
||||
var (
|
||||
foo string
|
||||
answer int
|
||||
shadok_words []string
|
||||
)
|
||||
testRemote(t,
|
||||
|
||||
func(eng *Engine) {
|
||||
job := eng.Job("sendenv")
|
||||
job.Env().Set("foo", "bar")
|
||||
job.Env().SetInt("answer", 42)
|
||||
job.Env().SetList("shadok_words", []string{"ga", "bu", "zo", "meu"})
|
||||
if err := job.Run(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
},
|
||||
|
||||
func(eng *Engine) {
|
||||
eng.Register("sendenv", func(job *Job) Status {
|
||||
foo = job.Env().Get("foo")
|
||||
answer = job.Env().GetInt("answer")
|
||||
shadok_words = job.Env().GetList("shadok_words")
|
||||
return StatusOK
|
||||
})
|
||||
},
|
||||
)
|
||||
// Check for results here rather than inside the job handler,
|
||||
// otherwise the tests may incorrectly pass if the handler is not
|
||||
// called.
|
||||
if foo != "bar" {
|
||||
t.Fatalf("%#v", foo)
|
||||
}
|
||||
if answer != 42 {
|
||||
t.Fatalf("%#v", answer)
|
||||
}
|
||||
if strings.Join(shadok_words, ", ") != "ga, bu, zo, meu" {
|
||||
t.Fatalf("%#v", shadok_words)
|
||||
}
|
||||
}
|
||||
|
||||
// Helpers
|
||||
|
||||
func testRemote(t *testing.T, senderSide, receiverSide func(*Engine)) {
|
||||
|
|
Loading…
Reference in a new issue