2014-01-08 21:47:57 -05:00
package execdriver
import (
2014-01-13 19:18:46 -05:00
"errors"
2014-02-21 16:27:15 -05:00
"io"
"os"
2014-01-09 18:04:45 -05:00
"os/exec"
2014-02-17 18:14:30 -05:00
2014-06-10 22:58:15 -04:00
"github.com/docker/libcontainer/devices"
2014-01-08 21:47:57 -05:00
)
2014-03-18 16:49:16 -04:00
// Context is a generic key value pair that allows
// arbatrary data to be sent
type Context map [ string ] string
2014-01-13 19:18:46 -05:00
var (
2014-01-13 21:36:59 -05: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-13 19:18:46 -05:00
)
2014-08-26 18:44:00 -04:00
type StartCallback func ( * ProcessConfig , int )
2014-01-13 18:02:12 -05:00
2014-01-15 16:57:07 -05:00
// Driver specific information based on
// processes registered with the driver
2014-01-15 14:46:25 -05:00
type Info interface {
IsRunning ( ) bool
}
2014-02-21 16:27:15 -05: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 13:03:57 -04: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 18:04:45 -05:00
type Driver interface {
2014-10-30 19:06:54 -04: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 13:03:57 -04:00
// Exec executes the process in an existing container, blocks until the process exits and returns the exit code
2014-09-04 01:29:19 -04:00
Exec ( c * Command , processConfig * ProcessConfig , pipes * Pipes , startCallback StartCallback ) ( int , error )
2014-01-20 19:05:07 -05:00
Kill ( c * Command , sig int ) error
2014-05-21 17:06:18 -04:00
Pause ( c * Command ) error
Unpause ( c * Command ) error
2014-01-28 10:17:51 -05: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 02:48:16 -04:00
Terminate ( c * Command ) error // kill it with fire
2014-09-10 03:34:38 -04:00
Clean ( id string ) error // clean all traces of container exec
2014-01-09 18:04:45 -05:00
}
2014-01-08 21:47:57 -05:00
// Network settings of the container
type Network struct {
2014-05-02 17:17:31 -04: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 15:52:27 -04:00
}
2014-11-10 16:14:17 -05: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-03-16 15:52:27 -04:00
type NetworkInterface struct {
2014-01-13 19:18:46 -05:00
Gateway string ` json:"gateway" `
IPAddress string ` json:"ip" `
IPPrefixLen int ` json:"ip_prefix_len" `
2014-10-02 19:46:06 -04:00
MacAddress string ` json:"mac_address" `
Bridge string ` json:"bridge" `
2014-01-08 21:47:57 -05:00
}
2014-01-20 16:23:02 -05:00
type Resources struct {
2014-05-12 20:44:57 -04:00
Memory int64 ` json:"memory" `
MemorySwap int64 ` json:"memory_swap" `
CpuShares int64 ` json:"cpu_shares" `
Cpuset string ` json:"cpuset" `
2014-01-20 16:23:02 -05:00
}
2014-03-03 10:15:29 -05:00
type Mount struct {
Source string ` json:"source" `
Destination string ` json:"destination" `
Writable bool ` json:"writable" `
Private bool ` json:"private" `
2014-09-13 12:42:10 -04:00
Slave bool ` json:"slave" `
2014-03-03 10:15:29 -05:00
}
2014-08-26 18:05:37 -04:00
// Describes a process that will be run inside a container.
type ProcessConfig struct {
2014-01-20 19:05:07 -05:00
exec . Cmd ` json:"-" `
2014-01-10 14:44:35 -05:00
2014-08-26 18:44:00 -04: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 18:05:37 -04:00
}
// Process wrapps an os/exec.Cmd to add more metadata
type Command struct {
2014-09-29 18:40:26 -04:00
ID string ` json:"id" `
Rootfs string ` json:"rootfs" ` // root fs of the container
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 16:14:17 -05:00
Ipc * Ipc ` json:"ipc" `
2014-09-29 18:40:26 -04: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 19:34:45 -04:00
AppArmorProfile string ` json:"apparmor_profile" `
2014-01-09 18:04:45 -05:00
}