dashboard/services/uniss/fsm.go

369 lines
10 KiB
Go

package uniss
import (
"context"
"dashboard/pkg/fsm"
"time"
"git.zhangshuocauc.cn/redhat/timewheel"
"go.uber.org/zap"
)
const (
unisFsmEventReset fsm.EventName = "unisFsmEventReset"
unisFsmEventOfline fsm.EventName = "unisFsmEventOfline"
unisFsmEventOnline fsm.EventName = "unisFsmEventOnline"
unisFsmEventLoginId fsm.EventName = "unisFsmEventLoginId"
unisFsmEventLoginSync fsm.EventName = "unisFsmEventLoginSync"
unisFsmEventLoginForce fsm.EventName = "unisFsmEventLoginForce"
unisFsmEventLoginServer fsm.EventName = "unisFsmEventLoginServer"
unisFsmEventLogout fsm.EventName = "unisFsmEventLogout"
unisFsmEventLogoutForce fsm.EventName = "unisFsmEventLogoutForce"
unisFsmEventLogoutServer fsm.EventName = "unisFsmEventLogoutServer"
unisFsmEventLogin fsm.EventName = "unisFsmEventLogin"
unisFsmEventLoginSyncFailed fsm.EventName = "unisFsmEventLoginSyncFailed"
unisFsmEventLoginSyncSuccess fsm.EventName = "unisFsmEventLoginSyncSuccess"
unisFsmEventLoginSuccess fsm.EventName = "unisFsmEventLoginSuccess"
unisFsmEventLoginFailed fsm.EventName = "unisFsmEventLoginFailed"
unisFsmEventLogoutSuccess fsm.EventName = "unisFsmEventLogoutSuccess"
unisFsmEventLogoutFailed fsm.EventName = "unisFsmEventLogoutFailed"
)
var events = fsm.Events{
unisFsmEventReset,
unisFsmEventLoginSuccess,
unisFsmEventLoginFailed,
unisFsmEventLogoutSuccess,
unisFsmEventLogoutFailed,
}
type fsmService struct {
unisMSystemFsm *unisMSystemFsm
unisMStateFsm *unisMStateFsm
}
func (f *fsmService) reset(ctx context.Context) {
f.unisMSystemFsm.reset(ctx)
f.unisMStateFsm.reset(ctx)
}
func newfsmService() (fsm *fsmService, err error) {
fsm = &fsmService{}
fsm.unisMSystemFsm, err = newunisMSystemFsm()
if err != nil {
return
}
fsm.unisMStateFsm, err = newunisMStateFsm()
if err != nil {
return
}
return
}
/*******************************主逻辑在线离线状态机************************************/
type unisMSystemFsm struct {
fsm *fsm.FSM
}
const (
unisMSystem = "unisMSystem"
unisMIdle = "unisMIdle"
unisMOnLine = "unisMOnLine"
unisMOfLine = "unisMOfLine"
unisMOnLineIdle = "unisMOnLineIdle"
unisMOnLineLoginId = "unisMOnLineLoginId"
unisMOnLineLoginning = "unisMOnLineLoginning"
unisMOnLineLogouting = "unisMOnLineLogouting"
unisMOnLineLoginSync = "unisMOnLineLoginSync"
)
func newunisMSystemFsm() (*unisMSystemFsm, error) {
res := new(unisMSystemFsm)
fsm, err := fsm.NewFsm(unisMSystem, unisMIdle, events, []*fsm.StateRule{
{Name: unisMSystem, Parent: "", InitState: unisMIdle, Processor: res.unisMSystem, Dst: []string{}},
{Name: unisMIdle, Parent: unisMSystem, InitState: "", Processor: res.unisMIdle, Dst: []string{}},
{Name: unisMOnLine, Parent: unisMSystem, InitState: unisMOnLineIdle, Processor: res.unisMOnLine, Dst: []string{}},
{Name: unisMOfLine, Parent: unisMSystem, InitState: "", Processor: res.unisMOfLine, Dst: []string{}},
{Name: unisMOnLineIdle, Parent: unisMOnLine, InitState: "", Processor: res.unisMOnLineIdle, Dst: []string{}},
{Name: unisMOnLineLoginId, Parent: unisMOnLine, InitState: "", Processor: res.unisMOnLineLoginId, Dst: []string{}},
{Name: unisMOnLineLoginning, Parent: unisMOnLine, InitState: "", Processor: res.unisMOnLineLoginning, Dst: []string{}},
{Name: unisMOnLineLogouting, Parent: unisMOnLine, InitState: "", Processor: res.unisMOnLineLogouting, Dst: []string{}},
{Name: unisMOnLineLoginSync, Parent: unisMOnLine, InitState: "", Processor: res.unisMOnLineLoginSync, Dst: []string{}},
}, zap.NewStdLog(log.Logger))
if err != nil {
log.Sugar().Error(err)
return nil, err
}
res.fsm = fsm
return res, nil
}
func (f *unisMSystemFsm) reset(ctx context.Context) {
f.fsm.ExecuteEvent(ctx, unisFsmEventReset, nil)
}
func (f *unisMSystemFsm) unisMSystem(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
case fsm.EventExit:
case unisFsmEventReset:
e.FSM.StateChange(ctx, unisMIdle, nil)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
func (f *unisMSystemFsm) unisMIdle(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
case fsm.EventExit:
case unisFsmEventOfline:
e.FSM.StateChange(ctx, unisMOfLine, nil)
case unisFsmEventOnline:
e.FSM.StateChange(ctx, unisMOnLineLoginSync, nil)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
func (f *unisMSystemFsm) unisMOnLine(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
case fsm.EventExit:
case unisFsmEventOfline:
e.FSM.StateChange(ctx, unisMOfLine, nil)
case unisFsmEventLoginId:
case unisFsmEventLoginSync:
e.FSM.StateChange(ctx, unisMOnLineLoginSync, nil)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
func (f *unisMSystemFsm) unisMOfLine(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
case fsm.EventExit:
case unisFsmEventOnline:
e.FSM.StateChange(ctx, unisMOnLineLoginSync, nil)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
/**********************************主逻辑登录状态机***********************************/
func (f *unisMSystemFsm) unisMOnLineIdle(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
case fsm.EventExit:
case unisFsmEventLoginId:
e.FSM.StateChange(ctx, unisMOnLineLoginId, e.Args)
case unisFsmEventLoginForce:
e.FSM.StateChange(ctx, unisMOnLineLoginning, e.Args)
case unisFsmEventLoginServer:
case unisFsmEventLogout:
e.FSM.StateChange(ctx, unisMOnLineLogouting, e.Args)
case unisFsmEventLogoutForce:
fallthrough
case unisFsmEventLogoutServer:
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
func (f *unisMSystemFsm) unisMOnLineLoginId(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
e.FSM.StartEventTimer(ctx, timewheel.TimerTypeOnce, time.Second*5, nil)
case fsm.EventExit:
e.FSM.StopEventTimer()
case unisFsmEventLogin:
e.FSM.StateChange(ctx, unisMOnLineLoginning, e.Args)
case fsm.EventTimeOut:
e.FSM.StateChange(ctx, unisMOnLineIdle, nil)
case unisFsmEventLoginFailed:
e.FSM.StateChange(ctx, unisMOnLineIdle, nil)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
func (f *unisMSystemFsm) unisMOnLineLoginning(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
e.FSM.StartEventTimer(ctx, timewheel.TimerTypeOnce, time.Second*5, nil)
case fsm.EventExit:
e.FSM.StopEventTimer()
case fsm.EventTimeOut:
e.FSM.StateChange(ctx, unisMOnLineIdle, nil)
case unisFsmEventLoginFailed:
e.FSM.StateChange(ctx, unisMOnLineIdle, nil)
case unisFsmEventLoginSuccess:
e.FSM.StateChange(ctx, unisMOnLineIdle, nil)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
func (f *unisMSystemFsm) unisMOnLineLogouting(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
e.FSM.StartEventTimer(ctx, timewheel.TimerTypeOnce, time.Second*5, nil)
case fsm.EventExit:
e.FSM.StopEventTimer()
case fsm.EventTimeOut:
fallthrough
case unisFsmEventLogoutFailed:
fallthrough
case unisFsmEventLogoutSuccess:
e.FSM.StateChange(ctx, unisMOnLineIdle, nil)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
func (f *unisMSystemFsm) unisMOnLineLoginSync(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
e.FSM.StartEventTimer(ctx, timewheel.TimerTypeOnce, time.Second*10, nil)
case fsm.EventExit:
e.FSM.StopEventTimer()
case fsm.EventTimeOut:
case unisFsmEventLoginSyncFailed:
case unisFsmEventLoginSyncSuccess:
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
/***************************主登录状态机********************************************/
type unisMStateFsm struct {
fsm *fsm.FSM
}
const (
unisMState = "unisMState"
unisMStateIdle = "unisMStateIdle"
unisMStateLogin = "unisMStateLogin"
unisMStateLogout = "unisMStateLogout"
)
func newunisMStateFsm() (*unisMStateFsm, error) {
res := new(unisMStateFsm)
fsm, err := fsm.NewFsm(unisMState, unisMState, events, []*fsm.StateRule{
{Name: unisMState, Parent: "", InitState: unisMStateIdle, Processor: res.unisMState, Dst: []string{}},
{Name: unisMStateIdle, Parent: unisMState, InitState: "", Processor: res.unisMStateIdle, Dst: []string{}},
{Name: unisMStateLogin, Parent: unisMState, InitState: "", Processor: res.unisMStateLogin, Dst: []string{}},
{Name: unisMStateLogout, Parent: unisMState, InitState: "", Processor: res.unisMStateLogout, Dst: []string{}},
{},
}, zap.NewStdLog(log.Logger))
if err != nil {
log.Sugar().Error(err)
return nil, err
}
res.fsm = fsm
return res, nil
}
func (f *unisMStateFsm) reset(ctx context.Context) {
f.fsm.ExecuteEvent(ctx, unisFsmEventReset, nil)
}
func (f *unisMStateFsm) unisMState(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
case fsm.EventExit:
case unisFsmEventReset:
e.FSM.StateChange(ctx, unisMStateIdle, nil)
case unisFsmEventLoginFailed:
case unisFsmEventLogoutFailed:
e.FSM.StateChange(ctx, unisMStateLogout, nil)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
func (f *unisMStateFsm) unisMStateIdle(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
case fsm.EventExit:
case unisFsmEventLoginSuccess:
e.FSM.StateChange(ctx, unisMStateLogin, e.Args)
case unisFsmEventLogoutSuccess:
e.FSM.StateChange(ctx, unisMStateLogout, e.Args)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
func (f *unisMStateFsm) unisMStateLogin(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
e.FSM.StartEventTimer(ctx, timewheel.TimerTypeOnce, time.Minute*5, nil)
case fsm.EventExit:
e.FSM.StopEventTimer()
case fsm.EventTimeOut:
e.FSM.StartEventTimer(ctx, timewheel.TimerTypeOnce, time.Minute*5, nil)
case unisFsmEventLoginSuccess:
case unisFsmEventLogoutSuccess:
e.FSM.StateChange(ctx, unisMStateLogout, e.Args)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}
func (f *unisMStateFsm) unisMStateLogout(ctx context.Context, e *fsm.Event) error {
switch e.Event {
case fsm.EventEntry:
case fsm.EventExit:
case unisFsmEventLoginSuccess:
e.FSM.StateChange(ctx, unisMStateLogin, e.Args)
default:
return fsm.EventNoProc
}
return fsm.EventOK
}