mesh/merge-gate head 58889235d163 merged into trunk 535c7641ac41 — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
mesh/repo-check head 58889235d163 merged into trunk 535c7641ac41 — pass: its merge-check.sh passed
mesh/delivery delivered
A broken service people rely on, such as mail, was said only as a warning on the desktop. A module may now declare unhealthy urgent with what people lose; the module check refuses it without why or with another severity.
56 lines
2.1 KiB
Go
56 lines
2.1 KiB
Go
package catalogue
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// How loud a module's unhealthy condition is (novox/hq ADR 0355, extending ADR 0240).
|
|
//
|
|
// **A module may declare its unhealthy urgent.** A module whose failure costs people something they rely on
|
|
// (mail refused or stuck for everyone with a mailbox) says so with `unhealthy`, and its condition
|
|
// `module.<module>.<machine>.unhealthy` is raised urgent instead of a warning. **Urgent needs a why**, as an
|
|
// `upgrade` policy other than roll does: a person reading the catalogue sees what is lost while it is broken.
|
|
|
|
// The severities a module may declare for its unhealthy condition.
|
|
const (
|
|
// UnhealthyUrgent raises the module's unhealthy condition urgent, on every machine it runs on.
|
|
UnhealthyUrgent = "urgent"
|
|
// UnhealthyWarning is what a module's unhealthy condition is without the field, said out loud.
|
|
UnhealthyWarning = "warning"
|
|
)
|
|
|
|
// UnhealthyPolicy is what a module says about how loud its unhealthy condition is: `unhealthy` in its manifest
|
|
// (novox/hq ADR 0355).
|
|
type UnhealthyPolicy struct {
|
|
Severity string `json:"severity"`
|
|
// Why names what people lose while the module is broken. It is required: a module that says nothing of
|
|
// why it is loud is refused.
|
|
Why string `json:"why,omitempty"`
|
|
}
|
|
|
|
// unhealthyProblems refuses an `unhealthy` without a why, and any severity but urgent or warning (novox/hq ADR
|
|
// 0355 §2).
|
|
func (m Manifest) unhealthyProblems() []string {
|
|
if m.Unhealthy == nil {
|
|
return nil
|
|
}
|
|
var problems []string
|
|
switch m.Unhealthy.Severity {
|
|
case UnhealthyUrgent, UnhealthyWarning:
|
|
default:
|
|
problems = append(problems, fmt.Sprintf("unhealthy is %q or %q, not %q", UnhealthyUrgent, UnhealthyWarning,
|
|
m.Unhealthy.Severity))
|
|
}
|
|
if strings.TrimSpace(m.Unhealthy.Why) == "" {
|
|
problems = append(problems, "unhealthy says why: a module that declares how loud its failure is names "+
|
|
"what people lose while it is broken")
|
|
}
|
|
return problems
|
|
}
|
|
|
|
// UnhealthyIsUrgent is whether the module declares its unhealthy condition urgent (novox/hq ADR 0355 §1).
|
|
func (m Manifest) UnhealthyIsUrgent() bool {
|
|
return m.Unhealthy != nil && m.Unhealthy.Severity == UnhealthyUrgent
|
|
}
|