summaryrefslogtreecommitdiff
path: root/internal/dependency.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/dependency.go')
-rw-r--r--internal/dependency.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/internal/dependency.go b/internal/dependency.go
new file mode 100644
index 0000000..020b4f5
--- /dev/null
+++ b/internal/dependency.go
@@ -0,0 +1,51 @@
+package internal
+
+import (
+ "context"
+ "fmt"
+)
+
+type dependency struct {
+ okMap map[string]chan struct{}
+ nokMap map[string]chan struct{}
+}
+
+func newDependency(config config) dependency {
+ d := dependency{
+ okMap: make(map[string]chan struct{}, len(config.Checks)),
+ nokMap: make(map[string]chan struct{}, len(config.Checks)),
+ }
+
+ for name := range config.Checks {
+ d.okMap[name] = make(chan struct{})
+ d.nokMap[name] = make(chan struct{})
+ }
+
+ return d
+}
+
+func (d dependency) ok(name string) {
+ close(d.okMap[name])
+}
+
+func (d dependency) notOk(name string) {
+ close(d.nokMap[name])
+}
+
+// Wait for all dependant checks to be executed!
+func (d dependency) wait(ctx context.Context, dependencies []string) error {
+ for _, dep := range dependencies {
+ if _, ok := d.okMap[dep]; !ok {
+ // We sent an error mail already via config.sanityCheck for this case.
+ continue
+ }
+ select {
+ case <-d.okMap[dep]:
+ case <-d.nokMap[dep]:
+ return fmt.Errorf("dependency '%s' is not OK!", dep)
+ case <-ctx.Done():
+ return fmt.Errorf("waited for too long for dependency '%s': %s", dep, ctx.Err().Error())
+ }
+ }
+ return nil
+}