diff options
-rw-r--r-- | genenetwork/services/genenetwork.scm | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/genenetwork/services/genenetwork.scm b/genenetwork/services/genenetwork.scm index 48dfcc8..6c08703 100644 --- a/genenetwork/services/genenetwork.scm +++ b/genenetwork/services/genenetwork.scm @@ -22,10 +22,11 @@ (define-module (genenetwork services genenetwork) #:use-module ((gn packages genenetwork) #:select (genenetwork2 genenetwork3 gn-auth gn-uploader)) #:use-module ((gnu packages web) #:select (nginx)) - #:use-module ((gnu packages admin) #:select (shadow)) + #:use-module ((gnu packages admin) #:select (shadow shepherd)) #:use-module ((gnu packages python) #:select (python)) #:use-module (gnu services) #:use-module (gnu services web) + #:use-module (gnu services mcron) #:use-module (gnu system file-systems) #:use-module (gnu system shadow) #:use-module (guix build python-build-system) @@ -132,6 +133,81 @@ (home-directory "/var/empty") (shell (file-append shadow "/sbin/nologin"))))) +(define (build-xapian-index-cron-gexp config) + (let* ((sql-uri (genenetwork-configuration-sql-uri config)) + (genenetwork3 (genenetwork-configuration-genenetwork3 config)) + (xapian-directory (genenetwork-configuration-xapian-db config)) + (sparql-endpoint (genenetwork-configuration-sparql-endpoint config)) + (xapian-build-directory (string-append xapian-directory "/build")) + (herd (file-append shepherd "/bin/herd")) + (index-genenetwork (file-append genenetwork3 "/bin/index-genenetwork")) + (gn3-profile (profile + (content (package->development-manifest genenetwork3)) + (allow-collisions? #t))) + (python3-version (python-version (package-version python)))) + (with-imported-modules '((guix build utils)) + #~(begin + (use-modules (guix build utils) + (srfi srfi-26)) + + ;; Use GN3 in container, not newly cloned GN3 to avoid + ;; inconsistencies between versions + (setenv "PYTHONPATH" + (string-append #$(file-append genenetwork3 + "/lib/python" + python3-version + "/site-packages") + ":" + #$gn3-profile + "/lib/python" + #$python3-version + "/site-packages")) + + (when (and + ;; not currently building an index + (not (file-exists? #$xapian-build-directory)) + ;; data has been modified + (zero? (status:exit-val (system* #$index-genenetwork + "is-data-modified" + #$xapian-directory + #$sql-uri + #$sparql-endpoint)))) + (dynamic-wind + (const #t) + ;; build the index + (lambda () + (invoke #$index-genenetwork + "create-xapian-index" + #$xapian-build-directory + #$sql-uri + #$sparql-endpoint) + (dynamic-wind + ;; stop GN3: Here there is magic!!! + ;; The name `gunicorn-genenetwork' is magical. It is not set + ;; here nor at the point of call, rather, it is set in a + ;; dependency of the system (forge), thereby creating a + ;; coupling between this g-expression and whatever forge + ;; is doing. We need to figure out a way to pass in the + ;; service name as part of the call to break that coupling + (cut invoke #$herd "stop" "gunicorn-genenetwork3") + ;;replace old index + (lambda () + (for-each (lambda (file) + (rename-file file + (string-append #$xapian-directory + "/" + (basename file)))) + (find-files #$xapian-build-directory))) + ;; restart GN3 + (cut invoke #$herd "start" "gunicorn-genenetwork3"))) + (lambda () + ;; delete build directory + (delete-file-recursively #$xapian-build-directory) + ;; set up correct permissions + (for-each (lambda (file) + (chmod file #o644)) + (find-files #$xapian-directory))))))))) + (define (genenetwork-activation config) (match-record config <genenetwork-configuration> (gn2-secrets gn3-secrets gn-auth-secrets auth-db) |