Let a requirement be optional, binding only a provider that already runs (hq issue 166, ADR 0330)
Making every soft dependency a provision made it hard: a mesh without influxdb could not assign
grafana, and one with influxdb in its catalogue would install it for grafana. A requirement may now
be written {"name": ..., "optional": true}. It resolves as a hard one when a provider is assigned or
reachable, and is otherwise absent: never refused, nothing installed for it. Its binding, credential
and only-when-bound files are left out, its ${bound:...|default:...} placeholders take their
defaults, the module check refuses one that could render empty, and plan and node list it unbound.
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/novox/mesh-controller/internal/catalogue"
|
||||
)
|
||||
|
||||
// unboundLines say which optional requirements of a machine's modules nothing assigned answers
|
||||
// (novox/hq ADR 0330 §7): left unbound rather than refused, with nothing installed for them, so the
|
||||
// module runs without — and said, because a data source that never appears is otherwise a silence.
|
||||
// Each binds without anybody's act on the first composition after a provider is assigned.
|
||||
func unboundLines(plan catalogue.Resolution) []string {
|
||||
lines := make([]string, 0, len(plan.Absent))
|
||||
for _, a := range plan.Absent {
|
||||
lines = append(lines, fmt.Sprintf(
|
||||
" unbound %s, optional for %s — nothing assigned provides it; it binds once a provider is "+
|
||||
"assigned (novox/hq ADR 0330)", a.Requirement, a.Consumer))
|
||||
}
|
||||
return lines
|
||||
}
|
||||
Reference in New Issue
Block a user