Skip to content

Commit c632f2d

Browse files
committed
handle forceabort case:- terminate workflow in this case and then mark force aborted in ci_workflow table
1 parent c15c963 commit c632f2d

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

pkg/pipeline/CiHandler.go

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -592,20 +592,9 @@ func (impl *CiHandlerImpl) GetBuildHistory(pipelineId int, appId int, offset int
592592
func (impl *CiHandlerImpl) CancelBuild(workflowId int, forceAbort bool) (int, error) {
593593
workflow, err := impl.ciWorkflowRepository.FindById(workflowId)
594594
if err != nil {
595-
impl.Logger.Errorw("err", "err", err)
595+
impl.Logger.Errorw("error in finding ci-workflow by workflow id", "ciWorkflowId", workflowId, "err", err)
596596
return 0, err
597597
}
598-
if !(string(v1alpha1.NodePending) == workflow.Status || string(v1alpha1.NodeRunning) == workflow.Status) {
599-
if forceAbort {
600-
return impl.cancelBuildAfterStartWorkflowStage(workflow)
601-
} else {
602-
return 0, &util.ApiError{Code: "200", HttpStatusCode: 400, UserMessage: "cannot cancel build, build not in progress"}
603-
}
604-
}
605-
//this arises when someone deletes the workflow in resource browser and wants to force abort a ci
606-
if workflow.Status == string(v1alpha1.NodeRunning) && forceAbort {
607-
return impl.cancelBuildAfterStartWorkflowStage(workflow)
608-
}
609598
isExt := workflow.Namespace != DefaultCiWorkflowNamespace
610599
var env *repository3.Environment
611600
var restConfig *rest.Config
@@ -618,12 +607,20 @@ func (impl *CiHandlerImpl) CancelBuild(workflowId int, forceAbort bool) (int, er
618607

619608
// Terminate workflow
620609
err = impl.workflowService.TerminateWorkflow(workflow.ExecutorType, workflow.Name, workflow.Namespace, restConfig, isExt, env)
621-
if err != nil && strings.Contains(err.Error(), "cannot find workflow") {
610+
if err != nil && forceAbort {
611+
impl.Logger.Errorw("error in terminating workflow, with force abort flag flag as true", "workflowName", workflow.Name, "err", err)
612+
//ignoring error in case of force abort later updating workflow with force abort
613+
} else if err != nil && strings.Contains(err.Error(), "cannot find workflow") {
622614
return 0, &util.ApiError{Code: "200", HttpStatusCode: http.StatusBadRequest, UserMessage: err.Error()}
623615
} else if err != nil {
624616
impl.Logger.Errorw("cannot terminate wf", "err", err)
625617
return 0, err
626618
}
619+
err = impl.handleForceAbortCase(workflow, forceAbort)
620+
if err != nil {
621+
impl.Logger.Errorw("error in handleForceAbortCase", "forceAbortFlag", forceAbort, "workflow", workflow, "err", err)
622+
return 0, err
623+
}
627624

628625
workflow.Status = executors.WorkflowCancel
629626
if workflow.ExecutorType == cdWorkflow.WORKFLOW_EXECUTOR_TYPE_SYSTEM {
@@ -652,16 +649,32 @@ func (impl *CiHandlerImpl) CancelBuild(workflowId int, forceAbort bool) (int, er
652649
return workflow.Id, nil
653650
}
654651

655-
func (impl *CiHandlerImpl) cancelBuildAfterStartWorkflowStage(workflow *pipelineConfig.CiWorkflow) (int, error) {
652+
func (impl *CiHandlerImpl) handleForceAbortCase(workflow *pipelineConfig.CiWorkflow, forceAbort bool) error {
653+
isWorkflowInNonTerminalStage := workflow.Status == string(v1alpha1.NodePending) || workflow.Status == string(v1alpha1.NodeRunning)
654+
if !isWorkflowInNonTerminalStage {
655+
if forceAbort {
656+
return impl.updateWorkflowForForceAbort(workflow)
657+
} else {
658+
return &util.ApiError{Code: "200", HttpStatusCode: 400, UserMessage: "cannot cancel build, build not in progress"}
659+
}
660+
}
661+
//this arises when someone deletes the workflow in resource browser and wants to force abort a ci
662+
if workflow.Status == string(v1alpha1.NodeRunning) && forceAbort {
663+
return impl.updateWorkflowForForceAbort(workflow)
664+
}
665+
return nil
666+
}
667+
668+
func (impl *CiHandlerImpl) updateWorkflowForForceAbort(workflow *pipelineConfig.CiWorkflow) error {
656669
workflow.Status = executors.WorkflowCancel
657670
workflow.PodStatus = string(bean.Failed)
658671
workflow.Message = ABORT_MESSAGE_AFTER_STARTING_STAGE
659672
err := impl.ciWorkflowRepository.UpdateWorkFlow(workflow)
660673
if err != nil {
661674
impl.Logger.Errorw("error in updating workflow status", "err", err)
662-
return 0, err
675+
return err
663676
}
664-
return workflow.Id, nil
677+
return nil
665678
}
666679

667680
func (impl *CiHandlerImpl) getRestConfig(workflow *pipelineConfig.CiWorkflow) (*rest.Config, error) {

0 commit comments

Comments
 (0)