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