Merge pull request #272 from amshinde/pass-bundle-in-hooks

hooks: Send the bundle path in the state that is sent with hooks
This commit is contained in:
Sebastien Boeuf 2018-04-30 07:28:27 -07:00 committed by GitHub
commit e78941e3e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 72 additions and 27 deletions

View File

@ -142,7 +142,7 @@ func startSandbox(p *Sandbox) (*Sandbox, error) {
} }
// Execute poststart hooks. // Execute poststart hooks.
if err := p.config.Hooks.postStartHooks(); err != nil { if err := p.config.Hooks.postStartHooks(p); err != nil {
return nil, err return nil, err
} }
@ -180,7 +180,7 @@ func StopSandbox(sandboxID string) (VCSandbox, error) {
} }
// Execute poststop hooks. // Execute poststop hooks.
if err := p.config.Hooks.postStopHooks(); err != nil { if err := p.config.Hooks.postStopHooks(p); err != nil {
return nil, err return nil, err
} }

View File

@ -14,6 +14,7 @@ import (
"syscall" "syscall"
"time" "time"
vcAnnotations "github.com/kata-containers/runtime/virtcontainers/pkg/annotations"
specs "github.com/opencontainers/runtime-spec/specs-go" specs "github.com/opencontainers/runtime-spec/specs-go"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -38,14 +39,17 @@ func (h *Hooks) Logger() *logrus.Entry {
return virtLog.WithField("subsystem", "hooks") return virtLog.WithField("subsystem", "hooks")
} }
func buildHookState(processID int) specs.State { func buildHookState(processID int, s *Sandbox) specs.State {
annotations := s.GetAnnotations()
return specs.State{ return specs.State{
Pid: processID, Pid: processID,
Bundle: annotations[vcAnnotations.BundlePathKey],
ID: s.id,
} }
} }
func (h *Hook) runHook() error { func (h *Hook) runHook(s *Sandbox) error {
state := buildHookState(os.Getpid()) state := buildHookState(os.Getpid(), s)
stateJSON, err := json.Marshal(state) stateJSON, err := json.Marshal(state)
if err != nil { if err != nil {
return err return err
@ -95,13 +99,13 @@ func (h *Hook) runHook() error {
return nil return nil
} }
func (h *Hooks) preStartHooks() error { func (h *Hooks) preStartHooks(s *Sandbox) error {
if len(h.PreStartHooks) == 0 { if len(h.PreStartHooks) == 0 {
return nil return nil
} }
for _, hook := range h.PreStartHooks { for _, hook := range h.PreStartHooks {
err := hook.runHook() err := hook.runHook(s)
if err != nil { if err != nil {
h.Logger().WithFields(logrus.Fields{ h.Logger().WithFields(logrus.Fields{
"hook-type": "pre-start", "hook-type": "pre-start",
@ -115,13 +119,13 @@ func (h *Hooks) preStartHooks() error {
return nil return nil
} }
func (h *Hooks) postStartHooks() error { func (h *Hooks) postStartHooks(s *Sandbox) error {
if len(h.PostStartHooks) == 0 { if len(h.PostStartHooks) == 0 {
return nil return nil
} }
for _, hook := range h.PostStartHooks { for _, hook := range h.PostStartHooks {
err := hook.runHook() err := hook.runHook(s)
if err != nil { if err != nil {
// In case of post start hook, the error is not fatal, // In case of post start hook, the error is not fatal,
// just need to be logged. // just need to be logged.
@ -135,13 +139,13 @@ func (h *Hooks) postStartHooks() error {
return nil return nil
} }
func (h *Hooks) postStopHooks() error { func (h *Hooks) postStopHooks(s *Sandbox) error {
if len(h.PostStopHooks) == 0 { if len(h.PostStopHooks) == 0 {
return nil return nil
} }
for _, hook := range h.PostStopHooks { for _, hook := range h.PostStopHooks {
err := hook.runHook() err := hook.runHook(s)
if err != nil { if err != nil {
// In case of post stop hook, the error is not fatal, // In case of post stop hook, the error is not fatal,
// just need to be logged. // just need to be logged.

View File

@ -10,8 +10,10 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"reflect" "reflect"
"sync"
"testing" "testing"
vcAnnotations "github.com/kata-containers/runtime/virtcontainers/pkg/annotations"
. "github.com/kata-containers/runtime/virtcontainers/pkg/mock" . "github.com/kata-containers/runtime/virtcontainers/pkg/mock"
specs "github.com/opencontainers/runtime-spec/specs-go" specs "github.com/opencontainers/runtime-spec/specs-go"
) )
@ -22,6 +24,7 @@ var testContainerIDHook = "test-container-id"
var testControllerIDHook = "test-controller-id" var testControllerIDHook = "test-controller-id"
var testProcessIDHook = 12345 var testProcessIDHook = 12345
var testBinHookPath = "/usr/bin/virtcontainers/bin/test/hook" var testBinHookPath = "/usr/bin/virtcontainers/bin/test/hook"
var testBundlePath = "/test/bundle"
func getMockHookBinPath() string { func getMockHookBinPath() string {
if DefaultMockHookBinPath == "" { if DefaultMockHookBinPath == "" {
@ -32,15 +35,32 @@ func getMockHookBinPath() string {
} }
func TestBuildHookState(t *testing.T) { func TestBuildHookState(t *testing.T) {
t.Skip()
expected := specs.State{ expected := specs.State{
Pid: testProcessIDHook, Pid: testProcessIDHook,
} }
hookState := buildHookState(testProcessIDHook) s := &Sandbox{}
hookState := buildHookState(testProcessIDHook, s)
if reflect.DeepEqual(hookState, expected) == false { if reflect.DeepEqual(hookState, expected) == false {
t.Fatal() t.Fatal()
} }
s = createTestSandbox()
hookState = buildHookState(testProcessIDHook, s)
expected = specs.State{
Pid: testProcessIDHook,
Bundle: testBundlePath,
ID: testSandboxID,
}
if reflect.DeepEqual(hookState, expected) == false {
t.Fatal()
}
} }
func createHook(timeout int) *Hook { func createHook(timeout int) *Hook {
@ -60,10 +80,24 @@ func createWrongHook() *Hook {
} }
} }
func createTestSandbox() *Sandbox {
c := &SandboxConfig{
Annotations: map[string]string{
vcAnnotations.BundlePathKey: testBundlePath,
},
}
return &Sandbox{
annotationsLock: &sync.RWMutex{},
config: c,
id: testSandboxID,
}
}
func testRunHookFull(t *testing.T, timeout int, expectFail bool) { func testRunHookFull(t *testing.T, timeout int, expectFail bool) {
hook := createHook(timeout) hook := createHook(timeout)
err := hook.runHook() s := createTestSandbox()
err := hook.runHook(s)
if expectFail { if expectFail {
if err == nil { if err == nil {
t.Fatal("unexpected success") t.Fatal("unexpected success")
@ -91,8 +125,9 @@ func TestRunHookTimeout(t *testing.T) {
func TestRunHookExitFailure(t *testing.T) { func TestRunHookExitFailure(t *testing.T) {
hook := createWrongHook() hook := createWrongHook()
s := createTestSandbox()
err := hook.runHook() err := hook.runHook(s)
if err == nil { if err == nil {
t.Fatal() t.Fatal()
} }
@ -103,7 +138,9 @@ func TestRunHookTimeoutFailure(t *testing.T) {
hook.Args = append(hook.Args, "2") hook.Args = append(hook.Args, "2")
err := hook.runHook() s := createTestSandbox()
err := hook.runHook(s)
if err == nil { if err == nil {
t.Fatal() t.Fatal()
} }
@ -113,8 +150,9 @@ func TestRunHookWaitFailure(t *testing.T) {
hook := createHook(60) hook := createHook(60)
hook.Args = append(hook.Args, "1", "panic") hook.Args = append(hook.Args, "1", "panic")
s := createTestSandbox()
err := hook.runHook() err := hook.runHook(s)
if err == nil { if err == nil {
t.Fatal() t.Fatal()
} }
@ -156,18 +194,19 @@ func testHooks(t *testing.T, hook *Hook) {
PostStartHooks: []Hook{*hook}, PostStartHooks: []Hook{*hook},
PostStopHooks: []Hook{*hook}, PostStopHooks: []Hook{*hook},
} }
s := createTestSandbox()
err := hooks.preStartHooks() err := hooks.preStartHooks(s)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
err = hooks.postStartHooks() err = hooks.postStartHooks(s)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
err = hooks.postStopHooks() err = hooks.postStopHooks(s)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -179,18 +218,19 @@ func testFailingHooks(t *testing.T, hook *Hook) {
PostStartHooks: []Hook{*hook}, PostStartHooks: []Hook{*hook},
PostStopHooks: []Hook{*hook}, PostStopHooks: []Hook{*hook},
} }
s := createTestSandbox()
err := hooks.preStartHooks() err := hooks.preStartHooks(s)
if err == nil { if err == nil {
t.Fatal(err) t.Fatal(err)
} }
err = hooks.postStartHooks() err = hooks.postStartHooks(s)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
err = hooks.postStopHooks() err = hooks.postStopHooks(s)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -210,18 +250,19 @@ func TestFailingHooks(t *testing.T) {
func TestEmptyHooks(t *testing.T) { func TestEmptyHooks(t *testing.T) {
hooks := &Hooks{} hooks := &Hooks{}
s := createTestSandbox()
err := hooks.preStartHooks() err := hooks.preStartHooks(s)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
err = hooks.postStartHooks() err = hooks.postStartHooks(s)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
err = hooks.postStopHooks() err = hooks.postStopHooks(s)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -820,7 +820,7 @@ func (s *Sandbox) createNetwork() error {
// Execute prestart hooks inside netns // Execute prestart hooks inside netns
if err := s.network.run(netNsPath, func() error { if err := s.network.run(netNsPath, func() error {
return s.config.Hooks.preStartHooks() return s.config.Hooks.preStartHooks(s)
}); err != nil { }); err != nil {
return err return err
} }