hooks: Fail ReadDir if a configured hook executable is missing

The continue here is from 5676597f (hooks/read: Ignore IsNotExist for
JSON files in ReadDir, 2018-04-27, #686), where it was intended to
silently ignore missing JSON files.  However, the old logic was also
silently ignoring not-exist errors from the os.Stat(hook.Hook.Path)
from 68eb128f (pkg/hooks: Version the hook structure and add 1.0.0
hooks, 2018-04-27, #686).  This commit adjusts the check so JSON
not-exist errors continue to be silently ignored while hook executable
not-exist errors become fatal.

Signed-off-by: W. Trevor King <wking@tremily.us>

Closes: #887
Approved by: rhatdan
This commit is contained in:
W. Trevor King
2018-06-03 11:38:46 -07:00
committed by Atomic Bot
parent cae49fca29
commit 947e410fe6
2 changed files with 26 additions and 2 deletions

View File

@ -67,13 +67,16 @@ func ReadDir(path string, extensionStages []string, hooks map[string]*current.Ho
}
for _, file := range files {
hook, err := Read(filepath.Join(path, file.Name()), extensionStages)
filePath := filepath.Join(path, file.Name())
hook, err := Read(filePath, extensionStages)
if err != nil {
if err == ErrNoJSONSuffix {
continue
}
if os.IsNotExist(err) {
continue
if err2, ok := err.(*os.PathError); ok && err2.Path == filePath {
continue
}
}
return err
}

View File

@ -191,3 +191,24 @@ func TestBadDir(t *testing.T) {
}
assert.Regexp(t, "^parsing hook \"[^\"]*a.json\": unrecognized hook version: \"-1\"$", err.Error())
}
func TestHookExecutableDoesNotExit(t *testing.T) {
dir, err := ioutil.TempDir("", "hooks-test-")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)
jsonPath := filepath.Join(dir, "hook.json")
err = ioutil.WriteFile(jsonPath, []byte("{\"version\": \"1.0.0\", \"hook\": {\"path\": \"/does/not/exist\"}, \"when\": {\"always\": true}, \"stages\": [\"prestart\"]}"), 0644)
if err != nil {
t.Fatal(err)
}
hooks := map[string]*current.Hook{}
err = ReadDir(dir, []string{}, hooks)
if err == nil {
t.Fatal("unexpected success")
}
assert.Regexp(t, "^stat /does/not/exist: no such file or directory$", err.Error())
}