engine

package
v0.3.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 21, 2015 License: Apache-2.0 Imports: 17 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Register

func Register(name string, handler Handler) error

func Tail

func Tail(buffer *bytes.Buffer, n int) string

Tail returns the n last lines of a buffer stripped out of the last \n, if any if n <= 0, returns an empty string

Types

type Decoder

type Decoder struct {
	*json.Decoder
}

func NewDecoder

func NewDecoder(src io.Reader) *Decoder

func (*Decoder) Decode

func (decoder *Decoder) Decode() (*Env, error)

type Engine

type Engine struct {
	Stdout  io.Writer
	Stderr  io.Writer
	Stdin   io.Reader
	Logging bool
	// contains filtered or unexported fields
}

The Engine is the core of Docker. It acts as a store for *containers*, and allows manipulation of these containers by executing *jobs*.

func New

func New() *Engine

New initializes a new engine.

func (*Engine) Hack_GetGlobalVar

func (eng *Engine) Hack_GetGlobalVar(key string) interface{}

func (*Engine) Hack_SetGlobalVar

func (eng *Engine) Hack_SetGlobalVar(key string, val interface{})

func (*Engine) IsShutdown

func (eng *Engine) IsShutdown() bool

IsShutdown returns true if the engine is in the process of shutting down, or already shut down. Otherwise it returns false.

func (*Engine) Job

func (eng *Engine) Job(name string, args ...string) *Job

Job creates a new job which can later be executed. This function mimics `Command` from the standard os/exec package.

func (*Engine) OnShutdown

func (eng *Engine) OnShutdown(h func())

OnShutdown registers a new callback to be called by Shutdown. This is typically used by services to perform cleanup.

func (*Engine) ParseJob

func (eng *Engine) ParseJob(input string) (*Job, error)

ParseJob creates a new job from a text description using a shell-like syntax.

The following syntax is used to parse `input`:

* Words are separated using standard whitespaces as separators. * Quotes and backslashes are not interpreted. * Words of the form 'KEY=[VALUE]' are added to the job environment. * All other words are added to the job arguments.

For example:

job, _ := eng.ParseJob("VERBOSE=1 echo hello TEST=true world")

The resulting job will have:

job.Args={"echo", "hello", "world"}
job.Env={"VERBOSE":"1", "TEST":"true"}

func (*Engine) Register

func (eng *Engine) Register(name string, handler Handler) error

func (*Engine) RegisterCatchall

func (eng *Engine) RegisterCatchall(catchall Handler)

func (*Engine) ServeHTTP

func (eng *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request)

ServeHTTP executes a job as specified by the http request `r`, and sends the result as an http response. This method allows an Engine instance to be passed as a standard http.Handler interface.

Note that the protocol used in this method is a convenience wrapper and is not the canonical implementation of remote job execution. This is because HTTP/1 does not handle stream multiplexing, and so cannot differentiate stdout from stderr. Additionally, headers cannot be added to a response once data has been written to the body, which makes it inconvenient to return metadata such as the exit status.

func (*Engine) Shutdown

func (eng *Engine) Shutdown()

Shutdown permanently shuts down eng as follows:

  • It refuses all new jobs, permanently.
  • It waits for all active jobs to complete (with no timeout)
  • It calls all shutdown handlers concurrently (if any)
  • It returns when all handlers complete, or after 15 seconds, whichever happens first.

func (*Engine) String

func (eng *Engine) String() string

type Env

type Env []string

func (*Env) Decode

func (env *Env) Decode(src io.Reader) error

DecodeEnv decodes `src` as a json dictionary, and adds each decoded key-value pair to the environment.

If `src` cannot be decoded as a json dictionary, an error is returned.

func (*Env) Encode

func (env *Env) Encode(dst io.Writer) error

func (*Env) Exists

func (env *Env) Exists(key string) bool

func (*Env) Get

func (env *Env) Get(key string) (value string)

Get returns the last value associated with the given key. If there are no values associated with the key, Get returns the empty string.

func (*Env) GetBool

func (env *Env) GetBool(key string) (value bool)

func (*Env) GetInt

func (env *Env) GetInt(key string) int

func (*Env) GetInt64

func (env *Env) GetInt64(key string) int64

func (*Env) GetJson

func (env *Env) GetJson(key string, iface interface{}) error

func (*Env) GetList

func (env *Env) GetList(key string) []string

Returns nil if key not found

func (*Env) GetSubEnv

func (env *Env) GetSubEnv(key string) *Env

