From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christopher Baines Subject: [PATCH] Support returning build information by output. Date: Sat, 4 Jan 2020 09:51:48 +0000 Message-ID: <20200104095148.3522-1-mail@cbaines.net> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:54222) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ing66-00083d-KD for guix-devel@gnu.org; Sat, 04 Jan 2020 04:51:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ing65-0003UO-9V for guix-devel@gnu.org; Sat, 04 Jan 2020 04:51:54 -0500 Received: from mira.cbaines.net ([212.71.252.8]:34902) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ing64-0003SE-Vb for guix-devel@gnu.org; Sat, 04 Jan 2020 04:51:53 -0500 Received: from localhost (unknown [46.237.160.207]) by mira.cbaines.net (Postfix) with ESMTPSA id 6D7FA17981 for ; Sat, 4 Jan 2020 09:51:51 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 4773beda for ; Sat, 4 Jan 2020 09:51:48 +0000 (UTC) List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: guix-devel@gnu.org Being able to take a derivation and query the build information is useful= , but in cases where there are multiple derivations that produce the same outpu= ts, the probability of getting the data back from Cuirass is reduced. This is because Cuirass might not have build the exact derivation you hav= e, but a different derivation that produces the same outputs (this can commo= nly happen when a related fixed output derivation changes). Cuirass doesn't store derivations if they produce the same outputs as a derivation it already knows about, so it can't determine if this is the case. Therefore, provide a way of querying build results by output, rathe= r than derivation. The motivation behind this is to make it easier to import build informati= on in to the Guix Data Service. * src/cuirass/database.scm (db-get-output): New procedure. * src/cuirass/http.scm (respond-output-not-found): New procedure. (request-path-components): Handle /output/=E2=80=A6 requests. * doc/cuirass.texi (Build information): Mention that you can get build information by output. --- doc/cuirass.texi | 4 ++++ src/cuirass/database.scm | 15 +++++++++++++++ src/cuirass/http.scm | 15 +++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/doc/cuirass.texi b/doc/cuirass.texi index ebb1fa5..e652e8d 100644 --- a/doc/cuirass.texi +++ b/doc/cuirass.texi @@ -477,6 +477,10 @@ It is possible to query Cuirass web server for build= informations. The dedicated API is "/build/@var{build-id}" where @var{build-id} is the unique id associated to the build in database. =20 +The build information can also be queried by output. For example, +@samp{/output/kg9mirg6xbvzcp0a98v7326n1nvvwgsj-hello-2.10} will return +the details of the output, along with the build if available. + For instance, querying a local Cuirass web server can be done with @code{curl} and @code{jq} to format the JSON response : =20 diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm index 523165d..66e93e2 100644 --- a/src/cuirass/database.scm +++ b/src/cuirass/database.scm @@ -47,6 +47,7 @@ build-status db-add-build db-update-build-status! + db-get-output db-get-build db-get-builds db-get-builds-by-search @@ -539,6 +540,20 @@ log file for DRV." "WHERE derivation=3D" drv " AND status !=3D " s= tatus ";"))))) =20 +(define (db-get-output path) + "Retrieve the OUTPUT for PATH." + (with-db-critical-section db + ;; There isn't a unique index on path, but because Cuirass avoids ad= ding + ;; derivations which introduce the same outputs, there should only b= e one + ;; result. + (match (sqlite-exec db "SELECT derivation, name FROM Outputs +WHERE path =3D" path " +LIMIT 1;") + (() #f) + ((#(derivation name)) + `((#:derivation . ,derivation) + (#:name . ,name)))))) + (define (db-get-outputs derivation) "Retrieve the OUTPUTS of the build identified by DERIVATION in the database." diff --git a/src/cuirass/http.scm b/src/cuirass/http.scm index 7579e1a..bf436c5 100644 --- a/src/cuirass/http.scm +++ b/src/cuirass/http.scm @@ -226,6 +226,11 @@ Hydra format." 404 (format #f "Build with ID ~a doesn't exist." build-id))) =20 + (define (respond-output-not-found output-id) + (respond-json-with-error + 404 + (format #f "Output with ID ~a doesn't exist." output-id))) + (define (respond-html-eval-not-found eval-id) (respond-html (html-page "Page not found" @@ -331,6 +336,16 @@ Hydra format." (#f (respond-build-not-found build-id))) (respond-build-not-found build-id)))) + (('GET "output" id) + (let ((output (db-get-output + (string-append (%store-prefix) "/" id)))) + (if output + (let ((build (db-get-build (assq-ref output #:derivation)))) + (respond-json + (object->json-string + (append output + `((#:build . ,(or build #nil))))))) + (respond-output-not-found id)))) (('GET "api" "evaluations") (let* ((params (request-parameters request)) ;; 'nr parameter is mandatory to limit query size. --=20 2.24.1