Skip to content
Snippets Groups Projects
Commit 1429f1a7 authored by ml bonhomme's avatar ml bonhomme :bee: Committed by Erwan Rouchet
Browse files

Block applying a template if it has unavailable worker version(s)

parent 6d778096
No related branches found
No related tags found
1 merge request!1882Block applying a template if it has unavailable worker version(s)
from django.conf import settings
from django.db.models import Q
from rest_framework import serializers
from rest_framework.exceptions import PermissionDenied, ValidationError
from arkindex.documents.models import Corpus, Element, ElementType
from arkindex.process.models import ActivityState, DataFile, Process, ProcessMode, WorkerRun
from arkindex.process.models import ActivityState, DataFile, Process, ProcessMode, WorkerRun, WorkerVersionState
from arkindex.process.serializers.git import RevisionSerializer
from arkindex.project.mixins import ProcessACLMixin
from arkindex.project.serializer_fields import EnumField, LinearRingField
......@@ -311,6 +312,13 @@ class ApplyProcessTemplateSerializer(ProcessACLMixin, serializers.Serializer):
raise PermissionDenied(detail='You do not have a contributor access to this process.')
return process
def validate(self, data):
template_process = self.context["template"]
unavailable = template_process.versions.filter(~Q(state=WorkerVersionState.Available) | Q(docker_image_id=None))
if unavailable.exists():
raise ValidationError(detail='This template contains one or more unavailable worker versions and cannot be applied.')
return data
class ElementsWorkflowSerializer(serializers.Serializer):
......
......@@ -4,7 +4,7 @@ from rest_framework import status
from rest_framework.reverse import reverse
from arkindex.documents.models import Corpus
from arkindex.process.models import ProcessMode, WorkerConfiguration, WorkerRun, WorkerVersion
from arkindex.process.models import ProcessMode, WorkerConfiguration, WorkerRun, WorkerVersion, WorkerVersionState
from arkindex.project.tests import FixtureAPITestCase
from arkindex.users.models import Role, User
......@@ -254,7 +254,7 @@ class TestTemplates(FixtureAPITestCase):
def test_apply_process_template(self):
self.client.force_login(self.user)
with self.assertNumQueries(17):
with self.assertNumQueries(18):
response = self.client.post(
reverse('api:apply-process-template', kwargs={'pk': str(self.template.id)}),
data=json.dumps({"process_id": str(self.process.id)}),
......@@ -282,7 +282,7 @@ class TestTemplates(FixtureAPITestCase):
parents=[],
)
# Apply a template that has two other worker runs
with self.assertNumQueries(17):
with self.assertNumQueries(18):
response = self.client.post(
reverse('api:apply-process-template', kwargs={'pk': str(self.template.id)}),
data=json.dumps({"process_id": str(process.id)}),
......@@ -300,6 +300,21 @@ class TestTemplates(FixtureAPITestCase):
self.assertTrue(self.template.worker_runs.filter(version=parent_run.version).exists())
self.assertTrue(self.template.worker_runs.filter(version=child_run.version).exists())
def test_apply_process_template_unavailable_worker_version(self):
self.version_2.state = WorkerVersionState.Error
self.version_2.save()
self.client.force_login(self.user)
with self.assertNumQueries(15):
response = self.client.post(
reverse('api:apply-process-template', kwargs={'pk': str(self.template.id)}),
data=json.dumps({"process_id": str(self.process.id)}),
content_type='application/json',
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(response.json(), {'non_field_errors': ['This template contains one or more unavailable worker versions and cannot be applied.']})
self.process.refresh_from_db()
self.assertEqual(self.process.template, None)
def test_list_templates_ignores_configuration_filter(self):
self.client.force_login(self.user)
with self.assertNumQueries(7):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment