This is an automated email from the ASF dual-hosted git repository. lynwee pushed a commit to branch cp10 in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
commit 89eb66c6c9c583ba22e300afc45cfc475606208b Author: d4x1 <1507509...@qq.com> AuthorDate: Fri Sep 20 11:35:20 2024 +0800 fix(project): project cannot be deleted when its pipelines are not finished --- backend/core/models/task.go | 5 ++++- backend/server/services/blueprint.go | 7 +++++++ backend/server/services/project.go | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/backend/core/models/task.go b/backend/core/models/task.go index 661ba091a..34be9eff7 100644 --- a/backend/core/models/task.go +++ b/backend/core/models/task.go @@ -34,7 +34,10 @@ const ( TASK_PARTIAL = "TASK_PARTIAL" ) -var PendingTaskStatus = []string{TASK_CREATED, TASK_RERUN, TASK_RUNNING} +var ( + PendingTaskStatus = []string{TASK_CREATED, TASK_RERUN, TASK_RUNNING} + FinishedTaskStatus = []string{TASK_PARTIAL, TASK_CANCELLED, TASK_FAILED, TASK_COMPLETED} +) type TaskProgressDetail struct { TotalSubTasks int `json:"totalSubTasks"` diff --git a/backend/server/services/blueprint.go b/backend/server/services/blueprint.go index d400abae2..037149d0b 100644 --- a/backend/server/services/blueprint.go +++ b/backend/server/services/blueprint.go @@ -238,6 +238,13 @@ func DeleteBlueprint(id uint64) errors.Error { if err != nil { return err } + pipelinesAreUnfinished, err := thereAreUnfinishedPipelinesUnderBlueprint(bp.ID) + if err != nil { + return err + } + if pipelinesAreUnfinished { + return errors.Default.New("There are unfinished pipelines under current blueprint. It can not be deleted now.") + } err = bpManager.DeleteBlueprint(bp.ID) if err != nil { return errors.Default.Wrap(err, "Failed to delete the blueprint") diff --git a/backend/server/services/project.go b/backend/server/services/project.go index 8e9528d38..8ef169781 100644 --- a/backend/server/services/project.go +++ b/backend/server/services/project.go @@ -19,6 +19,7 @@ package services import ( "fmt" + "golang.org/x/exp/slices" "golang.org/x/sync/errgroup" "strings" "time" @@ -321,6 +322,31 @@ func PatchProject(name string, body map[string]interface{}) (*models.ApiOutputPr return makeProjectOutput(project, false) } +func thereAreUnfinishedPipelinesUnderProject(projectName string) (bool, errors.Error) { + blueprint, err := GetBlueprintByProjectName(projectName) + if err != nil { + return false, err + } + return thereAreUnfinishedPipelinesUnderBlueprint(blueprint.ID) +} + +func thereAreUnfinishedPipelinesUnderBlueprint(blueprintID uint64) (bool, errors.Error) { + // get the first page + dbPipelines, count, err := GetDbPipelines(&PipelineQuery{BlueprintId: blueprintID}) + if err != nil { + return false, err + } + if count <= 0 { + return false, nil + } + for _, pipeline := range dbPipelines { + if !slices.Contains(models.FinishedTaskStatus, pipeline.Status) { + return true, nil + } + } + return false, nil +} + // DeleteProject FIXME ... func DeleteProject(name string) errors.Error { // verify input @@ -332,6 +358,14 @@ func DeleteProject(name string) errors.Error { if err != nil { return err } + // make sure there is no running pipelines in current projects + pipelinesAreUnfinished, err := thereAreUnfinishedPipelinesUnderProject(name) + if err != nil { + return err + } + if pipelinesAreUnfinished { + return errors.Default.New("There are unfinished pipelines under current project. It can not be deleted now.") + } err = deleteProjectBlueprint(name) if err != nil { return err