[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