From e5f6ba1f03bd26dc2846e84edee70e882d9d018d Mon Sep 17 00:00:00 2001 From: Valentin Rigal <rigal@teklia.com> Date: Wed, 13 Dec 2023 15:34:07 +0000 Subject: [PATCH] Require either docker_image_id or docker_image_iid to apply process template --- arkindex/process/serializers/imports.py | 3 ++- arkindex/process/tests/test_templates.py | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/arkindex/process/serializers/imports.py b/arkindex/process/serializers/imports.py index e5742e15eb..13ec204aa4 100644 --- a/arkindex/process/serializers/imports.py +++ b/arkindex/process/serializers/imports.py @@ -582,7 +582,8 @@ class ApplyProcessTemplateSerializer(ProcessACLMixin, serializers.Serializer): # The template's worker runs have already been prefetched, so we can use them to validate directly if any( - run.version.state != WorkerVersionState.Available or run.version.docker_image_id is None + run.version.state != WorkerVersionState.Available + or (run.version.docker_image_id is None and not run.version.docker_image_iid) for run in template_process.worker_runs.all() ): raise ValidationError(detail='This template contains one or more unavailable worker versions and cannot be applied.') diff --git a/arkindex/process/tests/test_templates.py b/arkindex/process/tests/test_templates.py index 899f9771a1..94d19ef369 100644 --- a/arkindex/process/tests/test_templates.py +++ b/arkindex/process/tests/test_templates.py @@ -301,6 +301,7 @@ class TestTemplates(FixtureAPITestCase): self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_apply(self): + self.assertIsNotNone(self.version_2.docker_image_id) self.client.force_login(self.user) with self.assertNumQueries(18): response = self.client.post( @@ -325,6 +326,25 @@ class TestTemplates(FixtureAPITestCase): self.assertIsNone(child_run.configuration_id) self.assertListEqual(child_run.parents, [parent_run.id]) + def test_apply_docker_image_iid(self): + """ + Either docker_image_id or docker_image_iid attribute can be set + """ + + self.version_2.docker_image_id = None + self.version_2.docker_image_iid = 'test' + self.version_2.save() + + self.client.force_login(self.user) + 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)}), + content_type='application/json', + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.json()['template_id'], str(self.template.id)) + def test_apply_delete_previous_worker_runs(self): self.client.force_login(self.user) # Create a process with one worker run already -- GitLab