From 0fccb0b29475720db24de120e926db7bdd644b73 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Thu, 29 Aug 2024 16:50:05 -0400 Subject: [PATCH 01/15] rename get_jobs to jobs and return Job objects --- client/qiskit_serverless/core/function.py | 8 +++++--- gateway/api/serializers.py | 1 + gateway/api/views.py | 10 +++------- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/client/qiskit_serverless/core/function.py b/client/qiskit_serverless/core/function.py index 685a7a72f..3b836210b 100644 --- a/client/qiskit_serverless/core/function.py +++ b/client/qiskit_serverless/core/function.py @@ -30,7 +30,6 @@ from dataclasses import dataclass from typing import Optional, Dict, List, Any, Tuple - @dataclass class QiskitFunction: # pylint: disable=too-many-instance-attributes """Serverless QiskitPattern. @@ -118,7 +117,7 @@ def run(self, **kwargs): config=config, ) - def get_jobs(self): + def jobs(self): """Run function Raises: @@ -127,6 +126,7 @@ def get_jobs(self): Returns: Job ids : job executed this function """ + from qiskit_serverless.core.job import Job if self.job_client is None: raise ValueError("No clients specified for a function.") @@ -138,10 +138,12 @@ def get_jobs(self): f"Function validation failed. Validation errors:\n {error_string}", ) - return self.job_client.get_jobs( + response = self.job_client.get_jobs( title=self.title, provider=self.provider, ) + jobs = [Job(job_id=job.get("id"), job_client=self.job_client, raw_data=job) for job in response] + return jobs def _validate_function(self) -> Tuple[bool, List[str]]: """Validate function arguments using schema provided. diff --git a/gateway/api/serializers.py b/gateway/api/serializers.py index c8b93aac3..e4fd9d740 100644 --- a/gateway/api/serializers.py +++ b/gateway/api/serializers.py @@ -168,6 +168,7 @@ class JobSerializer(serializers.ModelSerializer): class Meta: model = Job + fields = '__all__' class RunProgramSerializer(serializers.Serializer): diff --git a/gateway/api/views.py b/gateway/api/views.py index 75ed4c426..0c58d0cdc 100644 --- a/gateway/api/views.py +++ b/gateway/api/views.py @@ -45,6 +45,7 @@ from .serializers import ( JobConfigSerializer, RunJobSerializer, + JobSerializer, RunProgramSerializer, UploadProgramSerializer, RetrieveCatalogSerializer, @@ -412,13 +413,8 @@ def get_jobs( jobs = Job.objects.filter(program=program) else: jobs = Job.objects.filter(program=program, author=request.user) - return Response( - list( - jobs.values( - "status", "result", "id", "created", "version", "arguments" - ) - ) - ) + serializer = JobSerializer(jobs, many=True) + return Response(serializer.data) class JobViewSet(viewsets.GenericViewSet): From ab1a16fc902809dde3caaacfda699cf9541f0b35 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Thu, 29 Aug 2024 17:19:23 -0400 Subject: [PATCH 02/15] lint --- client/qiskit_serverless/core/function.py | 5 ++++- gateway/api/serializers.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/client/qiskit_serverless/core/function.py b/client/qiskit_serverless/core/function.py index 3b836210b..89776304a 100644 --- a/client/qiskit_serverless/core/function.py +++ b/client/qiskit_serverless/core/function.py @@ -142,7 +142,10 @@ def jobs(self): title=self.title, provider=self.provider, ) - jobs = [Job(job_id=job.get("id"), job_client=self.job_client, raw_data=job) for job in response] + jobs = [ + Job(job_id=job.get("id"), job_client=self.job_client, raw_data=job) + for job in response + ] return jobs def _validate_function(self) -> Tuple[bool, List[str]]: diff --git a/gateway/api/serializers.py b/gateway/api/serializers.py index e4fd9d740..8a7423a80 100644 --- a/gateway/api/serializers.py +++ b/gateway/api/serializers.py @@ -168,7 +168,7 @@ class JobSerializer(serializers.ModelSerializer): class Meta: model = Job - fields = '__all__' + fields = "__all__" class RunProgramSerializer(serializers.Serializer): From 9f9f387cf9c973f4703496f7655dbf3ca8f413b5 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Thu, 29 Aug 2024 17:22:45 -0400 Subject: [PATCH 03/15] fix tests --- tests/basic/06_function.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/basic/06_function.py b/tests/basic/06_function.py index 5f551e334..d98d934fa 100644 --- a/tests/basic/06_function.py +++ b/tests/basic/06_function.py @@ -35,5 +35,5 @@ print(job.result()) print(job.logs()) -jobs = my_function.get_jobs() +jobs = my_function.jobs() print(jobs) From f237037332a862895d6dc69a113e0b7520e9ddab Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Thu, 29 Aug 2024 19:11:26 -0400 Subject: [PATCH 04/15] lint --- client/qiskit_serverless/core/function.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/qiskit_serverless/core/function.py b/client/qiskit_serverless/core/function.py index 89776304a..ee3041182 100644 --- a/client/qiskit_serverless/core/function.py +++ b/client/qiskit_serverless/core/function.py @@ -30,6 +30,7 @@ from dataclasses import dataclass from typing import Optional, Dict, List, Any, Tuple + @dataclass class QiskitFunction: # pylint: disable=too-many-instance-attributes """Serverless QiskitPattern. @@ -127,6 +128,7 @@ def jobs(self): Job ids : job executed this function """ from qiskit_serverless.core.job import Job + if self.job_client is None: raise ValueError("No clients specified for a function.") From 86d9eb267dbc3b85a3458f42592d3dcc5a7d58ff Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Thu, 29 Aug 2024 19:22:29 -0400 Subject: [PATCH 05/15] lint --- client/qiskit_serverless/core/function.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/qiskit_serverless/core/function.py b/client/qiskit_serverless/core/function.py index ee3041182..6ab36ba8b 100644 --- a/client/qiskit_serverless/core/function.py +++ b/client/qiskit_serverless/core/function.py @@ -127,7 +127,7 @@ def jobs(self): Returns: Job ids : job executed this function """ - from qiskit_serverless.core.job import Job + from qiskit_serverless.core.job import Job # pylint: disable=import-outside-toplevel if self.job_client is None: raise ValueError("No clients specified for a function.") From 3704b575d211361e461bcff9ba7a8c0f59fda06e Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Thu, 29 Aug 2024 19:26:20 -0400 Subject: [PATCH 06/15] lint --- client/qiskit_serverless/core/function.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/qiskit_serverless/core/function.py b/client/qiskit_serverless/core/function.py index 6ab36ba8b..a2f436dfa 100644 --- a/client/qiskit_serverless/core/function.py +++ b/client/qiskit_serverless/core/function.py @@ -127,7 +127,9 @@ def jobs(self): Returns: Job ids : job executed this function """ - from qiskit_serverless.core.job import Job # pylint: disable=import-outside-toplevel + from qiskit_serverless.core.job import ( # pylint: disable=import-outside-toplevel + Job, + ) if self.job_client is None: raise ValueError("No clients specified for a function.") From 4b7e961489f01bff787b9364a9c9a9c81b09a8dd Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Thu, 29 Aug 2024 19:31:13 -0400 Subject: [PATCH 07/15] lint --- client/qiskit_serverless/core/function.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/qiskit_serverless/core/function.py b/client/qiskit_serverless/core/function.py index a2f436dfa..22caa3b45 100644 --- a/client/qiskit_serverless/core/function.py +++ b/client/qiskit_serverless/core/function.py @@ -127,7 +127,7 @@ def jobs(self): Returns: Job ids : job executed this function """ - from qiskit_serverless.core.job import ( # pylint: disable=import-outside-toplevel + from qiskit_serverless.core.job import ( # pylint: disable=import-outside-toplevel Job, ) From 998a88a28c142a9317b42be3d2be10a8b9840dbd Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Thu, 29 Aug 2024 22:06:03 -0400 Subject: [PATCH 08/15] disable cyclic-import lint check --- client/.pylintrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/.pylintrc b/client/.pylintrc index 6add8c53d..074dbeaa9 100644 --- a/client/.pylintrc +++ b/client/.pylintrc @@ -81,7 +81,8 @@ disable=raw-checker-failed, suppressed-message, useless-suppression, deprecated-pragma, - use-symbolic-message-instead + use-symbolic-message-instead, + cyclic-import # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option From a4eef476d76e6c0f86e2688850cf134f0fcfba09 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Fri, 30 Aug 2024 10:40:00 -0400 Subject: [PATCH 09/15] restore image version --- client/tests/resources/test-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/tests/resources/test-compose.yaml b/client/tests/resources/test-compose.yaml index 11dd6ba32..9cbfac5b0 100644 --- a/client/tests/resources/test-compose.yaml +++ b/client/tests/resources/test-compose.yaml @@ -1,7 +1,7 @@ services: testrayhead: container_name: testrayhead - image: icr.io/quantum-public/qiskit-serverless/ray-node:0.16.0 + image: icr.io/quantum-public/qiskit-serverless/ray-node:latest entrypoint: [ "ray", "start", "--head", "--port=6379", "--dashboard-host=0.0.0.0", "--block" From de821a62df396278818e6c6f34a4707db2bb3183 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Fri, 30 Aug 2024 13:00:42 -0400 Subject: [PATCH 10/15] restore compose file --- client/tests/resources/test-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/tests/resources/test-compose.yaml b/client/tests/resources/test-compose.yaml index 9cbfac5b0..11dd6ba32 100644 --- a/client/tests/resources/test-compose.yaml +++ b/client/tests/resources/test-compose.yaml @@ -1,7 +1,7 @@ services: testrayhead: container_name: testrayhead - image: icr.io/quantum-public/qiskit-serverless/ray-node:latest + image: icr.io/quantum-public/qiskit-serverless/ray-node:0.16.0 entrypoint: [ "ray", "start", "--head", "--port=6379", "--dashboard-host=0.0.0.0", "--block" From ac6a411cb7d5e3f58f3ef55f290d7aee808e4239 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Fri, 30 Aug 2024 15:20:49 -0400 Subject: [PATCH 11/15] review comments --- gateway/api/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gateway/api/serializers.py b/gateway/api/serializers.py index 8a7423a80..e54fba36c 100644 --- a/gateway/api/serializers.py +++ b/gateway/api/serializers.py @@ -168,7 +168,7 @@ class JobSerializer(serializers.ModelSerializer): class Meta: model = Job - fields = "__all__" + fields = ["id", "result", "status", "program", "created"] class RunProgramSerializer(serializers.Serializer): From d7d03e8a043d755bc5cc4549fa05dedebc0d91fb Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Fri, 30 Aug 2024 15:42:31 -0400 Subject: [PATCH 12/15] review comments --- client/qiskit_serverless/core/function.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/qiskit_serverless/core/function.py b/client/qiskit_serverless/core/function.py index 22caa3b45..fb9fc8ba4 100644 --- a/client/qiskit_serverless/core/function.py +++ b/client/qiskit_serverless/core/function.py @@ -30,6 +30,8 @@ from dataclasses import dataclass from typing import Optional, Dict, List, Any, Tuple +from qiskit_serverless.core.job import Job + @dataclass class QiskitFunction: # pylint: disable=too-many-instance-attributes @@ -127,9 +129,6 @@ def jobs(self): Returns: Job ids : job executed this function """ - from qiskit_serverless.core.job import ( # pylint: disable=import-outside-toplevel - Job, - ) if self.job_client is None: raise ValueError("No clients specified for a function.") From e989e9141f947f5eaea4237201a3e9484b9ddbc1 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Fri, 30 Aug 2024 15:50:50 -0400 Subject: [PATCH 13/15] review comments --- client/qiskit_serverless/core/function.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/qiskit_serverless/core/function.py b/client/qiskit_serverless/core/function.py index fb9fc8ba4..288d6b50b 100644 --- a/client/qiskit_serverless/core/function.py +++ b/client/qiskit_serverless/core/function.py @@ -129,6 +129,9 @@ def jobs(self): Returns: Job ids : job executed this function """ + from qiskit_serverless.core.job import ( # pylint: disable=import-outside-toplevel + Job + ) if self.job_client is None: raise ValueError("No clients specified for a function.") From 739b19446cde50327a5a1c4c0d2a5a5747210a66 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Fri, 30 Aug 2024 15:56:00 -0400 Subject: [PATCH 14/15] review comments --- client/qiskit_serverless/core/function.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/qiskit_serverless/core/function.py b/client/qiskit_serverless/core/function.py index 288d6b50b..22caa3b45 100644 --- a/client/qiskit_serverless/core/function.py +++ b/client/qiskit_serverless/core/function.py @@ -30,8 +30,6 @@ from dataclasses import dataclass from typing import Optional, Dict, List, Any, Tuple -from qiskit_serverless.core.job import Job - @dataclass class QiskitFunction: # pylint: disable=too-many-instance-attributes @@ -130,7 +128,7 @@ def jobs(self): Job ids : job executed this function """ from qiskit_serverless.core.job import ( # pylint: disable=import-outside-toplevel - Job + Job, ) if self.job_client is None: From 3ebcb12c372150352fd4857cace4262668f2e858 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Tue, 3 Sep 2024 16:20:26 -0400 Subject: [PATCH 15/15] review comments --- gateway/api/serializers.py | 1 - gateway/api/v1/views.py | 4 ++++ gateway/api/views.py | 10 +++++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/gateway/api/serializers.py b/gateway/api/serializers.py index e54fba36c..c8b93aac3 100644 --- a/gateway/api/serializers.py +++ b/gateway/api/serializers.py @@ -168,7 +168,6 @@ class JobSerializer(serializers.ModelSerializer): class Meta: model = Job - fields = ["id", "result", "status", "program", "created"] class RunProgramSerializer(serializers.Serializer): diff --git a/gateway/api/v1/views.py b/gateway/api/v1/views.py index 7edd823d0..3fd71432a 100644 --- a/gateway/api/v1/views.py +++ b/gateway/api/v1/views.py @@ -38,6 +38,10 @@ def get_serializer_run_program(*args, **kwargs): def get_serializer_run_job(*args, **kwargs): return v1_serializers.RunJobSerializer(*args, **kwargs) + @staticmethod + def get_serializer_job(*args, **kwargs): + return v1_serializers.JobSerializer(*args, **kwargs) + @swagger_auto_schema( operation_description="List author Qiskit Functions", responses={status.HTTP_200_OK: v1_serializers.ProgramSerializer(many=True)}, diff --git a/gateway/api/views.py b/gateway/api/views.py index 0c58d0cdc..706877677 100644 --- a/gateway/api/views.py +++ b/gateway/api/views.py @@ -106,6 +106,14 @@ def get_serializer_run_job(*args, **kwargs): return RunJobSerializer(*args, **kwargs) + @staticmethod + def get_serializer_job(*args, **kwargs): + """ + This method returns the job serializer + """ + + return JobSerializer(*args, **kwargs) + def get_serializer_class(self): return self.serializer_class @@ -413,7 +421,7 @@ def get_jobs( jobs = Job.objects.filter(program=program) else: jobs = Job.objects.filter(program=program, author=request.user) - serializer = JobSerializer(jobs, many=True) + serializer = self.get_serializer_job(jobs, many=True) return Response(serializer.data)