about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEfraim Flashner2020-12-01 21:15:21 +0200
committerEfraim Flashner2020-12-01 21:15:21 +0200
commit1d456b37cabefe6caa94cab22e952622c0d26c1f (patch)
treeaf89d0e45062d2a3776bb629710f617e03118399
parent091e1391ffffa54431a224f38c3d64a9a1f63ce2 (diff)
downloadguix-bioinformatics-1d456b37cabefe6caa94cab22e952622c0d26c1f.tar.gz
octopus: add slurm services
-rw-r--r--gn/deploy/octopus.scm98
-rw-r--r--gn/services/science.scm274
2 files changed, 322 insertions, 50 deletions
diff --git a/gn/deploy/octopus.scm b/gn/deploy/octopus.scm
index f707462..9d1e7d3 100644
--- a/gn/deploy/octopus.scm
+++ b/gn/deploy/octopus.scm
@@ -2,10 +2,70 @@
 
 (use-modules (gnu)
              (gn services science)
-             )
-(use-service-modules ssh web)
+             (gn packages parallel))
+(use-service-modules networking ssh web)
 (use-package-modules certs tmux screen vim)
 
+(define %slurm.conf
+  (plain-file "slurm.conf"
+              (string-append
+"ClusterName=linux
+ControlMachine=octopus
+
+SlurmUser=slurm
+#SlurmdUser=root
+SlurmctldPort=6817
+SlurmdPort=6818
+AuthType=auth/munge
+StateSaveLocation=/var/spool/slurmd/ctld
+SlurmdSpoolDir=/var/spool/slurmd
+SwitchType=switch/none
+MpiDefault=none
+SlurmctldPidFile=/var/run/slurm/slurmctld.pid
+SlurmdPidFile=/var/run/slurm/slurmd.pid
+ProctrackType=proctrack/pgid
+ReturnToService=1
+
+# TIMERS
+InactiveLimit=0
+MinJobAge=300
+KillWait=30
+#
+
+# LOGGING
+SlurmctldDebug=3
+SlurmctldLogFile=/var/log/slurm/slurmctld.log
+SlurmdDebug=3
+SlurmdLogFile=/var/log/slurm/slurmd.log
+JobCompType=jobcomp/none
+
+# COMPUTE NODES
+NodeName=octopus CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1024
+PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP")))
+
+(define %cgroup.conf
+  (plain-file "cgroup.conf"
+              (string-append
+"###
+# Slurm cgroup support configuration file
+###
+CgroupAutomount=yes
+ConstrainCores=yes
+#")))
+
+(define %slurmdbd.conf
+  (plain-file "slurmdbd.conf"
+              (string-append
+"AuthType=auth/munge
+AuthInfo=/var/run/munge/munge.socket.2
+DbdHost=localhost
+StorageHost=localhost
+StorageType=accounting_storage/none
+StorageUser=slurm
+PidFile=/var/run/slurm/slurmdbd.pid
+LogFile=/var/log/slurm/slurmdbd.log
+SlurmUser=slurm")))
+
 (operating-system
   (host-name "octopus")
   (timezone "Etc/UTC")
@@ -34,7 +94,9 @@
               ;(file-system
               ;  (device "octopus01:/home")
               ;  (mount-point "/home")
-              ;  (type "nfs"))
+              ;  (type "nfs")
+              ;  (mount? #f)    ; is this necessary?
+              ;  (check? #f))
               )
               %base-file-systems))
 
@@ -48,13 +110,13 @@
              (comment "Efraim Flashner")
              (uid 1000)
              (group "users")
-             (supplementary-groups '("wheel")))
+             (supplementary-groups '("wheel" "kvm")))
            (user-account
              (name "wrk")
              (comment "Pjotr Prins")
              (uid 502)
              (group "users")
-             (supplementary-groups '("wheel")))
+             (supplementary-groups '("wheel" "kvm")))
            %base-user-accounts))
 
 
@@ -75,8 +137,30 @@
               ;    (term "vt100")
               ;    (tty "ttyS0")))
 
-              (service openssh-service-type)
+              (service openssh-service-type
+                       (openssh-configuration
+                         (authorized-keys
+                           `(("efraimf" ,(local-file "/home/efraimf/.ssh/id_rsa.pub"))))))
 
               (service munge-service-type)
-              )
+              (service slurmd-service-type
+                       (slurm-configuration
+                         (package slurm-18.08)))
+              (service slurmdbd-service-type
+                       (slurm-configuration
+                         (package slurm-18.08)
+                         (run-slurmdbd? #t)))
+              (service slurmctld-service-type
+                       (slurm-configuration
+                         (package slurm-18.08)
+                         (run-slurmctld? #t)))
+
+              ;; Some slurm configuration files
+              (simple-service 'slurm-conf etc-service-type
+                              `(("slurm/slurm.conf" ,%slurm.conf)
+                                ("slurm/cgroup.conf" ,%cgroup.conf)
+                                ("slurm/slurmdbd.conf" ,%slurmdbd.conf)))
+
+              (service dhcp-client-service-type)
+              (service openntpd-service-type))
             %base-services)))
diff --git a/gn/services/science.scm b/gn/services/science.scm
index 4b34882..d1f3190 100644
--- a/gn/services/science.scm
+++ b/gn/services/science.scm
@@ -1,7 +1,13 @@
 (define-module (gn services science)
   #:export (munge-configuration
             munge-configuration?
-            munge-service-type))
+            munge-service-type
+
+            slurm-configuration
+            slurm-configuration?
+            slurmd-service-type
+            slurmdbd-service-type
+            slurmctld-service-type))
 
 (use-modules (gnu)
              (guix records)
@@ -9,6 +15,7 @@
 (use-service-modules shepherd)
 (use-package-modules admin parallel)
 
+;; TODO: Make id/uid configurable
 (define %munge-accounts
   (list (user-group
           (name "munge")
@@ -23,19 +30,6 @@
           (home-directory "/var/lib/munge")
           (shell (file-append shadow "/sbin/nologin")))))
 
-(define %slurm-accounts
-  (list (user-group
-          (name "slurm")
-          (id 901)
-          (system? #t))
-        (user-account
-          (name "slurm")
-          (group "slurm")
-          (uid 901)
-          (system? #t)
-          (comment "Slurm User")
-          (home-directory "/var/lib/slurm"))))
-
 (define-record-type* <munge-configuration>
   munge-configuration
   make-munge-configuration
@@ -51,20 +45,10 @@
   (key          munge-configuration-key
                 (default "/etc/munge/munge.key")))
 
-(define-record-type* <slurm-configuration>
-  slurm-configuration
-  make-slurm-configuration
-  slurm-configuration?
-  (package      slurm-configuration-package
-                (default slurm)))
-
 (define (munge-activation config)
   "Return the activation GEXP for CONFIG for the munge service."
   (with-imported-modules '((guix build utils))
     #~(begin
-        (use-modules (guix build utils)
-                     (rnrs bytevectors)
-                     (rnrs io ports))
         (define %user (getpw "munge"))
         (let* ((homedir     (passwd:dir %user))
                (key         #$(munge-configuration-key config))
@@ -78,29 +62,17 @@
                       (chmod dir #o700))
                     (list homedir etc-dir log-dir))
           (unless (file-exists? key)
-            ;; Borrowed from /dev/urandom in (gnu services base)
-            (call-with-input-file "/dev/urandom"
-              (lambda (urandom)
-                (let ((buf (make-bytevector 1024)))
-                  (get-bytevector-n! urandom buf 0 1024)
-                  (call-with-output-file key
-                    (lambda (seed)
-                      (put-bytevector seed buf)))))))
+            (invoke #$(file-append (munge-configuration-package config)
+                                 "/sbin/mungekey")
+                    "--create"
+                    (string-append "--bits=" (number->string (* 8 1024))) ; bits, not bytes
+                    (string-append "--keyfile=" key)))
           (chown key (passwd:uid %user) (passwd:gid %user))
           (chmod key #o400)
           (unless (file-exists? run-dir)
             (mkdir-p run-dir))
           (chown run-dir (passwd:uid %user) (passwd:gid %user))))))
 
-(define (slurm-activation config)
-  "Return the activation GEXP for CONFIG for the slurm service."
-  (with-imported-modules '((guix build utils))
-    #~(begin
-        (use-modules (guix build utils))
-        (unless (file-exists? "/var/lib/slurm")
-          (mkdir-p "/var/lib/slurm"))
-        (chown "/var/lib/slurm" (passwd:uid "slurm") (passwd:gid "slurm")))))
-
 (define munge-shepherd-service
   (match-lambda
     (($ <munge-configuration> package socket pid-file log-file key)
@@ -108,7 +80,7 @@
        (shepherd-service
          (documentation "Munge server")
          (provision '(munge))
-         (requirement '(loopback user-processes file-systems))
+         (requirement '(loopback user-processes))
          (start #~(make-forkexec-constructor
                     (list #$(file-append package "/sbin/munged")
                           "--foreground"    ; "--force"
@@ -144,4 +116,220 @@
                            (compose list munge-configuration-package))))
     (default-value (munge-configuration))
     (description
-     "Run a munge service.")))
+     "Run @url{https://dun.github.io/munge/,Munge}, an authentication service.")))
+
+;; Initial documentation for upstreaming:
+;@subsubheading Munge
+;
+;The following example describes a Munge service with the default configuration.
+;
+;@lisp
+;(service munge-service-type)
+;@end lisp
+;
+;@deftp {Data Type} munge-configuration
+;Data type representing the configuration for the @code{munge-service-type}.
+;
+;@table @asis
+;@item @code{package}
+;Munge package to use for the service.
+;
+;@item @code{socket} (default "/var/run/munge/munge.socket.2")
+;The socket Munge should use.
+;
+;@item @code{pid-file} (default "/var/run/munge/munged.pid")
+;The PID file which Munge should use.
+;
+;@item @code{log-file} (default "/var/log/munge/munged.log")
+;The location of the log file Munge should write to.
+;
+;@item @code{key} (default "/etc/munge/munge.key")
+;The location of the shared key Munge should use.  Since this a shared secret key between the different nodes it should not be added to the store.
+;
+;@end table
+;@end deftp
+
+
+;; TODO: Make id/uid configurable
+(define %slurm-accounts
+  (list (user-group
+          (name "slurm")
+          (id 901)
+          (system? #t))
+        (user-account
+          (name "slurm")
+          (group "slurm")
+          (uid 901)
+          (system? #t)
+          (comment "Slurm User")
+          (home-directory "/var/lib/slurm"))))
+
+(define-record-type* <slurm-configuration>
+  slurm-configuration
+  make-slurm-configuration
+  slurm-configuration?
+  ;; As I understand it, all the services depend on also running slurmd on
+  ;; 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.
+  (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
+                        (default "/var/log/slurm/slurmd.log"))
+  (slurmd-pid-file      slurm-configuration-slurmd-pid-file
+                        (default "/var/run/slurm/slurmd.pid"))
+
+  (slurmd-spooldir      slurm-configuration-slurmd-spooldir
+                        (default "/var/spool/slurmd"))
+
+  (run-slurmctld?       slurm-configuration-run-slurmctld
+                        (default #f))
+  (slurmctld-log-file   slurm-configuration-slurmctld-log-file
+                        (default "/var/log/slurm/slurmctld.log"))
+  (slurmctld-pid-file   slurm-configuration-slurmctld-pid-file
+                        (default "/var/run/slurm/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/slurm/slurmdbd.pid")))
+
+
+(define (slurm-activation config)
+  "Return the activation GEXP for CONFIG for the slurm service."
+  (with-imported-modules '((guix build utils))
+    #~(begin
+        (use-modules (guix build utils))
+        (define %user (getpw "slurm"))
+        (let ((homedir     (passwd:dir %user))
+              (spooldir    #$(slurm-configuration-slurmd-spooldir config))
+              (logdir      (dirname #$(slurm-configuration-slurmd-log-file config)))
+              (piddir      (dirname #$(slurm-configuration-slurmd-pid-file config))))
+          (for-each (lambda (dir)
+                      (unless (file-exists? dir)
+                        (mkdir-p dir))
+                      (chown dir (passwd:uid %user) (passwd:gid %user)))
+                    (list homedir spooldir piddir logdir)))
+        ;; /etc/slurm/slurm.conf needs to exist.
+        (file-exists? #$(slurm-configuration-slurm-conf-file config)))))
+
+(define slurmd-shepherd-service
+  (match-lambda
+    (($ <slurm-configuration> package slurm-conf-file slurmd-log-file slurmd-pid-file)
+     (list
+       (shepherd-service
+         (documentation "Slurmd server")
+         (provision '(slurmd))
+         (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))
+         (stop #~(make-kill-destructor)))))))
+
+(define slurmctld-shepherd-service
+  (match-lambda
+    (($ <slurm-configuration> package slurm-conf-file _ _ _ run-slurmctld? slurmctld-log-file slurmctld-pid-file)
+     (list
+       (shepherd-service
+         (documentation "Slurmctld server")
+         (provision '(slurmctld))
+         (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))
+         (stop #~(make-kill-destructor))
+         (auto-start? run-slurmctld?))))))
+
+(define (slurmdbd-activation config)
+  "Test the Slurmdbd configration exists."
+  (file-exists?
+    (slurm-configuration-slurmdbd-conf-file config)))
+
+(define slurmdbd-shepherd-service
+  (match-lambda
+    (($ <slurm-configuration> package _ _ _ _ _ _ _ run-slurmdbd? slurmdbd-conf-file slurmdbd-pid-file)
+     (list
+       (shepherd-service
+         (documentation "Slurmdbd server")
+         (provision '(slurmdbd))
+         (requirement '(loopback munge))
+         (start #~(make-forkexec-constructor
+                    (list #$(file-append package "/sbin/slurmdbd"))
+                    #:pid-file #$slurmdbd-pid-file))
+         (stop #~(make-kill-destructor))
+         (auto-start? run-slurmdbd?))))))
+
+(define (slurm-services-to-run config)
+  (append (slurmd-shepherd-service config)
+          (if (slurm-configuration-run-slurmctld? config)
+            (slurmctld-shepherd-service config)
+            '())
+          (if (slurm-configuration-run-slurmdbd? config)
+            (slurmdbd-shepherd-service config)
+            '())))
+
+(define (slurm-activations-to-run config)
+  (append (slurm-activation config)
+          (if (slurm-configuration-run-slurmctld? config)
+            (slurmctld-activation config)
+            '())
+          (if (slurm-configuration-run-slurmdbd? config)
+            (slurmdbd-activation config)
+            '())))
+
+(define slurmd-service-type
+  (service-type
+    (name 'slurmd)
+    (extensions
+      (list
+        (service-extension shepherd-root-service-type
+                           ;(cons slurmd-shepherd-service
+                           ;      slurmdbd-shepherd-service))
+                           slurmd-shepherd-service)
+                           ;slurm-services-to-run)
+        (service-extension activation-service-type
+                           ;(append slurm-activation
+                           ;      slurmdbd-activation))
+                           slurm-activation)
+                           ;slurm-activations-to-run)
+        (service-extension account-service-type
+                           (const %slurm-accounts))
+        (service-extension profile-service-type
+                           (compose list slurm-configuration-package))))
+    (default-value (slurm-configuration))
+    (description
+     "Run @url{https://slurm.schedmd.com/slurm.html,Slurm}, a workflow manager service.")))
+
+(define slurmdbd-service-type
+  (service-type
+    (name 'slurmdbd)
+    (extensions
+      (list
+        (service-extension shepherd-root-service-type
+                           slurmdbd-shepherd-service)
+        (service-extension activation-service-type
+                           slurmdbd-activation)))
+    (default-value (slurm-configuration))
+    (description
+      ;; TODO: Fix for slurmdbd or integrate with slurm(d).
+     "Run @url{https://slurm.schedmd.com/slurm.html,Slurm}, a workflow manager service.")))
+
+(define slurmctld-service-type
+  (service-type
+    (name 'slurmctld)
+    (extensions
+      (list
+        (service-extension shepherd-root-service-type
+                           slurmctld-shepherd-service)))
+    (default-value (slurm-configuration))
+    (description
+      ;; TODO: Fix for slurmctld or integrate with slurm(d).
+     "Run @url{https://slurm.schedmd.com/slurm.html,Slurm}, a workflow manager service.")))