[Patchew-devel] [PATCH 07/11] testing: add a version of testing-get under /api/v1/project/

Paolo Bonzini pbonzini at redhat.com
Wed May 15 12:58:04 UTC 2019


---
 api/rest.py     |  4 +++
 mods/testing.py | 76 ++++++++++++++++++++++++++++++++++++-------------
 2 files changed, 60 insertions(+), 20 deletions(-)

diff --git a/api/rest.py b/api/rest.py
index 9525a27..c3ec3e1 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -120,6 +120,10 @@ class ImportPermission(PatchewPermission):
     allowed_groups = ('importers',)
 
 
+class TestPermission(PatchewPermission):
+    allowed_groups = ('testers',)
+
+
 # utility function to generate REST API URLs
 
 def reverse_detail(obj, request):
diff --git a/mods/testing.py b/mods/testing.py
index 7ef8267..90bb2be 100644
--- a/mods/testing.py
+++ b/mods/testing.py
@@ -20,13 +20,14 @@ import time
 import math
 from api.views import APILoginRequiredView
 from api.models import (Message, MessageResult, Project, ProjectResult, Result)
-from api.rest import PluginMethodField, reverse_detail
+from api.rest import PluginMethodField, TestPermission, reverse_detail
 from api.search import SearchEngine
 from event import emit_event, declare_event, register_handler
 from patchew.logviewer import LogView
 from schema import *
-from rest_framework import serializers
+from rest_framework import serializers, generics
 from rest_framework.fields import CharField, BooleanField
+from rest_framework.response import Response
 
 _instance = None
 
@@ -249,6 +250,10 @@ class TestingModule(PatchewModule):
         urlpatterns.append(url(r"^(?P<project>[^/]*)/badge.(?P<ext>svg|png)$", self.www_view_badge,
                                name="testing-badge"))
 
+    def api_url_hook(self, urlpatterns):
+        urlpatterns.append(url(r"^v1/projects/(?P<pk>[^/]*)/get-test/$", GetTestView.as_view(),
+                               name="get-test"))
+
     def reverse_testing_log(self, obj, test, request=None, html=False):
         if isinstance(obj, Message):
             log_url = reverse("testing-log",
@@ -413,21 +418,8 @@ class TestingModule(PatchewModule):
             return
         po.set_property('testing.check_in.' + tester, time.time())
 
-class TestingGetView(APILoginRequiredView):
-    name = "testing-get"
-    allowed_groups = ["testers"]
-
-    def _generate_test_data(self, project, repo, head, base, identity, result_uri, test):
-        r = {"project": project,
-             "repo": repo,
-             "head": head,
-             "base": base,
-             "test": test,
-             "identity": identity,
-             "result_uri": result_uri,
-             }
-        return r
 
+class GetTestViewMixin(object):
     def _generate_series_test_data(self, request, s, result, test):
         gr = s.git_result
         assert gr.is_success()
@@ -499,20 +491,64 @@ class TestingGetView(APILoginRequiredView):
             return r, s, td
         return None
 
-    def handle(self, request, project, tester, capabilities):
+    def _do_testing_get(self, request, po, tester, capabilities):
         # Try project head test first
-        _instance.tester_check_in(project, tester or request.user.username)
-        po = Project.objects.get(name=project)
+        _instance.tester_check_in(po.name, tester or request.user.username)
         candidate = self._find_project_test(request, po, tester, capabilities)
         if not candidate:
             candidate = self._find_series_test(request, po, tester, capabilities)
         if not candidate:
-            return
+            return None
         r, obj, test_data = candidate
         r.status = Result.RUNNING
         r.save()
         return test_data
 
+
+class TestingGetView(APILoginRequiredView, GetTestViewMixin):
+    name = "testing-get"
+    allowed_groups = ["testers"]
+
+    def _generate_test_data(self, project, repo, head, base, identity, result_uri, test):
+        r = {"project": project,
+             "repo": repo,
+             "head": head,
+             "base": base,
+             "test": test,
+             "identity": identity,
+             "result_uri": result_uri,
+             }
+        return r
+
+    def handle(self, request, project, tester, capabilities):
+        po = Project.objects.get(name=project)
+        return self._do_testing_get(request, po, tester, capabilities)
+
+
+class GetTestView(generics.GenericAPIView, GetTestViewMixin):
+    queryset = Project.objects.all()
+    permission_classes = (TestPermission,)
+
+    def _generate_test_data(self, project, repo, head, base, identity, result_uri, test):
+        r = {"repo": repo,
+             "head": head,
+             "base": base,
+             "test": test,
+             "identity": identity,
+             "result_uri": result_uri,
+             }
+        return r
+
+    def post(self, request, *args, **kwargs):
+        tester = request.data.get('tester', '')
+        capabilities = request.data.get('capabilities', [])
+        test_data = self._do_testing_get(request, self.get_object(), tester, capabilities)
+        if test_data:
+            return Response(test_data)
+        else:
+            return Response(status=204)
+
+
 class TestingReportView(APILoginRequiredView):
     name = "testing-report"
     allowed_groups = ["testers"]
-- 
2.21.0





More information about the Patchew-devel mailing list