me
/
guix
Archived
1
0
Fork 0

services: ganeti: OS variants can be a directory.

* gnu/services/ganeti.scm (<ganeti-os>)[extension]: Default to #f.
(ganeti-os->directory): Only add extension if set.  Support a file-like object
for VARIANTS.
* doc/guix.texi (Virtualization Services): Document this change and add
example.  Update Ganeti URLs while at it.
Marius Bakke 2021-10-31 22:52:06 +01:00
parent 614a92cae8
commit 706f25f24d
No known key found for this signature in database
GPG Key ID: A2A06DF2A33A54FA
2 changed files with 67 additions and 37 deletions

View File

@ -33941,7 +33941,7 @@ cluster node that supports multiple storage backends, and installs the
@end lisp @end lisp
Users are advised to read the 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 administrators guide} to learn about the various cluster options and
day-to-day operations. There is also a day-to-day operations. There is also a
@url{https://guix.gnu.org/blog/2020/running-a-ganeti-cluster-on-guix/,blog post} @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 configuration ends up. Setting it to ``debootstrap'' will create
@file{/etc/ganeti/instance-debootstrap}. @file{/etc/ganeti/instance-debootstrap}.
@item @code{extension} @item @code{extension} (default: @code{#f})
The file extension for variants of this OS type. For example The file extension for variants of this OS type. For example @file{.conf}
@file{.conf} or @file{.scm}. or @file{.scm}. It will be appended to the variant file name if set.
@item @code{variants} (default: @code{'()}) @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 table
@end deftp @end deftp
@ -34318,7 +34336,7 @@ via a JSON-based RPC protocol.
Most query operations are allowed without authentication (unless Most query operations are allowed without authentication (unless
@var{require-authentication?} is set), whereas write operations require @var{require-authentication?} is set), whereas write operations require
explicit authorization via the @file{/var/lib/ganeti/rapi/users} file. See 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. API documentation} for more information.
The value of this service must be a @code{ganeti-rapi-configuration} object. The value of this service must be a @code{ganeti-rapi-configuration} object.

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; 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. ;;; 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> (define-record-type* <ganeti-os>
ganeti-os make-ganeti-os ganeti-os? ganeti-os make-ganeti-os ganeti-os?
(name ganeti-os-name) ;string (name ganeti-os-name) ;string
(extension ganeti-os-extension) ;string (extension ganeti-os-extension ;#f | string
(variants ganeti-os-variants ;list of <ganeti-os-variant> (default #f))
(variants ganeti-os-variants ;<file-like> | list of <ganeti-os-variant>
(default '()))) (default '())))
(define-record-type* <ganeti-os-variant> (define-record-type* <ganeti-os-variant>
@ -992,35 +993,46 @@ trap - EXIT
(define (ganeti-os->directory os) (define (ganeti-os->directory os)
"Return the derivation to build the configuration directory to be installed "Return the derivation to build the configuration directory to be installed
in /etc/ganeti/instance-$os for OS." in /etc/ganeti/instance-$os for OS."
(let* ((name (ganeti-os-name os)) (let ((name (ganeti-os-name os))
(extension (ganeti-os-extension os)) (extension (ganeti-os-extension os))
(variants (ganeti-os-variants os)) (variants (ganeti-os-variants os)))
(names (map ganeti-os-variant-name variants)) (define builder
(configs (map ganeti-os-variant-configuration variants))) (with-imported-modules '((guix build utils))
(with-imported-modules '((guix build utils)) (if (file-like? variants)
(define builder #~(begin
#~(begin (use-modules (guix build utils))
(use-modules (guix build utils) (mkdir-p #$output)
(ice-9 format) (symlink #$variants
(ice-9 match) (string-append #$output "/variants")))
(srfi srfi-1)) #~(begin
(mkdir-p #$output) (use-modules (guix build utils)
(unless (null? '#$names) (ice-9 format)
(let ((variants-dir (string-append #$output "/variants"))) (ice-9 match)
(mkdir-p variants-dir) (srfi srfi-1))
(call-with-output-file (string-append variants-dir "/variants.list") (mkdir-p #$output)
(lambda (port) (let ((variants-dir (string-append #$output "/variants"))
(format port "~a~%" (names '#$(map ganeti-os-variant-name variants))
(string-join '#$names "\n")))) (configs '#$(map ganeti-os-variant-configuration variants)))
(for-each (match-lambda (mkdir-p variants-dir)
((name file) (unless (null? names)
(symlink file (call-with-output-file (string-append variants-dir
(string-append variants-dir "/" name "/variants.list")
#$extension)))) (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))))))))
'#$(zip names configs)))))) (computed-file (string-append name "-os") builder
#:local-build? #t)))
(computed-file (string-append name "-os") builder))))
(define (ganeti-directory file-storage-file os) (define (ganeti-directory file-storage-file os)
(let ((dirs (map ganeti-os->directory os)) (let ((dirs (map ganeti-os->directory os))