8000 fix(api,ui): manual run and run join (#3830) · ovh/cds@16f164c · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 16f164c

Browse files
sguiheuxfsamin
authored andcommitted
fix(api,ui): manual run and run join (#3830)
1 parent 01bd3a2 commit 16f164c

File tree

3 files changed

+24
-111
lines changed

3 files changed

+24
-111
lines changed

engine/api/workflow/run_workflow.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,13 @@ func RunFromHook(ctx context.Context, db gorp.SqlExecutor, store cache.Store, p
8787
if errWR != nil {
8888
return nil, nil, sdk.WrapError(errWR, "RunFromHook> Unable to process workflow run")
8989
}
90-
_, _ = report.Merge(r1, nil)
9190
if !hasRun {
9291
wr.Status = sdk.StatusNeverBuilt.String()
9392
wr.LastExecution = time.Now()
93+
report.Add(wr)
9494
return wr, report, UpdateWorkflowRun(ctx, db, wr)
9595
}
96+
_, _ = report.Merge(r1, nil)
9697
} else {
9798

9899
//Load the last workflow run

engine/api/workflow_run.go

Lines changed: 21 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,7 @@ func (api *API) postWorkflowRunHandler() service.Handler {
901901
return sdk.WrapError(sdk.ErrWorkflowInvalid, "workflow %s asked, but workflow %s found", name, wf.Name)
902902
}
903903

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)
905905

906906
if errS != nil {
907907
return sdk.WrapError(errS, "postWorkflowRunHandler> Unable to start workflow %s/%s", key, name)
@@ -925,8 +925,8 @@ func (api *API) postWorkflowRunHandler() service.Handler {
925925
}
926926
}
927927

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")
930930
defer end()
931931

932932
report := new(workflow.ProcessorReport)
@@ -937,7 +937,7 @@ func startWorkflowRunV2(ctx context.Context, db *gorp.DbMap, store cache.Store,
937937
}
938938
defer tx.Rollback() // nolint
939939

940-
//Run from hook
940+
// Run from HOOK
941941
if opts.Hook != nil {
942942
_, r1, err := workflow.RunFromHook(ctx, tx, store, p, wf, opts.Hook, asCodeInfos)
943943
if err != nil {
@@ -952,7 +952,7 @@ func startWorkflowRunV2(ctx context.Context, db *gorp.DbMap, store cache.Store,
952952
return report.Merge(r1, nil)
953953
}
954954

955-
//Default manual run
955+
// Manual RUN
956956
if opts.Manual == nil {
957957
opts.Manual = &sdk.WorkflowNodeRunManual{}
958958
}
@@ -964,122 +964,38 @@ func startWorkflowRunV2(ctx context.Context, db *gorp.DbMap, store cache.Store,
964964
EnvironmentsPerm: opts.Manual.User.Permissions.EnvironmentsPerm,
965965
}
966966

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])
976971
}
977-
} else {
978-
fromNodes = append(fromNodes, &wf.WorkflowData.Node)
979-
}
980972

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)
993977
}
994-
optsCopy.Manual.PipelineParameters = make([]sdk.Parameter, len(opts.Manual.PipelineParameters))
995-
copy(optsCopy.Manual.PipelineParameters, opts.Manual.PipelineParameters)
996978
}
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-
}
1021979

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)
1024982
if errmr != nil {
1025983
return nil, sdk.WrapError(errmr, "Unable to run workflow")
1026984
}
1027985
_, _ = 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-
}
1059986

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)
1073990
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")
1075992
}
1076-
//since report is mutable and is a pointer and in this case we can't have any error, we can skip returned values
1077993
_, _ = report.Merge(r1, nil)
1078994
}
1079995

996+
//Commit and return success
1080997
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")
1083999
}
10841000
return report, nil
10851001
}

ui/src/app/shared/workflow/node/run/node.run.param.component.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -341,11 +341,7 @@ export class WorkflowNodeRunParamComponent implements OnInit {
341341
request.number = this.nodeRun.num;
342342
request.from_nodes = [this.nodeRun.workflow_node_id];
343343
} else if (this.nodeToRun && this.num != null) {
344-
if (this.nodeToRun.type !== 'join' || (this.workflowRun && this.workflowRun.version === 2)) {
345-
request.from_nodes = [this.nodeToRun.id];
346-
} else if (this.nodeToRun.type === 'join') {
347-
request.from_nodes = this.nodeToRun.triggers.map(t => t.child_node.id);
348-
}
344+
request.from_nodes = [this.nodeToRun.id];
349345
request.number = this.num;
350346
}
351347

0 commit comments

Comments
 (0)
0