[Patchew-devel] [PATCH 5/5] rest: include log directly in /.../results/xyz response

Paolo Bonzini pbonzini at redhat.com
Sat Mar 17 14:47:14 UTC 2018


Returning all the logs in the list view might make the response too large,
but we include it when retrieving a single result.  This also makes sense
because a POST or PUT request for a result should include the log.

Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
---
 api/rest.py           | 24 ++++++++++++++++--------
 mods/git.py           |  9 +++++----
 mods/testing.py       |  8 ++++++--
 tests/test_git.py     |  9 +++++++++
 tests/test_testing.py |  4 ++++
 5 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/api/rest.py b/api/rest.py
index 3d22de8..1205981 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -146,15 +146,15 @@ class ProjectMessagesViewSetMixin(mixins.RetrieveModelMixin):
     def get_queryset(self):
         return self.queryset.filter(project=self.kwargs['projects_pk'])
 
-class Result(namedtuple("Result", "name status log_url message data")):
+class Result(namedtuple("Result", "name status log log_url message data")):
     __slots__ = ()
 
-    def __new__(cls, name, status, message, log_url=None, data=None, request=None):
+    def __new__(cls, name, status, message, log=None, log_url=None, data=None, request=None):
         if log_url is not None and request is not None:
             log_url = request.build_absolute_uri(log_url)
         if status not in ('pending', 'success', 'failure'):
             raise ValueError("invalid value '%s' for status field" % status)
-        return super(cls, Result).__new__(cls, status=status, log_url=log_url,
+        return super(cls, Result).__new__(cls, status=status, log=log, log_url=log_url,
                                           message=message, data=data, name=name)
 
 # Series
@@ -342,8 +342,10 @@ class ResultSerializer(serializers.Serializer):
     log_url = CharField(required=False)
     data = JSONField(required=False)
 
+class ResultSerializerFull(ResultSerializer):
+    log = CharField(required=False)
+
 class SeriesResultsViewSet(viewsets.ViewSet, generics.GenericAPIView):
-    serializer_class = ResultSerializer
     lookup_field = 'name'
     lookup_value_regex = '[^/]+'
 
@@ -351,15 +353,21 @@ class SeriesResultsViewSet(viewsets.ViewSet, generics.GenericAPIView):
         return Message.objects.filter(project=self.kwargs['projects_pk'],
                                       message_id=self.kwargs['series_message_id'])
 
-    def get_results(self):
+    def get_serializer_class(self, *args, **kwargs):
+        if self.lookup_field in self.kwargs:
+            return ResultSerializerFull
+        return ResultSerializer
+
+    def get_results(self, detailed):
         message = self.get_queryset()[0]
         results = []
         dispatch_module_hook("rest_results_hook", request=self.request,
-                             message=message, results=results)
+                             message=message, results=results,
+                             detailed=detailed)
         return {x.name: x for x in results}
 
     def list(self, request, *args, **kwargs):
-        results = self.get_results().values()
+        results = self.get_results(detailed=False).values()
         serializer = self.get_serializer(results, many=True)
         # Fake paginator response for forwards-compatibility, in case
         # this ViewSet becomes model-based
@@ -369,7 +377,7 @@ class SeriesResultsViewSet(viewsets.ViewSet, generics.GenericAPIView):
         ]))
 
     def retrieve(self, request, name, *args, **kwargs):
-        results = self.get_results()
+        results = self.get_results(detailed=True)
         try:
             result = results[name]
         except KeyError:
diff --git a/mods/git.py b/mods/git.py
index 8164854..44c883a 100644
--- a/mods/git.py
+++ b/mods/git.py
@@ -114,10 +114,10 @@ class GitModule(PatchewModule):
             raise Exception("Project git repo invalid: %s" % project_git)
         return upstream, branch
 
-    def rest_results_hook(self, request, message, results):
-        l = message.get_property("git.apply-log")
+    def rest_results_hook(self, request, message, results, detailed=False):
+        log = message.get_property("git.apply-log")
         data = None
-        if l:
+        if log:
             if message.get_property("git.apply-failed"):
                 status = 'failure'
             else:
@@ -130,7 +130,8 @@ class GitModule(PatchewModule):
             status = 'pending'
             log_url = None
         results.append(Result(name='git', message=message, status=status,
-                              log_url=log_url, data=data, request=request))
+                              log=log, log_url=log_url, data=data,
+                              request=request))
 
     def prepare_message_hook(self, request, message, detailed):
         if not message.is_series_head:
diff --git a/mods/testing.py b/mods/testing.py
index 6f7d1ae..3d02de1 100644
--- a/mods/testing.py
+++ b/mods/testing.py
@@ -282,7 +282,7 @@ class TestingModule(PatchewModule):
         return reverse("testing-get-prop",
                        kwargs={"project_or_series": obj.message_id})
 
-    def rest_results_hook(self, request, message, results):
+    def rest_results_hook(self, request, message, results, detailed=False):
         for pn, p in message.get_properties().items():
             if not pn.startswith("testing.report."):
                 continue
@@ -290,8 +290,12 @@ class TestingModule(PatchewModule):
             failed = not p["passed"]
             log_url = self.reverse_testing_log(message, tn, request=request, html=False)
             passed_str = "failure" if failed else "success"
