diff --git a/arkindex/process/serializers/workers.py b/arkindex/process/serializers/workers.py index 9d513b48388e4eee3bac8d3043db43cf0f059e95..24c6bb162acf27713a002442ce0aaddd1e4c6eda 100644 --- a/arkindex/process/serializers/workers.py +++ b/arkindex/process/serializers/workers.py @@ -254,9 +254,10 @@ class WorkerVersionSerializer(serializers.ModelSerializer): read_only_fields = ("revision_url", "version") def validate_tag(self, tag): + if tag is None: + return worker = self.instance.worker if self.instance else self.context["worker"] - existing_version = worker.versions.filter(tag=tag).exists() - if existing_version: + if worker.versions.filter(tag=tag).exists(): raise ValidationError("A version already exists for this worker with this tag.") return tag @@ -306,6 +307,12 @@ class WorkerVersionCreateSerializer(WorkerVersionSerializer): raise ValidationError(str(e)) return docker_image_iid + def validate_revision_url(self, revision_url): + worker = self.instance.worker if self.instance else self.context["worker"] + if worker.versions.using("default").filter(revision_url=revision_url).exists(): + raise ValidationError("A version already exists for this worker with this revision_url.") + return revision_url + def validate(self, data): super().validate(data) errors = defaultdict(list) diff --git a/arkindex/process/tests/test_workers.py b/arkindex/process/tests/test_workers.py index 3263cba473c7caac705dabafb54b7093b7f4c0b8..96b792003d1b233a5302818fa1dc281d3842a158 100644 --- a/arkindex/process/tests/test_workers.py +++ b/arkindex/process/tests/test_workers.py @@ -64,7 +64,6 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): def setUp(self): super().setUp() self.version_1 = WorkerVersion.objects.get(worker=self.worker_reco) - self.version_1.gpu_usage = FeatureUsage.Disabled self.version_2 = self.worker_dla.versions.get() self.version_custom = self.worker_custom.versions.get() @@ -1226,7 +1225,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.worker_reco.archived = datetime.now(timezone.utc) self.worker_reco.save() - with self.assertNumQueries(2): + with self.assertNumQueries(3): response = self.client.post( reverse("api:worker-versions", kwargs={"pk": str(self.worker_reco.id)}), data={ @@ -1298,7 +1297,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.worker_dla.repository_url = "https://gitlab.com/NERV/eva" self.worker_dla.save() - with self.assertNumQueries(6): + with self.assertNumQueries(7): response = self.client.post( reverse("api:worker-versions", kwargs={"pk": str(self.worker_dla.id)}), data={"revision_url": "https://gitlab.com/NERV/eva/commit/eva-01", "configuration": {"test": "test2"}, "model_usage": FeatureUsage.Required.value}, @@ -1404,8 +1403,24 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertEqual(data["gpu_usage"], "disabled") self.assertEqual(data["model_usage"], FeatureUsage.Required.value) + def test_create_version_duplicate_revision_url(self): + self.version_1.revision_url = "https://gitlab.com/NERV/eva/commit/eva-01" + self.version_1.version = None + self.version_1.save() + response = self.client.post( + reverse("api:worker-versions", kwargs={"pk": str(self.worker_reco.id)}), + data={ + "configuration": {"test": "test2"}, + "revision_url": "https://gitlab.com/NERV/eva/commit/eva-01", + }, + format="json", + HTTP_AUTHORIZATION=f"Ponos {self.task.token}", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertDictEqual(response.json(), {"revision_url": ["A version already exists for this worker with this revision_url."]}) + def test_create_version_with_tag(self): - with self.assertNumQueries(6): + with self.assertNumQueries(7): response = self.client.post( reverse("api:worker-versions", kwargs={"pk": str(self.worker_reco.id)}), data={ @@ -1433,7 +1448,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.version_1.tag = "eva-01" self.version_1.save() - with self.assertNumQueries(3): + with self.assertNumQueries(4): response = self.client.post( reverse("api:worker-versions", kwargs={"pk": str(self.worker_reco.id)}), data={"configuration": {"test": "test2"}, "revision_url": "https://gitlab.com/NERV/eva/commit/eva-01", "tag": "eva-01"}, @@ -1444,7 +1459,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertDictEqual(response.json(), {"tag": ["A version already exists for this worker with this tag."]}) def test_create_version_empty_tag(self): - with self.assertNumQueries(2): + with self.assertNumQueries(3): response = self.client.post( reverse("api:worker-versions", kwargs={"pk": str(self.worker_reco.id)}), data={"configuration": {"test": "test2"}, "revision_url": "https://gitlab.com/NERV/eva/commit/eva-01", "tag": ""},