summaryrefslogtreecommitdiff
diff options
authorGustavo Niemeyer <gustavo@niemeyer.net>2017-08-28 23:49:36 -0300
committerGitHub <noreply@github.com>2017-08-28 23:49:36 -0300
commit94784f1cfb5a5945b498a356b4a3ed036701b231 (patch)
tree9cd9924372b1fe06110f3c521bab986ca972081a
parent84da2c59ad33ec276347fcc81f6fa5f58dd22805 (diff)
parentd832894f784a0151d542bf91bce29c9c68291263 (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.go3
-rw-r--r--overlord/hookstate/hookstate_test.go25
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