+            if detailed:
+                log = message.get_property("testing.log." + tn)
+            else:
+                log = None
             results.append(Result(name='testing.' + tn, message=message, status=passed_str,
-                                  log_url=log_url, request=request))
+                                  log=log, log_url=log_url, request=request))
 
     def prepare_message_hook(self, request, message, detailed):
         if not message.is_series_head:
diff --git a/tests/test_git.py b/tests/test_git.py
index fdf6b67..c781ead 100755
--- a/tests/test_git.py
+++ b/tests/test_git.py
@@ -108,6 +108,7 @@ class GitTest(PatchewTestCase):
         resp = self.api_client.get('%sseries/%s/results/git/' % (self.PROJECT_BASE, MESSAGE_ID))
         self.assertEqual(resp.data['status'], 'pending')
         self.assertEqual(resp.data['log_url'], None)
+        self.assertEqual(resp.data['log'], None)
 
     def test_rest_apply_failure(self):
         self.cli_import("0014-bar-patch.mbox.gz")
@@ -115,12 +116,19 @@ class GitTest(PatchewTestCase):
         MESSAGE_ID = '20160628014747.20971-2-famz at redhat.com'
         resp = self.api_client.get('%sseries/%s/' % (self.PROJECT_BASE, MESSAGE_ID))
         self.assertEqual(resp.data['is_complete'], True)
+
+        resp = self.api_client.get('%sseries/%s/results/' % (self.PROJECT_BASE, MESSAGE_ID))
+        self.assertEqual(resp.data['results'][0]['name'], 'git')
+        self.assertEqual('log' in resp.data['results'][0], False)
+        self.assertEqual('log_url' in resp.data['results'][0], True)
+
         resp = self.api_client.get('%sseries/%s/results/git/' % (self.PROJECT_BASE, MESSAGE_ID))
         self.assertEqual(resp.data['status'], 'failure')
         self.assertEqual('repo' in resp.data, False)
         self.assertEqual('tag' in resp.data, False)
         log = self.client.get(resp.data['log_url'])
         self.assertEqual(log.status_code, 200)
+        self.assertEqual(log.content.decode(), resp.data['log'])
 
     def test_rest_apply_success(self):
         self.cli_import("0013-foo-patch.mbox.gz")
@@ -134,6 +142,7 @@ class GitTest(PatchewTestCase):
         self.assertEqual(resp.data['data']['tag'], "refs/tags/patchew/20160628014747.20971-1-famz at redhat.com")
         log = self.client.get(resp.data['log_url'])
         self.assertEqual(log.status_code, 200)
+        self.assertEqual(log.content.decode(), resp.data['log'])
 
 if __name__ == '__main__':
     main()
diff --git a/tests/test_testing.py b/tests/test_testing.py
index 9bc03ab..a23f93f 100755
--- a/tests/test_testing.py
+++ b/tests/test_testing.py
@@ -98,6 +98,7 @@ class TestingTest(PatchewTestCase):
         self.msg_testing_done(log='everything good!', passed=True)
         resp = self.api_client.get('%sseries/%s/results/testing.tests/' % (self.PROJECT_BASE, self.msg.message_id))
         self.assertEquals(resp.data['status'], 'success')
+        self.assertEquals(resp.data['log'], 'everything good!')
         log = self.client.get(resp.data['log_url'])
         self.assertEquals(log.status_code, 200)
         self.assertEquals(log.content, b'everything good!')
@@ -106,6 +107,7 @@ class TestingTest(PatchewTestCase):
         self.msg_testing_done(log='sorry no good', passed=False)
         resp = self.api_client.get('%sseries/%s/results/testing.tests/' % (self.PROJECT_BASE, self.msg.message_id))
         self.assertEquals(resp.data['status'], 'failure')
+        self.assertEquals(resp.data['log'], 'sorry no good')
         log = self.client.get(resp.data['log_url'])
         self.assertEquals(log.status_code, 200)
         self.assertEquals(log.content, b'sorry no good')
@@ -116,6 +118,7 @@ class TestingTest(PatchewTestCase):
         resp = self.api_client.get('%sseries/%s/results/testing.a/' % (self.PROJECT_BASE, self.msg.message_id))
         self.assertEquals(resp.data['status'], 'success')
         log = self.client.get(resp.data['log_url'])
+        self.assertEquals(resp.data['log'], 'everything good!')
         self.assertEquals(log.status_code, 200)
         self.assertEquals(log.content, b'everything good!')
 
@@ -124,6 +127,7 @@ class TestingTest(PatchewTestCase):
         msgid = self.msg_testing_report(log='sorry no good', passed=False)
         resp = self.api_client.get('%sseries/%s/results/testing.a/' % (self.PROJECT_BASE, self.msg.message_id))
         self.assertEquals(resp.data['status'], 'failure')
+        self.assertEquals(resp.data['log'], 'sorry no good')
         log = self.client.get(resp.data['log_url'])
         self.assertEquals(log.status_code, 200)
         self.assertEquals(log.content, b'sorry no good')
-- 
2.16.2




More information about the Patchew-devel mailing list