2014-01-09 02:47:57 +00:00
package execdriver
import (
2014-01-14 00:18:46 +00:00
"errors"
2014-02-21 21:27:15 +00:00
"io"
"os"
2014-01-09 23:04:45 +00:00
"os/exec"
2015-01-07 22:43:04 +00:00
"time"
2014-02-17 23:14:30 +00:00
2015-01-07 22:43:04 +00:00
"github.com/docker/libcontainer"
2014-06-11 02:58:15 +00:00
"github.com/docker/libcontainer/devices"
2014-01-09 02:47:57 +00:00
)
2014-03-18 20:49:16 +00:00
// Context is a generic key value pair that allows
// arbatrary data to be sent
type Context map [ string ] string
2014-01-14 00:18:46 +00:00
var (
2014-01-14 02:36:59 +00:00
ErrNotRunning = errors . New ( "Process could not be started" )
ErrWaitTimeoutReached = errors . New ( "Wait timeout reached" )
ErrDriverAlreadyRegistered = errors . New ( "A driver already registered this docker init function" )
ErrDriverNotFound = errors . New ( "The requested docker init has not been found" )
2014-01-14 00:18:46 +00:00
)
2014-08-26 22:44:00 +00:00
type StartCallback func ( * ProcessConfig , int )
2014-01-13 23:02:12 +00:00
2014-01-15 21:57:07 +00:00
// Driver specific information based on
// processes registered with the driver
2014-01-15 19:46:25 +00:00
type Info interface {
IsRunning ( ) bool
}
2014-02-21 21:27:15 +00:00
// Terminal in an interface for drivers to implement
// if they want to support Close and Resize calls from
// the core
type Terminal interface {
io . Closer
Resize ( height , width int ) error
}
type TtyTerminal interface {
Master ( ) * os . File
}
2014-10-08 17:03:57 +00:00
// ExitStatus provides exit reasons for a container.
type ExitStatus struct {
// The exit code with which the container exited.
ExitCode int
// Whether the container encountered an OOM.
OOMKilled bool
}
2014-01-09 23:04:45 +00:00
type Driver interface {
2014-10-30 23:06:54 +00:00
Run ( c * Command , pipes * Pipes , startCallback StartCallback ) ( ExitStatus , error ) // Run executes the process and blocks until the process exits and returns the exit code
2014-10-08 17:03:57 +00:00
// Exec executes the process in an existing container, blocks until the process exits and returns the exit code
2014-09-04 05:29:19 +00:00
Exec ( c * Command , processConfig * ProcessConfig , pipes * Pipes , startCallback StartCallback ) ( int , error )
2014-01-21 00:05:07 +00:00
Kill ( c * Command , sig int ) error
2014-05-21 21:06:18 +00:00
Pause ( c * Command ) error
Unpause ( c * Command ) error
2014-01-28 15:17:51 +00:00
Name ( ) string // Driver name
Info ( id string ) Info // "temporary" hack (until we move state from core to plugins)
GetPidsForContainer ( id string ) ( [ ] int , error ) // Returns a list of pids for the given container.
2014-03-26 06:48:16 +00:00
Terminate ( c * Command ) error // kill it with fire
2014-09-10 07:34:38 +00:00
Clean ( id string ) error // clean all traces of container exec
2015-01-07 22:43:04 +00:00
Stats ( id string ) ( * ResourceStats , error ) // Get resource stats for a running container
2014-01-09 23:04:45 +00:00
}
2014-01-09 02:47:57 +00:00
// Network settings of the container
type Network struct {
2014-05-02 21:17:31 +00:00
Interface * NetworkInterface ` json:"interface" ` // if interface is nil then networking is disabled
Mtu int ` json:"mtu" `
ContainerID string ` json:"container_id" ` // id of the container to join network.
HostNetworking bool ` json:"host_networking" `
2014-03-16 19:52:27 +00:00
}
2014-11-10 21:14:17 +00:00
// IPC settings of the container
type Ipc struct {
ContainerID string ` json:"container_id" ` // id of the container to join ipc.
HostIpc bool ` json:"host_ipc" `
}
2014-11-25 20:10:53 +00:00
// PID settings of the container
type Pid struct {
HostPid bool ` json:"host_pid" `
}
2014-03-16 19:52:27 +00:00
type NetworkInterface struct {
2015-01-08 23:03:19 +00:00
Gateway string ` json:"gateway" `
IPAddress string ` json:"ip" `
IPPrefixLen int ` json:"ip_prefix_len" `
MacAddress string ` json:"mac" `
Bridge string ` json:"bridge" `
GlobalIPv6Address string ` json:"global_ipv6" `
LinkLocalIPv6Address string ` json:"link_local_ipv6" `
GlobalIPv6PrefixLen int ` json:"global_ipv6_prefix_len" `
IPv6Gateway string ` json:"ipv6_gateway" `
2014-01-09 02:47:57 +00:00
}
2014-01-20 21:23:02 +00:00
type Resources struct {
2014-05-13 00:44:57 +00:00
Memory int64 ` json:"memory" `
MemorySwap int64 ` json:"memory_swap" `
CpuShares int64 ` json:"cpu_shares" `
Cpuset string ` json:"cpuset" `
2014-01-20 21:23:02 +00:00
}
2015-01-07 22:43:04 +00:00
type ResourceStats struct {
* libcontainer . ContainerStats
2015-01-08 00:22:42 +00:00
Read time . Time ` json:"read" `
ClockTicks int ` json:"clock_ticks" `
MemoryLimit int64 ` json:"memory_limit" `
SystemUsage uint64 ` json:"system_usage" `
2015-01-07 22:43:04 +00:00
}
2014-03-03 15:15:29 +00:00
type Mount struct {
Source string ` json:"source" `
Destination string ` json:"destination" `
Writable bool ` json:"writable" `
Private bool ` json:"private" `
2014-09-13 16:42:10 +00:00
Slave bool ` json:"slave" `
2014-03-03 15:15:29 +00:00
}
2014-08-26 22:05:37 +00:00
// Describes a process that will be run inside a container.
type ProcessConfig struct {
2014-01-21 00:05:07 +00:00
exec . Cmd ` json:"-" `
2014-01-10 19:44:35 +00:00
2014-08-26 22:44:00 +00:00
Privileged bool ` json:"privileged" `
User string ` json:"user" `
Tty bool ` json:"tty" `
Entrypoint string ` json:"entrypoint" `
Arguments [ ] string ` json:"arguments" `
Terminal Terminal ` json:"-" ` // standard or tty terminal
Console string ` json:"-" ` // dev/console path
2014-08-26 22:05:37 +00:00
}
// Process wrapps an os/exec.Cmd to add more metadata
type Command struct {
2014-09-29 22:40:26 +00:00
ID string ` json:"id" `
2015-01-13 21:52:51 +00:00
Rootfs string ` json:"rootfs" ` // root fs of the container
ReadonlyRootfs bool ` json:"readonly_rootfs" `
2014-09-29 22:40:26 +00:00
InitPath string ` json:"initpath" ` // dockerinit
WorkingDir string ` json:"working_dir" `
ConfigPath string ` json:"config_path" ` // this should be able to be removed when the lxc template is moved into the driver
Network * Network ` json:"network" `
2014-11-10 21:14:17 +00:00
Ipc * Ipc ` json:"ipc" `
2014-11-25 20:10:53 +00:00
Pid * Pid ` json:"pid" `
2014-09-29 22:40:26 +00:00
Resources * Resources ` json:"resources" `
Mounts [ ] Mount ` json:"mounts" `
AllowedDevices [ ] * devices . Device ` json:"allowed_devices" `
AutoCreatedDevices [ ] * devices . Device ` json:"autocreated_devices" `
CapAdd [ ] string ` json:"cap_add" `
CapDrop [ ] string ` json:"cap_drop" `
ContainerPid int ` json:"container_pid" ` // the pid for the process inside a container
ProcessConfig ProcessConfig ` json:"process_config" ` // Describes the init process of the container.
ProcessLabel string ` json:"process_label" `
MountLabel string ` json:"mount_label" `
LxcConfig [ ] string ` json:"lxc_config" `
2014-09-29 23:34:45 +00:00
AppArmorProfile string ` json:"apparmor_profile" `
2014-01-09 23:04:45 +00:00
}