aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2020-07-01 17:44:15 +0100
committerChristopher Baines <mail@cbaines.net>2020-07-01 17:44:15 +0100
commite7e98cc7ca765a0ebaa65f9dd90fefcaeed0b308 (patch)
treee6d9727d5ff1855f2bfb99b10842b45642dd15e8
parentab5760aa633be66b7444a4896be53f31a101adcf (diff)
downloadbuild-coordinator-e7e98cc7ca765a0ebaa65f9dd90fefcaeed0b308.tar
build-coordinator-e7e98cc7ca765a0ebaa65f9dd90fefcaeed0b308.tar.gz
Add a way of sending events for all builds to the Guix Data Service
To backfill the data, where the hooks haven't been used.
-rw-r--r--guix-build-coordinator/guix-data-service.scm71
1 files changed, 69 insertions, 2 deletions
diff --git a/guix-build-coordinator/guix-data-service.scm b/guix-build-coordinator/guix-data-service.scm
index d777b49..7c4bd09 100644
--- a/guix-build-coordinator/guix-data-service.scm
+++ b/guix-build-coordinator/guix-data-service.scm
@@ -25,12 +25,19 @@
#:use-module (json)
#:use-module (web client)
#:use-module (web response)
- #:export (send-build-event-to-guix-data-service))
+ #:use-module (guix-build-coordinator datastore)
+ #:export (send-build-event-to-guix-data-service
+
+ send-events-for-all-builds))
(define (send-build-event-to-guix-data-service target-url event)
+ (send-build-events-to-guix-data-service target-url
+ (list event)))
+
+(define (send-build-events-to-guix-data-service target-url events)
(define body
(scm->json-string
- `((items . ,(vector event)))))
+ `((items . ,(list->vector events)))))
(let*-values
(((response body)
@@ -48,3 +55,63 @@
(simple-format #f "code: ~A response: ~A"
code
(utf8->string body)))))))
+
+(define (send-events-for-all-builds datastore target-url)
+ (define (events-for-build build-id)
+ (define build-details
+ (datastore-find-build datastore build-id))
+
+ (define derivation-name
+ (assq-ref build-details 'derivation-name))
+
+ `(((type . build)
+ (event . scheduled)
+ (build_id . ,build-id)
+ (derivation . ,derivation-name)
+ ,@(let ((created-at (assq-ref build-details 'created-at)))
+ (if created-at
+ `((timestamp` . ,(string->number
+ (strftime "%s"
+ (assq-ref build-details 'created-at)))))
+ '())))
+
+ ,@(map
+ (lambda (start-time-and-agent)
+ `((type . build)
+ (event . started)
+ (build_id . ,build-id)
+ (derivation . ,derivation-name)
+ (timestamp . ,(string->number
+ (strftime "%s"
+ (assq-ref start-time-and-agent
+ 'start-time))))))
+ (reverse
+ (datastore-find-build-starts datastore build-id)))
+
+ ,@(let ((result-details (datastore-find-build-result datastore build-id)))
+ (if result-details
+ `(((type . build)
+ (event . ,(let ((result (assq-ref result-details 'result)))
+ (cond
+ ((string=? result "success") 'succeeded)
+ ((string=? result "failure") 'failed)
+ (else
+ (error "unknown result")))))
+ (build_id . ,build-id)
+ (derivation . ,derivation-name)
+ ,@(let ((end-time (assq-ref build-details 'end-time)))
+ (if end-time
+ `((timestamp . ,(string->number
+ (strftime "%s"
+ (assq-ref build-details
+ 'end-time)))))
+ '()))))
+ '()))))
+
+ (datastore-for-each-build
+ datastore
+ (lambda (build-id)
+ (simple-format #t "~A\n" build-id)
+ (let ((events (events-for-build build-id)))
+ (send-build-events-to-guix-data-service target-url
+ events)))))