From nobody Fri Apr 19 20:29:43 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 15218986513821020.01045140723; Sat, 24 Mar 2018 06:37:31 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 709FF2FA; Sat, 24 Mar 2018 13:37:30 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5B7C718126; Sat, 24 Mar 2018 13:37:30 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 4A22C4CA98; Sat, 24 Mar 2018 13:37:30 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2ODbS45031670 for ; Sat, 24 Mar 2018 09:37:28 -0400 Received: by smtp.corp.redhat.com (Postfix) id 94A7317B67; Sat, 24 Mar 2018 13:37:28 +0000 (UTC) Received: from mx1.redhat.com (ext-mx04.extmail.prod.ext.phx2.redhat.com [10.5.110.28]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8C36517B77 for ; Sat, 24 Mar 2018 13:37:25 +0000 (UTC) Received: from mail-wr0-f176.google.com (mail-wr0-f176.google.com [209.85.128.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 57FA085541 for ; Sat, 24 Mar 2018 13:37:24 +0000 (UTC) Received: by mail-wr0-f176.google.com with SMTP id o8so14669329wra.1 for ; Sat, 24 Mar 2018 06:37:24 -0700 (PDT) Received: from donizetti.lan (94-36-194-48.adsl-ull.clienti.tiscali.it. [94.36.194.48]) by smtp.gmail.com with ESMTPSA id i78sm3854257wmc.32.2018.03.24.06.37.21 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 24 Mar 2018 06:37:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=S1k7mL+7cqlunSSp/V+gZbB5DkHBMaW1zHyEpo0sSKg=; b=d6MHgTeLyJz45uYpwpt0jpUhrwB8T9jlVVbc/zqLH1EtZhtpd1kVy+XJwYCi6kR7WX ZDa4Lz21Z113CVApPCy+p8av0QPAkvZchNoYeiaCHvjjvgyn1fAhYj1t2lVpf25GwDSH fH0AjOgTVjHxLy5jC66m3iKDA844aIcQr6x3Ykk5EIHKzhCAtXCME/EWabK4P27X/NTF Jf2//MJGrU9rDWtGKiP4O44Thskw16LnnaZbYirqPLl/czeBY7W1ENC5Tz88dpNc/2L0 xfVgep8Ugy/ezJxbkn/q04RD1YWz+Gxw8xwpxoRALGpz+xoowSGUPXpBKixMzyZC/n6S Tl1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=S1k7mL+7cqlunSSp/V+gZbB5DkHBMaW1zHyEpo0sSKg=; b=hY6kKuSDRPT04Dol79derEDtoN8ERWrKMaKlH5YgyATrxeJFTGaVaMU9YdkSeSVgnu PBacexXwPFU/7RT7n0MNveoJPwSBr9/EU3i4G6FazciTzEGpWhikvj26I9rYv1yCoU3y xpJ4qw/QQbmFR50KO6UcqSuBLmcv5hNgCpi+csiHjtNW4rq2OrCzhbibsrzN69Dg4vKH yhY+l2nM6MHX8mjzBSXm7d36803Svk5PlDSunvsJtn1MpYfEMTwpggZNa/U47d1YMd+2 SG3X/r8j54LTcUeL2k+XqI18pwT+ShNhQjuTbtZym/Jnugyhr+tDbq4q0l1PFwuJQS6F 2yOg== X-Gm-Message-State: AElRT7ESDpouZpCT09UVzTBgFqcnFo0gkHMniZtcOBx0gdxovDcRTzd2 XW87FOWwgkLPqbUf6CDDuDD6g4fz X-Google-Smtp-Source: AG47ELuz9vEI9T58JOtoFp313gJtxY5sorkiQpxRSv4Z/nEt2pOTX8GOGWWA2HvQm2EFOk8HReWbMQ== X-Received: by 10.223.178.163 with SMTP id g32mr27010493wrd.204.1521898642562; Sat, 24 Mar 2018 06:37:22 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Sat, 24 Mar 2018 14:37:12 +0100 Message-Id: <20180324133719.6030-2-pbonzini@redhat.com> In-Reply-To: <20180324133719.6030-1-pbonzini@redhat.com> References: <20180324133719.6030-1-pbonzini@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Sat, 24 Mar 2018 13:37:24 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Sat, 24 Mar 2018 13:37:24 +0000 (UTC) for IP:'209.85.128.176' DOMAIN:'mail-wr0-f176.google.com' HELO:'mail-wr0-f176.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.488 (DKIM_SIGNED, DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_PASS) 209.85.128.176 mail-wr0-f176.google.com 209.85.128.176 mail-wr0-f176.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.78 on 10.5.110.28 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: patchew-devel@redhat.com Subject: [Patchew-devel] [PATCH 1/8] rest: create Result object X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Sat, 24 Mar 2018 13:37:30 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Result objects were introduced first in the REST API. As a first step towards making them a first-class model, let rest_results_hook return Result namedtuples. Even though for now they are just converted back to a dictionary in the get_results method, they will get their own serializer later. Signed-off-by: Paolo Bonzini --- api/models.py | 14 ++++++++++++++ api/rest.py | 4 ++-- mods/git.py | 14 ++++++++------ mods/testing.py | 9 +++------ 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/api/models.py b/api/models.py index de01a61..9b52693 100644 --- a/api/models.py +++ b/api/models.py @@ -9,12 +9,14 @@ # http://opensource.org/licenses/MIT. =20 =20 +from collections import namedtuple import os import json import datetime import re import uuid import logging + from django.conf import settings from django.db import models from django.contrib.auth.models import User @@ -592,3 +594,15 @@ class Module(models.Model): =20 def __str__(self): return self.name + +class Result(namedtuple("Result", "name status log_url data")): + __slots__ =3D () + + def __new__(cls, name, status, log_url=3DNone, data=3DNone, request=3D= None): + if log_url is not None and request is not None: + log_url =3D request.build_absolute_uri(log_url) + if status not in ('pending', 'success', 'failure'): + raise ValueError("invalid value '%s' for status field" % statu= s) + return super(cls, Result).__new__(cls, status=3Dstatus, log_url=3D= log_url, + data=3Ddata, name=3Dname) + diff --git a/api/rest.py b/api/rest.py index 7c131a4..8c11050 100644 --- a/api/rest.py +++ b/api/rest.py @@ -177,11 +177,11 @@ class SeriesSerializer(BaseMessageSerializer): return fields =20 def get_results(self, message): - results =3D {} + results =3D [] request =3D self.context['request'] dispatch_module_hook("rest_results_hook", request=3Drequest, message=3Dmessage, results=3Dresults) - return results + return {x.name: x._asdict() for x in results} =20 def get_total_patches(self, obj): return obj.get_total_patches() diff --git a/mods/git.py b/mods/git.py index a077682..bf812df 100644 --- a/mods/git.py +++ b/mods/git.py @@ -18,7 +18,7 @@ from django.core.exceptions import PermissionDenied from django.utils.html import format_html from mod import PatchewModule from event import declare_event, register_handler, emit_event -from api.models import Message, MessageProperty +from api.models import Message, MessageProperty, Result from api.views import APILoginRequiredView, prepare_series from patchew.logviewer import LogView from schema import * @@ -113,19 +113,21 @@ class GitModule(PatchewModule): =20 def rest_results_hook(self, request, message, results): l =3D message.get_property("git.apply-log") + data =3D None if l: if message.get_property("git.apply-failed"): - result =3D {'status' : 'failure'} + status =3D 'failure' else: git_repo =3D message.get_property("git.repo") git_tag =3D message.get_property("git.tag") data =3D {'repo': git_repo, 'tag': 'refs/tags/' + git_tag} - result =3D {'status': 'success', 'data': data} + status =3D 'success' log_url =3D reverse("git-log", kwargs=3D{'series': message.mes= sage_id}) - result['log_url'] =3D request.build_absolute_uri(log_url) else: - result =3D {'status': 'pending'} - results['git'] =3D result + status =3D 'pending' + log_url =3D None + results.append(Result(name=3D'git', status=3Dstatus, log_url=3Dlog= _url, data=3Ddata, + request=3Drequest)) =20 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 7e15f56..52407b7 100644 --- a/mods/testing.py +++ b/mods/testing.py @@ -17,7 +17,7 @@ from mod import PatchewModule import time import math from api.views import APILoginRequiredView -from api.models import Message, Project, MessageProperty +from api.models import Message, MessageProperty, Project, Result from api.search import SearchEngine from event import emit_event, declare_event, register_handler from patchew.logviewer import LogView @@ -284,11 +284,8 @@ class TestingModule(PatchewModule): failed =3D not p["passed"] log_url =3D self.reverse_testing_log(message, tn, request=3Dre= quest, html=3DFalse) passed_str =3D "failure" if failed else "success" - result =3D { - 'status': passed_str, - 'log_url': log_url - } - results['testing.' + tn] =3D result + results.append(Result(name=3D'testing.' + tn, status=3Dpassed_= str, log_url=3Dlog_url, + request=3Drequest)) =20 def prepare_message_hook(self, request, message, detailed): if not message.is_series_head: --=20 2.16.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel From nobody Fri Apr 19 20:29:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521898651231322.3139474875319; Sat, 24 Mar 2018 06:37:31 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 32E13642; Sat, 24 Mar 2018 13:37:30 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1BA416090A; Sat, 24 Mar 2018 13:37:30 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 0D90E4CA98; Sat, 24 Mar 2018 13:37:30 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2ODbSJA031671 for ; Sat, 24 Mar 2018 09:37:28 -0400 Received: by smtp.corp.redhat.com (Postfix) id 942AC174AD; Sat, 24 Mar 2018 13:37:28 +0000 (UTC) Received: from mx1.redhat.com (ext-mx01.extmail.prod.ext.phx2.redhat.com [10.5.110.25]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8C115176DE for ; Sat, 24 Mar 2018 13:37:26 +0000 (UTC) Received: from mail-wr0-f193.google.com (mail-wr0-f193.google.com [209.85.128.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9A18F85359 for ; Sat, 24 Mar 2018 13:37:25 +0000 (UTC) Received: by mail-wr0-f193.google.com with SMTP id p53so7154079wrc.10 for ; Sat, 24 Mar 2018 06:37:25 -0700 (PDT) Received: from donizetti.lan (94-36-194-48.adsl-ull.clienti.tiscali.it. [94.36.194.48]) by smtp.gmail.com with ESMTPSA id i78sm3854257wmc.32.2018.03.24.06.37.22 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 24 Mar 2018 06:37:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=og/5Do3e8VAByXica9JWuYRwQoDql5VZ8xm9x0CAq5M=; b=ABUoJ8CQNg2YDABByntKJTKUkT1ZIYeOMrCuOX679NvCGXsS4eduDhe9AkFDaaeXZW J81LTMrr6WBfjCh395UlCBMRvxZnCshSUYSyWQdWZ6bcFCZSaYJSeXmW2Rns6eqdLdse wkrEO1dEzsh8dBB0HNV2MqxMfCpxdRAiBL6gSLVKDPR/H9pLrCFwjos70b1z264qiyog zx+RKKHdWcFb42VgEsXpyB/DpVjKvXhQT00SXKGtU4+zyp2QPgNpk+fMFGuRYjQ4/UsO 5B7ESyJZ09mtJCEDaUWviIKW+J4qSOOIwWgARybNcpsfaU0pP4SCISqVZfEeEtFOOsYI C9hA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=og/5Do3e8VAByXica9JWuYRwQoDql5VZ8xm9x0CAq5M=; b=lIbupfq4Juo8e3wefdrN/tvlEtyPUAm5+tUeVYv0d1+HY/zdDQBpnCp528BLBJHHAR GG6DD7poj+Q2AIEkIDbVcNfV+Cs42lq5y8lVEBacvbTDcKo2iYlqns0+ovqp+TGLus8e u+JAgBKUgd1+e3RtcGCOK3KwamX7QdMucP5nnqdxdpbAOSwoSe7UL2hjrKUat4hppFAc 9ZJ+hrTCfPlAVMEF7SNoOlQCwWydo5BzbTmvfoYusEkVH5r8Q/GGvNeVrZ1O8LTBUUH9 zWY2xERtNDUW4Jo+xZlVxk0EffHPql5g1wk5vl/sZ1ZHAMZZD8V+vbHGLXj68PVeo+1h hsvQ== X-Gm-Message-State: AElRT7FWVaSMPrgCqxRJC/IkGyWBRZmybFwX+tbn1aE17xMUbKWS3Ku1 th/5cMEj5HrQH6AuImD2otoL6o2O X-Google-Smtp-Source: AG47ELs/xmnwEcQjXZhf/Mdi9cBReFOjUb3+WCDOOkxFWeyjpWgLxZFeQOEIQCRx2xk/mgTyx++uyA== X-Received: by 10.223.184.188 with SMTP id i57mr25849400wrf.105.1521898643910; Sat, 24 Mar 2018 06:37:23 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Sat, 24 Mar 2018 14:37:13 +0100 Message-Id: <20180324133719.6030-3-pbonzini@redhat.com> In-Reply-To: <20180324133719.6030-1-pbonzini@redhat.com> References: <20180324133719.6030-1-pbonzini@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Sat, 24 Mar 2018 13:37:25 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Sat, 24 Mar 2018 13:37:25 +0000 (UTC) for IP:'209.85.128.193' DOMAIN:'mail-wr0-f193.google.com' HELO:'mail-wr0-f193.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.488 (DKIM_SIGNED, DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_PASS) 209.85.128.193 mail-wr0-f193.google.com 209.85.128.193 mail-wr0-f193.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.83 on 10.5.110.25 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: patchew-devel@redhat.com Subject: [Patchew-devel] [PATCH 2/8] rest: use lookup_field in HyperlinkedMessageField X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Sat, 24 Mar 2018 13:37:30 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Allow overriding the lookup field, so that it can be used with views that a= re not based on BaseMessageViewSet. The next patch will use it to include the= URI for results. Signed-off-by: Paolo Bonzini --- api/rest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/rest.py b/api/rest.py index 8c11050..0af1f30 100644 --- a/api/rest.py +++ b/api/rest.py @@ -99,8 +99,9 @@ class ProjectsViewSet(viewsets.ModelViewSet): # Common classes for series and messages =20 class HyperlinkedMessageField(HyperlinkedIdentityField): + lookup_field =3D 'message_id' def get_url(self, obj, view_name, request, format): - kwargs =3D {'projects_pk': obj.project_id, 'message_id': obj.messa= ge_id} + kwargs =3D {'projects_pk': obj.project_id, self.lookup_field: obj.= message_id} return self.reverse(view_name, kwargs=3Dkwargs, request=3Drequest,= format=3Dformat) =20 class BaseMessageSerializer(serializers.ModelSerializer): --=20 2.16.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel From nobody Fri Apr 19 20:29:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521898652483117.52569374950838; Sat, 24 Mar 2018 06:37:32 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 792A1C057F85; Sat, 24 Mar 2018 13:37:31 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6E17117C32; Sat, 24 Mar 2018 13:37:31 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 6502A4CA98; Sat, 24 Mar 2018 13:37:31 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2ODbUeh031684 for ; Sat, 24 Mar 2018 09:37:30 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5169960F8D; Sat, 24 Mar 2018 13:37:30 +0000 (UTC) Received: from mx1.redhat.com (ext-mx10.extmail.prod.ext.phx2.redhat.com [10.5.110.39]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 49474842A5 for ; Sat, 24 Mar 2018 13:37:27 +0000 (UTC) Received: from mail-wr0-f176.google.com (mail-wr0-f176.google.com [209.85.128.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CEA9D5D5ED for ; Sat, 24 Mar 2018 13:37:26 +0000 (UTC) Received: by mail-wr0-f176.google.com with SMTP id c24so14667632wrc.6 for ; Sat, 24 Mar 2018 06:37:26 -0700 (PDT) Received: from donizetti.lan (94-36-194-48.adsl-ull.clienti.tiscali.it. [94.36.194.48]) by smtp.gmail.com with ESMTPSA id i78sm3854257wmc.32.2018.03.24.06.37.23 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 24 Mar 2018 06:37:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=M2xoV9cVkbYo9w76AvnYwx6Y+oClmgk7nGr87nHPXCM=; b=JONILd2eF2UVEVGb/D5U4EZb4hy11k59yMDeijWfZObdU3tRyqT15+noweM9iKihFs 9NJ/cTYXwMwWNxF6fPeA2CZyvf3T7F7WShKqg4fOV8JgvIqWYt6gpZ+CD1ihdzcCmU/Y acfkY42YMg0SH1Ok+vBKjPUL37KxLCR+uIYgrzKl234YSgL/QxQli5S78h7YcyKm8ctT naGSBT/Xhgv3nh8CC0JfUg6cI5UKunho/7jKuylzy3jyMpqa+29UxN7d7MgDUMnMjmO7 wKRAEAqW37kYEPyBEDWAVFMxHxDShpeH738FwaRgzoRZO4mSj4pQAO19VrPKKATyugCS 1HqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=M2xoV9cVkbYo9w76AvnYwx6Y+oClmgk7nGr87nHPXCM=; b=UU1J/kqrDVvb3BRlrzq4oQPnoR3Ut3ZF3XOSt6gugNl/wiUgLg8rqWF46uL5l0+GOV G4O+KstuqZK0iz7c+QCKnjlEF1mBYCjvxg3DdqpmhpcG1zjlzPx5DbXCEsVpm4Ssfzge x5rTZCrmtrswokoDs5voxjtwq9kjhUg0P/+fJg0b5pZDHrk6ThItKeCOW/THHj35pmwa OE/WV2oyTObU7RttMmNnr8p0zdvMBBK0EQuWUmSczJVJy9cbvQ9fiPrIvPOYU2zwEquF 14yowT3xJrNqqI8oGdZOO0xVB+zhHrfcSS+xrAQeO1Vv/8zZ62tiFUP7kTG+8e0GFcp6 pBuw== X-Gm-Message-State: AElRT7FYLGW2hz4njvWRmQSiG9XBE08qyup9QQbQNnJ3GTvnOHcGQ6zS R7z1qcjj6EOqU9Tia6TRJbvjipSz X-Google-Smtp-Source: AG47ELvD4lrWpK4ABJ7HJ8wG10Vi1fIhHDhHRW9j3zhT/16h4XB1cgLq0hNB/Jo8F3f5jU0HHY47mw== X-Received: by 10.223.159.79 with SMTP id f15mr27146782wrg.115.1521898645144; Sat, 24 Mar 2018 06:37:25 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Sat, 24 Mar 2018 14:37:14 +0100 Message-Id: <20180324133719.6030-4-pbonzini@redhat.com> In-Reply-To: <20180324133719.6030-1-pbonzini@redhat.com> References: <20180324133719.6030-1-pbonzini@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Sat, 24 Mar 2018 13:37:27 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Sat, 24 Mar 2018 13:37:27 +0000 (UTC) for IP:'209.85.128.176' DOMAIN:'mail-wr0-f176.google.com' HELO:'mail-wr0-f176.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.488 (DKIM_SIGNED, DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_PASS) 209.85.128.176 mail-wr0-f176.google.com 209.85.128.176 mail-wr0-f176.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.78 on 10.5.110.39 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: patchew-devel@redhat.com Subject: [Patchew-devel] [PATCH 3/8] rest: add data to testing results X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Sat, 24 Mar 2018 13:37:31 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" --- mods/testing.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/testing.py b/mods/testing.py index 52407b7..cf22004 100644 --- a/mods/testing.py +++ b/mods/testing.py @@ -284,8 +284,11 @@ class TestingModule(PatchewModule): failed =3D not p["passed"] log_url =3D self.reverse_testing_log(message, tn, request=3Dre= quest, html=3DFalse) passed_str =3D "failure" if failed else "success" + + data =3D p.copy() + del data['passed'] results.append(Result(name=3D'testing.' + tn, status=3Dpassed_= str, log_url=3Dlog_url, - request=3Drequest)) + request=3Drequest, data=3Ddata)) =20 def prepare_message_hook(self, request, message, detailed): if not message.is_series_head: --=20 2.16.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel From nobody Fri Apr 19 20:29:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521898665528480.67645624223326; Sat, 24 Mar 2018 06:37:45 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 92262369B7; Sat, 24 Mar 2018 13:37:43 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 84BF687DC; Sat, 24 Mar 2018 13:37:43 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 7A4F6181B9FB; Sat, 24 Mar 2018 13:37:43 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2ODbgsQ031761 for ; Sat, 24 Mar 2018 09:37:42 -0400 Received: by smtp.corp.redhat.com (Postfix) id 0F77B18EC1; Sat, 24 Mar 2018 13:37:42 +0000 (UTC) Received: from mx1.redhat.com (ext-mx08.extmail.prod.ext.phx2.redhat.com [10.5.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0698D6090A for ; Sat, 24 Mar 2018 13:37:39 +0000 (UTC) Received: from mail-wr0-f181.google.com (mail-wr0-f181.google.com [209.85.128.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CC02CC057F92 for ; Sat, 24 Mar 2018 13:37:28 +0000 (UTC) Received: by mail-wr0-f181.google.com with SMTP id p53so7154155wrc.10 for ; Sat, 24 Mar 2018 06:37:28 -0700 (PDT) Received: from donizetti.lan (94-36-194-48.adsl-ull.clienti.tiscali.it. [94.36.194.48]) by smtp.gmail.com with ESMTPSA id i78sm3854257wmc.32.2018.03.24.06.37.25 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 24 Mar 2018 06:37:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=7uipfwpqN4KQAtWvUOaMNXazbQKzKF5HAZQUPhTw2+w=; b=bZLe0YODGrcmq0mJKmzdiU8ERvS9P5tkoxe7VpNnpxgtq3xN48LKcEYxiAIe72RQC7 ZtRPmJHknBe5H0WcMfzBQxJnQ9WnlcNmy/LPmB6llLLoqskCNk5scOV1Oyf7YDwncCdo jmHOLaMyANjSdrEtwPmqFNOnRP8m5MypyoYLLem11L2YdJoLGreC8FuhPD5SO5luWZG2 Vqmvt5cK6d9N09MZTkvlGS5O0gM2yhokfHg9kQVawRHIXQRlO47hs2RNLCrUhhF1b4IW 2GFn2803eOeV4JJ2K8D4pS8JZIqfNQv1pTVg5HALrfJf1m09JEiQNwDFnsyT3h82k71V Xyag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=7uipfwpqN4KQAtWvUOaMNXazbQKzKF5HAZQUPhTw2+w=; b=pP1NyhNalnl5WGVKZIPpuCzJRjEgpD4klRgD8VrUsfPqXcaZl5wXZE0DZ7sn6+5nkV VtcbqSFpmxysWHRbK3v3K56T3s/3f54R7UAQKr2F5U8g9mRDzf/Agb3UzUY9MYApRy3Q QehJ4H8ZRfrQVEDMtEaHLEMILMnVLYd1OagpToRA0Rp3vu+M02u7B0ovVva38ZonfI69 uuweC1RkqN2YW2R3Vl9/QyDoypfHKsIX/UNrWuOiefQNBtQIM1iQ2LMU5WscAzcP85WZ sXoafJn2EVRPjNjONeNIU22DEgUj640ljydDBnuKfaeQbPVxunCHXfRojQFi0DdLSXVF bITQ== X-Gm-Message-State: AElRT7HfoHvysvL8j4UV0GhvUFoHRVDnTSAooLufpXqxLOxx1DoJuGN4 ad2Zr5Ys9it6+Z5lxkGoosISY5j/ X-Google-Smtp-Source: AG47ELsd8Yr1dTuqo7WnTKK7ywCLyuPVEjQAIXi4o7nkg/roX0ivS4QCAIYR+6e5uuvC1UjnSZiJ9A== X-Received: by 10.223.150.161 with SMTP id u30mr25168854wrb.151.1521898646734; Sat, 24 Mar 2018 06:37:26 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Sat, 24 Mar 2018 14:37:15 +0100 Message-Id: <20180324133719.6030-5-pbonzini@redhat.com> In-Reply-To: <20180324133719.6030-1-pbonzini@redhat.com> References: <20180324133719.6030-1-pbonzini@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Sat, 24 Mar 2018 13:37:29 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Sat, 24 Mar 2018 13:37:29 +0000 (UTC) for IP:'209.85.128.181' DOMAIN:'mail-wr0-f181.google.com' HELO:'mail-wr0-f181.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.488 (DKIM_SIGNED, DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_PASS) 209.85.128.181 mail-wr0-f181.google.com 209.85.128.181 mail-wr0-f181.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.78 on 10.5.110.32 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: patchew-devel@redhat.com Subject: [Patchew-devel] [PATCH 4/8] rest: create separate results endpoint X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Sat, 24 Mar 2018 13:37:43 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" In the REST API, each series can have one or more results. Right now results are synthesized from message properties which are set by the applier-report and tester-report API. In order to simplify the conversion to REST of those APIs (e.g. using POST, PUT or PATCH requests), move the results out of the SeriesSerializer and into their own collection. For now, the ViewSet is not model-based, but I am including paginator-like fields so that it should be possible to change it to a ModelViewSet in the future. Signed-off-by: Paolo Bonzini --- api/models.py | 7 +++-- api/rest.py | 72 ++++++++++++++++++++++++++++++++++++++++++++---= ---- api/urls.py | 5 ++++ mods/git.py | 17 ++++++------ mods/testing.py | 10 +++---- tests/test_git.py | 44 +++++++++++++++++++------------ tests/test_rest.py | 6 +++++ tests/test_testing.py | 33 ++++++++++++----------- 8 files changed, 133 insertions(+), 61 deletions(-) diff --git a/api/models.py b/api/models.py index 9b52693..6141ac1 100644 --- a/api/models.py +++ b/api/models.py @@ -595,14 +595,13 @@ class Module(models.Model): def __str__(self): return self.name =20 -class Result(namedtuple("Result", "name status log_url data")): +class Result(namedtuple("Result", "name status log_url obj data")): __slots__ =3D () =20 - def __new__(cls, name, status, log_url=3DNone, data=3DNone, request=3D= None): + def __new__(cls, name, status, obj, log_url=3DNone, data=3DNone, reque= st=3DNone): if log_url is not None and request is not None: log_url =3D request.build_absolute_uri(log_url) if status not in ('pending', 'success', 'failure'): raise ValueError("invalid value '%s' for status field" % statu= s) return super(cls, Result).__new__(cls, status=3Dstatus, log_url=3D= log_url, - data=3Ddata, name=3Dname) - + obj=3Dobj, data=3Ddata, name=3Dn= ame) diff --git a/api/rest.py b/api/rest.py index 0af1f30..1e2b774 100644 --- a/api/rest.py +++ b/api/rest.py @@ -8,17 +8,21 @@ # This work is licensed under the MIT License. Please see the LICENSE fil= e or # http://opensource.org/licenses/MIT. =20 +from collections import OrderedDict from django.contrib.auth.models import User +from django.http import Http404 from django.template import loader =20 from mod import dispatch_module_hook from .models import Project, Message from .search import SearchEngine -from rest_framework import permissions, serializers, viewsets, filters, mi= xins, renderers +from rest_framework import (permissions, serializers, viewsets, filters, + mixins, generics, renderers) from rest_framework.decorators import detail_route -from rest_framework.fields import SerializerMethodField +from rest_framework.fields import SerializerMethodField, CharField, JSONFi= eld from rest_framework.relations import HyperlinkedIdentityField from rest_framework.response import Response +import rest_framework =20 SEARCH_PARAM =3D 'q' =20 @@ -163,8 +167,8 @@ class SeriesSerializer(BaseMessageSerializer): =20 resource_uri =3D HyperlinkedMessageField(view_name=3D'series-detail') message =3D HyperlinkedMessageField(view_name=3D'messages-detail') + results =3D HyperlinkedMessageField(view_name=3D'results-list', lookup= _field=3D'series_message_id') total_patches =3D SerializerMethodField() - results =3D SerializerMethodField() =20 def __init__(self, *args, **kwargs): self.detailed =3D kwargs.pop('detailed', False) @@ -177,13 +181,6 @@ class SeriesSerializer(BaseMessageSerializer): fields=3Dfields, detailed=3Dself.detailed) return fields =20 - def get_results(self, message): - results =3D [] - request =3D self.context['request'] - dispatch_module_hook("rest_results_hook", request=3Drequest, - message=3Dmessage, results=3Dresults) - return {x.name: x._asdict() for x in results} - def get_total_patches(self, obj): return obj.get_total_patches() =20 @@ -316,3 +313,58 @@ class MessagesViewSet(ProjectMessagesViewSetMixin, serializer =3D BaseMessageSerializer(page, many=3DTrue, context=3Dself.get_serializer_c= ontext()) return self.get_paginated_response(serializer.data) + +# Results + +class HyperlinkedResultField(HyperlinkedIdentityField): + def get_url(self, result, view_name, request, format): + obj =3D result.obj + kwargs =3D {'projects_pk': obj.project_id, 'series_message_id': ob= j.message_id, + 'name': result.name} + return self.reverse(view_name, kwargs=3Dkwargs, request=3Drequest,= format=3Dformat) + +class ResultSerializer(serializers.Serializer): + resource_uri =3D HyperlinkedResultField(view_name=3D'results-detail') + name =3D CharField() + status =3D CharField() # one of 'failure', 'success', 'pending' + log_url =3D CharField(required=3DFalse) + data =3D JSONField(required=3DFalse) + +class SeriesResultsViewSet(viewsets.ViewSet, generics.GenericAPIView): + serializer_class =3D ResultSerializer + lookup_field =3D 'name' + lookup_value_regex =3D '[^/]+' + + def get_queryset(self): + return Message.objects.filter(project=3Dself.kwargs['projects_pk'], + message_id=3Dself.kwargs['series_mes= sage_id']) + + def get_results(self): + queryset =3D self.get_queryset() + try: + obj =3D queryset[0] + except IndexError: + raise Http404 + results =3D [] + dispatch_module_hook("rest_results_hook", request=3Dself.request, + obj=3Dobj, results=3Dresults) + return {x.name: x for x in results} + + def list(self, request, *args, **kwargs): + results =3D self.get_results().values() + serializer =3D self.get_serializer(results, many=3DTrue) + # Fake paginator response for forwards-compatibility, in case + # this ViewSet becomes model-based + return Response(OrderedDict([ + ('count', len(results)), + ('results', serializer.data) + ])) + + def retrieve(self, request, name, *args, **kwargs): + results =3D self.get_results() + try: + result =3D results[name] + except KeyError: + raise Http404 + serializer =3D self.get_serializer(result) + return Response(serializer.data) diff --git a/api/urls.py b/api/urls.py index 0a447f0..becabeb 100644 --- a/api/urls.py +++ b/api/urls.py @@ -37,11 +37,16 @@ projects_router.include_format_suffixes =3D False projects_router.register('series', rest.ProjectSeriesViewSet, base_name=3D= 'series') projects_router.register('messages', rest.MessagesViewSet, base_name=3D'me= ssages') =20 +results_router =3D NestedDefaultRouter(projects_router, 'series', lookup= =3D'series', trailing_slash=3DTrue) +results_router.include_format_suffixes =3D False +results_router.register('results', rest.SeriesResultsViewSet, base_name=3D= 'results') + schema_view =3D get_schema_view(title=3D'API schema') =20 urlpatterns =3D _build_urls() + [ url(r"v1/", include(router.urls)), url(r"v1/", include(projects_router.urls)), + url(r"v1/", include(results_router.urls)), url(r'^v1/schema/$', schema_view), # Use the base class's handler by default url(r".*", views.APIView.as_view()) diff --git a/mods/git.py b/mods/git.py index bf812df..13c3642 100644 --- a/mods/git.py +++ b/mods/git.py @@ -111,22 +111,23 @@ class GitModule(PatchewModule): raise Exception("Project git repo invalid: %s" % project_git) return upstream, branch =20 - def rest_results_hook(self, request, message, results): - l =3D message.get_property("git.apply-log") + def rest_results_hook(self, request, obj, results): + log =3D obj.get_property("git.apply-log") data =3D None - if l: - if message.get_property("git.apply-failed"): + if log: + if obj.get_property("git.apply-failed"): status =3D 'failure' else: - git_repo =3D message.get_property("git.repo") - git_tag =3D message.get_property("git.tag") + git_repo =3D obj.get_property("git.repo") + git_tag =3D obj.get_property("git.tag") data =3D {'repo': git_repo, 'tag': 'refs/tags/' + git_tag} status =3D 'success' - log_url =3D reverse("git-log", kwargs=3D{'series': message.mes= sage_id}) + log_url =3D reverse("git-log", kwargs=3D{'series': obj.message= _id}) else: status =3D 'pending' log_url =3D None - results.append(Result(name=3D'git', status=3Dstatus, log_url=3Dlog= _url, data=3Ddata, + results.append(Result(name=3D'git', obj=3Dobj, status=3Dstatus, + log_url=3Dlog_url, data=3Ddata, request=3Drequest)) =20 def prepare_message_hook(self, request, message, detailed): diff --git a/mods/testing.py b/mods/testing.py index cf22004..21942d5 100644 --- a/mods/testing.py +++ b/mods/testing.py @@ -276,19 +276,19 @@ class TestingModule(PatchewModule): return reverse("testing-get-prop", kwargs=3D{"project_or_series": obj.message_id}) =20 - def rest_results_hook(self, request, message, results): - for pn, p in message.get_properties().items(): + def rest_results_hook(self, request, obj, results): + for pn, p in obj.get_properties().items(): if not pn.startswith("testing.report."): continue tn =3D pn[len("testing.report."):] failed =3D not p["passed"] - log_url =3D self.reverse_testing_log(message, tn, request=3Dre= quest, html=3DFalse) + log_url =3D self.reverse_testing_log(obj, tn, request=3Dreques= t, html=3DFalse) passed_str =3D "failure" if failed else "success" =20 data =3D p.copy() del data['passed'] - results.append(Result(name=3D'testing.' + tn, status=3Dpassed_= str, log_url=3Dlog_url, - request=3Drequest, data=3Ddata)) + results.append(Result(name=3D'testing.' + tn, obj=3Dobj, statu= s=3Dpassed_str, + log_url=3Dlog_url, request=3Drequest, da= ta=3Ddata)) =20 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 c2c98ae..8bff7d5 100755 --- a/tests/test_git.py +++ b/tests/test_git.py @@ -100,31 +100,41 @@ class GitTest(PatchewTestCase): self.repo + " patchew/20160628014747.20971-2-famz= @redhat.com") =20 def test_rest_need_apply(self): - resp =3D self.apply_and_retrieve("0013-foo-patch.mbox.gz", self.p.= id, - "20160628014747.20971-1-famz@redhat= .com") - self.assertEqual(resp.data['results']['git']['status'], 'pending') + self.cli_import("0013-foo-patch.mbox.gz") + MESSAGE_ID =3D '20160628014747.20971-1-famz@redhat.com' + resp =3D self.api_client.get('%sseries/%s/results/git/' % (self.PR= OJECT_BASE, MESSAGE_ID)) + self.assertEqual(resp.data['status'], 'pending') + self.assertEqual(resp.data['log_url'], None) =20 def test_rest_apply_failure(self): self.cli_import("0014-bar-patch.mbox.gz") self.do_apply() - resp =3D self.api_client.get(self.REST_BASE + 'series/?q=3Dproject= :QEMU') - self.assertEqual(resp.data['results'][0]['is_complete'], True) - self.assertEqual(resp.data['results'][0]['results']['git']['status= '], 'failure') - self.assertEqual('repo' in resp.data['results'][0]['results']['git= '], False) - self.assertEqual('tag' in resp.data['results'][0]['results']['git'= ], False) - log =3D self.client.get(resp.data['results'][0]['results']['git'][= 'log_url']) - self.assertEquals(log.status_code, 200) + MESSAGE_ID =3D '20160628014747.20971-2-famz@redhat.com' + resp =3D self.api_client.get('%sseries/%s/' % (self.PROJECT_BASE, = MESSAGE_ID)) + self.assertEqual(resp.data['is_complete'], True) + + resp =3D self.api_client.get('%sseries/%s/results/' % (self.PROJEC= T_BASE, MESSAGE_ID)) + self.assertEqual(resp.data['results'][0]['name'], 'git') + + resp =3D self.api_client.get('%sseries/%s/results/git/' % (self.PR= OJECT_BASE, MESSAGE_ID)) + self.assertEqual(resp.data['status'], 'failure') + self.assertEqual('repo' in resp.data, False) + self.assertEqual('tag' in resp.data, False) + log =3D self.client.get(resp.data['log_url']) + self.assertEqual(log.status_code, 200) =20 def test_rest_apply_success(self): self.cli_import("0013-foo-patch.mbox.gz") self.do_apply() - resp =3D self.api_client.get(self.REST_BASE + 'series/?q=3Dproject= :QEMU') - self.assertEqual(resp.data['results'][0]['is_complete'], True) - self.assertEqual(resp.data['results'][0]['results']['git']['status= '], 'success') - self.assertEqual(resp.data['results'][0]['results']['git']['data']= ['repo'], self.repo) - self.assertEqual(resp.data['results'][0]['results']['git']['data']= ['tag'], "refs/tags/patchew/20160628014747.20971-1-famz@redhat.com") - log =3D self.client.get(resp.data['results'][0]['results']['git'][= 'log_url']) - self.assertEquals(log.status_code, 200) + MESSAGE_ID =3D '20160628014747.20971-1-famz@redhat.com' + resp =3D self.api_client.get('%sseries/%s/' % (self.PROJECT_BASE, = MESSAGE_ID)) + self.assertEqual(resp.data['is_complete'], True) + resp =3D self.api_client.get('%sseries/%s/results/git/' % (self.PR= OJECT_BASE, MESSAGE_ID)) + self.assertEqual(resp.data['status'], 'success') + self.assertEqual(resp.data['data']['repo'], self.repo) + self.assertEqual(resp.data['data']['tag'], "refs/tags/patchew/2016= 0628014747.20971-1-famz@redhat.com") + log =3D self.client.get(resp.data['log_url']) + self.assertEqual(log.status_code, 200) =20 if __name__ =3D=3D '__main__': main() diff --git a/tests/test_rest.py b/tests/test_rest.py index 28ca10b..391714f 100755 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -189,6 +189,12 @@ class RestTest(PatchewTestCase): resp =3D self.api_client.get(self.REST_BASE + 'projects/12345/seri= es/') self.assertEqual(resp.data['count'], 0) =20 + def test_series_results_list(self): + resp1 =3D self.apply_and_retrieve('0001-simple-patch.mbox.gz', + self.p.id, '20160628014747.20971-1-= famz@redhat.com') + resp =3D self.api_client.get(resp1.data['results']) + self.assertEqual(resp.data['count'], len(resp.data['results'])) + def test_series_search(self): resp1 =3D self.apply_and_retrieve('0004-multiple-patch-reviewed.mb= ox.gz', self.p.id, '1469192015-16487-1-git= -send-email-berrange@redhat.com') diff --git a/tests/test_testing.py b/tests/test_testing.py index 0897bbc..369a806 100755 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -93,41 +93,40 @@ class TestingTest(PatchewTestCase): capabilities=3D[]) self.assertFalse(td) =20 - def test_rest_basic(self): - resp =3D self.api_client.get(self.PROJECT_BASE + 'series/' + self.= msg.message_id + '/') - self.assertEquals('testing.tests' in resp.data['results'], False) - def test_rest_done_success(self): self.msg_testing_done(log=3D'everything good!', passed=3DTrue) - resp =3D self.api_client.get(self.PROJECT_BASE + 'series/' + self.= msg.message_id + '/') - self.assertEquals(resp.data['results']['testing.tests']['status'],= 'success') - log =3D self.client.get(resp.data['results']['testing.tests']['log= _url']) + resp =3D self.api_client.get('%sseries/%s/results/testing.tests/' = % (self.PROJECT_BASE, self.msg.message_id)) + self.assertEquals(resp.data['status'], 'success') + log =3D self.client.get(resp.data['log_url']) self.assertEquals(log.status_code, 200) self.assertEquals(log.content, b'everything good!') =20 def test_rest_done_failure(self): - self.msg_testing_done(log=3D'sorry no good', passed=3DFalse) - resp =3D self.api_client.get(self.PROJECT_BASE + 'series/' + self.= msg.message_id + '/') - self.assertEquals(resp.data['results']['testing.tests']['status'],= 'failure') - log =3D self.client.get(resp.data['results']['testing.tests']['log= _url']) + self.msg_testing_done(log=3D'sorry no good', passed=3DFalse, rando= m_stuff=3D'xyz') + resp =3D 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['data']['random_stuff'], 'xyz') + log =3D self.client.get(resp.data['log_url']) self.assertEquals(log.status_code, 200) self.assertEquals(log.content, b'sorry no good') =20 def test_api_report_success(self): self.api_login() msgid =3D self.msg_testing_report(log=3D'everything good!', passed= =3DTrue) - resp =3D self.api_client.get(self.PROJECT_BASE + 'series/' + self.= msg.message_id + '/') - self.assertEquals(resp.data['results']['testing.a']['status'], 'su= ccess') - log =3D self.client.get(resp.data['results']['testing.a']['log_url= ']) + resp =3D self.api_client.get('%sseries/%s/results/testing.a/' % (s= elf.PROJECT_BASE, self.msg.message_id)) + self.assertEquals(resp.data['data']['is_timeout'], False) + self.assertEquals(resp.data['status'], 'success') + log =3D self.client.get(resp.data['log_url']) self.assertEquals(log.status_code, 200) self.assertEquals(log.content, b'everything good!') =20 def test_api_report_failure(self): self.api_login() msgid =3D self.msg_testing_report(log=3D'sorry no good', passed=3D= False) - resp =3D self.api_client.get(self.PROJECT_BASE + 'series/' + self.= msg.message_id + '/') - self.assertEquals(resp.data['results']['testing.a']['status'], 'fa= ilure') - log =3D self.client.get(resp.data['results']['testing.a']['log_url= ']) + resp =3D self.api_client.get('%sseries/%s/results/testing.a/' % (s= elf.PROJECT_BASE, self.msg.message_id)) + self.assertEquals(resp.data['data']['is_timeout'], False) + self.assertEquals(resp.data['status'], 'failure') + log =3D self.client.get(resp.data['log_url']) self.assertEquals(log.status_code, 200) self.assertEquals(log.content, b'sorry no good') =20 --=20 2.16.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel From nobody Fri Apr 19 20:29:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521898654476777.3521114832156; Sat, 24 Mar 2018 06:37:34 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8F05481DE5; Sat, 24 Mar 2018 13:37:33 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 816D85C261; Sat, 24 Mar 2018 13:37:33 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 734F8181B9FB; Sat, 24 Mar 2018 13:37:33 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2ODbVef031703 for ; Sat, 24 Mar 2018 09:37:31 -0400 Received: by smtp.corp.redhat.com (Postfix) id B9F6487DC; Sat, 24 Mar 2018 13:37:31 +0000 (UTC) Received: from mx1.redhat.com (ext-mx10.extmail.prod.ext.phx2.redhat.com [10.5.110.39]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B1442189B8 for ; Sat, 24 Mar 2018 13:37:31 +0000 (UTC) Received: from mail-wm0-f41.google.com (mail-wm0-f41.google.com [74.125.82.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 078ED624BE for ; Sat, 24 Mar 2018 13:37:30 +0000 (UTC) Received: by mail-wm0-f41.google.com with SMTP id e194so8068401wmd.3 for ; Sat, 24 Mar 2018 06:37:29 -0700 (PDT) Received: from donizetti.lan (94-36-194-48.adsl-ull.clienti.tiscali.it. [94.36.194.48]) by smtp.gmail.com with ESMTPSA id i78sm3854257wmc.32.2018.03.24.06.37.26 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 24 Mar 2018 06:37:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=TjGXt6AXuxhybGwhNNBYSezEcu+tlUJoaUbcOLH8GFE=; b=gMn6j16j6/NwvwxIrFbJS1sNl0MLfFDOH3eP6NRrbvDsA6aaYSM/gW5DIQyDerQw58 PwrVejzgcFlPS4BvK15TqFX326LTqwCYdY4W06yk8Eq30sk/UNUKtmJq0+X4lbehqPfB uK07gvU9ERdoFUriJDtL8m3Okzz3FmxgxMiuKgTFHlpF/Jcwx75yzU2F0Q4jdIRfO6xx bXGOphtv/QCLz5PZKnMFcyknVJr45CvIoWfcxEhsPmrC9sP05Uwh5djnsBMWYjuA+Kna hHzxcHb+/JrrWz/4OP6/rm5/oXlxIPz4TT1AxoJ97jhVwvwvkyWyS+rLfq5HIQB41+kT Nh/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=TjGXt6AXuxhybGwhNNBYSezEcu+tlUJoaUbcOLH8GFE=; b=PpByXnQdQ2ULhL5rvXIIdg0H8ELMe278G1UEzmykKjRKSNE/QOFY0lFigtg3xzK74d bgV8Vlj1d5+eCv2R6/S2JP7bTgRYS6KHuxwXRlu2wboSU6ytWi6yhtD2zYpgkLC1ovpM 15tfRIwAUs9B/Al1OJ735ID5BlnTqjTuowNVxKsikKNQVjejOsAZlpByu4NpZg4vKMTX ARwM/2r7lMLMeLteKgmR2VrNvd3QVDNiPyHsCaehBsGtrg7G2+l1ohsubOjVO5sHbKmR rxzW9cAUJfS3WkKU0OmrxcLd8yFeAK4AmxfZR3aJ4p0Oo2jB3hVOXxsBxGk2MeTBy5Cr a7uw== X-Gm-Message-State: AElRT7Ft6Rr2ohdakVaBg4drQiCyZlLme+pfp/zO+fS12j7qur3GarEk E/9qDjhUs183IuP6pPqM3/7qjtsX X-Google-Smtp-Source: AG47ELtsqPoS/337nyGIGLYfBxj6dPHYWTN/NMJOE7e53axsAR9ZV/VRIR4qkW5OZ11fT/P+i4CeQg== X-Received: by 10.28.87.73 with SMTP id l70mr10595066wmb.123.1521898648168; Sat, 24 Mar 2018 06:37:28 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Sat, 24 Mar 2018 14:37:16 +0100 Message-Id: <20180324133719.6030-6-pbonzini@redhat.com> In-Reply-To: <20180324133719.6030-1-pbonzini@redhat.com> References: <20180324133719.6030-1-pbonzini@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Sat, 24 Mar 2018 13:37:30 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Sat, 24 Mar 2018 13:37:30 +0000 (UTC) for IP:'74.125.82.41' DOMAIN:'mail-wm0-f41.google.com' HELO:'mail-wm0-f41.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.469 (DKIM_SIGNED, DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_PASS) 74.125.82.41 mail-wm0-f41.google.com 74.125.82.41 mail-wm0-f41.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.78 on 10.5.110.39 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: patchew-devel@redhat.com Subject: [Patchew-devel] [PATCH 5/8] rest: include log directly in /.../results/xyz response X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Sat, 24 Mar 2018 13:37:33 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" 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 --- api/models.py | 6 +++--- api/rest.py | 18 +++++++++++++----- mods/git.py | 4 ++-- mods/testing.py | 8 ++++++-- tests/test_git.py | 5 +++++ tests/test_testing.py | 4 ++++ 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/api/models.py b/api/models.py index 6141ac1..96d514a 100644 --- a/api/models.py +++ b/api/models.py @@ -595,13 +595,13 @@ class Module(models.Model): def __str__(self): return self.name =20 -class Result(namedtuple("Result", "name status log_url obj data")): +class Result(namedtuple("Result", "name status log log_url obj data")): __slots__ =3D () =20 - def __new__(cls, name, status, obj, log_url=3DNone, data=3DNone, reque= st=3DNone): + def __new__(cls, name, status, obj, log=3DNone, log_url=3DNone, data= =3DNone, request=3DNone): if log_url is not None and request is not None: log_url =3D request.build_absolute_uri(log_url) if status not in ('pending', 'success', 'failure'): raise ValueError("invalid value '%s' for status field" % statu= s) - return super(cls, Result).__new__(cls, status=3Dstatus, log_url=3D= log_url, + return super(cls, Result).__new__(cls, status=3Dstatus, log=3Dlog,= log_url=3Dlog_url, obj=3Dobj, data=3Ddata, name=3Dn= ame) diff --git a/api/rest.py b/api/rest.py index 1e2b774..9b1f103 100644 --- a/api/rest.py +++ b/api/rest.py @@ -330,8 +330,10 @@ class ResultSerializer(serializers.Serializer): log_url =3D CharField(required=3DFalse) data =3D JSONField(required=3DFalse) =20 +class ResultSerializerFull(ResultSerializer): + log =3D CharField(required=3DFalse) + class SeriesResultsViewSet(viewsets.ViewSet, generics.GenericAPIView): - serializer_class =3D ResultSerializer lookup_field =3D 'name' lookup_value_regex =3D '[^/]+' =20 @@ -339,7 +341,12 @@ class SeriesResultsViewSet(viewsets.ViewSet, generics.= GenericAPIView): return Message.objects.filter(project=3Dself.kwargs['projects_pk'], message_id=3Dself.kwargs['series_mes= sage_id']) =20 - 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): queryset =3D self.get_queryset() try: obj =3D queryset[0] @@ -347,11 +354,12 @@ class SeriesResultsViewSet(viewsets.ViewSet, generics= .GenericAPIView): raise Http404 results =3D [] dispatch_module_hook("rest_results_hook", request=3Dself.request, - obj=3Dobj, results=3Dresults) + obj=3Dobj, results=3Dresults, + detailed=3Ddetailed) return {x.name: x for x in results} =20 def list(self, request, *args, **kwargs): - results =3D self.get_results().values() + results =3D self.get_results(detailed=3DFalse).values() serializer =3D self.get_serializer(results, many=3DTrue) # Fake paginator response for forwards-compatibility, in case # this ViewSet becomes model-based @@ -361,7 +369,7 @@ class SeriesResultsViewSet(viewsets.ViewSet, generics.G= enericAPIView): ])) =20 def retrieve(self, request, name, *args, **kwargs): - results =3D self.get_results() + results =3D self.get_results(detailed=3DTrue) try: result =3D results[name] except KeyError: diff --git a/mods/git.py b/mods/git.py index 13c3642..6d4f365 100644 --- a/mods/git.py +++ b/mods/git.py @@ -111,7 +111,7 @@ class GitModule(PatchewModule): raise Exception("Project git repo invalid: %s" % project_git) return upstream, branch =20 - def rest_results_hook(self, request, obj, results): + def rest_results_hook(self, request, obj, results, detailed=3DFalse): log =3D obj.get_property("git.apply-log") data =3D None if log: @@ -127,7 +127,7 @@ class GitModule(PatchewModule): status =3D 'pending' log_url =3D None results.append(Result(name=3D'git', obj=3Dobj, status=3Dstatus, - log_url=3Dlog_url, data=3Ddata, + log=3Dlog, log_url=3Dlog_url, data=3Ddata, request=3Drequest)) =20 def prepare_message_hook(self, request, message, detailed): diff --git a/mods/testing.py b/mods/testing.py index 21942d5..306c99f 100644 --- a/mods/testing.py +++ b/mods/testing.py @@ -276,7 +276,7 @@ class TestingModule(PatchewModule): return reverse("testing-get-prop", kwargs=3D{"project_or_series": obj.message_id}) =20 - def rest_results_hook(self, request, obj, results): + def rest_results_hook(self, request, obj, results, detailed=3DFalse): for pn, p in obj.get_properties().items(): if not pn.startswith("testing.report."): continue @@ -284,11 +284,15 @@ class TestingModule(PatchewModule): failed =3D not p["passed"] log_url =3D self.reverse_testing_log(obj, tn, request=3Dreques= t, html=3DFalse) passed_str =3D "failure" if failed else "success" + if detailed: + log =3D obj.get_property("testing.log." + tn) + else: + log =3D None =20 data =3D p.copy() del data['passed'] results.append(Result(name=3D'testing.' + tn, obj=3Dobj, statu= s=3Dpassed_str, - log_url=3Dlog_url, request=3Drequest, da= ta=3Ddata)) + log=3Dlog, log_url=3Dlog_url, request=3D= request, data=3Ddata)) =20 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 8bff7d5..38a3c50 100755 --- a/tests/test_git.py +++ b/tests/test_git.py @@ -105,6 +105,7 @@ class GitTest(PatchewTestCase): resp =3D self.api_client.get('%sseries/%s/results/git/' % (self.PR= OJECT_BASE, MESSAGE_ID)) self.assertEqual(resp.data['status'], 'pending') self.assertEqual(resp.data['log_url'], None) + self.assertEqual(resp.data['log'], None) =20 def test_rest_apply_failure(self): self.cli_import("0014-bar-patch.mbox.gz") @@ -115,6 +116,8 @@ class GitTest(PatchewTestCase): =20 resp =3D self.api_client.get('%sseries/%s/results/' % (self.PROJEC= T_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) =20 resp =3D self.api_client.get('%sseries/%s/results/git/' % (self.PR= OJECT_BASE, MESSAGE_ID)) self.assertEqual(resp.data['status'], 'failure') @@ -122,6 +125,7 @@ class GitTest(PatchewTestCase): self.assertEqual('tag' in resp.data, False) log =3D self.client.get(resp.data['log_url']) self.assertEqual(log.status_code, 200) + self.assertEqual(log.content.decode(), resp.data['log']) =20 def test_rest_apply_success(self): self.cli_import("0013-foo-patch.mbox.gz") @@ -135,6 +139,7 @@ class GitTest(PatchewTestCase): self.assertEqual(resp.data['data']['tag'], "refs/tags/patchew/2016= 0628014747.20971-1-famz@redhat.com") log =3D self.client.get(resp.data['log_url']) self.assertEqual(log.status_code, 200) + self.assertEqual(log.content.decode(), resp.data['log']) =20 if __name__ =3D=3D '__main__': main() diff --git a/tests/test_testing.py b/tests/test_testing.py index 369a806..a8345d8 100755 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -97,6 +97,7 @@ class TestingTest(PatchewTestCase): self.msg_testing_done(log=3D'everything good!', passed=3DTrue) resp =3D 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 =3D 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): resp =3D 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['data']['random_stuff'], 'xyz') + self.assertEquals(resp.data['log'], 'sorry no good') log =3D self.client.get(resp.data['log_url']) self.assertEquals(log.status_code, 200) self.assertEquals(log.content, b'sorry no good') @@ -117,6 +119,7 @@ class TestingTest(PatchewTestCase): self.assertEquals(resp.data['data']['is_timeout'], False) self.assertEquals(resp.data['status'], 'success') log =3D 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!') =20 @@ -126,6 +129,7 @@ class TestingTest(PatchewTestCase): resp =3D self.api_client.get('%sseries/%s/results/testing.a/' % (s= elf.PROJECT_BASE, self.msg.message_id)) self.assertEquals(resp.data['data']['is_timeout'], False) self.assertEquals(resp.data['status'], 'failure') + self.assertEquals(resp.data['log'], 'sorry no good') log =3D self.client.get(resp.data['log_url']) self.assertEquals(log.status_code, 200) self.assertEquals(log.content, b'sorry no good') --=20 2.16.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel From nobody Fri Apr 19 20:29:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521898654560771.4535126619768; Sat, 24 Mar 2018 06:37:34 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A253EC049D49; Sat, 24 Mar 2018 13:37:33 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 957A59D9A7; Sat, 24 Mar 2018 13:37:33 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 873A6181BA04; Sat, 24 Mar 2018 13:37:33 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2ODbWLv031713 for ; Sat, 24 Mar 2018 09:37:32 -0400 Received: by smtp.corp.redhat.com (Postfix) id 60CCE189B5; Sat, 24 Mar 2018 13:37:32 +0000 (UTC) Received: from mx1.redhat.com (ext-mx01.extmail.prod.ext.phx2.redhat.com [10.5.110.25]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5C0B487DC for ; Sat, 24 Mar 2018 13:37:32 +0000 (UTC) Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 58F9785359 for ; Sat, 24 Mar 2018 13:37:31 +0000 (UTC) Received: by mail-wm0-f43.google.com with SMTP id e194so8068451wmd.3 for ; Sat, 24 Mar 2018 06:37:31 -0700 (PDT) Received: from donizetti.lan (94-36-194-48.adsl-ull.clienti.tiscali.it. [94.36.194.48]) by smtp.gmail.com with ESMTPSA id i78sm3854257wmc.32.2018.03.24.06.37.28 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 24 Mar 2018 06:37:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=dBfCYhnTBG2XKiXrcPvKWfmwjYhWAUNxQmYxxIpH5aQ=; b=REJjytJDiHFcuLJ0TzZHrkvCBV5oLEbEa4Fmq4qNke7eQ6EAIieX5NlVBqcc3ljJwq oL5RAjmTmvt1RBTtkzTaIMk4jcDmBUa5Wg5U3kooCc2pRwElzUS0bkyPuq3kapcFyGKk 1YCKoJnwZ4BjzmdnWc6kda6kOTe0h8MhnDyP0Veg29cP+us8R5nYmbTrashxkyrE6Cux 39GHqQBts3xxUT8Hw8K1LwWp39DT5ieLdx11LEb8lgDR8keB4ZkJePEfL4Cul0KZk3Vh G4o6AscAbfEdBz5bA+hwUh+JIJDsppVnvhB8rzzgge+9Tma6Vw5Ro947yGTylSklHEbH y1JA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=dBfCYhnTBG2XKiXrcPvKWfmwjYhWAUNxQmYxxIpH5aQ=; b=lfTavjqCsk9Ef3VsR12d96uU5b7o7QLzi1+PwxyPKye+bGFOhbmiGNeAHnQO8WQmtU 9ejqGksZ18sMRikuipRhS/dGEcdgkR213yQaKmvktxdNNjHdWCYtDITuTwWAAjkVPbua ykjuy7TBtABwT/bD/spc6VxccKindzJVqlBXAt1hbGa6yPRviwCHVd41KVGSL/STXrNy hB9BX3sEeue4mu/n8Quv2rQV0Lcrs/hJvKPqpfARyyQ52v2/ZF43EOuUM6zDuTN9Eyk+ lCW+7GoGFfzLRxHNUrb7/hCOpXFj/fRb9nzPJ10fPN9jB2PFQ288oOTY9eQQ413YJ+LZ Ld4w== X-Gm-Message-State: AElRT7E9Jr+gYybkeZfyFTiwYQ6TedETTwyetvdFk6Rt0gnDprw/HOWx KLx85HFP63Y8F4MrbqcDh8ngg9tE X-Google-Smtp-Source: AG47ELvnfPaarWRz0rGqOBLDrBhkHPDTfRR/gsZ3zz1fc/LfwioRO7CgvqsXMJzioOeBtiahZkZJDg== X-Received: by 10.28.125.84 with SMTP id y81mr11014419wmc.66.1521898649580; Sat, 24 Mar 2018 06:37:29 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Sat, 24 Mar 2018 14:37:17 +0100 Message-Id: <20180324133719.6030-7-pbonzini@redhat.com> In-Reply-To: <20180324133719.6030-1-pbonzini@redhat.com> References: <20180324133719.6030-1-pbonzini@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Sat, 24 Mar 2018 13:37:31 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Sat, 24 Mar 2018 13:37:31 +0000 (UTC) for IP:'74.125.82.43' DOMAIN:'mail-wm0-f43.google.com' HELO:'mail-wm0-f43.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.469 (DKIM_SIGNED, DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_PASS) 74.125.82.43 mail-wm0-f43.google.com 74.125.82.43 mail-wm0-f43.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.83 on 10.5.110.25 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: patchew-devel@redhat.com Subject: [Patchew-devel] [PATCH 6/8] rest: add project results X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Sat, 24 Mar 2018 13:37:33 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Another tiny step towards the Result model, allowing test results for a project to be expressed in the REST API. --- api/rest.py | 28 ++++++++++++++++++++-------- api/urls.py | 1 + mods/git.py | 2 ++ tests/test_rest.py | 5 +++++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/api/rest.py b/api/rest.py index 9b1f103..bb56b4b 100644 --- a/api/rest.py +++ b/api/rest.py @@ -93,7 +93,10 @@ class ProjectSerializer(serializers.HyperlinkedModelSeri= alizer): class Meta: model =3D Project fields =3D ('resource_uri', 'name', 'mailing_list', 'prefix_tags',= 'url', 'git', \ - 'description', 'display_order', 'logo', 'parent_project') + 'description', 'display_order', 'logo', 'parent_project'= , 'results') + + results =3D HyperlinkedIdentityField(view_name=3D'results-list', looku= p_field=3D'pk', + lookup_url_kwarg=3D'projects_pk') =20 class ProjectsViewSet(viewsets.ModelViewSet): queryset =3D Project.objects.all().order_by('id') @@ -319,8 +322,12 @@ class MessagesViewSet(ProjectMessagesViewSetMixin, class HyperlinkedResultField(HyperlinkedIdentityField): def get_url(self, result, view_name, request, format): obj =3D result.obj - kwargs =3D {'projects_pk': obj.project_id, 'series_message_id': ob= j.message_id, - 'name': result.name} + kwargs =3D {'name': result.name} + if isinstance(obj, Message): + kwargs['projects_pk'] =3D obj.project_id + kwargs['series_message_id'] =3D obj.message_id + else: + kwargs['projects_pk'] =3D obj.id return self.reverse(view_name, kwargs=3Dkwargs, request=3Drequest,= format=3Dformat) =20 class ResultSerializer(serializers.Serializer): @@ -333,14 +340,10 @@ class ResultSerializer(serializers.Serializer): class ResultSerializerFull(ResultSerializer): log =3D CharField(required=3DFalse) =20 -class SeriesResultsViewSet(viewsets.ViewSet, generics.GenericAPIView): +class ResultsViewSet(viewsets.ViewSet, generics.GenericAPIView): lookup_field =3D 'name' lookup_value_regex =3D '[^/]+' =20 - def get_queryset(self): - return Message.objects.filter(project=3Dself.kwargs['projects_pk'], - message_id=3Dself.kwargs['series_mes= sage_id']) - def get_serializer_class(self, *args, **kwargs): if self.lookup_field in self.kwargs: return ResultSerializerFull @@ -376,3 +379,12 @@ class SeriesResultsViewSet(viewsets.ViewSet, generics.= GenericAPIView): raise Http404 serializer =3D self.get_serializer(result) return Response(serializer.data) + +class ProjectResultsViewSet(ResultsViewSet): + def get_queryset(self): + return Project.objects.filter(id=3Dself.kwargs['projects_pk']) + +class SeriesResultsViewSet(ResultsViewSet): + def get_queryset(self): + return Message.objects.filter(project=3Dself.kwargs['projects_pk'], + message_id=3Dself.kwargs['series_mes= sage_id']) diff --git a/api/urls.py b/api/urls.py index becabeb..64e9629 100644 --- a/api/urls.py +++ b/api/urls.py @@ -34,6 +34,7 @@ router.register('series', rest.SeriesViewSet, base_name= =3D'series') =20 projects_router =3D NestedDefaultRouter(router, 'projects', lookup=3D'proj= ects', trailing_slash=3DTrue) projects_router.include_format_suffixes =3D False +projects_router.register('results', rest.ProjectResultsViewSet, base_name= =3D'results') projects_router.register('series', rest.ProjectSeriesViewSet, base_name=3D= 'series') projects_router.register('messages', rest.MessagesViewSet, base_name=3D'me= ssages') =20 diff --git a/mods/git.py b/mods/git.py index 6d4f365..1f22f2e 100644 --- a/mods/git.py +++ b/mods/git.py @@ -112,6 +112,8 @@ class GitModule(PatchewModule): return upstream, branch =20 def rest_results_hook(self, request, obj, results, detailed=3DFalse): + if not isinstance(obj, Message): + return log =3D obj.get_property("git.apply-log") data =3D None if log: diff --git a/tests/test_rest.py b/tests/test_rest.py index 391714f..261456b 100755 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -122,6 +122,11 @@ class RestTest(PatchewTestCase): self.assertEquals(resp.data['logo'], None) self.assertEquals(resp.data['parent_project'], self.PROJECT_BASE) =20 + def test_project_results_list(self): + resp1 =3D self.api_client.get(self.PROJECT_BASE) + resp =3D self.api_client.get(resp1.data['results']) + self.assertEqual(resp.data['count'], len(resp.data['results'])) + def test_series_single(self): resp =3D self.apply_and_retrieve('0001-simple-patch.mbox.gz', self.p.id, '20160628014747.20971-1-= famz@redhat.com') --=20 2.16.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel From nobody Fri Apr 19 20:29:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521898658442220.99878566593657; Sat, 24 Mar 2018 06:37:38 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 635EC4E8A8; Sat, 24 Mar 2018 13:37:37 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 41F5B6090A; Sat, 24 Mar 2018 13:37:37 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 336544CA98; Sat, 24 Mar 2018 13:37:37 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2ODbaM6031736 for ; Sat, 24 Mar 2018 09:37:36 -0400 Received: by smtp.corp.redhat.com (Postfix) id 364845E1C2; Sat, 24 Mar 2018 13:37:36 +0000 (UTC) Received: from mx1.redhat.com (ext-mx06.extmail.prod.ext.phx2.redhat.com [10.5.110.30]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2E75E5E1C1 for ; Sat, 24 Mar 2018 13:37:34 +0000 (UTC) Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AB6BC36809 for ; Sat, 24 Mar 2018 13:37:32 +0000 (UTC) Received: by mail-wm0-f43.google.com with SMTP id l9so8111566wmh.2 for ; Sat, 24 Mar 2018 06:37:32 -0700 (PDT) Received: from donizetti.lan (94-36-194-48.adsl-ull.clienti.tiscali.it. [94.36.194.48]) by smtp.gmail.com with ESMTPSA id i78sm3854257wmc.32.2018.03.24.06.37.29 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 24 Mar 2018 06:37:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=ieHTPVhZpYmsCwqpR6nXsoPD2g9E5yoN91g5Y7BDdi0=; b=p9SmoUfZJYUitN0/Nh9u+SFhCG+z4c6mvziLpVHjNW6sZDiewCGK5nSVVdYifJWaxk Cfc0HRdvdH2j2URuuREQEogzH0FFDbn5UxwS/Pm5ELcvMN8bfqOzauMTB/ZCV/P6kjuk ytwFtJcbJM6ni+lYK7SjvjIwQL8yJi3nJrouARiaZXAidPjQr88ooHNJifsHWY6bjafU 3sUWfZhbkOoTrjIqtomo2htSGQr9KZazTuWmnHz9J5L5pwHqMbWznEQ651KYq6A7/LDn 4/mEHezb5nuWtGEHDCOsxFmScCl8cZC/rUTHk5C2Qc+c7admp2zBJAR4sGrwYctSI+iT SbJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=ieHTPVhZpYmsCwqpR6nXsoPD2g9E5yoN91g5Y7BDdi0=; b=CI07AE1XQFeQAG68hM7/4AqbMpe3F2zSbhzkqUHivAIzGska/dK1Bi2IRYbsWIVQ7X B9LZQLfeGSrLvAq3mdbkqb9w8AmGiYQOSqssCjAOoRrXtv8RmtqXwvWPjUyagYe3ioW9 sDu/7dLDUMRSwmMamqu5ekgS1Lf/6X7Mba+7Zpg+pPPQSXxj4TPJEEvQUn7rFc30BMEb KmWfElGzwMyu7T0eY3DJCl+17DnQk2TvPLrQcE4t0jfaJjmz0rpzTVA6VateuwKkf0iA mlhwjUpzmAtYZtU2S2/XFPx1hyNgK9P+9B7BXr/u6lhocAQERjT5K7l9VWQPY+WXvMPH m0mg== X-Gm-Message-State: AElRT7F/K9D7W+8KF/2uL3nfXiMAQEyFOcsKm4R3gfG5NimeVWW+FHP3 BnKg6eboU06TNRJTswoBRPyGVk3g X-Google-Smtp-Source: AG47ELtwcedV6bln3rtVDRJAUr7thuJyxJxF9uFMjnGvuslMQsRIOSGgCCQeJEYtlqeYIt2IDyhJLQ== X-Received: by 10.28.220.130 with SMTP id t124mr11686807wmg.60.1521898650844; Sat, 24 Mar 2018 06:37:30 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Sat, 24 Mar 2018 14:37:18 +0100 Message-Id: <20180324133719.6030-8-pbonzini@redhat.com> In-Reply-To: <20180324133719.6030-1-pbonzini@redhat.com> References: <20180324133719.6030-1-pbonzini@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Sat, 24 Mar 2018 13:37:33 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Sat, 24 Mar 2018 13:37:33 +0000 (UTC) for IP:'74.125.82.43' DOMAIN:'mail-wm0-f43.google.com' HELO:'mail-wm0-f43.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.469 (DKIM_SIGNED, DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_PASS) 74.125.82.43 mail-wm0-f43.google.com 74.125.82.43 mail-wm0-f43.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.78 on 10.5.110.30 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: patchew-devel@redhat.com Subject: [Patchew-devel] [PATCH 7/8] testing: refactor tests introducing a common superclass TestingTestCase X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Sat, 24 Mar 2018 13:37:37 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" --- tests/test_testing.py | 85 +++++++++++++++++++++++++++++++++--------------= ---- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/tests/test_testing.py b/tests/test_testing.py index a8345d8..e525e1d 100755 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -8,6 +8,7 @@ # This work is licensed under the MIT License. Please see the LICENSE fil= e or # http://opensource.org/licenses/MIT. =20 +import abc import sys import os import subprocess @@ -24,7 +25,7 @@ def create_test(project, name): project.set_property(prefix + "users", "") project.set_property(prefix + "tester", "") =20 -class TestingTest(PatchewTestCase): +class TestingTestCase(PatchewTestCase, metaclass=3Dabc.ABCMeta): =20 def setUp(self): self.create_superuser() @@ -33,33 +34,21 @@ class TestingTest(PatchewTestCase): =20 create_test(self.p, "a") =20 - self.cli_login() - self.cli_import('0001-simple-patch.mbox.gz') - self.cli_logout() - - self.msg =3D Message.objects.all()[0] - self.msg.save() - self.msg.set_property("git.repo", "dummy repo") - self.msg.set_property("git.tag", "dummy tag") - self.msg.set_property("git.base", "dummy base") - - def msg_testing_done(self, log=3DNone, **report): + def _do_testing_done(self, obj, log, report): if not 'passed' in report: report['passed'] =3D True - self.msg.set_property("testing.report.tests", report) + obj.set_property("testing.report.tests", report) if log is not None: - self.msg.set_property("testing.log.tests", log) - self.msg.set_property("testing.done", True) - self.msg.set_property("testing.ready", None) + obj.set_property("testing.log.tests", log) + obj.set_property("testing.done", True) + obj.set_property("testing.ready", None) =20 - def msg_testing_report(self, **report): + def do_testing_report(self, **report): self.api_login() r =3D self.api_call("testing-get", project=3D"QEMU", tester=3D"dummy tester", capabilities=3D[]) - self.assertEquals(r['identity']['type'], 'series') - report['project'] =3D r["project"] report['identity'] =3D r["identity"] report['test'] =3D r["test"]["name"] @@ -74,7 +63,15 @@ class TestingTest(PatchewTestCase): report['is_timeout'] =3D False =20 self.api_call("testing-report", **report) - return r['identity']['message-id'] + return r['identity'] + + @abc.abstractmethod + def do_testing_done(self, log=3DNone, **report): + pass + + @abc.abstractmethod + def get_test_result(self, test_name): + pass =20 def test_basic(self): self.api_login() @@ -85,7 +82,7 @@ class TestingTest(PatchewTestCase): self.assertIn("head", td) =20 def test_done(self): - self.msg_testing_done() + self.do_testing_done() self.api_login() td =3D self.api_call("testing-get", project=3D"QEMU", @@ -94,8 +91,8 @@ class TestingTest(PatchewTestCase): self.assertFalse(td) =20 def test_rest_done_success(self): - self.msg_testing_done(log=3D'everything good!', passed=3DTrue) - resp =3D self.api_client.get('%sseries/%s/results/testing.tests/' = % (self.PROJECT_BASE, self.msg.message_id)) + self.do_testing_done(log=3D'everything good!', passed=3DTrue) + resp =3D self.get_test_result('tests') self.assertEquals(resp.data['status'], 'success') self.assertEquals(resp.data['log'], 'everything good!') log =3D self.client.get(resp.data['log_url']) @@ -103,8 +100,8 @@ class TestingTest(PatchewTestCase): self.assertEquals(log.content, b'everything good!') =20 def test_rest_done_failure(self): - self.msg_testing_done(log=3D'sorry no good', passed=3DFalse, rando= m_stuff=3D'xyz') - resp =3D self.api_client.get('%sseries/%s/results/testing.tests/' = % (self.PROJECT_BASE, self.msg.message_id)) + self.do_testing_done(log=3D'sorry no good', passed=3DFalse, random= _stuff=3D'xyz') + resp =3D self.get_test_result('tests') self.assertEquals(resp.data['status'], 'failure') self.assertEquals(resp.data['data']['random_stuff'], 'xyz') self.assertEquals(resp.data['log'], 'sorry no good') @@ -114,8 +111,8 @@ class TestingTest(PatchewTestCase): =20 def test_api_report_success(self): self.api_login() - msgid =3D self.msg_testing_report(log=3D'everything good!', passed= =3DTrue) - resp =3D self.api_client.get('%sseries/%s/results/testing.a/' % (s= elf.PROJECT_BASE, self.msg.message_id)) + self.do_testing_report(log=3D'everything good!', passed=3DTrue) + resp =3D self.get_test_result('a') self.assertEquals(resp.data['data']['is_timeout'], False) self.assertEquals(resp.data['status'], 'success') log =3D self.client.get(resp.data['log_url']) @@ -125,8 +122,8 @@ class TestingTest(PatchewTestCase): =20 def test_api_report_failure(self): self.api_login() - msgid =3D self.msg_testing_report(log=3D'sorry no good', passed=3D= False) - resp =3D self.api_client.get('%sseries/%s/results/testing.a/' % (s= elf.PROJECT_BASE, self.msg.message_id)) + self.do_testing_report(log=3D'sorry no good', passed=3DFalse) + resp =3D self.get_test_result('a') self.assertEquals(resp.data['data']['is_timeout'], False) self.assertEquals(resp.data['status'], 'failure') self.assertEquals(resp.data['log'], 'sorry no good') @@ -134,6 +131,33 @@ class TestingTest(PatchewTestCase): self.assertEquals(log.status_code, 200) self.assertEquals(log.content, b'sorry no good') =20 +class MessageTestingTest(TestingTestCase): + + def setUp(self): + super(MessageTestingTest, self).setUp() + + self.cli_login() + self.cli_import('0001-simple-patch.mbox.gz') + self.cli_logout() + + self.msg =3D Message.objects.all()[0] + self.msg.save() + self.msg.set_property("git.repo", "dummy repo") + self.msg.set_property("git.tag", "dummy tag") + self.msg.set_property("git.base", "dummy base") + + def do_testing_done(self, log=3DNone, **report): + self._do_testing_done(self.msg, log, report) + + def do_testing_report(self, **report): + r =3D super(MessageTestingTest, self).do_testing_report(**report) + self.assertEquals(r['type'], 'series') + return r + + def get_test_result(self, test_name): + return self.api_client.get('%sseries/%s/results/testing.%s/' % ( + self.PROJECT_BASE, self.msg.message= _id, test_name)) + class TesterTest(PatchewTestCase): =20 def setUp(self): @@ -186,5 +210,8 @@ class TesterTest(PatchewTestCase): self.assertIn("Nothing to test", out) self.cli_logout() =20 +# do not run tests on the abstract class +del TestingTestCase + if __name__ =3D=3D '__main__': main() --=20 2.16.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel From nobody Fri Apr 19 20:29:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521898658242527.6057008076398; Sat, 24 Mar 2018 06:37:38 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3FABF13AA9; Sat, 24 Mar 2018 13:37:37 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 314CA18123; Sat, 24 Mar 2018 13:37:37 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 22EEC181BA02; Sat, 24 Mar 2018 13:37:37 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2ODba5I031735 for ; Sat, 24 Mar 2018 09:37:36 -0400 Received: by smtp.corp.redhat.com (Postfix) id 357F79D9A3; Sat, 24 Mar 2018 13:37:36 +0000 (UTC) Received: from mx1.redhat.com (ext-mx02.extmail.prod.ext.phx2.redhat.com [10.5.110.26]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2F6C15C261 for ; Sat, 24 Mar 2018 13:37:35 +0000 (UTC) Received: from mail-wr0-f175.google.com (mail-wr0-f175.google.com [209.85.128.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 47D3587633 for ; Sat, 24 Mar 2018 13:37:34 +0000 (UTC) Received: by mail-wr0-f175.google.com with SMTP id m13so1357080wrj.5 for ; Sat, 24 Mar 2018 06:37:34 -0700 (PDT) Received: from donizetti.lan (94-36-194-48.adsl-ull.clienti.tiscali.it. [94.36.194.48]) by smtp.gmail.com with ESMTPSA id i78sm3854257wmc.32.2018.03.24.06.37.30 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 24 Mar 2018 06:37:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=Oav9YUaiH4j1c1gMLxcOi9gQ93ivsXrxEqOWQEBt/2U=; b=KaQyVBchrsqLNNZ3B2MhmqiO9r4DQA3s0/9CmJ2wgwXfUrJUde6WpD2eM9qHhWu3t9 1ch7fkEweANc2i3rbSS2E7WasiZQXV6evk3RhTAaUfZ2hnxEyrgiIPAqFz2kUSUBaNDi qYyPn1KKWUl5XtZ/AQNFrJ8zhK0KEfyGRxuSN+59AeY+crfyGzGyOgtqqtc5m6i6jM08 KGp6pf14nZNc7ejC0K0GDnAitQmx9FB4j3fHNl3yFdC4ttyzgkcl3wS7NpWh3IOdhCkZ gZkR7GxloSEOk1oMd3YVZd9h5N5d4xtgXGStyq3wgwiWvz6tcuwMSWxhCMbzMIzHjkN+ JPxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=Oav9YUaiH4j1c1gMLxcOi9gQ93ivsXrxEqOWQEBt/2U=; b=LPwVjpZMU+K1WzV5xqcMPJ+z1dCqOEXnpcsQGF5pHdYSKXip0B+Zm5ZQ8wq3pQf9dF Elg9k50v1yC36Emu5t/AAlrowj4yiCDdYks30TMoECWkxPY27bSF5xwruZ0eEtEep15v wC9xQD6kJOA6OKKX5Mi35I/Wy1TOobW4ehfYCtfmkxg19yB13BXT8L0OWlJRX0o2IjnM tnFCjRNHOMBchPBTAY+3Ep0HIiPkculRLgUP6MTQss0wtnk+HBOxLo8qE9wc8a4Ls8ko FTuRffRQFWK8WKOaulvzgRQ2IohUa2kYFC3RFLgEc4JTx5N5p5zjazMHpp9wFieaDU6r XAbg== X-Gm-Message-State: AElRT7Fc8qsaw50PsO9dvwZoJhGlbT4U0830g2nBmLJKl5uYFimwDXk1 FJHM+Gm+aIwqY9pSsxeL3NH6F6gE X-Google-Smtp-Source: AG47ELtAGtjYS7vGHmPFdwPIQMHp25WuPpt99XgHK36hnACPakshM2USyWaDjFmsKCY/QanU8YrGjg== X-Received: by 10.223.160.182 with SMTP id m51mr23902725wrm.187.1521898652369; Sat, 24 Mar 2018 06:37:32 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Sat, 24 Mar 2018 14:37:19 +0100 Message-Id: <20180324133719.6030-9-pbonzini@redhat.com> In-Reply-To: <20180324133719.6030-1-pbonzini@redhat.com> References: <20180324133719.6030-1-pbonzini@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Sat, 24 Mar 2018 13:37:34 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Sat, 24 Mar 2018 13:37:34 +0000 (UTC) for IP:'209.85.128.175' DOMAIN:'mail-wr0-f175.google.com' HELO:'mail-wr0-f175.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.488 (DKIM_SIGNED, DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_PASS) 209.85.128.175 mail-wr0-f175.google.com 209.85.128.175 mail-wr0-f175.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.78 on 10.5.110.26 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: patchew-devel@redhat.com Subject: [Patchew-devel] [PATCH 8/8] testing: cover project tests X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Sat, 24 Mar 2018 13:37:37 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" --- tests/test_testing.py | 69 +++++++++++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/tests/test_testing.py b/tests/test_testing.py index e525e1d..827d971 100755 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -30,6 +30,9 @@ class TestingTestCase(PatchewTestCase, metaclass=3Dabc.AB= CMeta): def setUp(self): self.create_superuser() self.p =3D self.add_project("QEMU", "qemu-devel@nongnu.org") + self.p.git =3D "dummy repo" + self.p.save() + self.PROJECT_BASE =3D '%sprojects/%d/' % (self.REST_BASE, self.p.i= d) =20 create_test(self.p, "a") @@ -158,15 +161,35 @@ class MessageTestingTest(TestingTestCase): return self.api_client.get('%sseries/%s/results/testing.%s/' % ( self.PROJECT_BASE, self.msg.message= _id, test_name)) =20 +class ProjectTestingTest(TestingTestCase): + + def setUp(self): + super(ProjectTestingTest, self).setUp() + self.p.set_property("git.head", "5678") + self.p.set_property("testing.tested-head", "1234") + self.p.set_property("testing.ready", 1) + + def do_testing_done(self, log=3DNone, **report): + self._do_testing_done(self.p, log, report) + + def do_testing_report(self, **report): + r =3D super(ProjectTestingTest, self).do_testing_report(**report) + self.assertEquals(r['type'], 'project') + return r + + def get_test_result(self, test_name): + return self.api_client.get('%sresults/testing.%s/' % ( + self.PROJECT_BASE, test_name)) + class TesterTest(PatchewTestCase): =20 def setUp(self): self.create_superuser() =20 - p1 =3D self.add_project("QEMU", "qemu-devel@nongnu.org") - create_test(p1, "a") - p2 =3D self.add_project("UMEQ", "qemu-devel@nongnu.org") - create_test(p2, "b") + self.p1 =3D self.add_project("QEMU", "qemu-devel@nongnu.org") + create_test(self.p1, "a") + self.p2 =3D self.add_project("UMEQ", "qemu-devel@nongnu.org") + create_test(self.p2, "b") =20 self.cli_login() self.cli_import('0001-simple-patch.mbox.gz') @@ -176,10 +199,9 @@ class TesterTest(PatchewTestCase): os.mkdir(self.repo) subprocess.check_output(["git", "init"], cwd=3Dself.repo) for f in ["foo", "bar"]: - subprocess.check_output(["touch", f], cwd=3Dself.repo) - subprocess.check_output(["git", "add", f], cwd=3Dself.repo) - subprocess.check_output(["git", "commit", "-m", "add " + f], - cwd=3Dself.repo) + self.add_file_and_commit(f) + self.update_head(self.p1) + self.update_head(self.p2) base =3D subprocess.check_output(["git", "rev-parse", "HEAD~1"], cwd=3Dself.repo).decode() subprocess.check_output(["git", "tag", "test"], cwd=3Dself.repo) @@ -189,6 +211,17 @@ class TesterTest(PatchewTestCase): msg.set_property("git.tag", "test") msg.set_property("git.base", base) =20 + def add_file_and_commit(self, f): + subprocess.check_output(["touch", f], cwd=3Dself.repo) + subprocess.check_output(["git", "add", f], cwd=3Dself.repo) + subprocess.check_output(["git", "commit", "-m", "add " + f], + cwd=3Dself.repo) + + def update_head(self, p): + head =3D subprocess.check_output(["git", "rev-parse", "HEAD"], + cwd=3Dself.repo).decode() + p.set_property("git.head", head) + def test_tester(self): self.cli_login() out, err =3D self.check_cli(["tester", "-p", "QEMU,UMEQ", @@ -210,6 +243,26 @@ class TesterTest(PatchewTestCase): self.assertIn("Nothing to test", out) self.cli_logout() =20 + def test_tester_project(self): + self.cli_login() + out, err =3D self.check_cli(["tester", "-p", "QEMU,UMEQ", + "--no-wait"]) + self.assertIn("Project: QEMU\n", out) + self.assertIn("Project: UMEQ\n", out) + + self.p1.git =3D self.repo + self.p1.save() + self.add_file_and_commit("baz") + self.update_head(self.p1) + out, err =3D self.check_cli(["tester", "-p", "QEMU,UMEQ", + "--no-wait", "-N", "1"]) + self.assertIn("Project: QEMU\n", out) + self.assertIn("'type': 'project'", out) + out, err =3D self.check_cli(["tester", "-p", "QEMU,UMEQ", + "--no-wait", "-N", "1"]) + self.assertIn("Nothing to test", out) + self.cli_logout() + # do not run tests on the abstract class del TestingTestCase =20 --=20 2.16.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel