Add checkpoint and restore
Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Update go-runc to 49b2a02ec1ed3e4ae52d30b54a291b75 Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Add shim to restore creation Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Keep checkpoint path in service Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Add C/R to non-shim build Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Checkpoint rw and image Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Pause container on bind checkpoints Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Return dump.log in error on checkpoint failure Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Pause container for checkpoint Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Update runc to 639454475cb9c8b861cc599f8bcd5c8c790ae402 For checkpoint into to work you need runc version 639454475cb9c8b861cc599f8bcd5c8c790ae402 + and criu 3.0 as this is what I have been testing with. Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Move restore behind create calls This remove the restore RPCs in favor of providing the checkpoint information to the `Create` calls of a container. If provided, the container will be created/restored from the checkpoint instead of an existing container. Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Regen protos after rebase Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
@@ -13,7 +13,6 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/containerd/containerd"
|
||||
"github.com/containerd/containerd/api/services/shim"
|
||||
"github.com/containerd/containerd/api/types/container"
|
||||
"github.com/containerd/containerd/api/types/mount"
|
||||
@@ -65,7 +64,7 @@ func New(ic *plugin.InitContext) (interface{}, error) {
|
||||
remote: !cfg.NoShim,
|
||||
shim: cfg.Shim,
|
||||
runtime: cfg.Runtime,
|
||||
events: make(chan *containerd.Event, 2048),
|
||||
events: make(chan *plugin.Event, 2048),
|
||||
eventsContext: c,
|
||||
eventsCancel: cancel,
|
||||
monitor: ic.Monitor,
|
||||
@@ -81,7 +80,7 @@ type Runtime struct {
|
||||
runtime string
|
||||
remote bool
|
||||
|
||||
events chan *containerd.Event
|
||||
events chan *plugin.Event
|
||||
eventsContext context.Context
|
||||
eventsCancel func()
|
||||
monitor plugin.ContainerMonitor
|
||||
@@ -108,13 +107,14 @@ func (r *Runtime) Create(ctx context.Context, id string, opts plugin.CreateOpts)
|
||||
return nil, err
|
||||
}
|
||||
sopts := &shim.CreateRequest{
|
||||
ID: id,
|
||||
Bundle: path,
|
||||
Runtime: r.runtime,
|
||||
Stdin: opts.IO.Stdin,
|
||||
Stdout: opts.IO.Stdout,
|
||||
Stderr: opts.IO.Stderr,
|
||||
Terminal: opts.IO.Terminal,
|
||||
ID: id,
|
||||
Bundle: path,
|
||||
Runtime: r.runtime,
|
||||
Stdin: opts.IO.Stdin,
|
||||
Stdout: opts.IO.Stdout,
|
||||
Stderr: opts.IO.Stderr,
|
||||
Terminal: opts.IO.Terminal,
|
||||
Checkpoint: opts.Checkpoint,
|
||||
}
|
||||
for _, m := range opts.Rootfs {
|
||||
sopts.Rootfs = append(sopts.Rootfs, &mount.Mount{
|
||||
@@ -127,8 +127,8 @@ func (r *Runtime) Create(ctx context.Context, id string, opts plugin.CreateOpts)
|
||||
os.RemoveAll(path)
|
||||
return nil, err
|
||||
}
|
||||
c := newContainer(id, s)
|
||||
// after the container is create add it to the monitor
|
||||
c := newContainer(id, opts.Spec, s)
|
||||
// after the container is created, add it to the monitor
|
||||
if err = r.monitor.Monitor(c); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -182,7 +182,7 @@ func (r *Runtime) Containers(ctx context.Context) ([]plugin.Container, error) {
|
||||
return o, nil
|
||||
}
|
||||
|
||||
func (r *Runtime) Events(ctx context.Context) <-chan *containerd.Event {
|
||||
func (r *Runtime) Events(ctx context.Context) <-chan *plugin.Event {
|
||||
return r.events
|
||||
}
|
||||
|
||||
@@ -204,20 +204,20 @@ func (r *Runtime) forward(events shim.Shim_EventsClient) {
|
||||
}
|
||||
return
|
||||
}
|
||||
var et containerd.EventType
|
||||
var et plugin.EventType
|
||||
switch e.Type {
|
||||
case container.Event_CREATE:
|
||||
et = containerd.CreateEvent
|
||||
et = plugin.CreateEvent
|
||||
case container.Event_EXEC_ADDED:
|
||||
et = containerd.ExecAddEvent
|
||||
et = plugin.ExecAddEvent
|
||||
case container.Event_EXIT:
|
||||
et = containerd.ExitEvent
|
||||
et = plugin.ExitEvent
|
||||
case container.Event_OOM:
|
||||
et = containerd.OOMEvent
|
||||
et = plugin.OOMEvent
|
||||
case container.Event_START:
|
||||
et = containerd.StartEvent
|
||||
et = plugin.StartEvent
|
||||
}
|
||||
r.events <- &containerd.Event{
|
||||
r.events <- &plugin.Event{
|
||||
Timestamp: time.Now(),
|
||||
Runtime: runtimeName,
|
||||
Type: et,
|
||||
@@ -256,9 +256,14 @@ func (r *Runtime) loadContainer(path string) (*Container, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
data, err := ioutil.ReadFile(filepath.Join(path, configFilename))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Container{
|
||||
id: id,
|
||||
shim: s,
|
||||
spec: data,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user