~ruther/guix-local

7cec43486548f12a43b56dff8082ffe00a5e0c3d — Ludovic Courtès 1 year, 3 months ago 27806fd
services: ganeti: Produce Shepherd timers instead of mcron jobs.

* gnu/services/ganeti.scm (<ganeti-watcher-configuration>)[schedule]:
Change default value to a cron string.
(ganeti-timer): New procedure.
(ganeti-watcher-jobs): Rename to…
(ganeti-watcher-service): … this.  Return Shepherd services.
(ganeti-watcher-service-type)[extensions]: Adjust accordingly.
(ganeti-cleaner-jobs): Rename to…
(ganeti-cleaner-service): … this.  Return Shepherd services.
(ganeti-cleaner-service-type)[extensions]: Adjust accordingly.
(ganeti-shepherd-services): Include the watcher and cleaner services.
(ganeti-mcron-jobs): Remove.
(ganeti-service-type)[extensions]: Adjust accordingly.
* doc/guix.texi (Virtualization Services): Update ‘schedule’
documentation.

Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Change-Id: Id209a3c50271203dc7190c4c6d0c0ffdf6c10875
2 files changed, 60 insertions(+), 65 deletions(-)

M doc/guix.texi
M gnu/services/ganeti.scm
M doc/guix.texi => doc/guix.texi +5 -2
@@ 39883,8 39883,11 @@ The service takes a @code{ganeti-watcher-configuration} object.
@item @code{ganeti} (default: @code{ganeti})
The @code{ganeti} package to use for this service.

