The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/crio-lxc/pull/19

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
if the container has been created with a 'create' call, but not started yet, even if we have a running underlying container, we need to report 'created' instead of 'running' or 'stopped'.

detect this case by always getting the PID if the container's running, and then using /proc/$initpid/task/$initpid/children, check for a single child running our fifo-waiter.

If that's the case, we are 'created'.

Adds this to the tests.
From 09a48901b62ed46ffdc5ce15de343dfb828a7dbc Mon Sep 17 00:00:00 2001
From: Michael McCracken <mikmc...@cisco.com>
Date: Wed, 29 Jan 2020 14:07:40 -0800
Subject: [PATCH 1/2] state: support 'created' status for containers waiting on
 fifo

per the spec, a container that has been created but has not been
started by a separate call, should return status 'created', not
'running', despite its actual underlying container process being up
and running.

Do this by getting the child PID of the init task and reading its
cmdline. if the cmdline is our fifo-waiter, we're 'created'.

Signed-off-by: Michael McCracken <mikmc...@cisco.com>
---
 cmd/state.go     | 44 ++++++++++++++++++++++++++++++++++++++------
 test/manual.bats |  8 ++++++++
 2 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/cmd/state.go b/cmd/state.go
index 6bea455..6494752 100644
--- a/cmd/state.go
+++ b/cmd/state.go
@@ -3,10 +3,13 @@ package main
 import (
        "encoding/json"
        "fmt"
+       "io/ioutil"
        "os"
        "path/filepath"
+       "strconv"
+       "strings"
 
-       //      "github.com/apex/log"
+       // "github.com/apex/log"
        "github.com/opencontainers/runtime-spec/specs-go"
        "github.com/pkg/errors"
        "github.com/urfave/cli"
@@ -51,14 +54,43 @@ func doState(ctx *cli.Context) error {
 
        }
 
-       // TODO need to detect 'created' per
-       // 
https://github.com/opencontainers/runtime-spec/blob/v1.0.0-rc4/runtime.md#state
-       // it means "the container process has neither exited nor executed the 
user-specified program"
        status := "stopped"
        pid := 0
-       if c.Running() && checkHackyPreStart(c) == "started" {
-               status = "running"
+       if c.Running() {
+               if checkHackyPreStart(c) == "started" {
+                       status = "running"
+               }
                pid = c.InitPid()
+
+               // need to detect 'created' per
+               // 
https://github.com/opencontainers/runtime-spec/blob/v1.0.0-rc4/runtime.md#state
+               // it means "the container process has neither exited nor 
executed the user-specified program"
+
+               // if cmd name of the child of the init pid starts with 
"/bin/sh /fifo-wait" then we can say it's 'created'
+
+               procChildrenFilename := 
fmt.Sprintf("/proc/%d/task/%d/children", pid, pid)
+               childrenStr, err := ioutil.ReadFile(procChildrenFilename)
+               if err != nil {
+                       return errors.Wrapf(err, "failed to read children from 
%s", procChildrenFilename)
+               }
+               children := 
strings.Split(strings.TrimSpace(string(childrenStr)), " ")
+
+               if len(children) == 1 {
+                       childPid, err := strconv.Atoi(children[0])
+                       if err != nil {
+                               return errors.Wrapf(err, "failed to convert 
child pid")
+                       }
+                       procCmdlineFilename := fmt.Sprintf("/proc/%d/cmdline", 
childPid)
+                       cmdline, err := ioutil.ReadFile(procCmdlineFilename)
+                       if err != nil {
+                               return errors.Wrapf(err, "failed to read 
cmdline from %s", procCmdlineFilename)
+                       }
+
+                       cmdArgv := strings.Split(string(cmdline), "\x00")
+                       if len(cmdArgv) > 2 && cmdArgv[0] == "/bin/sh" && 
cmdArgv[1] == "/fifo-wait" {
+                               status = "created"
+                       }
+               }
        }
        // bundlePath is the enclosing directory of the rootfs:
        // 
https://github.com/opencontainers/runtime-spec/blob/v1.0.0-rc4/bundle.md
diff --git a/test/manual.bats b/test/manual.bats
index 265e1fb..c4f9ae0 100644
--- a/test/manual.bats
+++ b/test/manual.bats
@@ -16,7 +16,15 @@ function teardown() {
 
 @test "manual invocation" {
     crio-lxc --debug --log-level trace --log-file "$TEMP_DIR/log" create 
--bundle "$TEMP_DIR/dest" --pid-file "$TEMP_DIR/pid" alpine
+
+    status=$(crio-lxc --debug --log-level trace --log-file "$TEMP_DIR/log" 
state alpine | jq -r .status)
+    [ $status = "created" ]
+
     crio-lxc --debug --log-level trace --log-file "$TEMP_DIR/log" start alpine
+
+    status=$(crio-lxc --debug --log-level trace --log-file "$TEMP_DIR/log" 
state alpine | jq -r .status)
+    [ $status = "running" ]
+
     pid1ipcnsinode=$(stat -L -c%i /proc/1/ns/ipc)
     mypid=$(<"$TEMP_DIR/pid")
     mypidipcnsinode=$(stat -L -c%i "/proc/$mypid/ns/ipc")

From 4d97b140a3f5fd5c033d1a72bbf5c9eeceab24a6 Mon Sep 17 00:00:00 2001
From: Michael McCracken <mikmc...@cisco.com>
Date: Wed, 29 Jan 2020 14:10:00 -0800
Subject: [PATCH 2/2] test helper: support flag file for keeping temp dirs
 while debugging

Signed-off-by: Michael McCracken <mikmc...@cisco.com>
---
 test/helpers.bash | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/helpers.bash b/test/helpers.bash
index a6e2cf7..2bba1b2 100644
--- a/test/helpers.bash
+++ b/test/helpers.bash
@@ -47,7 +47,7 @@ function cleanup_crio {
 }
 
 function cleanup_tempdir {
-    rm -rf "$TEMP_DIR" || true
+    [ -f .keeptempdirs ] || rm -rf "$TEMP_DIR" || true
 }
 
 function crictl {
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to