Implement OnAttach

Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com>
This commit is contained in:
Aanand Prasad 2014-06-19 14:59:39 +01:00 committed by Aaron Feng
parent 8e530ead6e
commit 3ac10e0c92
2 changed files with 18 additions and 12 deletions

View File

@ -44,7 +44,7 @@ func DockerClientWithConfig(config *DockerClientConfig) beam.Sender {
client: client, client: client,
Server: beam.NewServer(), Server: beam.NewServer(),
} }
b.Server.OnVerb(beam.Attach, beam.Handler(b.attach)) b.Server.OnAttach(b.attach)
b.Server.OnStart(b.start) b.Server.OnStart(b.start)
b.Server.OnLs(b.ls) b.Server.OnLs(b.ls)
b.Server.OnSpawn(b.spawn) b.Server.OnSpawn(b.spawn)
@ -58,12 +58,12 @@ type dockerClientBackend struct {
*beam.Server *beam.Server
} }
func (b *dockerClientBackend) attach(ctx *beam.Message) error { func (b *dockerClientBackend) attach(name string, ret beam.Sender) error {
if ctx.Args[0] == "" { if name == "" {
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: b.Server}) ret.Send(&beam.Message{Verb: beam.Ack, Ret: b.Server})
<-make(chan struct{}) <-make(chan struct{})
} else { } else {
path := fmt.Sprintf("/containers/%s/json", ctx.Args[0]) path := fmt.Sprintf("/containers/%s/json", name)
resp, err := b.client.call("GET", path, "") resp, err := b.client.call("GET", path, "")
if err != nil { if err != nil {
return err return err
@ -75,8 +75,8 @@ func (b *dockerClientBackend) attach(ctx *beam.Message) error {
if resp.StatusCode != 200 { if resp.StatusCode != 200 {
return fmt.Errorf("%s", respBody) return fmt.Errorf("%s", respBody)
} }
c := b.newContainer(ctx.Args[0]) c := b.newContainer(name)
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c}) ret.Send(&beam.Message{Verb: beam.Ack, Ret: c})
} }
return nil return nil
} }
@ -131,7 +131,7 @@ func (b *dockerClientBackend) spawn(cmd ...string) (beam.Sender, error) {
func (b *dockerClientBackend) newContainer(id string) beam.Sender { func (b *dockerClientBackend) newContainer(id string) beam.Sender {
c := &container{backend: b, id: id} c := &container{backend: b, id: id}
instance := beam.NewServer() instance := beam.NewServer()
instance.OnVerb(beam.Attach, beam.Handler(c.attach)) instance.OnAttach(c.attach)
instance.OnStart(c.start) instance.OnStart(c.start)
instance.OnStop(c.stop) instance.OnStop(c.stop)
instance.OnGet(c.get) instance.OnGet(c.get)
@ -143,8 +143,8 @@ type container struct {
id string id string
} }
func (c *container) attach(ctx *beam.Message) error { func (c *container) attach(name string, ret beam.Sender) error {
if _, err := ctx.Ret.Send(&beam.Message{Verb: beam.Ack}); err != nil { if _, err := ret.Send(&beam.Message{Verb: beam.Ack}); err != nil {
return err return err
} }
@ -152,8 +152,8 @@ func (c *container) attach(ctx *beam.Message) error {
stdoutR, stdoutW := io.Pipe() stdoutR, stdoutW := io.Pipe()
stderrR, stderrW := io.Pipe() stderrR, stderrW := io.Pipe()
go beam.EncodeStream(ctx.Ret, stdoutR, "stdout") go beam.EncodeStream(ret, stdoutR, "stdout")
go beam.EncodeStream(ctx.Ret, stderrR, "stderr") go beam.EncodeStream(ret, stderrR, "stderr")
c.backend.client.hijack("POST", path, nil, stdoutW, stderrW) c.backend.client.hijack("POST", path, nil, stdoutW, stderrW)
return nil return nil

View File

@ -49,6 +49,12 @@ func (s *Server) OnSpawn(h func(cmd ...string) (Sender, error)) *Server {
})) }))
} }
func (s *Server) OnAttach(h func(name string, ret Sender) error) *Server {
return s.OnVerb(Attach, Handler(func(msg *Message) error {
return h(msg.Args[0], msg.Ret)
}))
}
func (s *Server) OnGet(h func() (string, error)) *Server { func (s *Server) OnGet(h func() (string, error)) *Server {
return s.OnVerb(Get, Handler(func(msg *Message) error { return s.OnVerb(Get, Handler(func(msg *Message) error {
content, err := h() content, err := h()