implemented `docker ps`

Docker-DCO-1.1-Signed-off-by: Aaron Feng <aaron.feng@gmail.com> (github: aaronfeng)
This commit is contained in:
Aaron Feng 2014-06-19 00:46:38 -04:00
parent 7d816e029e
commit 11ec16e08d
1 changed files with 44 additions and 10 deletions

View File

@ -25,12 +25,16 @@ type ec2Client struct {
ec2Conn *ec2.EC2 ec2Conn *ec2.EC2
Server *beam.Server Server *beam.Server
instance *ec2.Instance instance *ec2.Instance
dockerInstance *beam.Object
} }
func (c *ec2Client) get(ctx *beam.Message) error { func (c *ec2Client) get(ctx *beam.Message) error {
fmt.Println("*** ec2 Get ***") fmt.Println("*** ec2 Get ***")
body := `{}` output, err := c.dockerInstance.Get()
ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: []string{body}}) if (err != nil) {
return err
}
ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: []string{output}})
return nil return nil
} }
@ -52,6 +56,7 @@ func (c *ec2Client) start(ctx *beam.Message) error {
} }
} }
c.initDockerClientInstance(c.instance)
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server}) ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server})
return nil return nil
} }
@ -64,13 +69,18 @@ func (c *ec2Client) log(ctx *beam.Message) error {
func (c *ec2Client) spawn(ctx *beam.Message) error { func (c *ec2Client) spawn(ctx *beam.Message) error {
fmt.Println("*** ec2 OnSpawn ***") fmt.Println("*** ec2 OnSpawn ***")
c.dockerInstance.Spawn(ctx.Args...)
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server}) ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server})
return nil return nil
} }
func (c *ec2Client) ls(ctx *beam.Message) error { func (c *ec2Client) ls(ctx *beam.Message) error {
fmt.Println("*** ec2 OnLs ***") fmt.Println("*** ec2 OnLs ***")
ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: []string{}}) output, err := c.dockerInstance.Ls()
if (err != nil) {
return err
}
ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: output})
return nil return nil
} }
@ -88,12 +98,20 @@ func (c *ec2Client) stop(ctx *beam.Message) error {
func (c *ec2Client) attach(ctx *beam.Message) error { func (c *ec2Client) attach(ctx *beam.Message) error {
fmt.Println("*** ec2 OnAttach ***") fmt.Println("*** ec2 OnAttach ***")
if ctx.Args[0] == "" {
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server}) ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server})
for { for {
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
(&beam.Object{ctx.Ret}).Log("ec2: heartbeat") (&beam.Object{ctx.Ret}).Log("ec2: heartbeat")
} }
} else {
_, out, err := c.dockerInstance.Attach(ctx.Args[0])
if err != nil {
return err
}
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: out})
}
return nil return nil
} }
@ -179,7 +197,6 @@ func (c *ec2Client) findInstance() (instance *ec2.Instance, err error) {
} }
instance := resp.Reservations[0].Instances[0] instance := resp.Reservations[0].Instances[0]
fmt.Println(instance.State.Name)
if (instance.State.Name == "running" || instance.State.Name == "pending") { if (instance.State.Name == "running" || instance.State.Name == "pending") {
return &instance, nil return &instance, nil
@ -235,6 +252,23 @@ func (c *ec2Client) startInstance() error {
return nil return nil
} }
func (c *ec2Client) initDockerClientInstance(instance *ec2.Instance) error {
dockerClient := DockerClientWithConfig(&DockerClientConfig{
Scheme: "http",
URLHost: instance.IPAddress,
})
dockerBackend := beam.Obj(dockerClient)
url := fmt.Sprintf("tcp://%s:4243", instance.IPAddress)
dockerInstance, err := dockerBackend.Spawn(url)
c.dockerInstance = dockerInstance
if err != nil {
return err
}
return nil
}
func Ec2() beam.Sender { func Ec2() beam.Sender {
backend := beam.NewServer() backend := beam.NewServer()
backend.OnSpawn(beam.Handler(func(ctx *beam.Message) error { backend.OnSpawn(beam.Handler(func(ctx *beam.Message) error {
@ -251,7 +285,7 @@ func Ec2() beam.Sender {
return err return err
} }
client := &ec2Client{config, ec2Conn, beam.NewServer(), nil} client := &ec2Client{config, ec2Conn, beam.NewServer(), nil, nil}
client.Server.OnSpawn(beam.Handler(client.spawn)) client.Server.OnSpawn(beam.Handler(client.spawn))
client.Server.OnStart(beam.Handler(client.start)) client.Server.OnStart(beam.Handler(client.start))
client.Server.OnStop(beam.Handler(client.stop)) client.Server.OnStop(beam.Handler(client.stop))