func (*Env) Import

func (env *Env) Import(src interface{}) (err error)

func (*Env) Init

func (env *Env) Init(src *Env)

func (*Env) InitMultiMap

func (env *Env) InitMultiMap(m map[string][]string)

InitMultiMap removes all values in env, then initializes new values from the contents of m.

func (*Env) Len

func (env *Env) Len() int

Len returns the number of keys in the environment. Note that len(env) might be different from env.Len(), because the same key might be set multiple times.

func (*Env) Map

func (env *Env) Map() map[string]string

func (*Env) MultiMap

func (env *Env) MultiMap() map[string][]string

MultiMap returns a representation of env as a map of string arrays, keyed by string. This is the same structure as http headers for example, which allow each key to have multiple values.

func (*Env) Set

func (env *Env) Set(key, value string)

func (*Env) SetAuto

func (env *Env) SetAuto(k string, v interface{})

func (*Env) SetBool

func (env *Env) SetBool(key string, value bool)

func (*Env) SetInt

func (env *Env) SetInt(key string, value int)

func (*Env) SetInt64

func (env *Env) SetInt64(key string, value int64)

func (*Env) SetJson

func (env *Env) SetJson(key string, value interface{}) error

func (*Env) SetList

func (env *Env) SetList(key string, value []string) error

func (*Env) SetSubEnv

func (env *Env) SetSubEnv(key string, sub *Env) error

func (*Env) WriteTo

func (env *Env) WriteTo(dst io.Writer) (n int64, err error)

type Hack

type Hack map[string]interface{}

type Handler

type Handler func(*Job) Status

type Input

type Input struct {
	sync.Mutex
	// contains filtered or unexported fields
}

func NewInput

func NewInput() *Input

NewInput returns a new Input object with no source attached. Reading to an empty Input will return io.EOF.

func (*Input) Add

func (i *Input) Add(src io.Reader) error

Add attaches a new source to the input. Add can only be called once per input. Subsequent calls will return an error.

func (*Input) Close

func (i *Input) Close() error

Closes the src Not thread safe on purpose

func (*Input) Read

func (i *Input) Read(p []byte) (n int, err error)

Read reads from the input in a thread-safe way.

type Installer

type Installer interface {
	Install(*Engine) error
}

Installer is a standard interface for objects which can "install" themselves on an engine by registering handlers. This can be used as an entrypoint for external plugins etc.

type Job

type Job struct {
	Eng  *Engine
	Name string
	Args []string

	Stdout *Output
	Stderr *Output
	Stdin  *Input
	// contains filtered or unexported fields
}

A job is the fundamental unit of work in the docker engine. Everything docker can do should eventually be exposed as a job. For example: execute a process in a container, create a new container, download an archive from the internet, serve the http api, etc.

The job API is designed after unix processes: a job has a name, arguments, environment variables, standard streams for input, output and error, and an exit status which can indicate success (0) or error (anything else).

For status, 0 indicates success, and any other integers indicates an error. This allows for richer error reporting.

func (*Job) CallString

func (job *Job) CallString() string

func (*Job) DecodeEnv

func (job *Job) DecodeEnv(src io.Reader) error

DecodeEnv decodes `src` as a json dictionary, and adds each decoded key-value pair to the environment.

If `src` cannot be decoded as a json dictionary, an error is returned.

func (*Job) EncodeEnv

func (job *Job) EncodeEnv(dst io.Writer) error

func (*Job) Env

func (job *Job) Env() *Env

func (*Job) EnvExists

func (job *Job) EnvExists(key string) (value bool)

func (*Job) Environ

func (job *Job) Environ() map[string]string

func (*Job) Error

func (job *Job) Error(err error) Status

func (*Job) Errorf

func (job *Job) Errorf(format string, args ...interface{}) Status

func (*Job) Getenv

func (job *Job) Getenv(key string) (value string)

func (*Job) GetenvBool

func (job *Job) GetenvBool(key string) (value bool)

func (*Job) GetenvInt

func (job *Job) GetenvInt(key string) int

func (*Job) GetenvInt64

func (job *Job) GetenvInt64(key string) int64

func (*Job) GetenvJson

func (job *Job) GetenvJson(key string, iface interface{}) error

func (*Job) GetenvList

func (job *Job) GetenvList(key string) []string

Returns nil if key not found

func (*Job) GetenvSubEnv

func (job *Job) GetenvSubEnv(key string) *Env

func (*Job) ImportEnv

func (job *Job) ImportEnv(src interface{}) (err error)

func (*Job) Logf

func (job *Job) Logf(format string, args ...interface{}) (n int, err error)

func (*Job) Printf

func (job *Job) Printf(format string, args ...interface{}) (n int, err error)

func (*Job) Run

func (job *Job) Run() error

Run executes the job and blocks until the job completes. If the job returns a failure status, an error is returned which includes the status.

func (*Job) SetCloseIO

func (job *Job) SetCloseIO(val bool)

func (*Job) Setenv

func (job *Job) Setenv(key, value string)

func (*Job) SetenvBool

func (job *Job) SetenvBool(key string, value bool)

func (*Job) SetenvInt

func (job *Job) SetenvInt(key string, value int)

func (*Job) SetenvInt64

func (job *Job) SetenvInt64(key string, value int64)

func (*Job) SetenvJson

func (job *Job) SetenvJson(key string, value interface{}) error

func (*Job) SetenvList

func (job *Job) SetenvList(key string, value []string) error

func (*Job) SetenvSubEnv

func (job *Job) SetenvSubEnv(key string, value *Env) error

func (*Job) StatusCode

func (job *Job) StatusCode() int

func (*Job) StatusString

func (job *Job) StatusString() string

func (*Job) String

func (job *Job) String() string

String returns a human-readable description of `job`

type Output

type Output struct {
	sync.Mutex
	// contains filtered or unexported fields
}

func NewOutput

func NewOutput() *Output

NewOutput returns a new Output object with no destinations attached. Writing to an empty Output will cause the written data to be discarded.

func (*Output) Add

func (o *Output) Add(dst io.Writer)

Add attaches a new destination to the Output. Any data subsequently written to the output will be written to the new destination in addition to all the others. This method is thread-safe.

func (*Output) AddEnv

func (o *Output) AddEnv() (dst *Env, err error)

AddEnv starts a new goroutine which will decode all subsequent data as a stream of json-encoded objects, and point `dst` to the last decoded object. The result `env` can be queried using the type-neutral Env interface. It is not safe to query `env` until the Output is closed.

func (*Output) AddListTable

func (o *Output) AddListTable() (dst *Table, err error)

func (*Output) AddPipe

func (o *Output) AddPipe() (io.Reader, error)

AddPipe creates an in-memory pipe with io.Pipe(), adds its writing end as a destination, and returns its reading end for consumption by the caller. This is a rough equivalent similar to Cmd.StdoutPipe() in the standard os/exec package. This method is thread-safe.

func (*Output) AddTable

func (o *Output) AddTable() (dst *Table, err error)

func (*Output) Close

func (o *Output) Close() error

Close unregisters all destinations and waits for all background AddTail and AddString tasks to complete. The Close method of each destination is called if it exists.

func (*Output) Set

func (o *Output) Set(dst io.Writer)

Set closes and remove existing destination and then attaches a new destination to the Output. Any data subsequently written to the output will be written to the new destination in addition to all the others. This method is thread-safe.

func (*Output) Used

func (o *Output) Used() bool

Return true if something was written on this output

func (*Output) Write

func (o *Output) Write(p []byte) (n int, err error)

Write writes the same data to all registered destinations. This method is thread-safe.

type Status

type Status int
const (
	StatusOK       Status = 0
	StatusErr      Status = 1
	StatusNotFound Status = 127
)

type Table

type Table struct {
	Data []*Env

	Chan chan *Env
	// contains filtered or unexported fields
}

func NewTable

func NewTable(sortKey string, sizeHint int) *Table

func (*Table) Add

func (t *Table) Add(env *Env)

func (*Table) Len

func (t *Table) Len() int

func (*Table) Less

func (t *Table) Less(a, b int) bool

func (*Table) ReadFrom

func (t *Table) ReadFrom(src io.Reader) (n int64, err error)

func (*Table) ReadListFrom

func (t *Table) ReadListFrom(src []byte) (n int64, err error)

func (*Table) ReverseSort

func (t *Table) ReverseSort()

func (*Table) SetKey

func (t *Table) SetKey(sortKey string)

func (*Table) Sort

func (t *Table) Sort()

func (*Table) Swap

func (t *Table) Swap(a, b int)

func (*Table) ToListString

func (t *Table) ToListString() (string, error)

func (*Table) WriteListTo

func (t *Table) WriteListTo(dst io.Writer) (n int64, err error)

func (*Table) WriteTo

func (t *Table) WriteTo(dst io.Writer) (n int64, err error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL