Add event support to execution subsystem

The implementation relies on nats.io

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
This commit is contained in:
Kenfe-Mickael Laventure 2016-12-11 11:07:32 -08:00
parent dd39b4dcf0
commit 2ef399b315
11 changed files with 441 additions and 125 deletions

View file

@ -4,11 +4,12 @@ import (
"fmt"
"os"
"path/filepath"
"time"
gocontext "context"
"github.com/docker/containerd/api/execution"
execEvents "github.com/docker/containerd/execution"
"github.com/nats-io/go-nats"
"github.com/urfave/cli"
)
@ -56,6 +57,27 @@ var runCommand = cli.Command{
return err
}
// setup our event subscriber
nc, err := nats.Connect(nats.DefaultURL)
if err != nil {
return err
}
nec, err := nats.NewEncodedConn(nc, nats.JSON_ENCODER)
if err != nil {
nc.Close()
return err
}
defer nec.Close()
evCh := make(chan *execEvents.ContainerExitEvent, 64)
sub, err := nec.Subscribe(execEvents.ContainersEventsSubjectSubscriber, func(e *execEvents.ContainerExitEvent) {
evCh <- e
})
if err != nil {
return err
}
defer sub.Unsubscribe()
tmpDir, err := getTempDir(id)
if err != nil {
return err
@ -87,18 +109,17 @@ var runCommand = cli.Command{
return err
}
// wait for it to die
var ec uint32
for {
gcr, err := executionService.Get(gocontext.Background(), &execution.GetContainerRequest{
ID: cr.Container.ID,
})
if err != nil {
return err
}
if gcr.Container.Status != execution.Status_RUNNING {
e, more := <-evCh
if !more {
break
}
if e.ID == cr.Container.ID && e.PID == cr.InitProcess.ID {
ec = e.StatusCode
break
}
time.Sleep(100 * time.Millisecond)
}
if _, err := executionService.Delete(gocontext.Background(), &execution.DeleteContainerRequest{
@ -110,6 +131,8 @@ var runCommand = cli.Command{
// Ensure we read all io
fwg.Wait()
os.Exit(int(ec))
return nil
},
}