Add pipelines.delete_runs endpoint

This commit is contained in:
allegroai 2023-07-26 18:23:05 +03:00
parent db021f2863
commit a83a932e84
4 changed files with 71 additions and 2 deletions
apiserver
apierrors
apimodels
schema/services
tests/automated

View File

@ -53,6 +53,9 @@
# Reports
150: ["operation_supported_on_reports_only", "passed task is not report"]
# Pipelines
160: ["cannot_remove_all_runs", "at least one pipeline run should be left"]
# Models
200: ["model_error", "general task error"]
201: ["invalid_model_id", "invalid model id"]

View File

@ -1,4 +1,5 @@
from jsonmodels import models, fields
from jsonmodels.validators import Length
from apiserver.apimodels import ListField
@ -8,6 +9,11 @@ class Arg(models.Base):
value = fields.StringField(required=True)
class DeleteRunsRequest(models.Base):
project = fields.StringField(required=True)
ids = ListField([str], required=True, validators=[Length(1)])
class StartPipelineRequest(models.Base):
task = fields.StringField(required=True)
queue = fields.StringField(required=True)

View File

@ -1,7 +1,42 @@
_description: "Provides a management API for pipelines in the system."
_definitions {
include "_common.conf"
}
delete_runs {
"999.0": ${_definitions.batch_operation} {
description: Delete pipeline runs
request {
required: [ids, project]
properties {
ids.description: "IDs of the pipeline runs to delete. Should be the ids of pipeline controller tasks"
project {
description: "Pipeline project ids. When deleting at least one run should be left"
type: string
}
}
}
response {
properties {
succeeded.items.properties.deleted {
description: "Indicates whether the task was deleted"
type: boolean
}
succeeded.items.properties.updated_children {
description: "Number of child tasks whose parent property was updated"
type: integer
}
succeeded.items.properties.updated_models {
description: "Number of models whose task property was updated"
type: integer
}
succeeded.items.properties.deleted_models {
description: "Number of deleted output models"
type: integer
}
}
}
}
}
start_pipeline {
"2.17" {
description: "Start a pipeline"

View File

@ -1,9 +1,34 @@
from typing import Tuple
from apiserver.apierrors import errors
from apiserver.tests.automated import TestService
class TestPipelines(TestService):
def test_delete_runs(self):
queue = self.api.queues.get_default().id
task_name = "pipelines test"
project, task = self._temp_project_and_task(name=task_name)
args = [{"name": "hello", "value": "test"}]
pipeline_tasks = [
self.api.pipelines.start_pipeline(
task=task, queue=queue, args=args
).pipeline
for _ in range(2)
]
tasks = self.api.tasks.get_all_ex(project=project).tasks
self.assertEqual({task, *pipeline_tasks}, {t.id for t in tasks})
# cannot delete all runs
with self.api.raises(errors.bad_request.CannotRemoveAllRuns):
self.api.pipelines.delete_runs(project=project, ids=[task, *pipeline_tasks])
# successful deletion
res = self.api.pipelines.delete_runs(project=project, ids=pipeline_tasks)
self.assertEqual({r.id for r in res.succeeded}, set(pipeline_tasks))
tasks = self.api.tasks.get_all_ex(project=project).tasks
self.assertEqual([task], [t.id for t in tasks])
def test_start_pipeline(self):
queue = self.api.queues.get_default().id
task_name = "pipelines test"
@ -42,7 +67,7 @@ class TestPipelines(TestService):
self.create_temp(
"tasks",
name=name,
type="testing",
type="controller",
project=project,
system_tags=["pipeline"],
),