63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
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
|
|
}
|