Files

57 lines
1.7 KiB
Go

// Package state persists task metadata. It never executes application actions.
package state
import (
"errors"
"regexp"
)
var (
ErrBusy = errors.New("host state is locked")
ErrClosed = errors.New("session is closed")
ErrPoisoned = errors.New("state write outcome uncertain; reopen and reconcile")
ErrConflict = errors.New("operation identity or revision conflict")
ErrUnresolved = errors.New("another operation requires completion or reconciliation")
ErrTransition = errors.New("invalid operation transition")
ErrNotFound = errors.New("operation not found")
ErrCapacity = errors.New("operation history capacity exhausted")
idPattern = regexp.MustCompile(`^[a-z][a-z0-9-]{0,47}$`)
hashPattern = regexp.MustCompile(`^sha256:[a-f0-9]{64}$`)
)
type Status string
const (
Queued Status = "queued"
Running Status = "running"
Succeeded Status = "succeeded"
FailedRecovered Status = "failed_recovered"
NeedsAttention Status = "needs_attention"
Unknown Status = "unknown"
Cancelled Status = "cancelled"
)
type Operation struct {
ID string `json:"id"`
PlanHash string `json:"planHash"`
Status Status `json:"status"`
Revision uint64 `json:"revision"`
}
func (s Status) terminal() bool { return s == Succeeded || s == FailedRecovered || s == Cancelled }
func (s Status) valid() bool {
return s.terminal() || s == Queued || s == Running || s == NeedsAttention || s == Unknown
}
func allowed(from, to Status) bool {
switch from {
case Queued:
return to == Running || to == Cancelled
case Running:
return to == Succeeded || to == FailedRecovered || to == NeedsAttention || to == Unknown
case NeedsAttention, Unknown:
return to == Succeeded || to == FailedRecovered
default:
return false
}
}