diff --git a/arkindex/process/serializers/imports.py b/arkindex/process/serializers/imports.py index e5742e15eb77bd88ce276f738b718da7cde4f6db..13ec204aa42f2169d6d19afe53ccb159a931e4c1 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 899f9771a1d69ae399bd86b437cb6961e6021cfa..94d19ef369c9b914e4853bafbcb07af18b0b20d6 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