Merge pull request #3580 from samc24/hook

Improved hooks monitoring
This commit is contained in:
OpenShift Merge Robot
2019-07-26 10:25:05 +02:00
committed by GitHub
4 changed files with 37 additions and 72 deletions

View File

@ -4,7 +4,6 @@ package hooks
import (
"context"
"fmt"
"path/filepath"
"sort"
"strings"
"sync"
@ -138,26 +137,3 @@ func (m *Manager) Hooks(config *rspec.Spec, annotations map[string]string, hasBi
return extensionStageHooks, nil
}
// remove remove a hook by name.
func (m *Manager) remove(hook string) (ok bool) {
m.lock.Lock()
defer m.lock.Unlock()
_, ok = m.hooks[hook]
if ok {
delete(m.hooks, hook)
}
return ok
}
// add adds a hook by path
func (m *Manager) add(path string) (err error) {
m.lock.Lock()
defer m.lock.Unlock()
hook, err := Read(path, m.extensionStages)
if err != nil {
return err
}
m.hooks[filepath.Base(path)] = hook
return nil
}

View File

@ -2,9 +2,8 @@ package hooks
import (
"context"
"os"
"path/filepath"
current "github.com/containers/libpod/pkg/hooks/1.0.0"
"github.com/fsnotify/fsnotify"
"github.com/sirupsen/logrus"
)
@ -49,47 +48,11 @@ func (m *Manager) Monitor(ctx context.Context, sync chan<- error) {
for {
select {
case event := <-watcher.Events:
filename := filepath.Base(event.Name)
if len(m.directories) <= 1 {
if event.Op&fsnotify.Remove == fsnotify.Remove {
ok := m.remove(filename)
if ok {
logrus.Debugf("removed hook %s", event.Name)
}
} else if event.Op&fsnotify.Create == fsnotify.Create || event.Op&fsnotify.Write == fsnotify.Write {
err = m.add(event.Name)
if err == nil {
logrus.Debugf("added hook %s", event.Name)
} else if err != ErrNoJSONSuffix {
logrus.Errorf("failed to add hook %s: %v", event.Name, err)
}
}
} else if event.Op&fsnotify.Create == fsnotify.Create || event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Remove == fsnotify.Remove {
err = nil
found := false
for i := len(m.directories) - 1; i >= 0; i-- {
path := filepath.Join(m.directories[i], filename)
err = m.add(path)
if err == nil {
found = true
logrus.Debugf("(re)added hook %s (triggered activity on %s)", path, event.Name)
break
} else if err == ErrNoJSONSuffix {
found = true
break // this is not going to change for fallback directories
} else if os.IsNotExist(err) {
continue // move on to the next fallback directory
} else {
found = true
logrus.Errorf("failed to (re)add hook %s (triggered by activity on %s): %v", path, event.Name, err)
break
}
}
if (found || event.Op&fsnotify.Remove == fsnotify.Remove) && err != nil {
ok := m.remove(filename)
if ok {
logrus.Debugf("removed hook %s (triggered by activity on %s)", filename, event.Name)
}
m.hooks = make(map[string]*current.Hook)
for _, dir := range m.directories {
err = ReadDir(dir, m.extensionStages, m.hooks)
if err != nil {
logrus.Errorf("failed loading hooks for %s: %v", event.Name, err)
}
}
case <-ctx.Done():

View File

@ -226,7 +226,28 @@ func TestMonitorTwoDirGood(t *testing.T) {
assert.Equal(t, primaryInjected, config.Hooks) // masked by primary
})
t.Run("bad-primary-addition", func(t *testing.T) {
primaryPath2 := filepath.Join(primaryDir, "0a.json") //0a because it will be before a.json alphabetically
t.Run("bad-primary-new-addition", func(t *testing.T) {
err = ioutil.WriteFile(primaryPath2, []byte("{\"version\": \"-1\"}"), 0644)
if err != nil {
t.Fatal(err)
}
time.Sleep(100 * time.Millisecond) // wait for monitor to notice
config := &rspec.Spec{}
fmt.Println("expected: ", config.Hooks)
expected := primaryInjected // 0a.json is bad, a.json is still good
_, err = manager.Hooks(config, map[string]string{}, false)
fmt.Println("actual: ", config.Hooks)
if err != nil {
t.Fatal(err)
}
assert.Equal(t, expected, config.Hooks)
})
t.Run("bad-primary-same-addition", func(t *testing.T) {
err = ioutil.WriteFile(primaryPath, []byte("{\"version\": \"-1\"}"), 0644)
if err != nil {
t.Fatal(err)
@ -235,7 +256,7 @@ func TestMonitorTwoDirGood(t *testing.T) {
time.Sleep(100 * time.Millisecond) // wait for monitor to notice
config := &rspec.Spec{}
expected := config.Hooks
expected := fallbackInjected
_, err = manager.Hooks(config, map[string]string{}, false)
if err != nil {
t.Fatal(err)

View File

@ -67,7 +67,7 @@ func ReadDir(path string, extensionStages []string, hooks map[string]*current.Ho
if err != nil {
return err
}
res := err
for _, file := range files {
filePath := filepath.Join(path, file.Name())
hook, err := Read(filePath, extensionStages)
@ -80,12 +80,17 @@ func ReadDir(path string, extensionStages []string, hooks map[string]*current.Ho
continue
}
}
return err
if res == nil {
res = err
} else {
res = errors.Wrapf(res, "%v", err)
}
continue
}
hooks[file.Name()] = hook
logrus.Debugf("added hook %s", filePath)
}
return nil
return res
}
func init() {