From 8a0eedfc1e8cf204c9f776cfac1d1e4574dd38e6 Mon Sep 17 00:00:00 2001 From: Manon Blanco <blanco@teklia.com> Date: Tue, 2 Nov 2021 15:18:04 +0100 Subject: [PATCH] Build API endpoint to list worker configurations --- arkindex/dataimport/api.py | 26 +++++++++++++++ arkindex/dataimport/serializers/workers.py | 18 ++++++++++ arkindex/dataimport/tests/test_workers.py | 38 ++++++++++++++++++++++ arkindex/project/api_v1.py | 2 ++ 4 files changed, 84 insertions(+) diff --git a/arkindex/dataimport/api.py b/arkindex/dataimport/api.py index dd11c84bea..6c937ac32d 100644 --- a/arkindex/dataimport/api.py +++ b/arkindex/dataimport/api.py @@ -44,6 +44,7 @@ from arkindex.dataimport.models import ( Worker, WorkerActivity, WorkerActivityState, + WorkerConfiguration, WorkerRun, WorkerVersion, ) @@ -65,6 +66,7 @@ from arkindex.dataimport.serializers.imports import ( from arkindex.dataimport.serializers.workers import ( RepositorySerializer, WorkerActivitySerializer, + WorkerConfigurationSerializer, WorkerSerializer, WorkerStatisticsSerializer, WorkerVersionEditSerializer, @@ -985,6 +987,30 @@ class WorkerRetrieve(WorkerACLMixin, RetrieveAPIView): return worker +@extend_schema( + tags=['repos'], + description=( + 'List configurations for a given worker ID.\n\n' + 'Requires a **read** access to the worker or its repository.' + ) +) +class WorkerConfigurationList(WorkerACLMixin, ListAPIView): + permission_classes = (IsVerified, ) + serializer_class = WorkerConfigurationSerializer + queryset = WorkerConfiguration.objects.none() + + def get_queryset(self): + worker = get_object_or_404( + Worker.objects.select_related('repository'), + pk=self.kwargs['pk'] + ) + + if not self.has_read_access(worker): + raise PermissionDenied(detail='You do not have a guest access to this worker.') + + return worker.configurations.order_by('name') + + @extend_schema(tags=['imports']) @extend_schema_view( get=extend_schema(description=( diff --git a/arkindex/dataimport/serializers/workers.py b/arkindex/dataimport/serializers/workers.py index 9352efdd18..a508df7d7b 100644 --- a/arkindex/dataimport/serializers/workers.py +++ b/arkindex/dataimport/serializers/workers.py @@ -12,6 +12,7 @@ from arkindex.dataimport.models import ( Worker, WorkerActivity, WorkerActivityState, + WorkerConfiguration, WorkerVersion, WorkerVersionGPUUsage, WorkerVersionState, @@ -186,3 +187,20 @@ class WorkerStatisticsSerializer(serializers.Serializer): started = serializers.IntegerField(read_only=True) processed = serializers.IntegerField(read_only=True) error = serializers.IntegerField(read_only=True) + + +class WorkerConfigurationSerializer(serializers.Serializer): + """ + Serialize a worker configuration + """ + id = serializers.UUIDField(read_only=True) + name = serializers.CharField() + configuration = serializers.DictField(allow_empty=True, default={}) + + class Meta: + model = WorkerConfiguration + fields = ( + 'id', + 'configuration', + 'name', + ) diff --git a/arkindex/dataimport/tests/test_workers.py b/arkindex/dataimport/tests/test_workers.py index 2e9014ed3e..8790c30ce6 100644 --- a/arkindex/dataimport/tests/test_workers.py +++ b/arkindex/dataimport/tests/test_workers.py @@ -959,3 +959,41 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): data={'revision': str(self.rev2.id), 'configuration': {"test": "test2"}, 'gpu_usage': 'not_supported'}, format='json' ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + + def test_configurations_list_required_login(self): + response = self.client.get(reverse('api:worker-configurations', kwargs={'pk': str(self.worker_1.id)})) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_configurations_list_no_rights(self): + new_user = User.objects.create(email='new@test.fr', verified_email=True) + self.client.force_login(new_user) + with self.assertNumQueries(8): + response = self.client.get(reverse('api:worker-configurations', kwargs={'pk': str(self.worker_1.id)})) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(response.json(), {'detail': 'You do not have a guest access to this worker.'}) + + def test_configurations_list(self): + """ + A user is able to retrieve a worker configuation if he has a guest access on it or its repository + """ + repo2 = Repository.objects.create( + url='http://gitlab/repo2', + type=RepositoryType.Worker, + hook_token='hook-token2', + credentials=self.creds, + provider_name='GitLabProvider' + ) + worker_2 = repo2.workers.create(name='Worker 2', slug='worker_2', type='classifier') + worker_2.configurations.create(name='config_1', configuration={'key': 'value'}) + worker_2.configurations.create(name='config_2') + repo2.memberships.create(user=self.user, level=Role.Guest.value) + + self.client.force_login(self.user) + with self.assertNumQueries(9): + response = self.client.get(reverse('api:worker-configurations', kwargs={'pk': str(worker_2.id)})) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertCountEqual(response.json()['results'], [{ + 'id': str(worker_config.id), + 'name': worker_config.name, + 'configuration': worker_config.configuration + } for worker_config in worker_2.configurations.all()]) diff --git a/arkindex/project/api_v1.py b/arkindex/project/api_v1.py index 223210cc60..2ec50ddd77 100644 --- a/arkindex/project/api_v1.py +++ b/arkindex/project/api_v1.py @@ -22,6 +22,7 @@ from arkindex.dataimport.api import ( RevisionRetrieve, StartProcess, UpdateWorkerActivity, + WorkerConfigurationList, WorkerList, WorkerRetrieve, WorkerRunDetails, @@ -205,6 +206,7 @@ api = [ # Workers path('workers/', WorkerList.as_view(), name='workers-list'), path('workers/<uuid:pk>/', WorkerRetrieve.as_view(), name='worker-retrieve'), + path('workers/<uuid:pk>/configurations/', WorkerConfigurationList.as_view(), name='worker-configurations'), path('workers/<uuid:pk>/versions/', WorkerVersionList.as_view(), name='worker-versions'), path('workers/versions/<uuid:pk>/', WorkerVersionRetrieve.as_view(), name='version-retrieve'), path('workers/versions/<uuid:pk>/activity/', UpdateWorkerActivity.as_view(), name='update-worker-activity'), -- GitLab