Bugfix: ctr container list can not get the proper status of container

Prior to this patch, when list containers by "ctr containers" or
"ctr containers xxx", it will not get the proper status of conatinser(s).

That was caused by the wrong implementation of State() for structure process,
it only send a signal "0" to ping the "init" process and do nothing.

Since the OCI/runc has implemented an interface Status(), we can use that.
And I think this is more compatible with the design for containerd:
- containerd -> runtime -> fun()

Signed-off-by: Hu Keping <hukeping@huawei.com>
This commit is contained in:
HuKeping 2016-04-22 17:42:08 -04:00
parent 40d42a1aac
commit ca7c504068
2 changed files with 21 additions and 2 deletions

View file

@ -146,7 +146,11 @@ func createAPIContainer(c runtime.Container, getPids bool) (*types.Container, er
procs = append(procs, appendToProcs) procs = append(procs, appendToProcs)
} }
var pids []int var pids []int
state := c.State() state, err := c.Status()
if err != nil {
return nil, grpc.Errorf(codes.Internal, "get status for container: "+err.Error())
}
if getPids && (state == runtime.Running || state == runtime.Paused) { if getPids && (state == runtime.Running || state == runtime.Paused) {
if pids, err = c.Pids(); err != nil { if pids, err = c.Pids(); err != nil {
return nil, grpc.Errorf(codes.Internal, "get all pids for container: "+err.Error()) return nil, grpc.Errorf(codes.Internal, "get all pids for container: "+err.Error())

View file

@ -286,7 +286,22 @@ func (c *container) Stats() (*Stat, error) {
// Status implements the runtime Container interface. // Status implements the runtime Container interface.
func (c *container) Status() (State, error) { func (c *container) Status() (State, error) {
return "running", nil args := c.runtimeArgs
args = append(args, "state", c.id)
out, err := exec.Command(c.runtime, args...).CombinedOutput()
if err != nil {
return "", fmt.Errorf(string(out))
}
// We only require the runtime json output to have a top level Status field.
var s struct {
Status State `json:"status"`
}
if err := json.Unmarshal(out, &s); err != nil {
return "", err
}
return s.Status, nil
} }
func (c *container) OOM() (OOM, error) { func (c *container) OOM() (OOM, error) {