[PATCH] services: shepherd: Support “free-form” services.

  • Done
  • quality assurance status badge
Details
2 participants
  • Ludovic Courtès
  • Maxim Cournoyer
Owner
unassigned
Submitted by
Ludovic Courtès
Severity
normal
L
L
Ludovic Courtès wrote on 23 Jun 23:58 +0200
[PATCH] services: shepherd: Support “free -form” services.
(address . guix-patches@gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
7501182c5831ba86d4e600967fb944e9e1124352.1719066498.git.ludo@gnu.org
* gnu/services/shepherd.scm (<shepherd-service>)[free-form]: New field.
[start]: Add default value.
(shepherd-service-file): Rename to…
(shepherd-service-file/regular): … this.
(shepherd-service-file/free-form): New procedure.
(shepherd-service-file): Dispatch to one of the two procedures above.
* doc/guix.texi (Shepherd Services): Document the ‘free-form’ field.

Change-Id: I206374e950ef6d1e4a996c0f507fb5fcd9cadde3
---
doc/guix.texi | 26 +++++++++++++++++++++++++-
gnu/services/shepherd.scm | 25 ++++++++++++++++++++++---
2 files changed, 47 insertions(+), 4 deletions(-)

Hi!

This patch fixes a limitation that became apparent with Shepherd 0.10,
where users could not instantiate services from the built-in service
collection for which they do not explicitly specify the ‘start’
and ‘stop’ methods (see REPL service example below).

Thoughts?

Ludo’.

Toggle diff (105 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 0102fd0fad3..4d9145445cc 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -43909,7 +43909,7 @@ Shepherd Services
When true, this is the delay in seconds before restarting a failed
service.
-@item @code{start}
+@item @code{start} (default: @code{#~(const #t)})
@itemx @code{stop} (default: @code{#~(const #f)})
The @code{start} and @code{stop} fields refer to the Shepherd's
facilities to start and stop processes (@pxref{Service De- and
@@ -43928,6 +43928,30 @@ Shepherd Services
herd @var{action} @var{service} [@var{arguments}@dots{}]
@end example
+@item @code{free-form} (default: @code{#f})
+When set, this field replaces the @code{start}, @code{stop}, and
+@code{actions} fields. It is meant to be used when the service
+definition comes from some other source, typically the service
+collection provided by the Shepherd proper (@pxref{Service Collection,,,
+shepherd, The GNU Shepherd Manual}).
+
+@cindex REPL service, for shepherd
+For example, the snippet below defines a service for the Shepherd's
+built-in @acronym{REPL, read-eval-print loop} service (@pxref{REPL
+Service,,, shepherd, The GNU Shepherd Manual}):
+
+@lisp
+(shepherd-service
+ (provision '(repl))
+ (modules '((shepherd service repl)))
+ (free-form #~(repl-service)))
+@end lisp
+
+In this case, the service object is returned by the @code{repl-service}
+procedure of the Shepherd, so all the @code{free-form} G-expression does
+is call that procedure. Note that the @code{provision} field must be
+consistent with the actual service provision.
+
@item @code{auto-start?} (default: @code{#t})
Whether this service should be started automatically by the Shepherd. If it
is @code{#f} the service has to be started manually with @code{herd start}.
diff --git a/gnu/services/shepherd.scm b/gnu/services/shepherd.scm
index ccc8e61a33c..05534ab3173 100644
--- a/gnu/services/shepherd.scm
+++ b/gnu/services/shepherd.scm
@@ -60,6 +60,7 @@ (define-module (gnu services shepherd)
shepherd-service-respawn?
shepherd-service-start
shepherd-service-stop
+ shepherd-service-free-form
shepherd-service-auto-start?
shepherd-service-modules
@@ -217,7 +218,10 @@ (define-record-type* <shepherd-service>
(default #f))
(respawn-delay shepherd-service-respawn-delay
(default #f))
- (start shepherd-service-start) ;g-expression (procedure)
+ (free-form shepherd-service-free-form ;#f | g-expression (service)
+ (default #f))
+ (start shepherd-service-start ;g-expression (procedure)
+ (default #~(const #t)))
(stop shepherd-service-stop ;g-expression (procedure)
(default #~(const #f)))
(actions shepherd-service-actions ;list of <shepherd-action>
@@ -298,8 +302,8 @@ (define (shepherd-service-file-name service)
provisions)
".scm")))
-(define (shepherd-service-file service)
- "Return a file defining SERVICE."
+(define (shepherd-service-file/regular service)
+ "Return a file defining SERVICE, a service whose 'free-form' field is #f."
(scheme-file (shepherd-service-file-name service)
(with-imported-modules %default-imported-modules
#~(begin
@@ -332,6 +336,21 @@ (define (shepherd-service-file service)
#~(#$name #$doc #$proc)))
(shepherd-service-actions service))))))))
+(define (shepherd-service-file/free-form service)
+ "Return a file defining SERVICE, a service whose 'free-form' field is set."
+ (scheme-file (shepherd-service-file-name service)
+ (with-imported-modules %default-imported-modules
+ #~(begin
+ (use-modules #$@(shepherd-service-modules service))
+
+ #$(shepherd-service-free-form service)))))
+
+(define (shepherd-service-file service)
+ "Return a file defining SERVICE."
+ (if (shepherd-service-free-form service)
+ (shepherd-service-file/free-form service)
+ (shepherd-service-file/regular service)))
+
(define (scm->go file shepherd)
"Compile FILE, which contains code to be loaded by shepherd's config file,
and return the resulting '.go' file. SHEPHERD is used as shepherd package."

base-commit: 2aeb37def258ad4dd23aaf57ed32f0be44d1bea5
--
2.45.1
L
L
Ludovic Courtès wrote on 24 Jun 15:07 +0200
Re: [bug#69591] [PATCH] services: shepherd: Support “free-form” services.
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
87pls6ij5b.fsf@gnu.org
Hi Maxim,

(Cc’ing 71739, which is actually the right one. :-))

Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:

Toggle quote (2 lines)
> Ludovic Courtès <ludo@gnu.org> writes:

[...]

Toggle quote (19 lines)
>> +@item @code{free-form} (default: @code{#f})
>> +When set, this field replaces the @code{start}, @code{stop}, and
>> +@code{actions} fields. It is meant to be used when the service
>> +definition comes from some other source, typically the service
>> +collection provided by the Shepherd proper (@pxref{Service Collection,,,
>> +shepherd, The GNU Shepherd Manual}).
>> +
>> +@cindex REPL service, for shepherd
>> +For example, the snippet below defines a service for the Shepherd's
>> +built-in @acronym{REPL, read-eval-print loop} service (@pxref{REPL
>> +Service,,, shepherd, The GNU Shepherd Manual}):
>> +
>> +@lisp
>> +(shepherd-service
>> + (provision '(repl))
>> + (modules '((shepherd service repl)))
>> + (free-form #~(repl-service)))
>> +@end lisp

[...]

Toggle quote (3 lines)
> Hm, if free-form is expected to be a built-in procedure provided by
> Shepherd, should we call it 'built-in' instead of 'free-form' ?

I view it as something more generic: it’s typically, but not just, for
when the service comes from a procedure defined in the Shepherd itself.

Other use case is when as a service author you need more freedom that
what you get with the ‘start’ and ‘stop’ fields, like:

(shepherd-service
;; …
(free-from #~(let ((whatever (spawn-fiber …)))
(service '(foo) #:start …))))

It’s probably going to be a relatively marginal use case, but it’s good
to have that extra level of flexibility.

WDYT?

Thanks!

Ludo’.
M
M
Maxim Cournoyer wrote on 25 Jun 05:22 +0200
(name . Ludovic Courtès)(address . ludo@gnu.org)
87pls5btae.fsf@gmail.com
Hi Ludovic,

Ludovic Courtès <ludo@gnu.org> writes:

[...]

Toggle quote (19 lines)
>> Hm, if free-form is expected to be a built-in procedure provided by
>> Shepherd, should we call it 'built-in' instead of 'free-form' ?
>
> I view it as something more generic: it’s typically, but not just, for
> when the service comes from a procedure defined in the Shepherd itself.
>
> Other use case is when as a service author you need more freedom that
> what you get with the ‘start’ and ‘stop’ fields, like:
>
> (shepherd-service
> ;; …
> (free-from #~(let ((whatever (spawn-fiber …)))
> (service '(foo) #:start …))))
>
> It’s probably going to be a relatively marginal use case, but it’s good
> to have that extra level of flexibility.
>
> WDYT?

Thanks for the extra explanation and example. The extra flexibility
sounds good to me!

Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail>

--
Thanks,
Maxim
L
L
Ludovic Courtès wrote on 27 Jun 00:21 +0200
Re: [bug#71739] [bug#69591] [PATCH] services: shepherd: Support “free-form” services.
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
87jzib9wge.fsf@gnu.org
Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:

Toggle quote (5 lines)
> Thanks for the extra explanation and example. The extra flexibility
> sounds good to me!
>
> Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail>

Pushed as 0a220c1599613b7bee38c0bf8bc1bb3e9cbcaeb8, thanks!

Ludo’.
Closed
?
Your comment

Commenting via the web interface is currently disabled.

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

To respond to this issue using the mumi CLI, first switch to it
mumi current 71739
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