Swicth to 1.0.0-alpha2 containerd api.

Signed-off-by: Mike Brown <brownwm@us.ibm.com>
This commit is contained in:
Mike Brown
2017-07-24 20:24:04 -05:00
committed by Lantao Liu
parent 6017d84040
commit 73748840da
21 changed files with 246 additions and 151 deletions

View File

@@ -19,8 +19,9 @@ package server
import (
"time"
"github.com/containerd/containerd/api/services/execution"
"github.com/containerd/containerd/api/types/task"
"github.com/containerd/containerd/api/services/events/v1"
"github.com/containerd/containerd/api/services/tasks/v1"
"github.com/containerd/containerd/typeurl"
"github.com/golang/glog"
"github.com/jpillora/backoff"
"golang.org/x/net/context"
@@ -48,7 +49,7 @@ func (c *criContainerdService) startEventMonitor() {
}
go func() {
for {
events, err := c.taskService.Events(context.Background(), &execution.EventsRequest{})
eventstream, err := c.eventService.Subscribe(context.Background(), &events.SubscribeRequest{})
if err != nil {
glog.Errorf("Failed to connect to containerd event stream: %v", err)
time.Sleep(b.Duration())
@@ -59,7 +60,7 @@ func (c *criContainerdService) startEventMonitor() {
// TODO(random-liu): Relist to recover state, should prevent other operations
// until state is fully recovered.
for {
if err := c.handleEventStream(events); err != nil {
if err := c.handleEventStream(eventstream); err != nil {
glog.Errorf("Failed to handle event stream: %v", err)
break
}
@@ -69,27 +70,34 @@ func (c *criContainerdService) startEventMonitor() {
}
// handleEventStream receives an event from containerd and handles the event.
func (c *criContainerdService) handleEventStream(events execution.Tasks_EventsClient) error {
e, err := events.Recv()
func (c *criContainerdService) handleEventStream(eventstream events.Events_SubscribeClient) error {
e, err := eventstream.Recv()
if err != nil {
return err
}
glog.V(2).Infof("Received container event: %+v", e)
glog.V(4).Infof("Received container event timestamp - %v, namespace - %q, topic - %q", e.Timestamp, e.Namespace, e.Topic)
c.handleEvent(e)
return nil
}
// handleEvent handles a containerd event.
func (c *criContainerdService) handleEvent(e *task.Event) {
switch e.Type {
func (c *criContainerdService) handleEvent(evt *events.Envelope) {
any, err := typeurl.UnmarshalAny(evt.Event)
if err != nil {
glog.Errorf("Failed to convert event envelope %+v: %v", evt, err)
return
}
switch any.(type) {
// If containerd-shim exits unexpectedly, there will be no corresponding event.
// However, containerd could not retrieve container state in that case, so it's
// fine to leave out that case for now.
// TODO(random-liu): [P2] Handle containerd-shim exit.
case task.Event_EXIT:
cntr, err := c.containerStore.Get(e.ID)
case *events.TaskExit:
e := any.(*events.TaskExit)
glog.V(2).Infof("TaskExit event %+v", e)
cntr, err := c.containerStore.Get(e.ContainerID)
if err != nil {
glog.Errorf("Failed to get container %q: %v", e.ID, err)
glog.Errorf("Failed to get container %q: %v", e.ContainerID, err)
return
}
if e.Pid != cntr.Status.Get().Pid {
@@ -97,10 +105,11 @@ func (c *criContainerdService) handleEvent(e *task.Event) {
return
}
// Delete the container from containerd.
_, err = c.taskService.Delete(context.Background(), &execution.DeleteRequest{ContainerID: e.ID})
_, err = c.taskService.Delete(context.Background(), &tasks.DeleteTaskRequest{ContainerID: e.ContainerID})
// TODO(random-liu): Change isContainerdGRPCNotFoundError to use errdefs.
if err != nil && !isContainerdGRPCNotFoundError(err) {
// TODO(random-liu): [P0] Enqueue the event and retry.
glog.Errorf("Failed to delete container %q: %v", e.ID, err)
glog.Errorf("Failed to delete container %q: %v", e.ContainerID, err)
return
}
err = cntr.Status.Update(func(status containerstore.Status) (containerstore.Status, error) {
@@ -115,21 +124,23 @@ func (c *criContainerdService) handleEvent(e *task.Event) {
return status, nil
})
if err != nil {
glog.Errorf("Failed to update container %q state: %v", e.ID, err)
glog.Errorf("Failed to update container %q state: %v", e.ContainerID, err)
// TODO(random-liu): [P0] Enqueue the event and retry.
return
}
case task.Event_OOM:
cntr, err := c.containerStore.Get(e.ID)
case *events.TaskOOM:
e := any.(*events.TaskOOM)
glog.V(2).Infof("TaskOOM event %+v", e)
cntr, err := c.containerStore.Get(e.ContainerID)
if err != nil {
glog.Errorf("Failed to get container %q: %v", e.ID, err)
glog.Errorf("Failed to get container %q: %v", e.ContainerID, err)
}
err = cntr.Status.Update(func(status containerstore.Status) (containerstore.Status, error) {
status.Reason = oomExitReason
return status, nil
})
if err != nil {
glog.Errorf("Failed to update container %q oom: %v", e.ID, err)
glog.Errorf("Failed to update container %q oom: %v", e.ContainerID, err)
return
}
}