Add procesStates for shim processes

Use the state pattern to handle process transitions from one state to
another and what actions can be performed on a process in a specific
state.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
Michael Crosby
2017-08-24 16:27:35 -04:00
parent a6ce1ef2a1
commit 967497097a
7 changed files with 716 additions and 108 deletions

View File

@@ -8,6 +8,7 @@ import (
"time"
"github.com/containerd/console"
"github.com/pkg/errors"
)
type stdio struct {
@@ -22,28 +23,49 @@ func (s stdio) isNull() bool {
}
type process interface {
processState
// ID returns the id for the process
ID() string
// Pid returns the pid for the process
Pid() int
// Resize resizes the process console
Resize(ws console.WinSize) error
// SetExited sets the exit status for the process
SetExited(status int)
// ExitStatus returns the exit status
ExitStatus() int
// ExitedAt is the time the process exited
ExitedAt() time.Time
// Delete deletes the process and its resourcess
Delete(context.Context) error
// Stdin returns the process STDIN
Stdin() io.Closer
// Kill kills the process
Kill(context.Context, uint32, bool) error
// Stdio returns io information for the container
Stdio() stdio
// Start execution of the process
Start(context.Context) error
// Status returns the process status
Status(ctx context.Context) (string, error)
}
type processState interface {
// Resize resizes the process console
Resize(ws console.WinSize) error
// Start execution of the process
Start(context.Context) error
// Delete deletes the process and its resourcess
Delete(context.Context) error
// Kill kills the process
Kill(context.Context, uint32, bool) error
// SetExited sets the exit status for the process
SetExited(status int)
}
func stateName(v interface{}) string {
switch v.(type) {
case *runningState, *execRunningState:
return "running"
case *createdState, *execCreatedState:
return "created"
case *pausedState:
return "paused"
case *deletedState:
return "deleted"
case *stoppedState:
return "stopped"
}
panic(errors.Errorf("invalid state %v", v))
}