aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/cuirass.texi4
-rw-r--r--src/cuirass/database.scm15
-rw-r--r--src/cuirass/http.scm15
3 files changed, 34 insertions, 0 deletions
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.