@item @code{schedule} (default: @code{'(next-second-from (next-minute (range 0 60 5)))})
How often to run the script.  The default is every five minutes.
@item @code{schedule} (default: @code{"*/5 * * * *"})
When to run the script, expressed either as a string in traditional cron
syntax or as a gexp representing a Shepherd calendar event
(@pxref{Timers,,, shepherd, The GNU Shepherd Manual}).  The default is
every five minutes.

@item @code{rapi-ip} (default: @code{#f})
This option needs to be specified only if the RAPI daemon is configured to use

M gnu/services/ganeti.scm => gnu/services/ganeti.scm +55 -63
@@ 1,5 1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2020, 2022 Marius Bakke <marius@gnu.org>
;;; Copyright © 2025 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 19,14 20,11 @@
(define-module (gnu services ganeti)
  #:use-module (gnu packages virtualization)
  #:use-module (gnu services)
  #:use-module (gnu services mcron)
  #:use-module (gnu services shepherd)
  #:use-module (guix gexp)
  #:use-module (guix records)

  #:use-module (srfi srfi-1)
  #:use-module (ice-9 match)

  #:export (ganeti-noded-configuration
            ganeti-noded-configuration?
            ganeti-noded-configuration-ganeti


@@ 644,9 642,8 @@ information to OS install scripts or instances.")))
  (ganeti        ganeti-watcher-configuration-ganeti        ;file-like
                 (default ganeti))
  (schedule      ganeti-watcher-configuration-schedule      ;list | string
                 (default '(next-second-from
                            ;; Run every five minutes.
                            (next-minute (range 0 60 5)))))
                 ;; Run every 5 minutes.
                 (default "*/5 * * * *"))
  (rapi-ip       ganeti-watcher-configuration-rapi-ip       ;#f | string
                 (default #f))
  (job-age       ganeti-watcher-configuration-job-age       ;integer


@@ 660,36 657,47 @@ information to OS install scripts or instances.")))
  (match-lambda
    (($ <ganeti-watcher-configuration> ganeti _ rapi-ip job-age verify-disks?
                                       debug?)
     #~(lambda ()
         (system* #$(file-append ganeti "/sbin/ganeti-watcher")
                  #$@(if rapi-ip
                         #~((string-append "--rapi-ip=" #$rapi-ip))
                         #~())
                  #$(string-append "--job-age=" (number->string job-age))
                  #$@(if verify-disks?
                         #~()
                         #~("--no-verify-disks"))
                  #$@(if debug?
                         #~("--debug")
                         #~()))))))

(define (ganeti-watcher-jobs config)
     #~(#$(file-append ganeti "/sbin/ganeti-watcher")
        #$@(if rapi-ip
               #~((string-append "--rapi-ip=" #$rapi-ip))
               #~())
        #$(string-append "--job-age=" (number->string job-age))
        #$@(if verify-disks?
               #~()
               #~("--no-verify-disks"))
        #$@(if debug?
               #~("--debug")
               #~())))))

(define (ganeti-timer name schedule command)
  "Return a Shepherd timer providing NAME and running COMMAND, a list-valued
gexp."
  (shepherd-service
   (provision (list name))
   (requirement '(user-processes))
   (modules '((shepherd service timer)))
   (start #~(make-timer-constructor
             #$(if (string? schedule)
                   #~(cron-string->calendar-event #$schedule)
                   schedule)
             (command '(#$@command))
             #:wait-for-termination? #t))
   (stop #~(make-timer-destructor))
   (documentation "Periodically run a Ganeti maintenance job.")
   (actions (list shepherd-trigger-action))))

(define (ganeti-watcher-service config)
  (match config
    (($ <ganeti-watcher-configuration> _ schedule)
     (list
      #~(job #$@(match schedule
                  ((? string?)
                   #~(#$schedule))
                  ((? list?)
                   #~('#$schedule)))
             #$(ganeti-watcher-command config)
             "ganeti-watcher")))))
     (list (ganeti-timer 'ganeti-watcher
                         schedule
                         (ganeti-watcher-command config))))))

(define ganeti-watcher-service-type
  (service-type (name 'ganeti-watcher)
                (extensions
                 (list (service-extension mcron-service-type
                                          ganeti-watcher-jobs)))
                 (list (service-extension shepherd-root-service-type
                                          ganeti-watcher-service)))
                (default-value (ganeti-watcher-configuration))
                (description
                 "@command{ganeti-watcher} is a periodically run script that


@@ 714,34 722,23 @@ is declared offline by known master candidates.")))
                   ;; Run the node cleaner at 02:45 every day.
                   (default "45 2 * * *")))

(define ganeti-cleaner-jobs
(define ganeti-cleaner-service
  (match-lambda
    (($ <ganeti-cleaner-configuration> ganeti master-schedule node-schedule)
     (list
      #~(job #$@(match master-schedule
                  ((? string?)
                   #~(#$master-schedule))
                  ((? list?)
                   #~('#$master-schedule)))
             (lambda ()
              (system* #$(file-append ganeti "/sbin/ganeti-cleaner")
                       "master"))
             "ganeti master cleaner")
      #~(job #$@(match node-schedule
                  ((? string?)
                   #~(#$node-schedule))
                  ((? list?)
                   #~('#$node-schedule)))
             (lambda ()
               (system* #$(file-append ganeti "/sbin/ganeti-cleaner")
                        "node"))
             "ganeti node cleaner")))))
     (list (ganeti-timer 'ganeti-master-cleaner
                         master-schedule
                         #~(#$(file-append ganeti "/sbin/ganeti-cleaner")
                            "master"))
           (ganeti-timer 'ganeti-node-cleaner
                         node-schedule
                         #~(#$(file-append ganeti "/sbin/ganeti-cleaner")
                            "node"))))))

(define ganeti-cleaner-service-type
  (service-type (name 'ganeti-cleaner)
                (extensions
                 (list (service-extension mcron-service-type
                                          ganeti-cleaner-jobs)))
                 (list (service-extension shepherd-root-service-type
                                          ganeti-cleaner-service)))
                (default-value (ganeti-cleaner-configuration))
                (description
                 "@command{ganeti-cleaner} is a script that removes old files


@@ 804,7 801,8 @@ than 21 days from @file{/var/lib/ganeti/queue/archive}.")))

(define ganeti-shepherd-services
  (match-lambda
    (($ <ganeti-configuration> _ noded confd wconfd luxid rapi kvmd mond metad)
    (($ <ganeti-configuration> _ noded confd wconfd luxid rapi kvmd mond metad
                               watcher cleaner)
     (append (ganeti-noded-service noded)
             (ganeti-confd-service confd)
             (ganeti-wconfd-service wconfd)


@@ 812,13 810,9 @@ than 21 days from @file{/var/lib/ganeti/queue/archive}.")))
             (ganeti-rapi-service rapi)
             (ganeti-kvmd-service kvmd)
             (ganeti-mond-service mond)
             (ganeti-metad-service metad)))))

(define ganeti-mcron-jobs
  (match-lambda
    (($ <ganeti-configuration> _ _ _ _ _ _ _ _ _ watcher cleaner)
     (append (ganeti-watcher-jobs watcher)
             (ganeti-cleaner-jobs cleaner)))))
             (ganeti-metad-service metad)
             (ganeti-watcher-service watcher)
             (ganeti-cleaner-service cleaner)))))

(define-record-type* <ganeti-os>
  ganeti-os make-ganeti-os ganeti-os?


@@ 1122,9 1116,7 @@ in /etc/ganeti/instance-$os for OS."
                       (service-extension etc-service-type
                                          ganeti-etc-service)
                       (service-extension profile-service-type
                                          (compose list ganeti-configuration-ganeti))
                       (service-extension mcron-service-type
                                          ganeti-mcron-jobs)))
                                          (compose list ganeti-configuration-ganeti))))
                (default-value (ganeti-configuration (os %default-ganeti-os)))
                (description
                 "Ganeti is a family of services that are designed to run