aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix-data-service/web/controller.scm48
-rw-r--r--guix-data-service/web/jobs/controller.scm69
-rw-r--r--guix-data-service/web/jobs/html.scm224
-rw-r--r--guix-data-service/web/view/html.scm210
4 files changed, 309 insertions, 242 deletions
diff --git a/guix-data-service/web/controller.scm b/guix-data-service/web/controller.scm
index 6f534e9..e89519c 100644
--- a/guix-data-service/web/controller.scm
+++ b/guix-data-service/web/controller.scm
@@ -51,6 +51,7 @@
#:use-module (guix-data-service web sxml)
#:use-module (guix-data-service web query-parameters)
#:use-module (guix-data-service web util)
+ #:use-module (guix-data-service web jobs controller)
#:use-module (guix-data-service web view html)
#:export (controller))
@@ -881,27 +882,6 @@
derivations))
#:extra-headers http-headers-for-unchanging-content)))))
-(define (render-jobs mime-types conn)
- (render-html
- #:sxml (view-jobs
- (select-jobs-and-events conn))))
-
-(define (render-job-queue mime-types conn)
- (render-html
- #:sxml (view-job-queue
- (select-unprocessed-jobs-and-events conn))))
-
-(define (render-job mime-types conn job-id query-parameters)
- (render-html
- #:sxml (view-job
- job-id
- query-parameters
- (log-for-job conn job-id
- #:character-limit
- (assq-ref query-parameters 'characters)
- #:start-character
- (assq-ref query-parameters 'start_character)))))
-
(define (parse-commit conn)
(lambda (s)
(if (guix-commit-exists? conn s)
@@ -983,6 +963,13 @@
(define path
(uri-path (request-uri request)))
+ (define (delegate-to f)
+ (f request
+ method-and-path-components
+ mime-types
+ body
+ conn))
+
(match method-and-path-components
(('GET)
(render-html
@@ -1317,21 +1304,8 @@
(render-compare/packages mime-types
conn
parsed-query-parameters)))
- (('GET "jobs")
- (render-jobs mime-types
- conn))
- (('GET "jobs" "queue")
- (render-job-queue mime-types
- conn))
- (('GET "job" job-id)
- (let ((parsed-query-parameters
- (parse-query-parameters
- request
- `((start_character ,parse-number)
- (characters ,parse-number #:default 1000000)))))
- (render-job mime-types
- conn
- job-id
- parsed-query-parameters)))
+ (('GET "jobs") (delegate-to jobs-controller))
+ (('GET "jobs" "queue") (delegate-to jobs-controller))
+ (('GET "job" job-id) (delegate-to jobs-controller))
(('GET path ...)
(not-found (request-uri request)))))
diff --git a/guix-data-service/web/jobs/controller.scm b/guix-data-service/web/jobs/controller.scm
new file mode 100644
index 0000000..8367196
--- /dev/null
+++ b/guix-data-service/web/jobs/controller.scm
@@ -0,0 +1,69 @@
+;;; Guix Data Service -- Information about Guix over time
+;;; Copyright © 2019 Christopher Baines <mail@cbaines.net>
+;;;
+;;; This program is free software: you can redistribute it and/or
+;;; modify it under the terms of the GNU Affero General Public License
+;;; as published by the Free Software Foundation, either version 3 of
+;;; the License, or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; Affero General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Affero General Public
+;;; License along with this program. If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (guix-data-service web jobs controller)
+ #:use-module (ice-9 match)
+ #:use-module (guix-data-service web render)
+ #:use-module (guix-data-service web query-parameters)
+ #:use-module (guix-data-service jobs load-new-guix-revision)
+ #:use-module (guix-data-service web jobs html)
+ #:export (jobs-controller))
+
+(define (jobs-controller request
+ method-and-path-components
+ mime-types
+ body
+ conn)
+ (match method-and-path-components
+ (('GET "jobs")
+ (render-jobs mime-types
+ conn))
+ (('GET "jobs" "queue")
+ (render-job-queue mime-types
+ conn))
+ (('GET "job" job-id)
+ (let ((parsed-query-parameters
+ (parse-query-parameters
+ request
+ `((start_character ,parse-number)
+ (characters ,parse-number #:default 1000000)))))
+ (render-job mime-types
+ conn
+ job-id
+ parsed-query-parameters)))))
+
+(define (render-jobs mime-types conn)
+ (render-html
+ #:sxml (view-jobs
+ (select-jobs-and-events conn))))
+
+(define (render-job-queue mime-types conn)
+ (render-html
+ #:sxml (view-job-queue
+ (select-unprocessed-jobs-and-events conn))))
+
+(define (render-job mime-types conn job-id query-parameters)
+ (render-html
+ #:sxml (view-job
+ job-id
+ query-parameters
+ (log-for-job conn job-id
+ #:character-limit
+ (assq-ref query-parameters 'characters)
+ #:start-character
+ (assq-ref query-parameters 'start_character)))))
+
diff --git a/guix-data-service/web/jobs/html.scm b/guix-data-service/web/jobs/html.scm
new file mode 100644
index 0000000..5d77a70
--- /dev/null
+++ b/guix-data-service/web/jobs/html.scm
@@ -0,0 +1,224 @@
+;;; Guix Data Service -- Information about Guix over time
+;;; Copyright © 2019 Christopher Baines <mail@cbaines.net>
+;;;
+;;; This program is free software: you can redistribute it and/or
+;;; modify it under the terms of the GNU Affero General Public License
+;;; as published by the Free Software Foundation, either version 3 of
+;;; the License, or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; Affero General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Affero General Public
+;;; License along with this program. If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (guix-data-service web jobs html)
+ #:use-module (ice-9 match)
+ #:use-module (guix-data-service web view html)
+ #:export (view-jobs
+ view-job-queue
+ view-job))
+
+(define (view-jobs jobs-and-events)
+ (layout
+ #:body
+ `(,(header)
+ (div
+ (@ (class "container"))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-sm-12"))
+ (h1 (@ (style "display: inline-block;"))
+ "Jobs")
+ (div
+ (@ (class "btn-group pull-right")
+ (style "margin-top: 1.3rem;")
+ (role "group"))
+ (a (@ (class "btn btn-lg btn-default")
+ (href "/jobs/queue")
+ (role "button"))
+ "Queue"))))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-sm-12"))
+ (table
+ (@ (class "table"))
+ (thead
+ (tr
+ (th "Commit")
+ (th "Source")
+ (th "Events")
+ (th "")))
+ (tdata
+ ,@(map (match-lambda
+ ((id commit source git-repository-id created-at succeeded-at
+ events log-exists?)
+ `(tr
+ (@ (class
+ ,(let ((event-names
+ (map (lambda (event)
+ (assoc-ref event "event"))
+ (vector->list events))))
+ (cond
+ ((member "success" event-names)
+ "success")
+ ((member "failure" event-names)
+ "danger")
+ ((member "start" event-names)
+ "info")
+ (else
+ "")))))
+ (td (a (@ (href
+ ,(string-append
+ "/revision/" commit)))
+ (samp ,commit)))
+ (td ,source)
+ (td
+ (dl
+ (@ (class "dl-horizontal"))
+ ,@(map
+ (lambda (event)
+ `((dt ,(assoc-ref event "event"))
+ (dd ,(assoc-ref event "occurred_at"))))
+ (cons
+ `(("event" . "created")
+ ("occurred_at" . ,created-at))
+ (vector->list events)))))
+ (td
+ ,@(if log-exists?
+ `((a (@ (href ,(string-append "/job/" id)))
+ "View log"))
+ '())))))
+ jobs-and-events)))))))))
+
+(define (view-job-queue jobs-and-events)
+ (layout
+ #:body
+ `(,(header)
+ (div
+ (@ (class "container"))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-sm-12"))
+ (a (@ (href "/jobs"))
+ (h3 "Jobs"))
+ (h1 "Queued jobs ("
+ ,(length jobs-and-events)
+ ")")))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-sm-12"))
+ (table
+ (@ (class "table"))
+ (thead
+ (tr
+ (th "Commit")
+ (th "Source")
+ (th "Events")
+ (th "")))
+ (tdata
+ ,@(map (match-lambda
+ ((id commit source git-repository-id created-at
+ events log-exists? latest-branch-commit?)
+ `(tr
+ (@ (class
+ ,(let ((event-names
+ (map (lambda (event)
+ (assoc-ref event "event"))
+ (vector->list events))))
+ (cond
+ ((member "success" event-names)
+ "success")
+ ((member "failure" event-names)
+ "danger")
+ ((member "start" event-names)
+ "info")
+ (else
+ "")))))
+ (td (a (@ (href
+ ,(string-append
+ "/revision/" commit)))
+ (samp ,commit)
+ ,@(if latest-branch-commit?
+ '((br)
+ (span (@ (class "text-danger"))
+ "(latest branch commit)"))
+ '())))
+ (td ,source)
+ (td
+ (dl
+ (@ (class "dl-horizontal"))
+ ,@(map
+ (lambda (event)
+ `((dt ,(assoc-ref event "event"))
+ (dd ,(assoc-ref event "occurred_at"))))
+ (cons
+ `(("event" . "created")
+ ("occurred_at" . ,created-at))
+ (vector->list events)))))
+ (td
+ ,@(if log-exists?
+ `((a (@ (href ,(string-append "/job/" id)))
+ "View log"))
+ '())))))
+ jobs-and-events)))))))))
+
+(define (view-job job-id query-parameters log)
+ (layout
+ #:body
+ `(,(header)
+ (div
+ (@ (class "container"))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-sm-12"))
+ (h1 "Job " ,job-id)))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-md-12"))
+ (div
+ (@ (class "well"))
+ (form
+ (@ (method "get")
+ (action "")
+ (class "form-horizontal"))
+ ,(form-horizontal-control
+ "Characters" query-parameters
+ #:help-text "Return at most this many characters.")
+ ,(form-horizontal-control
+ "Start character" query-parameters
+ #:help-text "Start reading the log from this character.")
+ (div (@ (class "form-group form-group-lg"))
+ (div (@ (class "col-sm-offset-2 col-sm-10"))
+ (button (@ (type "submit")
+ (class "btn btn-lg btn-primary"))
+ "Update log")))))))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-sm-12"))
+ (a (@ (class "btn btn-default btn-lg pull-right")
+ (style "margin-bottom: 20px;")
+ (href "#bottom"))
+ "Scroll to the bottom of the page")))
+ (div
+ (@ (class "row"))
+ (div
+ (pre (raw ,log))
+ (a (@ (id "bottom")))))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-sm-12"))
+ (a (@ (class "btn btn-default btn-lg pull-right")
+ (href "#top"))
+ "Scroll to the top of the page")))))))
diff --git a/guix-data-service/web/view/html.scm b/guix-data-service/web/view/html.scm
index ff815c4..2750944 100644
--- a/guix-data-service/web/view/html.scm
+++ b/guix-data-service/web/view/html.scm
@@ -28,7 +28,11 @@
#:use-module (texinfo)
#:use-module (texinfo html)
#:use-module (json)
- #:export (index
+ #:export (layout
+ header
+ form-horizontal-control
+
+ index
readme
general-not-found
unknown-revision
@@ -45,9 +49,6 @@
view-builds
view-derivation
view-store-item
- view-jobs
- view-job-queue
- view-job
compare
compare/derivations
compare-by-datetime/derivations
@@ -1428,207 +1429,6 @@
derivations
derivations-using-store-item-list)))))
-(define (view-jobs jobs-and-events)
- (layout
- #:body
- `(,(header)
- (div
- (@ (class "container"))
- (div
- (@ (class "row"))
- (div
- (@ (class "col-sm-12"))
- (h1 (@ (style "display: inline-block;"))
- "Jobs")
- (div
- (@ (class "btn-group pull-right")
- (style "margin-top: 1.3rem;")
- (role "group"))
- (a (@ (class "btn btn-lg btn-default")
- (href "/jobs/queue")
- (role "button"))
- "Queue"))))
- (div
- (@ (class "row"))
- (div
- (@ (class "col-sm-12"))
- (table
- (@ (class "table"))
- (thead
- (tr
- (th "Commit")
- (th "Source")
- (th "Events")
- (th "")))
- (tdata
- ,@(map (match-lambda
- ((id commit source git-repository-id created-at succeeded-at
- events log-exists?)
- `(tr
- (@ (class
- ,(let ((event-names
- (map (lambda (event)
- (assoc-ref event "event"))
- (vector->list events))))
- (cond
- ((member "success" event-names)
- "success")
- ((member "failure" event-names)
- "danger")
- ((member "start" event-names)
- "info")
- (else
- "")))))
- (td (a (@ (href
- ,(string-append
- "/revision/" commit)))
- (samp ,commit)))
- (td ,source)
- (td
- (dl
- (@ (class "dl-horizontal"))
- ,@(map
- (lambda (event)
- `((dt ,(assoc-ref event "event"))
- (dd ,(assoc-ref event "occurred_at"))))
- (cons
- `(("event" . "created")
- ("occurred_at" . ,created-at))
- (vector->list events)))))
- (td
- ,@(if log-exists?
- `((a (@ (href ,(string-append "/job/" id)))
- "View log"))
- '())))))
- jobs-and-events)))))))))
-
-(define (view-job-queue jobs-and-events)
- (layout
- #:body
- `(,(header)
- (div
- (@ (class "container"))
- (div
- (@ (class "row"))
- (div
- (@ (class "col-sm-12"))
- (a (@ (href "/jobs"))
- (h3 "Jobs"))
- (h1 "Queued jobs ("
- ,(length jobs-and-events)
- ")")))
- (div
- (@ (class "row"))
- (div
- (@ (class "col-sm-12"))
- (table
- (@ (class "table"))
- (thead
- (tr
- (th "Commit")
- (th "Source")
- (th "Events")
- (th "")))
- (tdata
- ,@(map (match-lambda
- ((id commit source git-repository-id created-at
- events log-exists? latest-branch-commit?)
- `(tr
- (@ (class
- ,(let ((event-names
- (map (lambda (event)
- (assoc-ref event "event"))
- (vector->list events))))
- (cond
- ((member "success" event-names)
- "success")
- ((member "failure" event-names)
- "danger")
- ((member "start" event-names)
- "info")
- (else
- "")))))
- (td (a (@ (href
- ,(string-append
- "/revision/" commit)))
- (samp ,commit)
- ,@(if latest-branch-commit?
- '((br)
- (span (@ (class "text-danger"))
- "(latest branch commit)"))
- '())))
- (td ,source)
- (td
- (dl
- (@ (class "dl-horizontal"))
- ,@(map
- (lambda (event)
- `((dt ,(assoc-ref event "event"))
- (dd ,(assoc-ref event "occurred_at"))))
- (cons
- `(("event" . "created")
- ("occurred_at" . ,created-at))
- (vector->list events)))))
- (td
- ,@(if log-exists?
- `((a (@ (href ,(string-append "/job/" id)))
- "View log"))
- '())))))
- jobs-and-events)))))))))
-
-(define (view-job job-id query-parameters log)
- (layout
- #:body
- `(,(header)
- (div
- (@ (class "container"))
- (div
- (@ (class "row"))
- (div
- (@ (class "col-sm-12"))
- (h1 "Job " ,job-id)))
- (div
- (@ (class "row"))
- (div
- (@ (class "col-md-12"))
- (div
- (@ (class "well"))
- (form
- (@ (method "get")
- (action "")
- (class "form-horizontal"))
- ,(form-horizontal-control
- "Characters" query-parameters
- #:help-text "Return at most this many characters.")
- ,(form-horizontal-control
- "Start character" query-parameters
- #:help-text "Start reading the log from this character.")
- (div (@ (class "form-group form-group-lg"))
- (div (@ (class "col-sm-offset-2 col-sm-10"))
- (button (@ (type "submit")
- (class "btn btn-lg btn-primary"))
- "Update log")))))))
- (div
- (@ (class "row"))
- (div
- (@ (class "col-sm-12"))
- (a (@ (class "btn btn-default btn-lg pull-right")
- (style "margin-bottom: 20px;")
- (href "#bottom"))
- "Scroll to the bottom of the page")))
- (div
- (@ (class "row"))
- (div
- (pre (raw ,log))
- (a (@ (id "bottom")))))
- (div
- (@ (class "row"))
- (div
- (@ (class "col-sm-12"))
- (a (@ (class "btn btn-default btn-lg pull-right")
- (href "#top"))
- "Scroll to the top of the page")))))))
-
(define (view-derivation derivation derivation-inputs derivation-outputs
builds)
(layout