mirror of https://github.com/docker/docs.git
Implement OnAttach
Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com>
This commit is contained in:
parent
8e530ead6e
commit
3ac10e0c92
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue