@@ -901,7 +901,7 @@ func (api *API) postWorkflowRunHandler() service.Handler {
901
901
return sdk .WrapError (sdk .ErrWorkflowInvalid , "workflow %s asked, but workflow %s found" , name , wf .Name )
902
902
}
903
903
904
- report , errS := startWorkflowRunV2 (ctx , api .mustDB (), api .Cache , p , wf , lastRun , opts , u , asCodeInfosMsg )
904
+ report , errS := startWorkflowRun (ctx , api .mustDB (), api .Cache , p , wf , lastRun , opts , u , asCodeInfosMsg )
905
905
906
906
if errS != nil {
907
907
return sdk .WrapError (errS , "postWorkflowRunHandler> Unable to start workflow %s/%s" , key , name )
@@ -925,8 +925,8 @@ func (api *API) postWorkflowRunHandler() service.Handler {
925
925
}
926
926
}
927
927
928
- func startWorkflowRunV2 (ctx context.Context , db * gorp.DbMap , store cache.Store , p * sdk.Project , wf * sdk.Workflow , lastRun * sdk.WorkflowRun , opts * sdk.WorkflowRunPostHandlerOption , u * sdk.User , asCodeInfos []sdk.Message ) (* workflow.ProcessorReport , error ) {
929
- ctx , end := observability .Span (ctx , "api.startWorkflowRunV2 " )
928
+ func startWorkflowRun (ctx context.Context , db * gorp.DbMap , store cache.Store , p * sdk.Project , wf * sdk.Workflow , lastRun * sdk.WorkflowRun , opts * sdk.WorkflowRunPostHandlerOption , u * sdk.User , asCodeInfos []sdk.Message ) (* workflow.ProcessorReport , error ) {
929
+ ctx , end := observability .Span (ctx , "api.startWorkflowRun " )
930
930
defer end ()
931
931
932
932
report := new (workflow.ProcessorReport )
@@ -937,7 +937,7 @@ func startWorkflowRunV2(ctx context.Context, db *gorp.DbMap, store cache.Store,
937
937
}
938
938
defer tx .Rollback () // nolint
939
939
940
- //Run from hook
940
+ // Run from HOOK
941
941
if opts .Hook != nil {
942
942
_ , r1 , err := workflow .RunFromHook (ctx , tx , store , p , wf , opts .Hook , asCodeInfos )
943
943
if err != nil {
@@ -952,7 +952,7 @@ func startWorkflowRunV2(ctx context.Context, db *gorp.DbMap, store cache.Store,
952
952
return report .Merge (r1 , nil )
953
953
}
954
954
955
- //Default manual run
955
+ // Manual RUN
956
956
if opts .Manual == nil {
957
957
opts .Manual = & sdk.WorkflowNodeRunManual {}
958
958
}
@@ -964,122 +964,38 @@ func startWorkflowRunV2(ctx context.Context, db *gorp.DbMap, store cache.Store,
964
964
EnvironmentsPerm : opts .Manual .User .Permissions .EnvironmentsPerm ,
965
965
}
966
966
967
- //Load the node from which we launch the workflow run
968
- fromNodes := make ([]* sdk.Node , 0 , len (opts .FromNodeIDs ))
969
- if len (opts .FromNodeIDs ) > 0 {
970
- for _ , fromNodeID := range opts .FromNodeIDs {
971
- fromNode := lastRun .Workflow .WorkflowData .NodeByID (fromNodeID )
972
- if fromNode == nil {
973
- return nil , sdk .WrapError (sdk .ErrWorkflowNodeNotFound , "Payload: Unable to get node %d" , fromNodeID )
974
- }
975
- fromNodes = append (fromNodes , fromNode )
967
+ if len (opts .FromNodeIDs ) > 0 && lastRun != nil {
968
+ fromNode := wf .WorkflowData .NodeByID (opts .FromNodeIDs [0 ])
969
+ if fromNode == nil {
970
+ return nil , sdk .WrapError (sdk .ErrWorkflowNodeNotFound , "unable to find node %d" , opts .FromNodeIDs [0 ])
976
971
}
977
- } else {
978
- fromNodes = append (fromNodes , & wf .WorkflowData .Node )
979
- }
980
972
981
- //Run all the node asynchronously in a goroutines
982
- var wg = & sync.WaitGroup {}
983
- wg .Add (len (fromNodes ))
984
- for i := 0 ; i < len (fromNodes ); i ++ {
985
- optsCopy := sdk.WorkflowRunPostHandlerOption {
986
- FromNodeIDs : opts .FromNodeIDs ,
987
- Number : opts .Number ,
988
- }
989
- if opts .Manual != nil {
990
- optsCopy .Manual = & sdk.WorkflowNodeRunManual {
991
- User : opts .Manual .User ,
992
- Payload : opts .Manual .Payload ,
973
+ // Check Env Permission
974
+ if fromNode .Context .EnvironmentID != 0 {
975
+ if ! permission .AccessToEnvironment (p .Key , lastRun .Workflow .Environments [fromNode .Context .EnvironmentID ].Name , u , permission .PermissionReadExecute ) {
976
+ return nil , sdk .WrapError (sdk .ErrNoEnvExecution , "runFromNode> Not enough right to run on environment %s" , lastRun .Workflow .Environments [fromNode .Context .EnvironmentID ].Name )
993
977
}
994
- optsCopy .Manual .PipelineParameters = make ([]sdk.Parameter , len (opts .Manual .PipelineParameters ))
995
- copy (optsCopy .Manual .PipelineParameters , opts .Manual .PipelineParameters )
996
978
}
997
- if opts .Hook != nil {
998
- optsCopy .Hook = & sdk.WorkflowNodeRunHookEvent {
999
- Payload : opts .Hook .Payload ,
1000
- WorkflowNodeHookUUID : opts .Hook .WorkflowNodeHookUUID ,
1001
- }
1002
- }
1003
- go func (fromNode * sdk.Node ) {
1004
- r1 , err := runFromNodeV2 (ctx , db , store , optsCopy , p , wf , lastRun , u , fromNode )
1005
- if err != nil {
1006
- log .Error ("error: %v" , err )
1007
- report .Add (err )
1008
- }
1009
- //since report is mutable and is a pointer and in this case we can't have any error, we can skip returned values
1010
- _ , _ = report .Merge (r1 , nil )
1011
- wg .Done ()
1012
- }(fromNodes [i ])
1013
- }
1014
-
1015
- wg .Wait ()
1016
-
1017
- if report .Errors () != nil {
1018
- //Just return the first error
1019
- return nil , report .Errors ()[0 ]
1020
- }
1021
979
1022
- if lastRun == nil {
1023
- _ , r1 , errmr := workflow .ManualRun (ctx , tx , store , p , wf , opts .Manual , asCodeInfos )
980
+ // Continue the current workflow run
981
+ _ , r1 , errmr := workflow .ManualRunFromNode (ctx , tx , store , p , wf , lastRun . Number , opts .Manual , fromNode . ID )
1024
982
if errmr != nil {
1025
983
return nil , sdk .WrapError (errmr , "Unable to run workflow" )
1026
984
}
1027
985
_ , _ = report .Merge (r1 , nil )
1028
- }
1029
-
1030
- //Commit and return success
1031
- if err := tx .Commit (); err != nil {
1032
- return nil , sdk .WrapError (err , "Unable to commit transaction" )
1033
- }
1034
-
1035
- return report , nil
1036
-
1037
- }
1038
-
1039
- func runFromNodeV2 (ctx context.Context , db * gorp.DbMap , store cache.Store , opts sdk.WorkflowRunPostHandlerOption , p * sdk.Project , wf * sdk.Workflow , lastRun * sdk.WorkflowRun , u * sdk.User , fromNode * sdk.Node ) (* workflow.ProcessorReport , error ) {
1040
- var end func ()
1041
- ctx , end = observability .Span (ctx , "runFromNode" )
1042
- defer end ()
1043
-
1044
- tx , errb := db .Begin ()
1045
- if errb != nil {
1046
- return nil , errb
1047
- }
1048
-
1049
- defer tx .Rollback () // nolint
1050
-
1051
- report := new (workflow.ProcessorReport )
1052
-
1053
- // Check Env Permission
1054
- if fromNode .Context .EnvironmentID != 0 {
1055
- if ! permission .AccessToEnvironment (p .Key , lastRun .
C566
Workflow .Environments [fromNode .Context .EnvironmentID ].Name , u , permission .PermissionReadExecute ) {
1056
- return nil , sdk .WrapError (sdk .ErrNoEnvExecution , "runFromNode> Not enough right to run on environment %s" , lastRun .Workflow .Environments [fromNode .Context .EnvironmentID ].Name )
1057
- }
1058
- }
1059
986
1060
- //If payload is not set, keep the default payload
1061
- if opts .Manual .Payload == interface {}(nil ) {
1062
- opts .Manual .Payload = fromNode .Context .DefaultPayload
1063
- }
1064
-
1065
- //If PipelineParameters are not set, keep the default PipelineParameters
1066
- if len (opts .Manual .PipelineParameters ) == 0 {
1067
- opts .Manual .PipelineParameters = fromNode .Context .DefaultPipelineParameters
1068
- }
1069
-
1070
- //Manual run
1071
- if lastRun != nil {
1072
- _ , r1 , errmr := workflow .ManualRunFromNode (ctx , tx , store , p , wf , lastRun .Number , opts .Manual , fromNode .ID )
987
+ } else {
988
+ // Start new workflow
989
+ _ , r1 , errmr := workflow .ManualRun (ctx , tx , store , p , wf , opts .Manual , asCodeInfos )
1073
990
if errmr != nil {
1074
- return nil , sdk .WrapError (errmr , "runFromNode> Unable to run workflow from node " )
991
+ return nil , sdk .WrapError (errmr , "Unable to run workflow" )
1075
992
}
1076
- //since report is mutable and is a pointer and in this case we can't have any error, we can skip returned values
1077
993
_ , _ = report .Merge (r1 , nil )
1078
994
}
1079
995
996
+ //Commit and return success
1080
997
if err := tx .Commit (); err != nil {
1081
- return nil , sdk .WrapError (err , "runFromNode> Unable to commit transaction" )
1082
-
998
+ return nil , sdk .WrapError (err , "Unable to commit transaction" )
1083
999
}
1084
1000
return report , nil
1085
1001
}
0 commit comments