diff options
author | W. Trevor King <wking@tremily.us> | 2018-05-31 11:47:17 -0700 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-06-04 18:36:40 +0000 |
commit | c9f763456cd8263c3f2d84c6b2b6e17ad81cf3ba (patch) | |
tree | b1cffd82978145f372893f62754432d75003b31d /libpod/container_internal_test.go | |
parent | 28d1cec9f64cca11d42410c6e33c43b01b1d7678 (diff) | |
download | podman-c9f763456cd8263c3f2d84c6b2b6e17ad81cf3ba.tar.gz podman-c9f763456cd8263c3f2d84c6b2b6e17ad81cf3ba.tar.bz2 podman-c9f763456cd8263c3f2d84c6b2b6e17ad81cf3ba.zip |
libpod: Execute poststop hooks locally
Instead of delegating to the runtime, since some runtimes do not seem
to handle these reliably [1].
[1]: https://github.com/projectatomic/libpod/issues/730#issuecomment-392959938
Signed-off-by: W. Trevor King <wking@tremily.us>
Closes: #864
Approved by: rhatdan
Diffstat (limited to 'libpod/container_internal_test.go')
-rw-r--r-- | libpod/container_internal_test.go | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/libpod/container_internal_test.go b/libpod/container_internal_test.go new file mode 100644 index 000000000..78891a672 --- /dev/null +++ b/libpod/container_internal_test.go @@ -0,0 +1,80 @@ +package libpod + +import ( + "context" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "testing" + + rspec "github.com/opencontainers/runtime-spec/specs-go" + "github.com/stretchr/testify/assert" +) + +// hookPath is the path to an example hook executable. +var hookPath string + +func TestPostDeleteHooks(t *testing.T) { + ctx := context.Background() + dir, err := ioutil.TempDir("", "libpod_test_") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + + statePath := filepath.Join(dir, "state") + copyPath := filepath.Join(dir, "copy") + c := Container{ + config: &ContainerConfig{ + ID: "123abc", + Spec: &rspec.Spec{ + Annotations: map[string]string{ + "a": "b", + }, + }, + StaticDir: dir, // not the bundle, but good enough for this test + }, + state: &containerState{ + ExtensionStageHooks: map[string][]rspec.Hook{ + "poststop": { + rspec.Hook{ + Path: hookPath, + Args: []string{"sh", "-c", fmt.Sprintf("cat >%s", statePath)}, + }, + rspec.Hook{ + Path: "/does/not/exist", + }, + rspec.Hook{ + Path: hookPath, + Args: []string{"sh", "-c", fmt.Sprintf("cp %s %s", statePath, copyPath)}, + }, + }, + }, + }, + } + err = c.postDeleteHooks(ctx) + if err != nil { + t.Fatal(err) + } + + stateRegexp := "{\"ociVersion\":\"1\\.0\\.0\",\"id\":\"123abc\",\"status\":\"stopped\",\"bundle\":\"/tmp/libpod_test_[0-9]*\",\"annotations\":{\"a\":\"b\"}}" + for _, path := range []string{statePath, copyPath} { + t.Run(path, func(t *testing.T) { + content, err := ioutil.ReadFile(path) + if err != nil { + t.Fatal(err) + } + assert.Regexp(t, stateRegexp, string(content)) + }) + } +} + +func init() { + if runtime.GOOS != "windows" { + hookPath = "/bin/sh" + } else { + panic("we need a reliable executable path on Windows") + } +} |