engine

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Jan 22, 2015 License: Apache-2.0 Imports: 15 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) Logf

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

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)

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).

One slight variation is that jobs report their status as a string. The string "0" indicates success, and any other strings 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) 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