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:
Michael Crosby
2017-05-12 10:18:00 -07:00
parent 5ee77fc281
commit 7cc1b64bd8
31 changed files with 2153 additions and 406 deletions

View File

@@ -5,6 +5,7 @@ import "context"
type ContainerInfo struct {
ID string
Runtime string
Spec []byte
}
type Container interface {
@@ -28,6 +29,18 @@ type Container interface {
Pty(context.Context, uint32, ConsoleSize) error
// CloseStdin closes the processes stdin
CloseStdin(context.Context, uint32) error
// Checkpoint checkpoints a container to an image with live system data
Checkpoint(context.Context, CheckpointOpts) error
}
type CheckpointOpts struct {
Exit bool
AllowTCP bool
AllowUnixSockets bool
AllowTerminal bool
FileLocks bool
EmptyNamespaces []string
Path string
}
type ExecOpts struct {

42
plugin/event.go Normal file
View File

@@ -0,0 +1,42 @@
package plugin
import "time"
type EventType int
func (t EventType) String() string {
switch t {
case ExitEvent:
return "exit"
case PausedEvent:
return "paused"
case CreateEvent:
return "create"
case StartEvent:
return "start"
case OOMEvent:
return "oom"
case ExecAddEvent:
return "execAdd"
}
return "unknown"
}
const (
ExitEvent EventType = iota + 1
PausedEvent
CreateEvent
StartEvent
OOMEvent
ExecAddEvent
)
type Event struct {
Timestamp time.Time
Type EventType
Runtime string
ID string
Pid uint32
ExitStatus uint32
ExitedAt time.Time
}

View File

@@ -1,7 +1,5 @@
package plugin
import "github.com/containerd/containerd"
// ContainerMonitor provides an interface for monitoring of containers within containerd
type ContainerMonitor interface {
// Monitor adds the provided container to the monitor
@@ -9,7 +7,7 @@ type ContainerMonitor interface {
// Stop stops and removes the provided container from the monitor
Stop(Container) error
// Events emits events from the monitor
Events(chan<- *containerd.Event)
Events(chan<- *Event)
}
func NewMultiContainerMonitor(monitors ...ContainerMonitor) ContainerMonitor {
@@ -33,7 +31,7 @@ func (mm *noopContainerMonitor) Stop(c Container) error {
return nil
}
func (mm *noopContainerMonitor) Events(events chan<- *containerd.Event) {
func (mm *noopContainerMonitor) Events(events chan<- *Event) {
}
type multiContainerMonitor struct {
@@ -58,7 +56,7 @@ func (mm *multiContainerMonitor) Stop(c Container) error {
return nil
}
func (mm *multiContainerMonitor) Events(events chan<- *containerd.Event) {
func (mm *multiContainerMonitor) Events(events chan<- *Event) {
for _, m := range mm.monitors {
m.Events(events)
}

View File

@@ -20,7 +20,8 @@ type CreateOpts struct {
// Rootfs mounts to perform to gain access to the container's filesystem
Rootfs []containerd.Mount
// IO for the container's main process
IO IO
IO IO
Checkpoint string
}
type Exit struct {
@@ -38,5 +39,5 @@ type Runtime interface {
// Delete removes the container in the runtime
Delete(context.Context, Container) (*Exit, error)
// Events returns events for the runtime and all containers created by the runtime
Events(context.Context) <-chan *containerd.Event
Events(context.Context) <-chan *Event
}