This fixes a sync issue when the containerd api returns after a container has started. It fixes it by calling the runtime start inside containerd after the oom handler has been setup. Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
		
			
				
	
	
		
			124 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package runtime
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/docker/containerd/specs"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	// ErrContainerExited is returned when access to an exited
 | 
						|
	// container is attempted
 | 
						|
	ErrContainerExited = errors.New("containerd: container has exited")
 | 
						|
	// ErrProcessNotExited is returned when trying to retrieve the exit
 | 
						|
	// status of an alive process
 | 
						|
	ErrProcessNotExited = errors.New("containerd: process has not exited")
 | 
						|
	// ErrContainerNotStarted is returned when a container fails to
 | 
						|
	// start without error from the shim or the OCI runtime
 | 
						|
	ErrContainerNotStarted = errors.New("containerd: container not started")
 | 
						|
	// ErrContainerStartTimeout is returned if a container takes too
 | 
						|
	// long to start
 | 
						|
	ErrContainerStartTimeout = errors.New("containerd: container did not start before the specified timeout")
 | 
						|
	// ErrShimExited is returned if the shim or the contianer's init process
 | 
						|
	// exits before completing
 | 
						|
	ErrShimExited = errors.New("containerd: shim exited before container process was started")
 | 
						|
 | 
						|
	errNoPidFile      = errors.New("containerd: no process pid file found")
 | 
						|
	errInvalidPidInt  = errors.New("containerd: process pid is invalid")
 | 
						|
	errNotImplemented = errors.New("containerd: not implemented")
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	// ExitFile holds the name of the pipe used to monitor process
 | 
						|
	// exit
 | 
						|
	ExitFile = "exit"
 | 
						|
	// ExitStatusFile holds the name of the file where the container
 | 
						|
	// exit code is to be written
 | 
						|
	ExitStatusFile = "exitStatus"
 | 
						|
	// StateFile holds the name of the file where the container state
 | 
						|
	// is written
 | 
						|
	StateFile = "state.json"
 | 
						|
	// ControlFile holds the name of the pipe used to control the shim
 | 
						|
	ControlFile = "control"
 | 
						|
	// InitProcessID holds the special ID used for the very first
 | 
						|
	// container's process
 | 
						|
	InitProcessID = "init"
 | 
						|
)
 | 
						|
 | 
						|
// Checkpoint holds information regarding a container checkpoint
 | 
						|
type Checkpoint struct {
 | 
						|
	// Timestamp is the time that checkpoint happened
 | 
						|
	Created time.Time `json:"created"`
 | 
						|
	// Name is the name of the checkpoint
 | 
						|
	Name string `json:"name"`
 | 
						|
	// TCP checkpoints open tcp connections
 | 
						|
	TCP bool `json:"tcp"`
 | 
						|
	// UnixSockets persists unix sockets in the checkpoint
 | 
						|
	UnixSockets bool `json:"unixSockets"`
 | 
						|
	// Shell persists tty sessions in the checkpoint
 | 
						|
	Shell bool `json:"shell"`
 | 
						|
	// Exit exits the container after the checkpoint is finished
 | 
						|
	Exit bool `json:"exit"`
 | 
						|
	// EmptyNS tells CRIU to omit a specified namespace
 | 
						|
	EmptyNS []string `json:"emptyNS,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
// PlatformProcessState container platform-specific fields in the ProcessState structure
 | 
						|
type PlatformProcessState struct {
 | 
						|
	Checkpoint string `json:"checkpoint"`
 | 
						|
	RootUID    int    `json:"rootUID"`
 | 
						|
	RootGID    int    `json:"rootGID"`
 | 
						|
}
 | 
						|
 | 
						|
// State represents a container state
 | 
						|
type State string
 | 
						|
 | 
						|
// Resource regroups the various container limits that can be updated
 | 
						|
type Resource struct {
 | 
						|
	CPUShares         int64
 | 
						|
	BlkioWeight       uint16
 | 
						|
	CPUPeriod         int64
 | 
						|
	CPUQuota          int64
 | 
						|
	CpusetCpus        string
 | 
						|
	CpusetMems        string
 | 
						|
	KernelMemory      int64
 | 
						|
	KernelTCPMemory   int64
 | 
						|
	Memory            int64
 | 
						|
	MemoryReservation int64
 | 
						|
	MemorySwap        int64
 | 
						|
}
 | 
						|
 | 
						|
// Possible container states
 | 
						|
const (
 | 
						|
	Paused  = State("paused")
 | 
						|
	Stopped = State("stopped")
 | 
						|
	Running = State("running")
 | 
						|
)
 | 
						|
 | 
						|
type state struct {
 | 
						|
	Bundle      string   `json:"bundle"`
 | 
						|
	Labels      []string `json:"labels"`
 | 
						|
	Stdin       string   `json:"stdin"`
 | 
						|
	Stdout      string   `json:"stdout"`
 | 
						|
	Stderr      string   `json:"stderr"`
 | 
						|
	Runtime     string   `json:"runtime"`
 | 
						|
	RuntimeArgs []string `json:"runtimeArgs"`
 | 
						|
	Shim        string   `json:"shim"`
 | 
						|
	NoPivotRoot bool     `json:"noPivotRoot"`
 | 
						|
}
 | 
						|
 | 
						|
// ProcessState holds the process OCI specs along with various fields
 | 
						|
// required by containerd
 | 
						|
type ProcessState struct {
 | 
						|
	specs.ProcessSpec
 | 
						|
	Exec        bool     `json:"exec"`
 | 
						|
	Stdin       string   `json:"containerdStdin"`
 | 
						|
	Stdout      string   `json:"containerdStdout"`
 | 
						|
	Stderr      string   `json:"containerdStderr"`
 | 
						|
	RuntimeArgs []string `json:"runtimeArgs"`
 | 
						|
	NoPivotRoot bool     `json:"noPivotRoot"`
 | 
						|
 | 
						|
	PlatformProcessState
 | 
						|
}
 |