[PATCH] services: guix: Add nar-herder-service-type.

  • Done
  • quality assurance status badge
Details
One participant
  • Christopher Baines
Owner
unassigned
Submitted by
Christopher Baines
Severity
normal

Debbugs page

Christopher Baines wrote 3 years ago
(address . guix-patches@gnu.org)
20220109120012.18655-1-mail@cbaines.net
* gnu/services/guix.scm (<nar-herder-configuration>): New record type.
(nar-herder-configuration, nar-herder-configuration?,
nar-herder-configuration-package,
nar-herder-configuration-user,
nar-herder-configuration-group,
nar-herder-configuration-mirror
nar-herder-configuration-database
nar-herder-configuration-database-dump
nar-herder-configuration-host
nar-herder-configuration-port
nar-herder-configuration-storage
nar-herder-configuration-storage-limit
nar-herder-configuration-storage-nar-removal-criteria
nar-herder-shepherd-services, nar-herder-activation,
nar-herder-account): New procedures.
(nar-herder-service-type): New variable.
* gnu/tests/guix.scm (%test-nar-herder): New variable.
* doc/guix.texi (Guix Services): Document the new service.
---
doc/guix.texi | 72 +++++++++++++++++++++
gnu/services/guix.scm | 147 +++++++++++++++++++++++++++++++++++++++++-
gnu/tests/guix.scm | 79 ++++++++++++++++++++++-
3 files changed, 296 insertions(+), 2 deletions(-)

Toggle diff (341 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 08e5bfa111..8884052956 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -33287,6 +33287,78 @@ Extra command line options for @code{guix-data-service-process-jobs}.
@end table
@end deftp
+@subsubheading Nar Herder
+The @uref{https://git.cbaines.net/guix/nar-herder/about/,Nar Herder} is
+a utility for managing a collection of nars.
+
+@defvar {Scheme Variable} nar-herder-type
+Service type for the Guix Data Service. Its value must be a
+@code{nar-herder-configuration} object. The service optionally
+extends the getmail service, as the guix-commits mailing list is used to
+find out about changes in the Guix git repository.
+@end defvar
+
+@deftp {Data Type} nar-herder-configuration
+Data type representing the configuration of the Guix Data Service.
+
+@table @asis
+@item @code{package} (default: @code{nar-herder})
+The Nar Herder package to use.
+
+@item @code{user} (default: @code{"nar-herder"})
+The system user to run the service as.
+
+@item @code{group} (default: @code{"nar-herder"})
+The system group to run the service as.
+
+@item @code{port} (default: @code{8734})
+The port to bind the server to.
+
+@item @code{host} (default: @code{"127.0.0.1"})
+The host to bind the server to.
+
+@item @code{mirror} (default: @code{#f})
+Optional URL of the other Nar Herder instance which should be mirrored.
+This means that this Nar Herder instance will download it's database,
+and keep it up to date.
+
+@item @code{database} (default: @code{"/var/lib/nar-herder/nar_herder.db"})
+Location for the database. If this Nar Herder instance is mirroring
+another, the database will be downloaded if it doesn't exist. If this
+Nar Herder instance isn't mirroring another, an empty database will be
+created.
+
+@item @code{database-dump} (default: @code{"/var/lib/nar-herder/nar_herder_dump.db"})
+Location of the database dump. This is created and regularly updated by
+taking a copy of the database. This is the version of the database that
+is available to download.
+
+@item @code{storage} (default: @code{#f})
+Optional location in which to store nars.
+
+@item @code{storage-limit} (default: @code{"none"})
+Limit in bytes for the nars stored in the storage location. This can
+also be set to ``none'' so that there is no limit.
+
+When the storage location exceeds this size, nars are removed according
+to the nar removal criteria.
+
+@item @code{storage-nar-removal-criteria} (default: @code{'()})
+Criteria used to remove nars from the storage location. These are used
+in conjunction with the storage limit.
+
+When the storage location exceeds the storage limit size, nars will be
+checked against the nar removal criteria and if any of the criteria
+match, they will be removed. This will continue until the storage
+location is below the storage limit size.
+
+Each criteria is specified by a string, then an equals sign, then
+another string. Currently, only one criteria is supported, checking if a
+nar is stored on another Nar Herder instance.
+
+@end table
+@end deftp
+
@node Linux Services
@subsection Linux Services
diff --git a/gnu/services/guix.scm b/gnu/services/guix.scm
index df5fa13bea..930a78bf3c 100644
--- a/gnu/services/guix.scm
+++ b/gnu/services/guix.scm
@@ -107,7 +107,22 @@ (define-module (gnu services guix)
guix-data-service-getmail-idle-mailboxes
guix-data-service-commits-getmail-retriever-configuration
- guix-data-service-type))
+ guix-data-service-type
+
+ nar-herder-service-type
+ nar-herder-configuration
+ nar-herder-configuration?
+ nar-herder-configuration-package
+ nar-herder-configuration-user
+ nar-herder-configuration-group
+ nar-herder-configuration-mirror
+ nar-herder-configuration-database
+ nar-herder-configuration-database-dump
+ nar-herder-configuration-host
+ nar-herder-configuration-port
+ nar-herder-configuration-storage
+ nar-herder-configuration-storage-limit
+ nar-herder-configuration-storage-nar-removal-criteria))
;;;; Commentary:
;;;
@@ -728,3 +743,133 @@ (define guix-data-service-type
(guix-data-service-configuration))
(description
"Run an instance of the Guix Data Service.")))
+
+
+;;;
+;;; Nar Herder
+;;;
+
+(define-record-type* <nar-herder-configuration>
+ nar-herder-configuration make-nar-herder-configuration
+ nar-herder-configuration?
+ (package nar-herder-configuration-package
+ (default nar-herder))
+ (user nar-herder-configuration-user
+ (default "nar-herder"))
+ (group nar-herder-configuration-group
+ (default "nar-herder"))
+ (mirror nar-herder-configuration-mirror
+ (default #f))
+ (database nar-herder-configuration-database
+ (default "/var/lib/nar-herder/nar_herder.db"))
+ (database-dump nar-herder-configuration-database-dump
+ (default "/var/lib/nar-herder/nar_herder_dump.db"))
+ (host nar-herder-configuration-host
+ (default "127.0.0.1"))
+ (port nar-herder-configuration-port
+ (default 8734))
+ (storage nar-herder-configuration-storage
+ (default #f))
+ (storage-limit nar-herder-configuration-storage-limit
+ (default "none"))
+ (storage-nar-removal-criteria
+ nar-herder-configuration-storage-nar-removal-criteria
+ (default '())))
+
+(define (nar-herder-shepherd-services config)
+ (match-record config <nar-herder-configuration>
+ (package user group
+ mirror
+ database database-dump
+ host port
+ storage storage-limit storage-nar-removal-criteria)
+
+ (unless (or mirror storage)
+ (error "nar-herder: mirror or storage must be set"))
+
+ (list
+ (shepherd-service
+ (documentation "Nar Herder")
+ (provision '(nar-herder))
+ (requirement '(networking))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append package
+ "/bin/nar-herder")
+ "run-server"
+ "--pid-file=/var/run/nar-herder/pid"
+ #$(string-append "--port=" (number->string port))
+ #$(string-append "--host=" host)
+ #$@(if mirror
+ (list (string-append "--mirror=" mirror))
+ '())
+ #$(string-append "--database=" database)
+ #$(string-append "--database-dump=" database-dump)
+ #$@(if storage
+ (list (string-append "--storage=" storage))
+ '())
+ #$(string-append "--storage-limit="
+ (if (number? storage-limit)
+ (number->string storage-limit)
+ storage-limit))
+ #$@(map (lambda (criteria)
+ (string-append
+ "--storage-nar-removal-criteria="
+ (match criteria
+ ((k . v) (simple-format #f "~A=~A" k v))
+ (str str))))
+ storage-nar-removal-criteria))
+ #:user #$user
+ #:group #$group
+ #:pid-file "/var/run/nar-herder/pid"
+ #:environment-variables
+ `(,(string-append
+ "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
+ "LC_ALL=en_US.utf8")
+ #:log-file "/var/log/nar-herder/server.log"))
+ (stop #~(make-kill-destructor))))))
+
+(define (nar-herder-activation config)
+ #~(begin
+ (use-modules (guix build utils))
+
+ (define %user
+ (getpw #$(nar-herder-configuration-user
+ config)))
+
+ (chmod "/var/lib/nar-herder" #o755)
+
+ (mkdir-p "/var/log/nar-herder")
+
+ ;; Allow writing the PID file
+ (mkdir-p "/var/run/nar-herder")
+ (chown "/var/run/nar-herder"
+ (passwd:uid %user)
+ (passwd:gid %user))))
+
+(define (nar-herder-account config)
+ (match-record config <nar-herder-configuration>
+ (user group)
+ (list (user-group
+ (name group)
+ (system? #t))
+ (user-account
+ (name user)
+ (group group)
+ (system? #t)
+ (comment "Nar Herder user")
+ (home-directory "/var/lib/nar-herder")
+ (shell (file-append shadow "/sbin/nologin"))))))
+
+(define nar-herder-service-type
+ (service-type
+ (name 'nar-herder)
+ (extensions
+ (list
+ (service-extension shepherd-root-service-type
+ nar-herder-shepherd-services)
+ (service-extension activation-service-type
+ nar-herder-activation)
+ (service-extension account-service-type
+ nar-herder-account)))
+ (description
+ "Run a Nar Herder server.")))
diff --git a/gnu/tests/guix.scm b/gnu/tests/guix.scm
index 69cac7c1aa..0209767cd2 100644
--- a/gnu/tests/guix.scm
+++ b/gnu/tests/guix.scm
@@ -36,7 +36,8 @@ (define-module (gnu tests guix)
#:use-module (guix utils)
#:use-module (ice-9 match)
#:export (%test-guix-build-coordinator
- %test-guix-data-service))
+ %test-guix-data-service
+ %test-nar-herder))
;;;
;;; Guix Build Coordinator
@@ -239,3 +240,79 @@ (define %test-guix-data-service
(name "guix-data-service")
(description "Connect to a running Guix Data Service.")
(value (run-guix-data-service-test))))
+
+
+;;;
+;;; Nar Herder
+;;;
+
+(define %nar-herder-os
+ (simple-operating-system
+ (service dhcp-client-service-type)
+ (service nar-herder-service-type
+ (nar-herder-configuration
+ (host "0.0.0.0")
+ ;; Not a realistic value, but works for the test
+ (storage "/tmp")))))
+
+(define (run-nar-herder-test)
+ (define os
+ (marionette-operating-system
+ %nar-herder-os
+ #:imported-modules '((gnu services herd)
+ (guix combinators))))
+
+ (define forwarded-port
+ (nar-herder-configuration-port
+ (nar-herder-configuration)))
+
+ (define vm
+ (virtual-machine
+ (operating-system os)
+ (memory-size 1024)
+ (port-forwardings `((,forwarded-port . ,forwarded-port)))))
+
+ (define test
+ (with-imported-modules '((gnu build marionette))
+ #~(begin
+ (use-modules (srfi srfi-11) (srfi srfi-64)
+ (gnu build marionette)
+ (web uri)
+ (web client)
+ (web response))
+
+ (define marionette
+ (make-marionette (list #$vm)))
+
+ (test-runner-current (system-test-runner #$output))
+ (test-begin "nar-herder")
+
+ (test-assert "service running"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu services herd))
+ (match (start-service 'nar-herder)
+ (#f #f)
+ (('service response-parts ...)
+ (match (assq-ref response-parts 'running)
+ ((pid) (number? pid))))))
+ marionette))
+
+ (test-equal "http-get"
+ 404
+ (let-values
+ (((response text)
+ (http-get #$(simple-format
+ #f "http://localhost:~A/" forwarded-port)
+ #:decode-body? #t)))
+ (response-code response)))
+
+ (test-end))))
+
+ (gexp->derivation "nar-herder-test" test))
+
+(define %test-nar-herder
+ (system-test
+ (name "nar-herder")
+ (description "Connect to a running Nar Herder server.")
+ (value (run-nar-herder-test))))
--
2.34.0
Christopher Baines wrote 3 years ago
(address . 53140-done@debbugs.gnu.org)
875ypzn4f3.fsf@cbaines.net
Christopher Baines <mail@cbaines.net> writes:

Toggle quote (24 lines)
> * gnu/services/guix.scm (<nar-herder-configuration>): New record type.
> (nar-herder-configuration, nar-herder-configuration?,
> nar-herder-configuration-package,
> nar-herder-configuration-user,
> nar-herder-configuration-group,
> nar-herder-configuration-mirror
> nar-herder-configuration-database
> nar-herder-configuration-database-dump
> nar-herder-configuration-host
> nar-herder-configuration-port
> nar-herder-configuration-storage
> nar-herder-configuration-storage-limit
> nar-herder-configuration-storage-nar-removal-criteria
> nar-herder-shepherd-services, nar-herder-activation,
> nar-herder-account): New procedures.
> (nar-herder-service-type): New variable.
> * gnu/tests/guix.scm (%test-nar-herder): New variable.
> * doc/guix.texi (Guix Services): Document the new service.
> ---
> doc/guix.texi | 72 +++++++++++++++++++++
> gnu/services/guix.scm | 147 +++++++++++++++++++++++++++++++++++++++++-
> gnu/tests/guix.scm | 79 ++++++++++++++++++++++-
> 3 files changed, 296 insertions(+), 2 deletions(-)

Merged to master as 087cdafc9f8ef1d73780ab3e0b4dd340b9e0bce0.
-----BEGIN PGP SIGNATURE-----

iQKlBAEBCgCPFiEEPonu50WOcg2XVOCyXiijOwuE9XcFAmH4KuBfFIAAAAAALgAo
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF
ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcRHG1haWxAY2Jh
aW5lcy5uZXQACgkQXiijOwuE9XeTjhAAkEPR5Dak5wLgZtBiIU5vU7IgQ0Ps84RP
aDz0uRNP26ij0S7rwmbTr7/TLRyyRKl5q38vN8NwwM75Xfk0QRV3Go3wcMQ5KBrG
3Hvp2QUwVsRfBtdCkyYD81lCVng+krPHVMPE5gtFP+HL7sx1Omw4mNe7kJNiPjNP
fRU5EKQXNMvyiB1FNFtIdJJLc2sp7VOjnLlIrPikJ9+ygCs/JBPEOYvcwpVGp7y8
vN3N/P1qA4m+SqMDKJzU+h6D/+ISVNtdfwf9xHJfJE044d0PEl1gsBPM6wl2p0/g
KsPh11BSKSDYiBq5XOBwatM5A6/lu9i3Teq20K6Aiu94/K9GZfa0sat/btxgseCg
Ca23A8UfRbO4SB88udnbP/4l2NPjE1Nda9wBVStD27g7srUivTuYd2IvGp0YDMJo
CPd/g4g6ls8SqJgW8fHUnb1zNNbOh4/8eF3+w61p+En59sutahuxhzQNJ012E56h
3nqy5MwwLgduF6Gjah48nlfs7JpMJ9SQMrQP4AfiXEnL/u6Ouf9RgKRkHYQQ3tkR
ppGzsSFnSOFTSKqe10k77Ad0ZTac3hKScGr++78uC/3LMo62KMqgdYWC9QmdlGVq
RUr9l5B5dlSdy//ezb1cYYXYJvStK03VS1sn/GXYvj/Be22VCzLe8LDv0l2Yb4h5
KBu9ccB/amw=
=BRiN
-----END PGP SIGNATURE-----

Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 53140@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 53140
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch
You may also tag this issue. See list of standard tags. For example, to set the confirmed and easy tags
mumi command -t +confirmed -t +easy
Or, remove the moreinfo tag and set the help tag
mumi command -t -moreinfo -t +help