mirror of
https://github.com/mulgadc/spinifex.git
synced 2026-10-20 19:25:52 +00:00
59 lines
2.2 KiB
Go
59 lines
2.2 KiB
Go
package vm
|
|
|
|
import "slices"
|
|
|
|
// InstanceState represents a typed VM lifecycle state.
|
|
type InstanceState string
|
|
|
|
const (
|
|
StateProvisioning InstanceState = "provisioning"
|
|
StatePending InstanceState = "pending"
|
|
StateRunning InstanceState = "running"
|
|
StateStopping InstanceState = "stopping"
|
|
StateStopped InstanceState = "stopped"
|
|
StateShuttingDown InstanceState = "shutting-down"
|
|
StateTerminated InstanceState = "terminated"
|
|
StateError InstanceState = "error"
|
|
)
|
|
|
|
// EC2StateInfo holds the EC2 API code and name for a given instance state.
|
|
type EC2StateInfo struct {
|
|
Code int64
|
|
Name string
|
|
}
|
|
|
|
// EC2StateCodes maps each InstanceState to its EC2 API code and name.
|
|
// Note: StateError and StateProvisioning are Hive-specific states with no direct
|
|
// AWS EC2 equivalent. Their Code/Name values are best-effort mappings.
|
|
var EC2StateCodes = map[InstanceState]EC2StateInfo{
|
|
StateProvisioning: {Code: 0, Name: "pending"},
|
|
StatePending: {Code: 0, Name: "pending"},
|
|
StateRunning: {Code: 16, Name: "running"},
|
|
StateStopping: {Code: 64, Name: "stopping"},
|
|
StateStopped: {Code: 80, Name: "stopped"},
|
|
StateShuttingDown: {Code: 32, Name: "shutting-down"},
|
|
StateTerminated: {Code: 48, Name: "terminated"},
|
|
StateError: {Code: 0, Name: "error"},
|
|
}
|
|
|
|
// ValidTransitions defines the allowed state transitions for an instance.
|
|
// StateTerminated is intentionally absent — it is a terminal state with no valid transitions.
|
|
var ValidTransitions = map[InstanceState][]InstanceState{
|
|
StateProvisioning: {StateRunning, StateError, StateShuttingDown},
|
|
StatePending: {StateRunning, StateError, StateShuttingDown},
|
|
StateRunning: {StateStopping, StateShuttingDown, StateError},
|
|
StateStopping: {StateStopped, StateShuttingDown, StateError},
|
|
StateStopped: {StateRunning, StateShuttingDown, StateError},
|
|
StateShuttingDown: {StateTerminated, StateError},
|
|
StateError: {StatePending, StateRunning, StateShuttingDown},
|
|
}
|
|
|
|
// IsValidTransition checks whether moving from current to target is allowed.
|
|
func IsValidTransition(current, target InstanceState) bool {
|
|
allowed, ok := ValidTransitions[current]
|
|
if !ok {
|
|
return false
|
|
}
|
|
return slices.Contains(allowed, target)
|
|
}
|