execution/oci: use Status type instead of string

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
This commit is contained in:
Kenfe-Mickael Laventure 2016-12-14 19:10:35 -08:00
parent 7dd69a8597
commit abaa421141
8 changed files with 56 additions and 44 deletions

View file

@ -11,12 +11,12 @@ func NewContainer(stateRoot, id, bundle string) (*Container, error) {
id: id, id: id,
bundle: bundle, bundle: bundle,
stateDir: stateDir, stateDir: stateDir,
status: "created", status: Created,
processes: make(map[string]Process), processes: make(map[string]Process),
}, nil }, nil
} }
func LoadContainer(dir StateDir, id, bundle, status string, initPid int64) *Container { func LoadContainer(dir StateDir, id, bundle string, status Status, initPid int64) *Container {
return &Container{ return &Container{
id: id, id: id,
stateDir: dir, stateDir: dir,
@ -32,7 +32,7 @@ type Container struct {
bundle string bundle string
stateDir StateDir stateDir StateDir
initPid int64 initPid int64
status string status Status
processes map[string]Process processes map[string]Process
} }
@ -41,7 +41,7 @@ func (c *Container) ID() string {
return c.id return c.id
} }
func (c *Container) Status() string { func (c *Container) Status() Status {
return c.status return c.status
} }

7
execution/error.go Normal file
View file

@ -0,0 +1,7 @@
package execution
import "fmt"
var (
ErrProcessNotFound = fmt.Errorf("process not found")
)

View file

@ -113,7 +113,7 @@ func (r *OCIRuntime) load(runcC *runc.Container) (*execution.Container, error) {
execution.StateDir(filepath.Join(r.root, runcC.ID)), execution.StateDir(filepath.Join(r.root, runcC.ID)),
runcC.ID, runcC.ID,
runcC.Bundle, runcC.Bundle,
runcC.Status, execution.Status(runcC.Status),
int64(runcC.Pid), int64(runcC.Pid),
) )

View file

@ -1,6 +1,7 @@
package oci package oci
import ( import (
"fmt"
"os" "os"
"syscall" "syscall"
@ -8,21 +9,27 @@ import (
) )
func newProcess(c *execution.Container, id string, pid int) (execution.Process, error) { func newProcess(c *execution.Container, id string, pid int) (execution.Process, error) {
proc, err := os.FindProcess(pid) status := execution.Running
if err != nil { if err := syscall.Kill(pid, 0); err != nil {
return nil, err if err == syscall.ESRCH {
status = execution.Stopped
} else {
return nil, err
}
} }
return &process{ return &process{
c: c, c: c,
id: id, id: id,
proc: proc, pid: pid,
status: status,
}, nil }, nil
} }
type process struct { type process struct {
c *execution.Container c *execution.Container
id string id string
proc *os.Process pid int
status execution.Status
} }
func (p *process) Container() *execution.Container { func (p *process) Container() *execution.Container {
@ -34,18 +41,35 @@ func (p *process) ID() string {
} }
func (p *process) Pid() int64 { func (p *process) Pid() int64 {
return int64(p.proc.Pid) return int64(p.pid)
} }
func (p *process) Wait() (uint32, error) { func (p *process) Wait() (uint32, error) {
state, err := p.proc.Wait() if p.status == execution.Running {
if err != nil { var wstatus syscall.WaitStatus
return 0, nil _, err := syscall.Wait4(p.pid, &wstatus, 0, nil)
if err != nil {
return 255, nil
}
// TODO: implement kill-all if we are the init pid
p.status = execution.Stopped
return uint32(wstatus.ExitStatus()), nil
} }
// TODO: implement kill-all if we are the init pid
return uint32(state.Sys().(syscall.WaitStatus).ExitStatus()), nil return 255, execution.ErrProcessNotFound
} }
func (p *process) Signal(s os.Signal) error { func (p *process) Signal(s os.Signal) error {
return p.proc.Signal(s) if p.status == execution.Running {
sig, ok := s.(syscall.Signal)
if !ok {
return fmt.Errorf("invalid signal %v", s)
}
return syscall.Kill(p.pid, sig)
}
return execution.ErrProcessNotFound
}
func (p *process) Status() execution.Status {
return p.status
} }

View file

@ -1,19 +0,0 @@
package execution
import (
"context"
"github.com/docker/containerd/log"
"github.com/sirupsen/logrus"
)
var ctx context.Context
func GetLogger(module string) *logrus.Entry {
if ctx == nil {
ctx = log.WithModule(context.Background(), "execution")
}
subCtx := log.WithModule(ctx, module)
return log.GetLogger(subCtx)
}

View file

@ -9,4 +9,5 @@ type Process interface {
//Spec() *specs.Process //Spec() *specs.Process
Wait() (uint32, error) Wait() (uint32, error)
Signal(os.Signal) error Signal(os.Signal) error
Status() Status
} }

View file

@ -13,8 +13,7 @@ import (
) )
var ( var (
emptyResponse = &google_protobuf.Empty{} emptyResponse = &google_protobuf.Empty{}
ErrProcessNotFound = fmt.Errorf("Process not found")
) )
func New(executor Executor) (*Service, error) { func New(executor Executor) (*Service, error) {
@ -24,8 +23,7 @@ func New(executor Executor) (*Service, error) {
} }
type Service struct { type Service struct {
executor Executor executor Executor
supervisor *Supervisor
} }
func (s *Service) Create(ctx context.Context, r *api.CreateContainerRequest) (*api.CreateContainerResponse, error) { func (s *Service) Create(ctx context.Context, r *api.CreateContainerRequest) (*api.CreateContainerResponse, error) {

View file

@ -3,6 +3,7 @@ package execution
type Status string type Status string
const ( const (
Created Status = "created"
Paused Status = "paused" Paused Status = "paused"
Running Status = "running" Running Status = "running"
Stopped Status = "stopped" Stopped Status = "stopped"