mirror of
https://github.com/opencontainers/runc.git
synced 2025-10-05 23:46:57 +08:00
libct: better errors for hooks
When a hook has failed, the error message looks like this: > error running hook: error running hook #1: exit status 1, stdout: ... The two problems here are: 1. it is impossible to know what kind of hook it was; 2. "error running hook" stuttering; Change that to > error running createContainer hook #1: exit status 1, stdout: ... Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
This commit is contained in:
@@ -285,6 +285,7 @@ type Capabilities struct {
|
|||||||
Ambient []string
|
Ambient []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: use (Hooks).Run instead.
|
||||||
func (hooks HookList) RunHooks(state *specs.State) error {
|
func (hooks HookList) RunHooks(state *specs.State) error {
|
||||||
for i, h := range hooks {
|
for i, h := range hooks {
|
||||||
if err := h.Run(state); err != nil {
|
if err := h.Run(state); err != nil {
|
||||||
@@ -341,6 +342,18 @@ func (hooks *Hooks) MarshalJSON() ([]byte, error) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Run executes all hooks for the given hook name.
|
||||||
|
func (hooks Hooks) Run(name HookName, state *specs.State) error {
|
||||||
|
list := hooks[name]
|
||||||
|
for i, h := range list {
|
||||||
|
if err := h.Run(state); err != nil {
|
||||||
|
return fmt.Errorf("error running %s hook #%d: %w", name, i, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type Hook interface {
|
type Hook interface {
|
||||||
// Run executes the hook with the provided state.
|
// Run executes the hook with the provided state.
|
||||||
Run(*specs.State) error
|
Run(*specs.State) error
|
||||||
@@ -401,7 +414,7 @@ func (c Command) Run(s *specs.State) error {
|
|||||||
go func() {
|
go func() {
|
||||||
err := cmd.Wait()
|
err := cmd.Wait()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("error running hook: %w, stdout: %s, stderr: %s", err, stdout.String(), stderr.String())
|
err = fmt.Errorf("%w, stdout: %s, stderr: %s", err, stdout.String(), stderr.String())
|
||||||
}
|
}
|
||||||
errC <- err
|
errC <- err
|
||||||
}()
|
}()
|
||||||
|
@@ -341,7 +341,7 @@ func (c *Container) start(process *Process) (retErr error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := c.config.Hooks[configs.Poststart].RunHooks(s); err != nil {
|
if err := c.config.Hooks.Run(configs.Poststart, s); err != nil {
|
||||||
if err := ignoreTerminateErrors(parent.terminate()); err != nil {
|
if err := ignoreTerminateErrors(parent.terminate()); err != nil {
|
||||||
logrus.Warn(fmt.Errorf("error running poststart hook: %w", err))
|
logrus.Warn(fmt.Errorf("error running poststart hook: %w", err))
|
||||||
}
|
}
|
||||||
|
@@ -1134,10 +1134,10 @@ func (c *Container) criuNotifications(resp *criurpc.CriuResp, process *Process,
|
|||||||
}
|
}
|
||||||
s.Pid = int(notify.GetPid())
|
s.Pid = int(notify.GetPid())
|
||||||
|
|
||||||
if err := c.config.Hooks[configs.Prestart].RunHooks(s); err != nil {
|
if err := c.config.Hooks.Run(configs.Prestart, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := c.config.Hooks[configs.CreateRuntime].RunHooks(s); err != nil {
|
if err := c.config.Hooks.Run(configs.CreateRuntime, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -536,10 +536,10 @@ func (p *initProcess) start() (retErr error) {
|
|||||||
s.Status = specs.StateCreating
|
s.Status = specs.StateCreating
|
||||||
hooks := p.config.Config.Hooks
|
hooks := p.config.Config.Hooks
|
||||||
|
|
||||||
if err := hooks[configs.Prestart].RunHooks(s); err != nil {
|
if err := hooks.Run(configs.Prestart, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := hooks[configs.CreateRuntime].RunHooks(s); err != nil {
|
if err := hooks.Run(configs.CreateRuntime, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -590,10 +590,10 @@ func (p *initProcess) start() (retErr error) {
|
|||||||
s.Status = specs.StateCreating
|
s.Status = specs.StateCreating
|
||||||
hooks := p.config.Config.Hooks
|
hooks := p.config.Config.Hooks
|
||||||
|
|
||||||
if err := hooks[configs.Prestart].RunHooks(s); err != nil {
|
if err := hooks.Run(configs.Prestart, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := hooks[configs.CreateRuntime].RunHooks(s); err != nil {
|
if err := hooks.Run(configs.CreateRuntime, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -143,7 +143,7 @@ func prepareRootfs(pipe *os.File, iConfig *initConfig, mountFds mountFds) (err e
|
|||||||
s := iConfig.SpecState
|
s := iConfig.SpecState
|
||||||
s.Pid = unix.Getpid()
|
s.Pid = unix.Getpid()
|
||||||
s.Status = specs.StateCreating
|
s.Status = specs.StateCreating
|
||||||
if err := iConfig.Config.Hooks[configs.CreateContainer].RunHooks(s); err != nil {
|
if err := iConfig.Config.Hooks.Run(configs.CreateContainer, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -258,7 +258,7 @@ func (l *linuxStandardInit) Init() error {
|
|||||||
s := l.config.SpecState
|
s := l.config.SpecState
|
||||||
s.Pid = unix.Getpid()
|
s.Pid = unix.Getpid()
|
||||||
s.Status = specs.StateCreated
|
s.Status = specs.StateCreated
|
||||||
if err := l.config.Config.Hooks[configs.StartContainer].RunHooks(s); err != nil {
|
if err := l.config.Config.Hooks.Run(configs.StartContainer, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -64,11 +64,7 @@ func runPoststopHooks(c *Container) error {
|
|||||||
}
|
}
|
||||||
s.Status = specs.StateStopped
|
s.Status = specs.StateStopped
|
||||||
|
|
||||||
if err := hooks[configs.Poststop].RunHooks(s); err != nil {
|
return hooks.Run(configs.Poststop, s)
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// stoppedState represents a container is a stopped/destroyed state.
|
// stoppedState represents a container is a stopped/destroyed state.
|
||||||
|
@@ -182,6 +182,6 @@ function flags_value() {
|
|||||||
|
|
||||||
runc run test_busybox
|
runc run test_busybox
|
||||||
[ "$status" -ne 0 ]
|
[ "$status" -ne 0 ]
|
||||||
[[ "$output" == *"error running hook"* ]]
|
[[ "$output" == *"error running startContainer hook"* ]]
|
||||||
[[ "$output" == *"bad system call"* ]]
|
[[ "$output" == *"bad system call"* ]]
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user