From 54c43ad0cdde59887d7e42dc09bd2d05a4a7de2d Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 7 Dec 2020 11:37:24 +0200 Subject: gn: modularize slurm service --- gn/services/science.scm | 136 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 110 insertions(+), 26 deletions(-) (limited to 'gn/services') diff --git a/gn/services/science.scm b/gn/services/science.scm index f0f43d0..1a25382 100644 --- a/gn/services/science.scm +++ b/gn/services/science.scm @@ -170,32 +170,113 @@ ;; that machine. Therefore it makes sense to have one config section with ;; "common" and "extended" options. With all the possible options and ;; versions we only cover the ones which affect the services. + ;; We keep the capitalization used in the config files to make discovery easier. (package slurm-configuration-package (default slurm)) (slurm-conf-file slurm-configuration-slurm-conf-file (default "/etc/slurm/slurm.conf")) - (slurmd-log-file slurm-configuration-slurmd-log-file + (SlurmdLogFile slurm-configuration-slurmd-log-file (default #f)) ; #f for syslog - (slurmd-pid-file slurm-configuration-slurmd-pid-file + (SlurmdPidFile slurm-configuration-slurmd-pidfile (default "/var/run/slurmd.pid")) - (slurmd-spooldir slurm-configuration-slurmd-spooldir + (SlurmdSpoolDir slurm-configuration-slurmd-spooldir (default "/var/spool/slurmd")) (run-slurmctld? slurm-configuration-run-slurmctld (default #f)) - (slurmctld-log-file slurm-configuration-slurmctld-log-file + (SlurmctldLogFile slurm-configuration-slurmctld-log-file (default #f)) ; #f for syslog - (slurmctld-pid-file slurm-configuration-slurmctld-pid-file + (SlurmctldPidFile slurm-configuration-slurmctld-pidfile (default "/var/run/slurmctld.pid")) (run-slurmdbd? slurm-configuration-run-slurmdbd (default #f)) (slurmdbd-conf-file slurm-configuration-slurmdbd-conf-file (default "/etc/slurm/slurmdbd.conf")) - (slurmdbd-pid-file slurm-configuration-slurmdbd-pid-file - (default "/var/run/slurmdbd.pid"))) + (slurmdbd-PidFile slurm-configuration-slurmdbd-pidfile + (default "/var/run/slurmdbd.pid")) + (ClusterName slurm-configuration-clustername + (default #f)) ; string + (SlurmUser slurm-configuration-slurmuser + (default #f)) ; string + (SlurmctldHost slurm-configuration-slurmctldhost + (default #f)) ; list of strings + (slurm-extra-content slurm-configuration-slurm-extra-content + (default "")) + (cgroup-extra-content slurm-configuration-cgroup-extra-content + (default "")) + (DbdHost slurm-configuration-dbdhost + (default #f)) ; string + (StorageType slurm-configuration-storagetype + (default #f)) ; string + (slurmdbd-extra-content slurm-configuration-slurmdbd-extra-content + (default ""))) + + +(define (%slurm.conf config) + "Return a slurm.conf configuration file corresponding to CONFIG." + (computed-file + "slurm_conf" + #~(begin + (use-modules (srfi srfi-26)) + (call-with-output-file #$output + (lambda (port) + (display "# Generated by 'slurm-service'.\n" port) + (format port "ClusterName=~a\n" + #$(slurm-configuration-clustername config)) + (for-each + (cut format port "SlurmCtldHost=~a\n" <>) + '#$(slurm-configuration-slurmctldhost config)) + (format port "SlurmdSpoolDir=~a\n" + #$(slurm-configuration-slurmd-spooldir config)) + (format port "SlurmdPidFile=~a\n" + #$(slurm-configuration-slurmd-pidfile config)) + (if #$(slurm-configuration-slurmd-log-file config) + (format port "SlurmdLogFile=~a\n" + #$(slurm-configuration-slurmd-log-file config))) + (format port "SlurmctldPidFile=~a\n" + #$(slurm-configuration-slurmctld-pidfile config)) + (if #$(slurm-configuration-slurmctld-log-file config) + (format port "SlurmctldLogFile=~a\n" + #$(slurm-configuration-slurmctld-log-file config))) + (format port "SlurmUser=~a\n" + #$(slurm-configuration-slurmuser config)) + (format port "\n# Extra content here:\n~a\n" + #$(slurm-configuration-slurm-extra-content config)) + #t))))) + +(define (%cgroup.conf config) + "Return a cgroup.conf configuration file corresponding to CONFIG." + (computed-file + "cgroup_conf" + #~(begin + (call-with-output-file #$output + (lambda (port) + (display "# Generated by 'slurm-service'.\n" port) + (format port "~a\n" + #$(slurm-configuration-cgroup-extra-content config))))))) + +(define (%slurmdbd.conf config) + "Return a slurm.conf configuration file corresponding to CONFIG." + (computed-file + "slurmdbd_conf" + #~(begin + (call-with-output-file #$output + (lambda (port) + (display "# Generated by 'slurm-service'.\n" port) + (format port "DbdHost=~a\n" + #$(slurm-configuration-dbdhost config)) + (format port "StorageType=~a\n" + #$(slurm-configuration-storagetype config)) + (format port "SlurmUser=~a\n" + #$(slurm-configuration-slurmuser config)) + (format port "PidFile=~a\n" + #$(slurm-configuration-slurmdbd-pidfile config)) + (format port "\n# Extra content here:\n~a\n" + #$(slurm-configuration-slurmdbd-extra-content config)) + #t))))) (define (slurm-activation config) "Return the activation GEXP for CONFIG for the slurm service." @@ -207,7 +288,7 @@ (logdir (dirname (or #$(slurm-configuration-slurmd-log-file config) #$(slurm-configuration-slurmctld-log-file config) "/var/log/slurmd.log"))) - (piddir (dirname #$(slurm-configuration-slurmd-pid-file config)))) + (piddir (dirname #$(slurm-configuration-slurmd-pidfile config)))) (unless (file-exists? spooldir) (mkdir-p spooldir)) (chown spooldir (passwd:uid %user) (passwd:gid %user)) @@ -219,11 +300,15 @@ (unless (file-exists? piddir) (mkdir-p piddir))) ;; /etc/slurm/slurm.conf needs to exist. - (file-exists? #$(slurm-configuration-slurm-conf-file config))))) + (file-exists? #$(slurm-configuration-slurm-conf-file config)) + ;; slurmdbd activation + (when #$(slurm-configuration-run-slurmdbd config) + (file-exists? + #$(slurm-configuration-slurmdbd-conf-file config)))))) (define slurmd-shepherd-service (match-lambda - (($ package slurm-conf-file slurmd-log-file slurmd-pid-file) + (($ package slurm-conf-file _ slurmd-pidfile) (list (shepherd-service (documentation "Slurmd server") @@ -231,14 +316,13 @@ (requirement '(loopback munge)) (start #~(make-forkexec-constructor (list #$(file-append package "/sbin/slurmd") - ;"-L" #$slurmd-log-file "-f" #$slurm-conf-file) - #:pid-file #$slurmd-pid-file)) + #:pid-file #$slurmd-pidfile)) (stop #~(make-kill-destructor))))))) (define slurmctld-shepherd-service (match-lambda - (($ package slurm-conf-file _ _ _ run-slurmctld? slurmctld-log-file slurmctld-pid-file) + (($ package slurm-conf-file _ _ _ run-slurmctld? _ slurmctld-pidfile) (list (shepherd-service (documentation "Slurmctld server") @@ -246,22 +330,14 @@ (requirement '(loopback munge)) (start #~(make-forkexec-constructor (list #$(file-append package "/sbin/slurmctld") - ;"-L" #$slurmctld-log-file "-f" #$slurm-conf-file) - #:pid-file #$slurmctld-pid-file)) + #:pid-file #$slurmctld-pidfile)) (stop #~(make-kill-destructor)) (auto-start? run-slurmctld?)))))) -(define (slurmdbd-activation config) - "Test the Slurmdbd configration exists." - (when (slurm-configuration-run-slurmdbd config) - (file-exists? - (slurm-configuration-slurmdbd-conf-file config))) - #t) - (define slurmdbd-shepherd-service (match-lambda - (($ package _ _ _ _ _ _ _ run-slurmdbd? slurmdbd-conf-file slurmdbd-pid-file) + (($ package _ _ _ _ _ _ _ run-slurmdbd? _ slurmdbd-pidfile) (list (shepherd-service (documentation "Slurmdbd server") @@ -269,7 +345,7 @@ (requirement '(loopback munge)) (start #~(make-forkexec-constructor (list #$(file-append package "/sbin/slurmdbd")) - #:pid-file #$slurmdbd-pid-file)) + #:pid-file #$slurmdbd-pidfile)) (stop #~(make-kill-destructor)) (auto-start? run-slurmdbd?)))))) @@ -282,6 +358,14 @@ (slurmdbd-shepherd-service config) '()))) +(define (slurm-etc-service config) + (append + `(("slurm/slurm.conf" ,(%slurm.conf config)) + ("slurm/cgroup.conf" ,(%cgroup.conf config))) + (if (slurm-configuration-run-slurmdbd config) + `(("slurm/slurmdbd.conf" ,(%slurmdbd.conf config))) + '()))) + (define slurm-service-type (service-type (name 'slurm) @@ -291,8 +375,8 @@ slurm-services-to-run) (service-extension activation-service-type slurm-activation) - (service-extension activation-service-type - slurmdbd-activation) + (service-extension etc-service-type + slurm-etc-service) (service-extension account-service-type (const %slurm-accounts)) (service-extension profile-service-type -- cgit v1.2.3