execution/oci: use Status type instead of string
Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
This commit is contained in:
parent
7dd69a8597
commit
abaa421141
8 changed files with 56 additions and 44 deletions
|
@ -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
7
execution/error.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package execution
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrProcessNotFound = fmt.Errorf("process not found")
|
||||||
|
)
|
|
@ -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),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in a new issue