From 7ab401d65460d2c6ab28d22dd596827dd164b54d Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Fri, 19 Jan 2024 15:34:07 -0500 Subject: [PATCH 1/9] add RuntimeJob table Signed-off-by: Akihiko Kuroda --- gateway/api/models.py | 13 +++++++++ gateway/api/serializers.py | 11 +++++++- gateway/api/v1/serializers.py | 11 ++++++++ gateway/api/v1/urls.py | 5 ++++ gateway/api/v1/views.py | 15 ++++++++++- gateway/api/views.py | 51 +++++++++++++++++++++++++++++++++-- 6 files changed, 102 insertions(+), 4 deletions(-) diff --git a/gateway/api/models.py b/gateway/api/models.py index a30a7f97d..874a88e96 100644 --- a/gateway/api/models.py +++ b/gateway/api/models.py @@ -172,3 +172,16 @@ class CatalogEntry(models.Model): created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True, null=True) program = models.ForeignKey(to=Program, on_delete=models.SET_NULL, null=True) + + +class RuntimeJob(models.Model): + """Runtime Job model.""" + + job = models.ForeignKey( + to=Job, + on_delete=models.SET_NULL, + default=None, + null=True, + blank=True, + ) + runtime_job = models.CharField(primary_key=True, blank=False, null=False) diff --git a/gateway/api/serializers.py b/gateway/api/serializers.py index 597425905..657a3a062 100644 --- a/gateway/api/serializers.py +++ b/gateway/api/serializers.py @@ -8,7 +8,7 @@ from django.conf import settings from rest_framework import serializers -from .models import Program, Job, JobConfig +from .models import Program, Job, JobConfig, RuntimeJob class JobConfigSerializer(serializers.ModelSerializer): @@ -78,3 +78,12 @@ def update(self, instance, validated_data): def create(self, validated_data): pass + + +class RuntimeJobSerializer(serializers.ModelSerializer): + """ + Serializer for the runtime job model. + """ + + class Meta: + model = RuntimeJob diff --git a/gateway/api/v1/serializers.py b/gateway/api/v1/serializers.py index 67b1b6d6d..b19c337eb 100644 --- a/gateway/api/v1/serializers.py +++ b/gateway/api/v1/serializers.py @@ -50,3 +50,14 @@ class Meta(serializers.JobConfigSerializer.Meta): "auto_scaling", "python_version", ] + + +class RuntimeJobSerializer(serializers.RuntimeJobSerializer): + """ + Runtime job serializer first version. Serializer for the runtime job model. + """ + + job = JobSerializer(many=False) + + class Meta(serializers.RuntimeJobSerializer.Meta): + fields = ["job", "runtime_job"] diff --git a/gateway/api/v1/urls.py b/gateway/api/v1/urls.py index 3aebcb304..886969027 100644 --- a/gateway/api/v1/urls.py +++ b/gateway/api/v1/urls.py @@ -19,5 +19,10 @@ router.register( r"files", v1_views.FilesViewSet, basename=v1_views.FilesViewSet.BASE_NAME ) +router.register( + r"runtime_jobs", + v1_views.RuntimeJobViewSet, + basename=v1_views.RuntimeJobViewSet.BASE_NAME, +) urlpatterns = router.urls diff --git a/gateway/api/v1/views.py b/gateway/api/v1/views.py index 0e402255f..7b0a2dee7 100644 --- a/gateway/api/v1/views.py +++ b/gateway/api/v1/views.py @@ -6,7 +6,7 @@ from api import views -from api.models import Program, Job +from api.models import Program, Job, RuntimeJob from api.permissions import IsOwner from . import serializers as v1_serializers from . import services as v1_services @@ -68,3 +68,16 @@ class FilesViewSet(views.FilesViewSet): """ permission_classes = [permissions.IsAuthenticated, IsOwner] + + +class RuntimeJobViewSet(views.RuntimeJobViewSet): # pylint: disable=too-many-ancestors + """ + RuntimeJob view set. + """ + + queryset = RuntimeJob.objects.all() + serializer_class = v1_serializers.RuntimeJobSerializer + permission_classes = [permissions.IsAuthenticated, IsOwner] + + def get_serializer_class(self): + return v1_serializers.RuntimeJobSerializer diff --git a/gateway/api/views.py b/gateway/api/views.py index 48437569f..b96b1b355 100644 --- a/gateway/api/views.py +++ b/gateway/api/views.py @@ -29,9 +29,13 @@ from utils import sanitize_file_path from .exceptions import InternalServerErrorException, ResourceNotFoundException -from .models import Program, Job +from .models import Program, Job, RuntimeJob from .ray import get_job_handler -from .serializers import JobSerializer, ExistingProgramSerializer, JobConfigSerializer +from .serializers import ( + JobSerializer, + ExistingProgramSerializer, + JobConfigSerializer, +) from .services import JobService, ProgramService, JobConfigService logger = logging.getLogger("gateway") @@ -468,3 +472,46 @@ def upload(self, request): # pylint: disable=invalid-name destination.write(chunk) return Response({"message": file_path}) return Response("server error", status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +class RuntimeJobViewSet(viewsets.ModelViewSet): # pylint: disable=too-many-ancestors + """ViewSet for runtime job operations handling.""" + + BASE_NAME = "utils" + + def get_serializer_class(self): + return self.serializer_class + + @action(methods=["POST"], detail=True) + def create_runtimejob( + self, request, pk=None + ): # pylint: disable=invalid-name,unused-argument + """Create runtime job with job.""" + tracer = trace.get_tracer("gateway.tracer") + ctx = TraceContextTextMapPropagator().extract(carrier=request.headers) + with tracer.start_as_current_span("gateway.runtimejob.add", context=ctx): + runtimejob = RuntimeJob( + runtime_job=request.data.get("runtime_job"), + job=Job.objects.all().filter(id=request.data.get("job")).first(), + ) + runtimejob.save() + serializer_class = self.get_serializer_class() + serializer = serializer_class(runtimejob) # pylint: disable=not-callable + return Response(serializer.data, status=status.HTTP_201_CREATED) + + @action(methods=["GET"], detail=True) + def list_runtimejob( + self, request, pk=None + ): # pylint: disable=invalid-name,unused-argument + """List runtime jobs for job.""" + print("List runtime jobs for job") + tracer = trace.get_tracer("gateway.tracer") + ctx = TraceContextTextMapPropagator().extract(carrier=request.headers) + with tracer.start_as_current_span("gateway.job.primitive", context=ctx): + job = request.data.get("job") + runtime_jobs = RuntimeJob.objects.all().filter(job=job) + serializer_class = self.get_serializer_class() + serializer = serializer_class( # pylint: disable=not-callable + runtime_jobs, many=True + ) + return Response(serializer.data, status=status.HTTP_200_OK) From 2c0b20f661c6c56a99c13ccd05f1405657651145 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Fri, 19 Jan 2024 15:43:26 -0500 Subject: [PATCH 2/9] add migration --- gateway/api/migrations/0014_runtimejob.py | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 gateway/api/migrations/0014_runtimejob.py diff --git a/gateway/api/migrations/0014_runtimejob.py b/gateway/api/migrations/0014_runtimejob.py new file mode 100644 index 000000000..f9eccab42 --- /dev/null +++ b/gateway/api/migrations/0014_runtimejob.py @@ -0,0 +1,30 @@ +# Generated by Django 4.2.2 on 2024-01-19 20:42 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("api", "0013_program_groups_catalogentry"), + ] + + operations = [ + migrations.CreateModel( + name="RuntimeJob", + fields=[ + ("runtime_job", models.CharField(primary_key=True, serialize=False)), + ( + "job", + models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.job", + ), + ), + ], + ), + ] From 147d3f344c7647688e2cd9061078775d5a038d53 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Fri, 19 Jan 2024 20:48:54 -0500 Subject: [PATCH 3/9] lint --- gateway/api/migrations/0014_runtimejob.py | 7 +++++-- gateway/api/models.py | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/gateway/api/migrations/0014_runtimejob.py b/gateway/api/migrations/0014_runtimejob.py index f9eccab42..0b453775d 100644 --- a/gateway/api/migrations/0014_runtimejob.py +++ b/gateway/api/migrations/0014_runtimejob.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.2 on 2024-01-19 20:42 +# Generated by Django 4.2.2 on 2024-01-20 01:44 from django.db import migrations, models import django.db.models.deletion @@ -14,7 +14,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name="RuntimeJob", fields=[ - ("runtime_job", models.CharField(primary_key=True, serialize=False)), + ( + "runtime_job", + models.CharField(max_length=100, primary_key=True, serialize=False), + ), ( "job", models.ForeignKey( diff --git a/gateway/api/models.py b/gateway/api/models.py index 874a88e96..768d8d1c9 100644 --- a/gateway/api/models.py +++ b/gateway/api/models.py @@ -184,4 +184,6 @@ class RuntimeJob(models.Model): null=True, blank=True, ) - runtime_job = models.CharField(primary_key=True, blank=False, null=False) + runtime_job = models.CharField( + primary_key=True, max_length=100, blank=False, null=False + ) From 82a6acb34b44ed4af8f1cd43d1fca823e0e4e4d5 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Mon, 22 Jan 2024 11:26:33 -0500 Subject: [PATCH 4/9] add test --- gateway/api/views.py | 3 +-- gateway/tests/api/test_v1_program.py | 38 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/gateway/api/views.py b/gateway/api/views.py index b96b1b355..c8ca91027 100644 --- a/gateway/api/views.py +++ b/gateway/api/views.py @@ -499,12 +499,11 @@ def create_runtimejob( serializer = serializer_class(runtimejob) # pylint: disable=not-callable return Response(serializer.data, status=status.HTTP_201_CREATED) - @action(methods=["GET"], detail=True) + @action(methods=["POST"], detail=True) def list_runtimejob( self, request, pk=None ): # pylint: disable=invalid-name,unused-argument """List runtime jobs for job.""" - print("List runtime jobs for job") tracer = trace.get_tracer("gateway.tracer") ctx = TraceContextTextMapPropagator().extract(carrier=request.headers) with tracer.start_as_current_span("gateway.job.primitive", context=ctx): diff --git a/gateway/tests/api/test_v1_program.py b/gateway/tests/api/test_v1_program.py index 757ce7e30..4bd597ba1 100644 --- a/gateway/tests/api/test_v1_program.py +++ b/gateway/tests/api/test_v1_program.py @@ -81,3 +81,41 @@ def test_run_existing(self): self.assertEqual(job.config.max_workers, 5) self.assertEqual(job.config.workers, None) self.assertEqual(job.config.auto_scaling, True) + + def test_runtimejob(self): + """Tests runtimejob setting.""" + auth = reverse("rest_login") + response = self.client.post( + auth, {"username": "test_user", "password": "123"}, format="json" + ) + token = response.data.get("access") + self.client.credentials(HTTP_AUTHORIZATION="Bearer " + token) + + runtime_job_response = self.client.post( + "/api/v1/runtime_jobs/utils/create_runtimejob/", + data={ + "job": "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", + "runtime_job": "runtimejob1", + }, + format="json", + ) + self.assertEqual(runtime_job_response.json()["job"]["id"],"1a7947f9-6ae8-4e3d-ac1e-e7d608deec82") + self.assertEqual(runtime_job_response.json()["runtime_job"],"runtimejob1") + + runtime_job_response = self.client.get( + "/api/v1/runtime_jobs/", + format="json", + ) + self.assertEqual(runtime_job_response.json()["results"][0]["job"]["id"],"1a7947f9-6ae8-4e3d-ac1e-e7d608deec82") + self.assertEqual(runtime_job_response.json()["results"][0]["runtime_job"],"runtimejob1") + + runtime_job_response = self.client.post( + "/api/v1/runtime_jobs/utils/list_runtimejob/", + data={ + "job": "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", + }, + format="json", + ) + self.assertEqual(runtime_job_response.json()[0]["job"]["id"],"1a7947f9-6ae8-4e3d-ac1e-e7d608deec82") + self.assertEqual(runtime_job_response.json()[0]["runtime_job"],"runtimejob1") + From ba497a7e57521451909c88b0d08a340c6894afa4 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Mon, 22 Jan 2024 11:42:44 -0500 Subject: [PATCH 5/9] lint --- gateway/tests/api/test_v1_program.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/gateway/tests/api/test_v1_program.py b/gateway/tests/api/test_v1_program.py index 4bd597ba1..c14a328f2 100644 --- a/gateway/tests/api/test_v1_program.py +++ b/gateway/tests/api/test_v1_program.py @@ -99,15 +99,23 @@ def test_runtimejob(self): }, format="json", ) - self.assertEqual(runtime_job_response.json()["job"]["id"],"1a7947f9-6ae8-4e3d-ac1e-e7d608deec82") - self.assertEqual(runtime_job_response.json()["runtime_job"],"runtimejob1") + self.assertEqual( + runtime_job_response.json()["job"]["id"], + "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", + ) + self.assertEqual(runtime_job_response.json()["runtime_job"], "runtimejob1") runtime_job_response = self.client.get( "/api/v1/runtime_jobs/", format="json", ) - self.assertEqual(runtime_job_response.json()["results"][0]["job"]["id"],"1a7947f9-6ae8-4e3d-ac1e-e7d608deec82") - self.assertEqual(runtime_job_response.json()["results"][0]["runtime_job"],"runtimejob1") + self.assertEqual( + runtime_job_response.json()["results"][0]["job"]["id"], + "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", + ) + self.assertEqual( + runtime_job_response.json()["results"][0]["runtime_job"], "runtimejob1" + ) runtime_job_response = self.client.post( "/api/v1/runtime_jobs/utils/list_runtimejob/", @@ -116,6 +124,8 @@ def test_runtimejob(self): }, format="json", ) - self.assertEqual(runtime_job_response.json()[0]["job"]["id"],"1a7947f9-6ae8-4e3d-ac1e-e7d608deec82") - self.assertEqual(runtime_job_response.json()[0]["runtime_job"],"runtimejob1") - + self.assertEqual( + runtime_job_response.json()[0]["job"]["id"], + "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", + ) + self.assertEqual(runtime_job_response.json()[0]["runtime_job"], "runtimejob1") From 25c5341df1d0c966539027f13ab40c91521f6b23 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Tue, 23 Jan 2024 09:55:46 -0500 Subject: [PATCH 6/9] review comments --- gateway/api/views.py | 8 ++------ gateway/tests/api/test_v1_program.py | 4 ++-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/gateway/api/views.py b/gateway/api/views.py index c8ca91027..f45bbd958 100644 --- a/gateway/api/views.py +++ b/gateway/api/views.py @@ -483,9 +483,7 @@ def get_serializer_class(self): return self.serializer_class @action(methods=["POST"], detail=True) - def create_runtimejob( - self, request, pk=None - ): # pylint: disable=invalid-name,unused-argument + def add(self, request, pk=None): # pylint: disable=invalid-name,unused-argument """Create runtime job with job.""" tracer = trace.get_tracer("gateway.tracer") ctx = TraceContextTextMapPropagator().extract(carrier=request.headers) @@ -500,9 +498,7 @@ def create_runtimejob( return Response(serializer.data, status=status.HTTP_201_CREATED) @action(methods=["POST"], detail=True) - def list_runtimejob( - self, request, pk=None - ): # pylint: disable=invalid-name,unused-argument + def issued(self, request, pk=None): # pylint: disable=invalid-name,unused-argument """List runtime jobs for job.""" tracer = trace.get_tracer("gateway.tracer") ctx = TraceContextTextMapPropagator().extract(carrier=request.headers) diff --git a/gateway/tests/api/test_v1_program.py b/gateway/tests/api/test_v1_program.py index c14a328f2..d32bbf019 100644 --- a/gateway/tests/api/test_v1_program.py +++ b/gateway/tests/api/test_v1_program.py @@ -92,7 +92,7 @@ def test_runtimejob(self): self.client.credentials(HTTP_AUTHORIZATION="Bearer " + token) runtime_job_response = self.client.post( - "/api/v1/runtime_jobs/utils/create_runtimejob/", + "/api/v1/runtime_jobs/utils/add/", data={ "job": "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", "runtime_job": "runtimejob1", @@ -118,7 +118,7 @@ def test_runtimejob(self): ) runtime_job_response = self.client.post( - "/api/v1/runtime_jobs/utils/list_runtimejob/", + "/api/v1/runtime_jobs/utils/issued/", data={ "job": "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", }, From 81a53be9061307820aeef3bb8c01499767b39d85 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Tue, 23 Jan 2024 15:49:13 -0500 Subject: [PATCH 7/9] review comments --- gateway/api/permissions.py | 3 ++ gateway/api/v1/urls.py | 5 --- gateway/api/v1/views.py | 15 +-------- gateway/api/views.py | 46 ++------------------------ gateway/tests/api/test_v1_program.py | 48 ---------------------------- 5 files changed, 6 insertions(+), 111 deletions(-) diff --git a/gateway/api/permissions.py b/gateway/api/permissions.py index f88acf99e..def027e7d 100644 --- a/gateway/api/permissions.py +++ b/gateway/api/permissions.py @@ -1,6 +1,7 @@ """Permissions.""" from rest_framework import permissions +from .models import RuntimeJob class IsOwner(permissions.BasePermission): @@ -9,4 +10,6 @@ class IsOwner(permissions.BasePermission): """ def has_object_permission(self, request, view, obj): + if isinstance(obj, RuntimeJob): + return obj.job.author == request.user return obj.author == request.user diff --git a/gateway/api/v1/urls.py b/gateway/api/v1/urls.py index 886969027..3aebcb304 100644 --- a/gateway/api/v1/urls.py +++ b/gateway/api/v1/urls.py @@ -19,10 +19,5 @@ router.register( r"files", v1_views.FilesViewSet, basename=v1_views.FilesViewSet.BASE_NAME ) -router.register( - r"runtime_jobs", - v1_views.RuntimeJobViewSet, - basename=v1_views.RuntimeJobViewSet.BASE_NAME, -) urlpatterns = router.urls diff --git a/gateway/api/v1/views.py b/gateway/api/v1/views.py index 7b0a2dee7..0e402255f 100644 --- a/gateway/api/v1/views.py +++ b/gateway/api/v1/views.py @@ -6,7 +6,7 @@ from api import views -from api.models import Program, Job, RuntimeJob +from api.models import Program, Job from api.permissions import IsOwner from . import serializers as v1_serializers from . import services as v1_services @@ -68,16 +68,3 @@ class FilesViewSet(views.FilesViewSet): """ permission_classes = [permissions.IsAuthenticated, IsOwner] - - -class RuntimeJobViewSet(views.RuntimeJobViewSet): # pylint: disable=too-many-ancestors - """ - RuntimeJob view set. - """ - - queryset = RuntimeJob.objects.all() - serializer_class = v1_serializers.RuntimeJobSerializer - permission_classes = [permissions.IsAuthenticated, IsOwner] - - def get_serializer_class(self): - return v1_serializers.RuntimeJobSerializer diff --git a/gateway/api/views.py b/gateway/api/views.py index f45bbd958..48437569f 100644 --- a/gateway/api/views.py +++ b/gateway/api/views.py @@ -29,13 +29,9 @@ from utils import sanitize_file_path from .exceptions import InternalServerErrorException, ResourceNotFoundException -from .models import Program, Job, RuntimeJob +from .models import Program, Job from .ray import get_job_handler -from .serializers import ( - JobSerializer, - ExistingProgramSerializer, - JobConfigSerializer, -) +from .serializers import JobSerializer, ExistingProgramSerializer, JobConfigSerializer from .services import JobService, ProgramService, JobConfigService logger = logging.getLogger("gateway") @@ -472,41 +468,3 @@ def upload(self, request): # pylint: disable=invalid-name destination.write(chunk) return Response({"message": file_path}) return Response("server error", status=status.HTTP_500_INTERNAL_SERVER_ERROR) - - -class RuntimeJobViewSet(viewsets.ModelViewSet): # pylint: disable=too-many-ancestors - """ViewSet for runtime job operations handling.""" - - BASE_NAME = "utils" - - def get_serializer_class(self): - return self.serializer_class - - @action(methods=["POST"], detail=True) - def add(self, request, pk=None): # pylint: disable=invalid-name,unused-argument - """Create runtime job with job.""" - tracer = trace.get_tracer("gateway.tracer") - ctx = TraceContextTextMapPropagator().extract(carrier=request.headers) - with tracer.start_as_current_span("gateway.runtimejob.add", context=ctx): - runtimejob = RuntimeJob( - runtime_job=request.data.get("runtime_job"), - job=Job.objects.all().filter(id=request.data.get("job")).first(), - ) - runtimejob.save() - serializer_class = self.get_serializer_class() - serializer = serializer_class(runtimejob) # pylint: disable=not-callable - return Response(serializer.data, status=status.HTTP_201_CREATED) - - @action(methods=["POST"], detail=True) - def issued(self, request, pk=None): # pylint: disable=invalid-name,unused-argument - """List runtime jobs for job.""" - tracer = trace.get_tracer("gateway.tracer") - ctx = TraceContextTextMapPropagator().extract(carrier=request.headers) - with tracer.start_as_current_span("gateway.job.primitive", context=ctx): - job = request.data.get("job") - runtime_jobs = RuntimeJob.objects.all().filter(job=job) - serializer_class = self.get_serializer_class() - serializer = serializer_class( # pylint: disable=not-callable - runtime_jobs, many=True - ) - return Response(serializer.data, status=status.HTTP_200_OK) diff --git a/gateway/tests/api/test_v1_program.py b/gateway/tests/api/test_v1_program.py index d32bbf019..757ce7e30 100644 --- a/gateway/tests/api/test_v1_program.py +++ b/gateway/tests/api/test_v1_program.py @@ -81,51 +81,3 @@ def test_run_existing(self): self.assertEqual(job.config.max_workers, 5) self.assertEqual(job.config.workers, None) self.assertEqual(job.config.auto_scaling, True) - - def test_runtimejob(self): - """Tests runtimejob setting.""" - auth = reverse("rest_login") - response = self.client.post( - auth, {"username": "test_user", "password": "123"}, format="json" - ) - token = response.data.get("access") - self.client.credentials(HTTP_AUTHORIZATION="Bearer " + token) - - runtime_job_response = self.client.post( - "/api/v1/runtime_jobs/utils/add/", - data={ - "job": "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", - "runtime_job": "runtimejob1", - }, - format="json", - ) - self.assertEqual( - runtime_job_response.json()["job"]["id"], - "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", - ) - self.assertEqual(runtime_job_response.json()["runtime_job"], "runtimejob1") - - runtime_job_response = self.client.get( - "/api/v1/runtime_jobs/", - format="json", - ) - self.assertEqual( - runtime_job_response.json()["results"][0]["job"]["id"], - "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", - ) - self.assertEqual( - runtime_job_response.json()["results"][0]["runtime_job"], "runtimejob1" - ) - - runtime_job_response = self.client.post( - "/api/v1/runtime_jobs/utils/issued/", - data={ - "job": "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", - }, - format="json", - ) - self.assertEqual( - runtime_job_response.json()[0]["job"]["id"], - "1a7947f9-6ae8-4e3d-ac1e-e7d608deec82", - ) - self.assertEqual(runtime_job_response.json()[0]["runtime_job"], "runtimejob1") From 205d0c5b8d74213a2c14ad96e5d49fb18d1a6b5e Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Wed, 24 Jan 2024 17:35:05 -0500 Subject: [PATCH 8/9] review comment --- gateway/api/permissions.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/gateway/api/permissions.py b/gateway/api/permissions.py index def027e7d..caf7c42b8 100644 --- a/gateway/api/permissions.py +++ b/gateway/api/permissions.py @@ -10,6 +10,4 @@ class IsOwner(permissions.BasePermission): """ def has_object_permission(self, request, view, obj): - if isinstance(obj, RuntimeJob): - return obj.job.author == request.user return obj.author == request.user From c2a13b0c752cee83af85de0589ddaa9f626787b4 Mon Sep 17 00:00:00 2001 From: Akihiko Kuroda Date: Wed, 24 Jan 2024 17:38:53 -0500 Subject: [PATCH 9/9] review comment --- gateway/api/permissions.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gateway/api/permissions.py b/gateway/api/permissions.py index caf7c42b8..f88acf99e 100644 --- a/gateway/api/permissions.py +++ b/gateway/api/permissions.py @@ -1,7 +1,6 @@ """Permissions.""" from rest_framework import permissions -from .models import RuntimeJob class IsOwner(permissions.BasePermission):