@@ -592,20 +592,9 @@ func (impl *CiHandlerImpl) GetBuildHistory(pipelineId int, appId int, offset int
592592func (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
667680func (impl * CiHandlerImpl ) getRestConfig (workflow * pipelineConfig.CiWorkflow ) (* rest.Config , error ) {
0 commit comments