55 lines
943 B
Go
55 lines
943 B
Go
// Package diag implements network diagnostics.
|
|
package diag
|
|
|
|
import "fmt"
|
|
|
|
type Node interface {
|
|
Then(t Node) Node
|
|
Children() []Node
|
|
Evaluate() (status string, _ error)
|
|
}
|
|
|
|
type Monitor struct {
|
|
root Node
|
|
}
|
|
|
|
func NewMonitor(n Node) *Monitor {
|
|
return &Monitor{root: n}
|
|
}
|
|
|
|
type EvalResult struct {
|
|
Name string
|
|
Error bool
|
|
Status string
|
|
Children []*EvalResult
|
|
}
|
|
|
|
func evaluate(n Node, err string) *EvalResult {
|
|
r := EvalResult{
|
|
Name: fmt.Sprintf("%s", n),
|
|
Status: err,
|
|
Error: err != "",
|
|
}
|
|
if r.Status == "" {
|
|
status, err := n.Evaluate()
|
|
if err != nil {
|
|
r.Error = true
|
|
r.Status = err.Error()
|
|
} else {
|
|
r.Status = status
|
|
}
|
|
}
|
|
var childErr string
|
|
if r.Error {
|
|
childErr = fmt.Sprintf("dependency %s failed", r.Name)
|
|
}
|
|
for _, n := range n.Children() {
|
|
r.Children = append(r.Children, evaluate(n, childErr))
|
|
}
|
|
return &r
|
|
}
|
|
|
|
func (m *Monitor) Evaluate() *EvalResult {
|
|
return evaluate(m.root, "")
|
|
}
|