package supervisor type ReleaseState string const ( ReleaseCandidate ReleaseState = "CANDIDATE" ReleaseHealthy ReleaseState = "HEALTHY" ReleaseFailed ReleaseState = "FAILED" ReleaseRolledBack ReleaseState = "ROLLED_BACK" ) type Release struct { ID string Version string State ReleaseState LastKnownGood bool } type Observation struct { ReleaseID string Ready bool Reason string ObservedAtUnixMillis int64 } type Lifeboat struct { Current Release LastKnownGood Release Observations []Observation } func (l *Lifeboat) Start(candidate Release) bool { if candidate.ID == "" || candidate.Version == "" { return false } candidate.State = ReleaseCandidate l.Current = candidate return true } func (l *Lifeboat) Record(o Observation) bool { if o.ReleaseID == "" { return false } l.Observations = append(l.Observations, o) if o.ReleaseID != l.Current.ID { return true } if o.Ready { l.Current.State = ReleaseHealthy l.Current.LastKnownGood = true l.LastKnownGood = l.Current } else { l.Current.State = ReleaseFailed } return true } func (l *Lifeboat) Rollback() bool { if l.LastKnownGood.ID == "" { return false } l.Current = l.LastKnownGood l.Current.State = ReleaseRolledBack return true }