Commit Graph

475 Commits

Author SHA1 Message Date
Christopher Baines faf4bfdfcb Enable make-worker-thread-channel to create multiple worker threads.
This will allow running multiple threads, that all listen on the same channel,
enabling processing multiple jobs at one time.

* src/cuirass/utils.scm (make-worker-thread-channel): Add a #:parallelism
argument, and create as many threads as the given parallelism.
2020-01-25 22:32:09 +00:00
Christopher Baines e34d773faf Adjust make-worker-thread-channel to take an initializer.
While this is a generic method, and initializer function will give the
flexibility required to create multiple worker threads for performing SQLite
queries, each with it's own database connection (as a result of calling the
initializer once for each thread). Without this change, they'd all have to use
the same connection, which would not work.

* src/cuirass/utils.scm (make-worker-thread-channel): Change procedure to take
an initializer, rather than arguments directly.
* src/cuirass/database.scm (with-database): Adjust to call
make-worker-thread-channel with an initializer.
* tests/database.scm (db-init): Change to use make-worker-thread-channel
initializer.
* tests/http.scm (db-init): Change to use make-worker-thread-channel
initializer.
2020-01-25 22:32:09 +00:00
Christopher Baines 0d23a6d374 utils: Change critical section terminology to worker threads.
As far as I'm aware, it's necessary to use a separate thread for interacting
with SQLite as one of the threads used for fibers will be blocked while the
SQLite query is running.

This doesn't mean all queries have to be executed one at a time though,
providing the queries are executed outside the threads used by fibers, and a
single connection isn't used in multiple threads.

These changes start to move in this direction, first by just changing the
terminology.

* src/cuirass/base.scm (clear-build-queue, cancel-old-builds): Change
with-db-critical-section to with-db-worker-thread.
* src/cuirass/database.scm (with-db-critical-section): Rename syntax rule to
with-db-worker-thread.
(db-add-input, db-add-checkout, db-add-specification, db-remove-specification,
db-get-inputs, db-get-specification, db-add-evaluation,
db-set-evaluations-done, db-set-evaluation-done, db-add-derivation-output,
db-add-build, db-update-build-status!, db-get-output, db-get-outputs,
db-get-builds-by-search, db-get-builds, db-get-build derivation-or-id,
db-add-event, db-get-events, db-delete-events-with-ids-<=-to,
db-get-pending-derivations, db-get-checkouts, db-get-evaluations,
db-get-evaluations-build-summary, db-get-evaluations-id-max,
db-get-evaluation-summary, db-get-builds-query-min, db-get-builds-query-max,
db-get-builds-min, db-get-builds-max, db-get-evaluation-specification): Change
from using with-db-critical-section to
with-db-worker-thread.
(with-database): Change syntax rule to use make-worker-thread-channel,
renaming from make-critical-section.
* src/cuirass/utils.scm (%critical-section-args): Rename parameter to
%worker-thread-args.
(make-critical-section): Rename to make-worker-thread-channel, and adjust
parameter and docstring.
(call-with-critical-section): Rename to call-with-worker-thread and adjust
parameter.
(with-critical-section): Rename to with-worker-thread, and adjust to call
call-with-worker-thread.
* tests/database.scm (db-init): Use make-worker-thread-channel rather than
make-critical-section.
* tests/http.scm (db-init): Use make-worker-thread-channel rather than
make-critical-section.
2020-01-25 22:32:09 +00:00
Christopher Baines fa412cdb59 Alter the Builds table to have an id field
The internal rowid's are used for builds as you can request builds by using
the rowid in the URL.

The motivation here is to enable running VACUUM operations in SQLite, without
risking the rowid's for Builds changing. It would be bad if they change, as
they're used in the URL's for builds.

* src/schema.sql (Builds): Add id column.
* src/curiass/dataabse.scm (db-add-build): Change PRIMARYKEY constraint to
UNIQUE constraint.
* src/sql/upgrade-6.sql: New file.
* Makefile.am (dist_sql_DATA): Add it.
2020-01-25 22:22:39 +00:00
Christopher Baines 9eb96d1b19 database: Don't return rowid from db-add-input.
As it is unused from where db-add-input is called.

* src/cuirass/database.scm (db-add-input): Don't call and
return (last-insert-rowid).
2020-01-24 19:46:25 +00:00
Ludovic Courtès c238cc9f87 build: Allow builds with Guile 3.0.
* configure.ac: Add "3.0" to 'GUILE_PKG'.
* README: Mention it.
2020-01-18 15:18:00 +01:00
Ludovic Courtès 23daae21af http: Add missing import of (ice-9 threads) in test.
Using the core binding for 'call-with-new-thread' was deprecated in 2.2
and is removed in 3.0.

