mirror of https://github.com/docker/docs.git
Implement OnSpawn
Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com>
This commit is contained in:
parent
ab20d526b1
commit
8fa6e11f73
|
@ -31,15 +31,15 @@ func DockerClient() beam.Sender {
|
||||||
|
|
||||||
func DockerClientWithConfig(config *DockerClientConfig) beam.Sender {
|
func DockerClientWithConfig(config *DockerClientConfig) beam.Sender {
|
||||||
backend := beam.NewServer()
|
backend := beam.NewServer()
|
||||||
backend.OnVerb(beam.Spawn, beam.Handler(func(ctx *beam.Message) error {
|
backend.OnSpawn(func(cmd ...string) (beam.Sender, error) {
|
||||||
if len(ctx.Args) != 1 {
|
if len(cmd) != 1 {
|
||||||
return fmt.Errorf("dockerclient: spawn takes exactly 1 argument, got %d", len(ctx.Args))
|
return nil, fmt.Errorf("dockerclient: spawn takes exactly 1 argument, got %d", len(cmd))
|
||||||
}
|
}
|
||||||
client := newClient()
|
client := newClient()
|
||||||
client.scheme = config.Scheme
|
client.scheme = config.Scheme
|
||||||
client.urlHost = config.URLHost
|
client.urlHost = config.URLHost
|
||||||
client.transport.TLSClientConfig = config.TLSClientConfig
|
client.transport.TLSClientConfig = config.TLSClientConfig
|
||||||
client.setURL(ctx.Args[0])
|
client.setURL(cmd[0])
|
||||||
b := &dockerClientBackend{
|
b := &dockerClientBackend{
|
||||||
client: client,
|
client: client,
|
||||||
Server: beam.NewServer(),
|
Server: beam.NewServer(),
|
||||||
|
@ -47,10 +47,9 @@ func DockerClientWithConfig(config *DockerClientConfig) beam.Sender {
|
||||||
b.Server.OnVerb(beam.Attach, beam.Handler(b.attach))
|
b.Server.OnVerb(beam.Attach, beam.Handler(b.attach))
|
||||||
b.Server.OnVerb(beam.Start, beam.Handler(b.start))
|
b.Server.OnVerb(beam.Start, beam.Handler(b.start))
|
||||||
b.Server.OnVerb(beam.Ls, beam.Handler(b.ls))
|
b.Server.OnVerb(beam.Ls, beam.Handler(b.ls))
|
||||||
b.Server.OnVerb(beam.Spawn, beam.Handler(b.spawn))
|
b.Server.OnSpawn(b.spawn)
|
||||||
_, err := ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: b.Server})
|
return b.Server, nil
|
||||||
return err
|
})
|
||||||
}))
|
|
||||||
return backend
|
return backend
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,30 +110,26 @@ func (b *dockerClientBackend) ls(ctx *beam.Message) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *dockerClientBackend) spawn(ctx *beam.Message) error {
|
func (b *dockerClientBackend) spawn(cmd ...string) (beam.Sender, error) {
|
||||||
if len(ctx.Args) != 1 {
|
if len(cmd) != 1 {
|
||||||
return fmt.Errorf("dockerclient: spawn takes exactly 1 argument, got %d", len(ctx.Args))
|
return nil, fmt.Errorf("dockerclient: spawn takes exactly 1 argument, got %d", len(cmd))
|
||||||
}
|
}
|
||||||
resp, err := b.client.call("POST", "/containers/create", ctx.Args[0])
|
resp, err := b.client.call("POST", "/containers/create", cmd[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
respBody, err := ioutil.ReadAll(resp.Body)
|
respBody, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
if resp.StatusCode != 201 {
|
if resp.StatusCode != 201 {
|
||||||
return fmt.Errorf("expected status code 201, got %d:\n%s", resp.StatusCode, respBody)
|
return nil, fmt.Errorf("expected status code 201, got %d:\n%s", resp.StatusCode, respBody)
|
||||||
}
|
}
|
||||||
var respJson struct{ Id string }
|
var respJson struct{ Id string }
|
||||||
if err = json.Unmarshal(respBody, &respJson); err != nil {
|
if err = json.Unmarshal(respBody, &respJson); err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
c := b.newContainer(respJson.Id)
|
return b.newContainer(respJson.Id), nil
|
||||||
if _, err = ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c}); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *dockerClientBackend) newContainer(id string) beam.Sender {
|
func (b *dockerClientBackend) newContainer(id string) beam.Sender {
|
||||||
|
|
|
@ -27,6 +27,17 @@ func (s *Server) OnVerb(v Verb, h Sender) *Server {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Server) OnSpawn(h func(cmd ...string) (Sender, error)) *Server {
|
||||||
|
return s.OnVerb(Spawn, Handler(func(msg *Message) error {
|
||||||
|
obj, err := h(msg.Args...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = msg.Ret.Send(&Message{Verb: Ack, Ret: obj})
|
||||||
|
return err
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Server) Send(msg *Message) (Receiver, error) {
|
func (s *Server) Send(msg *Message) (Receiver, error) {
|
||||||
if h, exists := s.handlers[msg.Verb]; exists {
|
if h, exists := s.handlers[msg.Verb]; exists {
|
||||||
return h.Send(msg)
|
return h.Send(msg)
|
||||||
|
|
Loading…
Reference in New Issue