mirror of
https://github.com/containers/podman.git
synced 2025-07-02 00:30:00 +08:00
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
This commit is contained in:

committed by
Atomic Bot

parent
28d1cec9f6
commit
c9f763456c
80
libpod/container_internal_test.go
Normal file
80
libpod/container_internal_test.go
Normal file
@ -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")
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user