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. +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 : diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm index ab6a4c7..308b5c3 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 @@ -588,6 +589,20 @@ log file for DRV." (#:event . ,(assq-ref status-names status))))))))) +(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 adding + ;; derivations which introduce the same outputs, there should only be one + ;; result. + (match (sqlite-exec db "SELECT derivation, name FROM Outputs +WHERE path =" 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))) + (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.