From 21e9782432dbcf6f502b97749abfc188afbf0f34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Arag=C3=B3n?= Date: Mon, 24 Feb 2025 19:30:07 +0100 Subject: [PATCH] Feat: job provider list in serverless client (#1588) * feat: job provider list endpoint * fix lint * apply partial review suggestions * fix provider-endpoint * change serializer for provider_list * feat: job provider list client * fix lint * wip * fix lint * fix url for provider-list * action tag added to provider_list --------- Co-authored-by: David <9059044+Tansito@users.noreply.github.com> --- .../core/clients/serverless_client.py | 43 ++++++++++++++++++- gateway/api/views/jobs.py | 1 + 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/client/qiskit_serverless/core/clients/serverless_client.py b/client/qiskit_serverless/core/clients/serverless_client.py index a7d215fdb..780043ea1 100644 --- a/client/qiskit_serverless/core/clients/serverless_client.py +++ b/client/qiskit_serverless/core/clients/serverless_client.py @@ -77,7 +77,7 @@ _trace_functions = trace_decorator_factory("function") -class ServerlessClient(BaseClient): +class ServerlessClient(BaseClient): # pylint: disable=too-many-public-methods """ A client for connecting to a specified host. @@ -159,7 +159,46 @@ def jobs(self, **kwargs) -> List[Job]: response_data = safe_json_request_as_dict( request=lambda: requests.get( - f"{self.host}/api/{self.version}/jobs", + f"{self.host}/api/{self.version}/jobs/", + params=kwargs, + headers={"Authorization": f"Bearer {self.token}"}, + timeout=REQUESTS_TIMEOUT, + ) + ) + + return [ + Job(job.get("id"), job_service=self, raw_data=job) + for job in response_data.get("results", []) + ] + + @_trace_job("provider_list") + def provider_jobs(self, function: QiskitFunction, **kwargs) -> List[Job]: + """List of jobs created in this provider and function. + + Args: + function: QiskitFunction + **kwargs: additional parameters for the request + + Raises: + QiskitServerlessException: validation exception + + Returns: + [Job] : list of jobs + """ + + if not function.provider: + raise QiskitServerlessException("`function` doesn't have a provider.") + + limit = kwargs.get("limit", 10) + kwargs["limit"] = limit + offset = kwargs.get("offset", 0) + kwargs["offset"] = offset + kwargs["function"] = function.title + kwargs["provider"] = function.provider + + response_data = safe_json_request_as_dict( + request=lambda: requests.get( + f"{self.host}/api/{self.version}/jobs/provider/", params=kwargs, headers={"Authorization": f"Bearer {self.token}"}, timeout=REQUESTS_TIMEOUT, diff --git a/gateway/api/views/jobs.py b/gateway/api/views/jobs.py index 17d1490bd..5748aae4d 100644 --- a/gateway/api/views/jobs.py +++ b/gateway/api/views/jobs.py @@ -153,6 +153,7 @@ def list(self, request): serializer = self.get_serializer_job_without_result(queryset, many=True) return Response(serializer.data) + @action(methods=["GET"], detail=False, url_path="provider") def provider_list(self, request): """ It returns a list with the jobs for the provider function: