Files
cocos/manager/vm/state.go
T
Sammy Kerata Oina bceb1727d1 NOISSUE - Use Mockery config (#323)
Signed-off-by: Sammy Oina <sammyoina@gmail.com>
2024-11-28 15:11:13 +01:00

54 lines
1022 B
Go

// Copyright (c) Ultraviolet
// SPDX-License-Identifier: Apache-2.0
package vm
import (
"errors"
"sync"
"github.com/ultravioletrs/cocos/pkg/manager"
)
type sm struct {
sync.Mutex
state manager.ManagerState
}
type StateMachine interface {
Transition(newState manager.ManagerState) error
State() string
}
func NewStateMachine() StateMachine {
return &sm{state: manager.VmProvision}
}
func (sm *sm) Transition(newState manager.ManagerState) error {
sm.Lock()
defer sm.Unlock()
switch sm.state {
case manager.VmProvision:
if newState == manager.VmRunning || newState == manager.StopComputationRun {
sm.state = newState
return nil
}
case manager.VmRunning:
if newState == manager.StopComputationRun {
sm.state = newState
return nil
}
case manager.StopComputationRun:
if newState == manager.VmRunning {
sm.state = newState
return nil
}
}
return errors.New("invalid state transition")
}
func (sm *sm) State() string {
sm.Lock()
defer sm.Unlock()
return sm.state.String()
}