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