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...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 }