diff options
| author | Gustavo Niemeyer <gustavo@niemeyer.net> | 2017-08-28 23:49:36 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-08-28 23:49:36 -0300 |
| commit | 94784f1cfb5a5945b498a356b4a3ed036701b231 (patch) | |
| tree | 9cd9924372b1fe06110f3c521bab986ca972081a | |
| parent | 84da2c59ad33ec276347fcc81f6fa5f58dd22805 (diff) | |
| parent | d832894f784a0151d542bf91bce29c9c68291263 (diff) | |
hooks: do not error when hook handler is not registered (2.27) (#3819)
hooks: do not error when hook handler is not registered (2.27)
| -rw-r--r-- | overlord/hookstate/hookmgr.go | 3 | ||||
| -rw-r--r-- | overlord/hookstate/hookstate_test.go | 25 |
2 files changed, 28 insertions, 0 deletions
diff --git a/overlord/hookstate/hookmgr.go b/overlord/hookstate/hookmgr.go index 2e764d6631..ecd5ff133a 100644 --- a/overlord/hookstate/hookmgr.go +++ b/overlord/hookstate/hookmgr.go @@ -227,6 +227,9 @@ func (m *HookManager) doRunHook(task *state.Task, tomb *tomb.Tomb) error { handlers := m.repository.generateHandlers(context) handlersCount := len(handlers) if handlersCount == 0 { + if hooksup.Optional { + return nil + } return fmt.Errorf("internal error: no registered handlers for hook %q", hooksup.Hook) } if handlersCount > 1 { diff --git a/overlord/hookstate/hookstate_test.go b/overlord/hookstate/hookstate_test.go index 569fcbb5fa..919e7b549f 100644 --- a/overlord/hookstate/hookstate_test.go +++ b/overlord/hookstate/hookstate_test.go @@ -594,6 +594,31 @@ func (s *hookManagerSuite) TestHookWithoutHookOptional(c *C) { c.Logf("Task log:\n%s\n", s.task.Log()) } +func (s *hookManagerSuite) TestOptionalHookWithMissingHandler(c *C) { + hooksup := &hookstate.HookSetup{ + Snap: "test-snap", + Hook: "missing-hook-and-no-handler", + Optional: true, + } + s.state.Lock() + s.task.Set("hook-setup", hooksup) + s.state.Unlock() + + s.manager.Ensure() + s.manager.Wait() + + c.Check(s.command.Calls(), IsNil) + + s.state.Lock() + defer s.state.Unlock() + + c.Check(s.task.Kind(), Equals, "run-hook") + c.Check(s.task.Status(), Equals, state.DoneStatus) + c.Check(s.change.Status(), Equals, state.DoneStatus) + + c.Logf("Task log:\n%s\n", s.task.Log()) +} + func checkTaskLogContains(c *C, task *state.Task, pattern string) { exp := regexp.MustCompile(pattern) found := false |
