@@ -43,6 +43,7 @@ import (
4343 "github.com/AliceO2Group/Control/core/workflow"
4444 "github.com/gobwas/glob"
4545 "github.com/looplab/fsm"
46+ "github.com/pborman/uuid"
4647 "github.com/sirupsen/logrus"
4748)
4849
@@ -65,6 +66,7 @@ type Environment struct {
6566 GlobalVars gera.StringMap // From Consul
6667 UserVars gera.StringMap // From user input
6768 stateChangedCh chan * event.TasksStateChangedEvent
69+ unsubscribe chan struct {}
6870}
6971
7072func (env * Environment ) NotifyEvent (e event.DeviceEvent ) {
@@ -363,4 +365,57 @@ func (env *Environment) setState(state string) {
363365 env .Mu .Lock ()
364366 defer env .Mu .Unlock ()
365367 env .Sm .SetState (state )
368+ }
369+
370+ func (env * Environment ) subscribeToWfState (taskman * task.Manager ) {
371+ go func () {
372+ wf := env .Workflow ()
373+ notify := make (chan task.State )
374+ subscriptionId := uuid .NewUUID ().String ()
375+ env .wfAdapter .SubscribeToStateChange (subscriptionId , notify )
376+ defer env .wfAdapter .UnsubscribeFromStateChange (subscriptionId )
377+ env .unsubscribe = make (chan struct {})
378+
379+ wfState := wf .GetState ()
380+ if wfState != task .ERROR {
381+ WORKFLOW_STATE_LOOP:
382+ for {
383+ select {
384+ case wfState = <- notify :
385+ if wfState == task .ERROR {
386+ env .setState (wfState .String ())
387+ toStop := env .Workflow ().GetTasks ().Filtered (func (t * task.Task ) bool {
388+ t .SetSafeToStop (true )
389+ return t .IsSafeToStop ()
390+ })
391+ if len (toStop ) > 0 {
392+ taskmanMessage := task .NewTransitionTaskMessage (
393+ toStop ,
394+ task .RUNNING .String (),
395+ task .STOP .String (),
396+ task .CONFIGURED .String (),
397+ nil ,
398+ env .Id (),
399+ )
400+ taskman .MessageChannel <- taskmanMessage
401+ <- env .stateChangedCh
402+ }
403+ break WORKFLOW_STATE_LOOP
404+ }
405+ if wfState == task .DONE {
406+ break WORKFLOW_STATE_LOOP
407+ }
408+ case <- env .unsubscribe :
409+ env .unsubscribe = nil
410+ break WORKFLOW_STATE_LOOP
411+ }
412+ }
413+ }
414+ }()
415+ }
416+
417+ func (env * Environment ) unsubscribeFromWfState () {
418+ if env .unsubscribe != nil {
419+ env .unsubscribe <- struct {}{}
420+ }
366421}
0 commit comments