summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/guix.texi30
-rw-r--r--gnu/services/ganeti.scm76
2 files changed, 68 insertions, 38 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index 449049fcc8..7806b21a0f 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -33941,7 +33941,7 @@ cluster node that supports multiple storage backends, and installs the
 @end lisp
 
 Users are advised to read the
-@url{http://docs.ganeti.org/ganeti/master/html/admin.html,Ganeti
+@url{https://docs.ganeti.org/docs/ganeti/3.0/html/admin.html,Ganeti
 administrators guide} to learn about the various cluster options and
 day-to-day operations.  There is also a
 @url{https://guix.gnu.org/blog/2020/running-a-ganeti-cluster-on-guix/,blog post}
@@ -34030,12 +34030,30 @@ The name for this OS provider.  It is only used to specify where the
 configuration ends up.  Setting it to ``debootstrap'' will create
 @file{/etc/ganeti/instance-debootstrap}.
 
-@item @code{extension}
-The file extension for variants of this OS type.  For example
-@file{.conf} or @file{.scm}.
+@item @code{extension} (default: @code{#f})
+The file extension for variants of this OS type.  For example @file{.conf}
+or @file{.scm}.  It will be appended to the variant file name if set.
 
 @item @code{variants} (default: @code{'()})
-List of @code{ganeti-os-variant} objects for this OS.
+This must be either a list of @code{ganeti-os-variant} objects for this OS,
+or a ``file-like'' object (@pxref{G-Expressions, file-like objects})
+representing the variants directory.
+
+To use the Guix OS provider with variant definitions residing in a local
+directory instead of declaring individual variants (see @var{guix-variants}
+below), you can do:
+
+@lisp
+(ganeti-os
+ (name "guix")
+ (variants (local-file "ganeti-guix-variants"
+                       #:recursive? #true)))
+@end lisp
+
+Note that you will need to maintain the @file{variants.list} file
+(see @code{@url{https://docs.ganeti.org/docs/ganeti/3.0/man/ganeti-os-interface.html,
+ganeti-os-interface(7)}})
+manually in this case.
 
 @end table
 @end deftp
@@ -34318,7 +34336,7 @@ via a JSON-based RPC protocol.
 Most query operations are allowed without authentication (unless
 @var{require-authentication?} is set), whereas write operations require
 explicit authorization via the @file{/var/lib/ganeti/rapi/users} file.  See
-the @url{http://docs.ganeti.org/ganeti/master/html/rapi.html, Ganeti Remote
+the @url{https://docs.ganeti.org/docs/ganeti/3.0/html/rapi.html, Ganeti Remote
 API documentation} for more information.
 
 The value of this service must be a @code{ganeti-rapi-configuration} object.
diff --git a/gnu/services/ganeti.scm b/gnu/services/ganeti.scm
index 85adbd7362..d9770b1a29 100644
--- a/gnu/services/ganeti.scm
+++ b/gnu/services/ganeti.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2020 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2020, 2022 Marius Bakke <marius@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -819,8 +819,9 @@ than 21 days from @file{/var/lib/ganeti/queue/archive}.")))
 (define-record-type* <ganeti-os>
   ganeti-os make-ganeti-os ganeti-os?
   (name ganeti-os-name)                     ;string
-  (extension ganeti-os-extension)           ;string
-  (variants ganeti-os-variants              ;list of <ganeti-os-variant>
+  (extension ganeti-os-extension            ;#f | string
+             (default #f))
+  (variants ganeti-os-variants              ;<file-like> | list of <ganeti-os-variant>
             (default '())))
 
 (define-record-type* <ganeti-os-variant>
@@ -992,35 +993,46 @@ trap - EXIT
 (define (ganeti-os->directory os)
   "Return the derivation to build the configuration directory to be installed
 in /etc/ganeti/instance-$os for OS."
-  (let* ((name      (ganeti-os-name os))
-         (extension (ganeti-os-extension os))
-         (variants  (ganeti-os-variants os))
-         (names     (map ganeti-os-variant-name variants))
-         (configs   (map ganeti-os-variant-configuration variants)))
-    (with-imported-modules '((guix build utils))
-      (define builder
-        #~(begin
-            (use-modules (guix build utils)
-                         (ice-9 format)
-                         (ice-9 match)
-                         (srfi srfi-1))
-            (mkdir-p #$output)
-            (unless (null? '#$names)
-              (let ((variants-dir (string-append #$output "/variants")))
-                (mkdir-p variants-dir)
-                (call-with-output-file (string-append variants-dir "/variants.list")
-                  (lambda (port)
-                    (format port "~a~%"
-                            (string-join '#$names "\n"))))
-                (for-each (match-lambda
-                            ((name file)
-                             (symlink file
-                                      (string-append variants-dir "/" name
-                                                     #$extension))))
-
-                          '#$(zip names configs))))))
-
-      (computed-file (string-append name "-os") builder))))
+  (let ((name      (ganeti-os-name os))
+        (extension (ganeti-os-extension os))
+        (variants  (ganeti-os-variants os)))
+    (define builder
+      (with-imported-modules '((guix build utils))
+        (if (file-like? variants)
+            #~(begin
+                (use-modules (guix build utils))
+                (mkdir-p #$output)
+                (symlink #$variants
+                         (string-append #$output "/variants")))
+            #~(begin
+                (use-modules (guix build utils)
+                             (ice-9 format)
+                             (ice-9 match)
+                             (srfi srfi-1))
+                (mkdir-p #$output)
+                (let ((variants-dir (string-append #$output "/variants"))
+                      (names   '#$(map ganeti-os-variant-name variants))
+                      (configs '#$(map ganeti-os-variant-configuration variants)))
+                  (mkdir-p variants-dir)
+                  (unless (null? names)
+                    (call-with-output-file (string-append variants-dir
+                                                          "/variants.list")
+                      (lambda (port)
+                        (format port "~a~%"
+                                (string-join names "\n"))))
+                    (for-each (match-lambda
+                                ((name file)
+                                 (let ((file-name
+                                        (if #$extension
+                                            (string-append name #$extension)
+                                            name)))
+                                   (symlink file
+                                            (string-append variants-dir "/"
+                                                           file-name)))))
+                              (zip names configs))))))))
+
+    (computed-file (string-append name "-os") builder
+                   #:local-build? #t)))
 
 (define (ganeti-directory file-storage-file os)
   (let ((dirs (map ganeti-os->directory os))