* tests/http.scm: Use (ice-9 threads).
2020-01-18 15:16:01 +01:00
Christopher Baines 46f73b6b7c Support returning build information by output.
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 outputs,
the probability of getting the data back from Cuirass is reduced.

This is because Cuirass might not have build the exact derivation you have,
but a different derivation that produces the same outputs (this can commonly
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, rather
than derivation.

The motivation behind this is to make it easier to import build information 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/… requests.
* doc/cuirass.texi (Build information): Mention that you can get build
information by output.
2020-01-16 08:33:03 +00:00
Christopher Baines 267649c9f0 Support publishing evaluation events
* src/cuirass/database.scm (db-add-evaluation): Record the creation of new
evaluations as events.
(db-set-evaluation-done): Record when evaluations finish as an event.
* src/cuirass/http.scm (url-handler): Add a new /api/evaluation-events page.
2020-01-16 08:33:03 +00:00
Christopher Baines 12def48b3b Support publishing build events
Add a table to store events, which have a type and a JSON blob. These can be
used to record changes, this commit inserts events when new builds are
created, and when the status of builds change.

The EventsOutbox table is then used to track when events have been sent
out. This is done through the new cuirass-send-events script.

* Makefile.am (bin_SCRIPTS): Add bin/cuirass-send-events.
.gitignore: Add bin/cuirass-send-events.
(dist_pkgmodule_DATA): Add src/cuirass/send-events.scm.
(dist_sql_DATA): Add src/sql/upgrade-5.sql.
(EXTRA_DIST): bin/cuirass-send-events.in.
(bin/cuirass-send-events): New rule.
* bin/cuirass-send-events.in: New file.
* src/cuirass/send-events.scm: New file.
* src/sql/upgrade-5.sql: New file.
* src/cuirass/database.scm (changes-count): New procedure.
(db-update-build-status!): Call db-add-event after updating the build status.
(db-add-event): New procedure.
(db-add-build): Insert an event when a new build is inserted.
(db-delete-events-with-ids-<=-to): New procedure.
* src/schema.sql (Events): New table.
2020-01-16 08:32:52 +00:00
Ludovic Courtès 5c5790ad21 base: 'build-derivations&' closes the build output port only once.
* src/cuirass/base.scm (build-derivations&): Remove extra 'close-port'
call in 'guard' clause.
2019-11-03 11:47:52 +01:00
Ricardo Wurmus e20ff86d97
tests: Remove 405 test.
This is a follow-up to commit c88a7c006e.

* tests/http.scm: Remove test for invalid POST to /build/1.
2019-10-30 13:29:37 +01:00
Ricardo Wurmus 647f3961fa
http: Add route for /admin.
* src/cuirass/http.scm (url-handler): Handle /admin route.
2019-10-30 13:00:14 +01:00
Ricardo Wurmus 5ffb2c3089
bin: Remove redundant lambda.
* bin/cuirass.in (main): Remove redundant lambda wrapping in for-each.
2019-10-30 09:23:14 +01:00
Ricardo Wurmus 918601d966
http: Handle specification deletion and addition.
* src/cuirass/http.scm (url-handler): Handle /admin/specifications/add,
/admin/specifications/delete/*, and /admin/specifications.
2019-10-30 09:21:37 +01:00
Ricardo Wurmus 53fe4996be
templates: specifications-table: Add admin features.
* src/cuirass/templates.scm (specifications-table): Handle optional ADMIN?
argument.
2019-10-30 09:20:51 +01:00
Ricardo Wurmus 8a618322b1
database: Add db-remove-specification.
* src/cuirass/database.scm (db-remove-specification): New procedure.
2019-10-30 09:19:28 +01:00
Ricardo Wurmus c88a7c006e
http: Be explicit about accepted HTTP methods.
* src/cuirass/http.scm (url-handler): Match on HTTP method.
2019-10-30 09:18:01 +01:00
Ludovic Courtès 80b6e89a7b templates: Failed evaluations link to their log.
* src/cuirass/templates.scm (evaluation-badges): Link to
/eval/ID/log/raw in the 'zero?' case.
2019-10-23 15:46:10 +02:00
Ludovic Courtès c8c34f8ee3 http: Serve evaluation logs at /eval/ID/log/raw.
* src/cuirass/base.scm (evaluation-log-file): Export.
* src/cuirass/http.scm (url-handler)[respond-gzipped-file]: New
procedure.
Add handler for /eval/ID/log/raw.
2019-10-23 15:37:15 +02:00
Ludovic Courtès 15fc2d7691 base: Log the evaluation ID upon evaluation failure.
* src/cuirass/base.scm (&evaluation-error)[id]: New field.
(evaluate): Specify the 'id' field.
(process-specs): Show the log file name upon evaluation failure.
2019-10-23 14:53:50 +02:00
Ludovic Courtès c96863bc7c base: Write to 'evaluate' output to /var/log/cuirass.
This fixes a longstanding issue where evalution output would splatter
over the /var/log/cuirass.log and be inscrutable.

* src/cuirass/base.scm (%cuirass-state-directory): New variable.
(evaluation-log-file): New procedure.
(evaluate)[log-file, log-pipe]: New variables.
Call 'spawn-fiber' with a logging fiber.  Wrap 'open-pipe*' call into
'with-error-to-port'.  Close 'log-pipe'.
2019-10-23 14:53:50 +02:00
Christopher Baines 9acb0aa55b http: Support fetching builds by derivation.
There's a one to one mapping of build id to derivation, so allow querying by
derivation file name as well. I'm looking at this as I'm interested in getting
build information in to the Guix Data Service.

* src/cuirass/http.scm (url-handler): Support fetching builds by numeric id or
the derivation file name.
2019-10-02 08:16:54 +01:00
Ludovic Courtès d27ff21e43 templates: Fix type errors in build details page.
This is a followup to 858b6b8c8f.

* src/cuirass/templates.scm (build-details)[blocking-outputs]: Fix type
errors when dealing with the result of 'derivation-build-plan'.
2019-09-23 22:44:53 +02:00
Ludovic Courtès 6cf84a43bb http: Pass 'build-search-results-table' a list, not a vector.
* src/cuirass/http.scm (url-handler): Call 'vector->list' on the result
of 'handle-builds-search-request', as expected by 'build-search-results-table'.
2019-08-27 10:12:12 +02:00
Ludovic Courtès 3d494b8973 http: Pass 'build-eval-table' a list, not a vector.
* src/cuirass/http.scm (url-handler): Call 'vector->list' on the result
of 'handle-builds-request', as expected by 'build-eval-table'.
2019-08-27 10:06:18 +02:00
Ricardo Wurmus 1cd2f9334d
http: Fix type error.
This is a follow-up to commit c6f4fa5f57.

* src/cuirass/http.scm (url-handler): SPECIFICATIONS-TABLE expects a list, not
a vector.
2019-08-27 00:38:08 +02:00
Ludovic Courtès 858b6b8c8f templates: Use 'derivation-build-plan'.
* src/cuirass/templates.scm (build-details): Use 'derivation-build-plan'
instead of 'derivation-prerequisites-to-build'.
2019-08-17 19:08:33 +02:00
Ludovic Courtès b1d7e9ddb4 doc: Guile 2.2 is needed.
This is a followup to ee11ba1d93.

* README: Ask for Guile 2.2.
2019-08-17 18:59:28 +02:00
Ludovic Courtès c6f4fa5f57 Switch to Guile-JSON 3.x.
Guile-JSON 3.x is incompatible with Guile-JSON 1.x, which we relied on
until now: it maps JSON dictionaries to alists (instead of hash tables),
and JSON arrays to vectors (instead of lists).  This commit is about
adjusting all the existing code to this new mapping.

* src/cuirass/http.scm (evaluation->json-object): New procedure.
(handle-builds-request): Pass the result through 'list->vector'.
(handle-builds-search-request): Likewise.
(url-handler): Likewise for /jobsets, /specifications, /api/evaluations,
and /build.  For /api/evaluations, use 'evaluation->json-object'.
* src/cuirass/utils.scm (object->json-scm): Add 'vector?' case.
* tests/http.scm (hash-table-keys, hash-table=?): Remove.
(evaluations-query-result): Use vectors for JSON arrays.
("object->json-string"): Expects alists instead of hash tables.
("/build/1"): Use 'lset=' instead of 'hash-table=?'.
("/api/latestbuilds?nr=1&jobset=guix"): Likewise, and expect alists
instead of hash tables.
("/api/latestbuilds?nr=1&jobset=gnu"): Likewise.
("/api/evaluations?nr=1"): Likewise.
* README: Mention Guile-JSON 3.x.
2019-08-17 18:48:34 +02:00
Ludovic Courtès 92bdf3cda0 http: Import (ice-9 format).
* src/cuirass/http.scm: Add missing include of (ice-9 format).
2019-08-17 16:53:07 +02:00
Ludovic Courtès 907c21f761 base: Use the new 'store-error' procedure names.
The 'nix-error' names are now deprecated in Guix.

* src/cuirass/base.scm (build-derivations&): Use the new 'store-error'
procedure names.
2019-08-17 12:09:23 +02:00
Ricardo Wurmus e11f172265
Separate web interface.
* bin/cuirass.in (show-help): Document "--web" option.
(%options): Default to running without web interface.
(main): Either run the web interface or build packages.
* README: Mention the "--web" option.
2019-08-10 13:46:55 +02:00
Robert Vollmert 1aeea2f97f
Fix templates to handle all statuses.
* src/cuirass/templates.scm: Factor out class and title helpers
for build statuses, and handle all the statuses.
2019-08-07 16:19:20 +02:00
Ricardo Wurmus fed15b83b0
database: query->bind-arguments: Process ^ and $ characters.
* src/cuirass/database.scm (query->bind-arguments): Handle ^ and $ characters
in query strings.
2019-06-20 23:31:34 +02:00
Danny Milosavljevic d5b827097b
templates: If applicable, disable "Last" and "First" pagination links.
* src/cuirass/templates.scm (pagination): Disable "Last" and "First"
if applicable.
2019-06-19 17:47:13 +02:00
Tobias Geerinckx-Rice 8c91c82e35
templates: Add link titles to evaluation badges.
* src/cuirass/templates.scm (evaluation-badges): Add ‘title’ attributes.
2019-06-19 16:24:18 +02:00
Ricardo Wurmus 39e3c899e2
templates: Expand search input on focus.
* src/cuirass/templates.scm (html-page): Include CSS for widening the search
input field on focus.
2019-06-19 15:42:00 +02:00
Ricardo Wurmus 219506d5f9
cuirass: Restore search query.
* src/cuirass/templates.scm (search-form): Take the query as an argument and
set it as the value (unless #F).
(html-page): Optionally take a value for QUERY as an argument.
* src/cuirass/http.scm (url-handler): Let "search" handler pass QUERY to
HTML-PAGE.
2019-06-19 15:38:01 +02:00
Ricardo Wurmus c3ff064e97
database: query->bind-arguments: Ignore invalid query terms.
* src/cuirass/database.scm (query->bind-arguments): Ignore invalid query
terms.
2019-06-19 15:37:05 +02:00
Ricardo Wurmus 5885b9814d
templates: Display logs of blocking dependencies.
* src/cuirass/templates.scm (build-details): Determine failed outputs of
prerequisites and link to their logs.
2019-06-19 15:17:45 +02:00
Ricardo Wurmus efe7d36e64
http: Show number of builds.
* src/cuirass/database.scm (db-get-evaluation-summary): New procedure.
* src/cuirass/http.scm (url-handler): Display number of builds in tabs.
2019-06-19 10:22:51 +02:00
Ricardo Wurmus a11f7a4779
cuirass: Remove tabs for canceled, dependency failed, and other failed.
All of them are included in "failed".

* src/cuirass/http.scm (url-handler): Remove extraneous tabs.
2019-06-19 09:58:17 +02:00
Ricardo Wurmus 831d73874b
cuirass: Adjust query for scheduled builds.
* src/cuirass/http.scm (url-handler): Use "pending" instead of "scheduled".
2019-06-19 09:56:06 +02:00
Ricardo Wurmus 372d47b326
cuirass: Display builds in separate tabs.
* src/cuirass/http.scm (url-handler): Split result for "eval" page in tabs.
* src/cuirass/templates.scm (build-eval-table): Remove border from table head;
Remove lead paragraph.
2019-06-19 09:38:08 +02:00
Ricardo Wurmus 11f888abb8
http: Fix navigation URL for build details page.
* src/cuirass/http.scm (url-handler): Use "jobset" instead of "spec".
2019-06-19 00:13:54 +02:00
Ricardo Wurmus 5f631820c8
templates: Link to "details" page in build tables.
* src/cuirass/templates.scm (build-eval-table, build-search-results-table):
Link ID to build details URL.
2019-06-19 00:09:27 +02:00
Ricardo Wurmus 5070d17e7e
http: Handle /build/<id>/details URL.
* src/cuirass/http.scm (url-handler): Add handler for /build/<id>/details.
* src/cuirass/templates.scm (build-details): New procedure.
2019-06-18 23:59:53 +02:00
Ricardo Wurmus 767f34bd68
database: db-get-specifications: Order specs by name.
* src/cuirass/database.scm (db-get-specifications): Order rows by "name".
2019-06-18 23:36:37 +02:00
Ricardo Wurmus 9017b9fbc1
database: Support advanced query strings.
* src/cuirass/database.scm (query->bind-arguments): New procedure.
(db-get-builds-by-search): Support filtering by spec and system.
(db-get-builds-query-min, db-get-builds-query-max): Adjust.
2019-05-21 11:40:28 +02:00