Add support for deleting pipeline projects

This commit is contained in:
allegroai 2022-05-18 10:30:21 +03:00
parent 60b9c8de14
commit e0cde2f7c9

View File

@ -13,7 +13,7 @@ from apiserver.config_repo import config
from apiserver.database.model import EntityVisibility from apiserver.database.model import EntityVisibility
from apiserver.database.model.model import Model from apiserver.database.model.model import Model
from apiserver.database.model.project import Project from apiserver.database.model.project import Project
from apiserver.database.model.task.task import Task, ArtifactModes from apiserver.database.model.task.task import Task, ArtifactModes, TaskType
from apiserver.timing_context import TimingContext from apiserver.timing_context import TimingContext
from .sub_projects import _ids_with_children from .sub_projects import _ids_with_children
@ -32,22 +32,28 @@ class DeleteProjectResult:
def validate_project_delete(company: str, project_id: str): def validate_project_delete(company: str, project_id: str):
project = Project.get_for_writing( project = Project.get_for_writing(
company=company, id=project_id, _only=("id", "path") company=company, id=project_id, _only=("id", "path", "system_tags")
) )
if not project: if not project:
raise errors.bad_request.InvalidProjectId(id=project_id) raise errors.bad_request.InvalidProjectId(id=project_id)
is_pipeline = "pipeline" in (project.system_tags or [])
project_ids = _ids_with_children([project_id]) project_ids = _ids_with_children([project_id])
ret = {} ret = {}
for cls in (Task, Model): for cls in (Task, Model):
ret[f"{cls.__name__.lower()}s"] = cls.objects( ret[f"{cls.__name__.lower()}s"] = cls.objects(project__in=project_ids).count()
project__in=project_ids,
).count()
for cls in (Task, Model): for cls in (Task, Model):
ret[f"non_archived_{cls.__name__.lower()}s"] = cls.objects( query = dict(
project__in=project_ids, project__in=project_ids, system_tags__nin=[EntityVisibility.archived.value]
system_tags__nin=[EntityVisibility.archived.value], )
).count() name = f"non_archived_{cls.__name__.lower()}s"
if not is_pipeline:
ret[name] = cls.objects(**query).count()
else:
ret[name] = (
cls.objects(**query, type=TaskType.controller).count()
if cls == Task
else 0
)
return ret return ret
@ -56,23 +62,30 @@ def delete_project(
company: str, project_id: str, force: bool, delete_contents: bool company: str, project_id: str, force: bool, delete_contents: bool
) -> Tuple[DeleteProjectResult, Set[str]]: ) -> Tuple[DeleteProjectResult, Set[str]]:
project = Project.get_for_writing( project = Project.get_for_writing(
company=company, id=project_id, _only=("id", "path") company=company, id=project_id, _only=("id", "path", "system_tags")
) )
if not project: if not project:
raise errors.bad_request.InvalidProjectId(id=project_id) raise errors.bad_request.InvalidProjectId(id=project_id)
is_pipeline = "pipeline" in (project.system_tags or [])
project_ids = _ids_with_children([project_id]) project_ids = _ids_with_children([project_id])
if not force: if not force:
for cls, error in ( query = dict(
(Task, errors.bad_request.ProjectHasTasks), project__in=project_ids, system_tags__nin=[EntityVisibility.archived.value]
(Model, errors.bad_request.ProjectHasModels), )
): if not is_pipeline:
non_archived = cls.objects( for cls, error in (
project__in=project_ids, (Task, errors.bad_request.ProjectHasTasks),
system_tags__nin=[EntityVisibility.archived.value], (Model, errors.bad_request.ProjectHasModels),
).only("id") ):
non_archived = cls.objects(**query).only("id")
if non_archived:
raise error("use force=true to delete", id=project_id)
else:
non_archived = Task.objects(**query, type=TaskType.controller).only("id")
if non_archived: if non_archived:
raise error("use force=true to delete", id=project_id) raise errors.bad_request.ProjectHasTasks(
"please archive all the runs inside the project", id=project_id
)
if not delete_contents: if not delete_contents:
with TimingContext("mongo", "update_children"): with TimingContext("mongo", "update_children"):