unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Services can now have a default value
@ 2017-04-15 22:51 Ludovic Courtès
  2017-04-15 23:11 ` ng0
                   ` (2 more replies)
  0 siblings, 3 replies; 33+ messages in thread
From: Ludovic Courtès @ 2017-04-15 22:51 UTC (permalink / raw)
  To: guix-devel

Hello Guix!

With commit 1bb895eabf74a1e571887eb1521915e668a5c28d, service types can
declare a default value for their instances.  After this one can write:

  (service openssh-service-type)

instead of:

  (service openssh-service-type (openssh-configuration))

A bit of typing saved!

Note that this changes breaks the ABI for services, so make sure to run
“make clean-go && make”.

Feedback welcome!

Ludo’.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-15 22:51 Services can now have a default value Ludovic Courtès
@ 2017-04-15 23:11 ` ng0
  2017-04-17 11:56   ` Ricardo Wurmus
  2017-04-17 11:58 ` Ricardo Wurmus
  2017-04-19 14:42 ` Carlo Zancanaro
  2 siblings, 1 reply; 33+ messages in thread
From: ng0 @ 2017-04-15 23:11 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

Ludovic Courtès transcribed 0.4K bytes:
> Hello Guix!
> 
> With commit 1bb895eabf74a1e571887eb1521915e668a5c28d, service types can
> declare a default value for their instances.  After this one can write:
> 
>   (service openssh-service-type)
> 
> instead of:
> 
>   (service openssh-service-type (openssh-configuration))
> 
> A bit of typing saved!
> 
> Note that this changes breaks the ABI for services, so make sure to run
> “make clean-go && make”.
> 
> Feedback welcome!
> 
> Ludo’.
> 

Before I lock myself out, this is the definition for defaults.
So:
 (service openssh-service-type
          (openssh-configuration
            (port-number 12121)))

becomes:
  (service openssh-service-type
          (port-number 12121))

or is this just a definition for defaults and not the configuration, and
when the configuration is specified it is still like before this commit?
-- 
PGP and more: https://people.pragmatique.xyz/ng0/

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-15 23:11 ` ng0
@ 2017-04-17 11:56   ` Ricardo Wurmus
  2017-04-19 23:22     ` ng0
  0 siblings, 1 reply; 33+ messages in thread
From: Ricardo Wurmus @ 2017-04-17 11:56 UTC (permalink / raw)
  To: ng0; +Cc: guix-devel


ng0 <contact.ng0@cryptolab.net> writes:

> Before I lock myself out, this is the definition for defaults.
> So:
>  (service openssh-service-type
>           (openssh-configuration
>             (port-number 12121)))
>
> becomes:
>   (service openssh-service-type
>           (port-number 12121))
>
> or is this just a definition for defaults and not the configuration, and
> when the configuration is specified it is still like before this commit?

The “openssh-service-type” has a default value
“(openssh-configuration)”.  If you want to override parts of the default
configuration you can use the “modify-services” syntax.  Your second
snippet is incorrect, because “service” expects a type and a
configuration value, but you gave it a type and “(port-number 12121)”,
which is not a valid configuration.

-- 
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
https://elephly.net

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-15 22:51 Services can now have a default value Ludovic Courtès
  2017-04-15 23:11 ` ng0
@ 2017-04-17 11:58 ` Ricardo Wurmus
  2017-04-19 14:42 ` Carlo Zancanaro
  2 siblings, 0 replies; 33+ messages in thread
From: Ricardo Wurmus @ 2017-04-17 11:58 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel


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

> With commit 1bb895eabf74a1e571887eb1521915e668a5c28d, service types can
> declare a default value for their instances.  After this one can write:
>
>   (service openssh-service-type)
>
> instead of:
>
>   (service openssh-service-type (openssh-configuration))
>
> A bit of typing saved!

Yeah, I like it!  Thanks!

-- 
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
https://elephly.net

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-15 22:51 Services can now have a default value Ludovic Courtès
  2017-04-15 23:11 ` ng0
  2017-04-17 11:58 ` Ricardo Wurmus
@ 2017-04-19 14:42 ` Carlo Zancanaro
  2017-04-19 15:18   ` ng0
  2017-04-19 21:20   ` Ludovic Courtès
  2 siblings, 2 replies; 33+ messages in thread
From: Carlo Zancanaro @ 2017-04-19 14:42 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

[-- Attachment #1: Type: text/plain, Size: 1045 bytes --]

I have a question related to this, but about a broader issue.

On Sat, Apr 15 2017, Ludovic Courtès wrote:
>   (service openssh-service-type)

Is this supposed to be the preferred way to add a service to your
operating system? Or, put another way, as a service writer: should I
consider a *-service-type to be sufficient to complete the work of
creating a service?

Looking at various services that we have defined at the moment
(according to what is documented), most services have a procedure (ie.
*-service), and maybe also a *-service-type. For example, in "Database
Services" we have postgresql-service and mysql-service, with no
corresponding *-service-type. But then we have redis-service-type
without a *-service to go with it.

I wonder if we would be better off creating *-service procedures for
each *-service-type and documenting them as the canonical way to create
services. That way we could handle things like default arguments through
the usual scheme mechanisms, rather than our own special case.

Carlo

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-19 14:42 ` Carlo Zancanaro
@ 2017-04-19 15:18   ` ng0
  2017-04-19 21:20   ` Ludovic Courtès
  1 sibling, 0 replies; 33+ messages in thread
From: ng0 @ 2017-04-19 15:18 UTC (permalink / raw)
  To: Carlo Zancanaro; +Cc: guix-devel

Carlo Zancanaro transcribed 1.7K bytes:
> I have a question related to this, but about a broader issue.
> 
> On Sat, Apr 15 2017, Ludovic Courtès wrote:
> >   (service openssh-service-type)
> 
> Is this supposed to be the preferred way to add a service to your
> operating system? Or, put another way, as a service writer: should I
> consider a *-service-type to be sufficient to complete the work of
> creating a service?
> 
> Looking at various services that we have defined at the moment
> (according to what is documented), most services have a procedure (ie.
> *-service), and maybe also a *-service-type. For example, in "Database
> Services" we have postgresql-service and mysql-service, with no
> corresponding *-service-type. But then we have redis-service-type
> without a *-service to go with it.
> 
> I wonder if we would be better off creating *-service procedures for
> each *-service-type and documenting them as the canonical way to create
> services. That way we could handle things like default arguments through
> the usual scheme mechanisms, rather than our own special case.
> 
> Carlo

Yeah I fully agree and sympathize with the need for a canonical
way to create services.
In packages, we habe some kind of framework (with some expectations),
with system-services it is currently as free as it gets in freedom
of expression.
Which is both good and confusing to get started with.

-- 
PGP and more: https://people.pragmatique.xyz/ng0/

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-19 14:42 ` Carlo Zancanaro
  2017-04-19 15:18   ` ng0
@ 2017-04-19 21:20   ` Ludovic Courtès
       [not found]     ` <8737d32abz.fsf@zancanaro.id.au>
  1 sibling, 1 reply; 33+ messages in thread
From: Ludovic Courtès @ 2017-04-19 21:20 UTC (permalink / raw)
  To: Carlo Zancanaro; +Cc: guix-devel

Hi!

Carlo Zancanaro <carlo@zancanaro.id.au> skribis:

> I have a question related to this, but about a broader issue.
>
> On Sat, Apr 15 2017, Ludovic Courtès wrote:
>>   (service openssh-service-type)
>
> Is this supposed to be the preferred way to add a service to your
> operating system? Or, put another way, as a service writer: should I
> consider a *-service-type to be sufficient to complete the work of
> creating a service?

Yes.

> Looking at various services that we have defined at the moment
> (according to what is documented), most services have a procedure (ie.
> *-service), and maybe also a *-service-type. For example, in "Database
> Services" we have postgresql-service and mysql-service, with no
> corresponding *-service-type. But then we have redis-service-type
> without a *-service to go with it.
>
> I wonder if we would be better off creating *-service procedures for
> each *-service-type and documenting them as the canonical way to create
> services. That way we could handle things like default arguments through
> the usual scheme mechanisms, rather than our own special case.

It used to be that we would write ‘-service’ procedures.  Then when (gnu
services) was added, each of these procedures would boil down to:

  (define (foo-service #:key (foo foo) (number 42))
    (service foo-service-type
             (foo-configuration (foo foo) (number number))))

There are two issues here:

  1. The default values here are redundant with those we also specify in
     <foo-configuration>.

  2. The ‘-service’ procedures are a bit opaque.  For things like
     ‘modify-services’, we want to expose the fact that we have service
     objects with an associated <foo-configuration> value, rather than
     hide it inside a procedure.

For these reasons, I’ve been progressively suggesting that we avoid
‘-service’ procedures altogether, and deprecate the existing ones.
There are still many of them though, as you write; we should remove
them (patches welcome! easy task for a GuixSD newcomer! :-)).

The default value thing in this thread is about making the ‘service’
form less verbose and closer to what we had with ‘-service’ procedures.

Clearly there’s a parallel between procedures with keyword parameters
and services/configurations records with default field values.  The key
here is that we want first-class objects that we can inspect and derive
from when customizing a system.

Does that clarify things?

Thanks,
Ludo’.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-17 11:56   ` Ricardo Wurmus
@ 2017-04-19 23:22     ` ng0
  2017-04-20  8:53       ` Ricardo Wurmus
  0 siblings, 1 reply; 33+ messages in thread
From: ng0 @ 2017-04-19 23:22 UTC (permalink / raw)
  To: Ricardo Wurmus; +Cc: guix-devel

Ricardo Wurmus transcribed 0.9K bytes:
> 
> ng0 <contact.ng0@cryptolab.net> writes:
> 
> > Before I lock myself out, this is the definition for defaults.
> > So:
> >  (service openssh-service-type
> >           (openssh-configuration
> >             (port-number 12121)))
> >
> > becomes:
> >   (service openssh-service-type
> >           (port-number 12121))
> >
> > or is this just a definition for defaults and not the configuration, and
> > when the configuration is specified it is still like before this commit?
> 
> The “openssh-service-type” has a default value
> “(openssh-configuration)”.  If you want to override parts of the default
> configuration you can use the “modify-services” syntax.  Your second
> snippet is incorrect, because “service” expects a type and a
> configuration value, but you gave it a type and “(port-number 12121)”,
> which is not a valid configuration.
> 
> -- 
> Ricardo
> 
> GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
> https://elephly.net
> 

Because I still don't think modify-services is documented well enough
and I have only one case where it's working for me, I assume:

As an example,
                   (service openssh-service-type
                            (openssh-configuration
                             (permit-root-login #t)))

Would still work. If it doesn't, I know there is no lint checking for services
in the system config.
-- 
PGP and more: https://people.pragmatique.xyz/ng0/

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
       [not found]     ` <8737d32abz.fsf@zancanaro.id.au>
@ 2017-04-20  8:42       ` Ludovic Courtès
  2017-04-20 10:19         ` Carlo Zancanaro
  0 siblings, 1 reply; 33+ messages in thread
From: Ludovic Courtès @ 2017-04-20  8:42 UTC (permalink / raw)
  To: Carlo Zancanaro; +Cc: guix-devel

Hi Carlo,

Carlo Zancanaro <carlo@zancanaro.id.au> skribis:

>> There are two issues here:
>>
>>   1. The default values here are redundant with those we also specify in
>>      <foo-configuration>.
>>
>>   2. The ‘-service’ procedures are a bit opaque.  For things like
>>      ‘modify-services’, we want to expose the fact that we have service
>>      objects with an associated <foo-configuration> value, rather than
>>      hide it inside a procedure.
>>
>> For these reasons, I’ve been progressively suggesting that we avoid
>> ‘-service’ procedures altogether, and deprecate the existing ones.
>> There are still many of them though, as you write; we should remove
>> them (patches welcome! easy task for a GuixSD newcomer! :-)).
>
> Could we create a mapping from configuration -> service-type? Or somehow
> embed the service-type inside the configuration record? (I prefer the
> former.) That way we could specify our service list as a list of
> configurations without having to doubly-specify the services.
>
> So then instead of
>
>   (service foo-service-type
>            (foo-configuration (foo #f)
>                               (number 42)))
>
> we could have:
>
>   (foo-configuration (foo #f)
>                      (number 42))
>
> and have the foo-service-type implicitly looked up when instantiating
> the services.

There must be some sort of a mapping between service types and
configuration types, indeed, but I’m not sure how to achieve it.

One solution would be to have all the <foo-configuration> records
inherit (in the OO sense) from <service>, or something along these
lines.

Or we could make <service-type> “struct vtables” and then make
<foo-configuration> instances of those vtables (info "(guile) Vtables").
I’d rather avoid using those interfaces, though (currently the only
record API we use is SRFI-9.)

Or we could have a ‘define-service’ macro that defines both the
<service-type> and the <foo-configuration>, and defines a ‘foo-service’
macro equivalent to (service foo-service-type (foo-configuration …)).

  (define-service-type openssh-service-type
    openssh-service
    (extensions …)
    (configuration
      (port openssh-service-port (default 22))
      (use-pam? openssh-service-use-pam? (default #t))))

and then:

   (operating-system
     ;; …
     (services (cons (openssh-service (port 2222)) %base-services)))

Thoughts?

>> The default value thing in this thread is about making the ‘service’
>> form less verbose and closer to what we had with ‘-service’
>> procedures.
>
> Yeah, okay. I guess I just saw the change and felt like it doesn't
> actually change much. Having a default value saves you a bit of typing,
> but only in the case where you don't want to change any configuration
> for the service.
>
> The other thing that it would buy you (which is more significant) is the
> ability to create services that are required for service extensions, but
> which aren't listed in the operating-system's services. I assume we
> don't want to do that, though, because that could be
> dangerous/surprising.

I’m not sure what you mean.  Is it something like what ‘simple-service’
does?

>> Does that clarify things?
>
> Yes, thanks! Are there discussions somewhere that I can read about how
> this came together? I don't think I've been on the list long enough to
> have seen it myself (or if I have, I can't find them).

It all started with the new service API, which introduced service types
and service objects:

  https://lists.gnu.org/archive/html/guix-devel/2015-09/msg00608.html

The specific issue we’re discussing hasn’t received much attention
though, but it’s been discussed a few times as people were adding new
service definitions.

Thanks,
Ludo’.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-19 23:22     ` ng0
@ 2017-04-20  8:53       ` Ricardo Wurmus
  2017-04-20  9:09         ` ng0
  0 siblings, 1 reply; 33+ messages in thread
From: Ricardo Wurmus @ 2017-04-20  8:53 UTC (permalink / raw)
  To: ng0; +Cc: guix-devel


ng0 <contact.ng0@cryptolab.net> writes:

> Because I still don't think modify-services is documented well enough

What do you find under-documented about “modify-services”?  The manual
includes an example and a syntax definition, both of which are pretty
clear in my opinion.

Could you please take a look at “6.2.15.3 Service Reference” (especially
where “modify-services” is documented) and “6.2.1 Using the
Configuration System” (sub-heading “System Services”), and tell us what
you consider to be unclear?

--
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
https://elephly.net

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-20  8:53       ` Ricardo Wurmus
@ 2017-04-20  9:09         ` ng0
  2017-04-23 10:23           ` Ricardo Wurmus
  0 siblings, 1 reply; 33+ messages in thread
From: ng0 @ 2017-04-20  9:09 UTC (permalink / raw)
  To: Ricardo Wurmus; +Cc: guix-devel

Ricardo Wurmus transcribed 0.6K bytes:
> 
> ng0 <contact.ng0@cryptolab.net> writes:
> 
> > Because I still don't think modify-services is documented well enough
> 
> What do you find under-documented about “modify-services”?  The manual
> includes an example and a syntax definition, both of which are pretty
> clear in my opinion.
> 
> Could you please take a look at “6.2.15.3 Service Reference” (especially
> where “modify-services” is documented) and “6.2.1 Using the
> Configuration System” (sub-heading “System Services”), and tell us what
> you consider to be unclear?
> 
> --
> Ricardo
> 
> GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
> https://elephly.net
> 

It's probably well documented from a programmers point of view, I have
no open question in that regard, but from a users point of view there
is the question open how many modify-services can there be?
If I want to keep %base-services as is and just want to modify one
of the extra services (openssh for example), how does an example
look like?

Questions like these. You think it's clear because the programming
side is covered. Documentation includes the easy to understand
user (I don't like the separation of btw) side.
-- 
PGP and more: https://people.pragmatique.xyz/ng0/

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-20  8:42       ` Ludovic Courtès
@ 2017-04-20 10:19         ` Carlo Zancanaro
  2017-04-21 22:04           ` Ludovic Courtès
  0 siblings, 1 reply; 33+ messages in thread
From: Carlo Zancanaro @ 2017-04-20 10:19 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

[-- Attachment #1: Type: text/plain, Size: 2954 bytes --]

Hey Ludo,

On Thu, Apr 20 2017, Ludovic Courtès wrote:
> There must be some sort of a mapping between service types and
> configuration types, indeed, but I’m not sure how to achieve it.
>
> One solution would be to have all the <foo-configuration> records
> inherit (in the OO sense) from <service>, or something along these
> lines.

This was my first thought. I couldn't see how to do OO-style inheritance
with the SRFI-9 API, though. I'm not very experienced with Guile (or
scheme generally), so I might do some more reading about that.

One nice thing about this approach is that now a "service type" is a
scheme record-type, and a "service" is a particular instance of that
record-type, which feels slightly simpler/cleaner to me.

> Or we could make <service-type> “struct vtables” and then make
> <foo-configuration> instances of those vtables (info "(guile) Vtables").
> I’d rather avoid using those interfaces, though (currently the only
> record API we use is SRFI-9.)

I don't know what this means. I had a quick scan of the documentation,
but I'll have to read it in more detail later.

> Or we could have a ‘define-service’ macro that defines both the
> <service-type> and the <foo-configuration>, and defines a ‘foo-service’
> macro equivalent to (service foo-service-type (foo-configuration …)).
>
>   (define-service-type openssh-service-type
>     openssh-service
>     (extensions …)
>     (configuration
>       (port openssh-service-port (default 22))
>       (use-pam? openssh-service-use-pam? (default #t))))
>
> and then:
>
>    (operating-system
>      ;; …
>      (services (cons (openssh-service (port 2222)) %base-services)))

I also thought about this, but I was concerned about things like
dovecot-service, where there are two configuration objects. I wouldn't
want to force us to duplicate code, and create two different service
types, if we wanted services like that in future.

Although, maybe we would actually rather enforce a "one configuration
type per service type" rule, for the sake of modifying services? It's
hard to modify a service if you can't be sure of what the type of the
configuration will be.

Do you have a preference for what approach to use? If we use a macro to
generate things then we retain the same flexibility as the current
approach which removing a bunch of boilerplate, but I'm not sure I have
the best view of the trade-offs involved.

> I’m not sure what you mean.  Is it something like what ‘simple-service’
> does?

I meant something more like what I did with exim-service-type, where I
extend a service just to ensure its presence, then I had to document
you have to have a mail-aliases-service-type in order to use exim. With
a default configuration the mail-aliases-service-type could be
automatically instantiated if it doesn't exist.

I don't think that's a good idea, though.

Carlo

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-20 10:19         ` Carlo Zancanaro
@ 2017-04-21 22:04           ` Ludovic Courtès
  2017-04-21 23:41             ` Carlo Zancanaro
  2017-04-22 14:46             ` Christopher Allan Webber
  0 siblings, 2 replies; 33+ messages in thread
From: Ludovic Courtès @ 2017-04-21 22:04 UTC (permalink / raw)
  To: Carlo Zancanaro; +Cc: guix-devel

Hello,

Carlo Zancanaro <carlo@zancanaro.id.au> skribis:

> On Thu, Apr 20 2017, Ludovic Courtès wrote:
>> There must be some sort of a mapping between service types and
>> configuration types, indeed, but I’m not sure how to achieve it.
>>
>> One solution would be to have all the <foo-configuration> records
>> inherit (in the OO sense) from <service>, or something along these
>> lines.
>
> This was my first thought. I couldn't see how to do OO-style inheritance
> with the SRFI-9 API, though. I'm not very experienced with Guile (or
> scheme generally), so I might do some more reading about that.

SRFI-99 supports inheritance, though there’s currently no SRFI-99 module
in Guile proper:

  https://srfi.schemers.org/srfi-99/srfi-99.html

Oh and there’s also R6RS records, SRFI-35… no shortage of record APIs!
:-)

>> Or we could have a ‘define-service’ macro that defines both the
>> <service-type> and the <foo-configuration>, and defines a ‘foo-service’
>> macro equivalent to (service foo-service-type (foo-configuration …)).
>>
>>   (define-service-type openssh-service-type
>>     openssh-service
>>     (extensions …)
>>     (configuration
>>       (port openssh-service-port (default 22))
>>       (use-pam? openssh-service-use-pam? (default #t))))
>>
>> and then:
>>
>>    (operating-system
>>      ;; …
>>      (services (cons (openssh-service (port 2222)) %base-services)))
>
> I also thought about this, but I was concerned about things like
> dovecot-service, where there are two configuration objects. I wouldn't
> want to force us to duplicate code, and create two different service
> types, if we wanted services like that in future.
>
> Although, maybe we would actually rather enforce a "one configuration
> type per service type" rule, for the sake of modifying services? It's
> hard to modify a service if you can't be sure of what the type of the
> configuration will be.

Right, I would prefer one type per service.  I didn’t know dovecot was
different.

> Do you have a preference for what approach to use? If we use a macro to
> generate things then we retain the same flexibility as the current
> approach which removing a bunch of boilerplate, but I'm not sure I have
> the best view of the trade-offs involved.

A ‘define-service-type’ macro or similar could generate either code the
current framework (with <service-type> and <service> and
<foo-configuration>) or for SRFI-99-style records if we later to go that
route.

So I think we should start by designing this macro.

How does that sound?

>> I’m not sure what you mean.  Is it something like what ‘simple-service’
>> does?
>
> I meant something more like what I did with exim-service-type, where I
> extend a service just to ensure its presence, then I had to document
> you have to have a mail-aliases-service-type in order to use exim. With
> a default configuration the mail-aliases-service-type could be
> automatically instantiated if it doesn't exist.

Oh right.

Well I don’t know, perhaps in some cases it might make sense to
automatically instantiate things depended on.  The advantage is that as
a user of the service (exim for instance) you don’t have to be aware of
the services it expects (improves separation of concern).

So you could blissfully write just:

  (cons (service mediagoblin-service-type)
        %base-services)

and behind the scenes it would add an nginx instance, an mcron instance
with a couple of jobs, a rottlog instance, and so on.

WDYT?

Thanks,
Ludo’.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-21 22:04           ` Ludovic Courtès
@ 2017-04-21 23:41             ` Carlo Zancanaro
  2017-04-22  0:46               ` We need an RFC procedure [Re: Services can now have a default value] ng0
  2017-05-13 10:39               ` Services can now have a default value Carlo Zancanaro
  2017-04-22 14:46             ` Christopher Allan Webber
  1 sibling, 2 replies; 33+ messages in thread
From: Carlo Zancanaro @ 2017-04-21 23:41 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

[-- Attachment #1: Type: text/plain, Size: 1549 bytes --]

On Fri, Apr 21 2017, Ludovic Courtès wrote:
> A ‘define-service-type’ macro or similar could generate either code the
> current framework (with <service-type> and <service> and
> <foo-configuration>) or for SRFI-99-style records if we later to go that
> route.
>
> So I think we should start by designing this macro.
>
> How does that sound?

Great! I think that it's sensible to not break things for now, and we
should be able to design the macro to do that.

I'll have a go at it later today and see what I can come up with. (I'm
not very familiar with guile/scheme libraries, but I have played around
a fair bit with macros.)

> Well I don’t know, perhaps in some cases it might make sense to
> automatically instantiate things depended on.  The advantage is that as
> a user of the service (exim for instance) you don’t have to be aware of
> the services it expects (improves separation of concern).
>
> So you could blissfully write just:
>
>   (cons (service mediagoblin-service-type)
>         %base-services)
>
> and behind the scenes it would add an nginx instance, an mcron instance
> with a couple of jobs, a rottlog instance, and so on.
>
> WDYT?

My main concern would be making sure that all of our services have safe
defaults that can be extended. It may lead to surprising outcomes if we
have services spun up which do more than you expect. As an example, if
someone requests exim to start as a dependency, we should make sure it
doesn't turn you into an open relay by default.

Carlo

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* We need an RFC procedure [Re: Services can now have a default value]
  2017-04-21 23:41             ` Carlo Zancanaro
@ 2017-04-22  0:46               ` ng0
  2017-04-22  7:12                 ` Ricardo Wurmus
  2017-05-13 10:39               ` Services can now have a default value Carlo Zancanaro
  1 sibling, 1 reply; 33+ messages in thread
From: ng0 @ 2017-04-22  0:46 UTC (permalink / raw)
  To: Carlo Zancanaro; +Cc: guix-devel

Carlo Zancanaro transcribed 2.2K bytes:
> On Fri, Apr 21 2017, Ludovic Courtès wrote:
> > A ‘define-service-type’ macro or similar could generate either code the
> > current framework (with <service-type> and <service> and
> > <foo-configuration>) or for SRFI-99-style records if we later to go that
> > route.
> >
> > So I think we should start by designing this macro.
> >
> > How does that sound?
> 
> Great! I think that it's sensible to not break things for now, and we
> should be able to design the macro to do that.
> 
> I'll have a go at it later today and see what I can come up with. (I'm
> not very familiar with guile/scheme libraries, but I have played around
> a fair bit with macros.)
> 
> > Well I don’t know, perhaps in some cases it might make sense to
> > automatically instantiate things depended on.  The advantage is that as
> > a user of the service (exim for instance) you don’t have to be aware of
> > the services it expects (improves separation of concern).
> >
> > So you could blissfully write just:
> >
> >   (cons (service mediagoblin-service-type)
> >         %base-services)
> >
> > and behind the scenes it would add an nginx instance, an mcron instance
> > with a couple of jobs, a rottlog instance, and so on.
> >
> > WDYT?
> 
> My main concern would be making sure that all of our services have safe
> defaults that can be extended. It may lead to surprising outcomes if we
> have services spun up which do more than you expect. As an example, if
> someone requests exim to start as a dependency, we should make sure it
> doesn't turn you into an open relay by default.
> 
> Carlo

On the matter of 'not breaking things':

I want an formal, publicly tracked (not *just* on the mailinglist) RFC (like in Rust or similar projects) procedure for all things which
can break currently existing configurations. Introducing these changes would
require to document properly what needs to changed so that people can read
about how to fix the mistakes.
Right now to me it seems as if people are mostly talking about such development on IRC or
offlist and then the changes are applied after a QA which sometimes takes a bit of
"don't break stuff" in consideration but is never able to grasp the full effect of
breakage.

The current error output of Guix is not enough if you simply want to do
an update of a system.
If you take a look from the perspective of someone who just wants to
administrate a mailserver, and we break their config by a simple change
of how things are written, the resulting error when you run guix system reconfigure
requires some understanding of Guix and Guile.

And please don't derail this by saying that it's currently beta status. If we are
aiming for general purpose and server adoption, we should look at problems and
solutions from all perspectives.
-- 
PGP and more: https://people.pragmatique.xyz/ng0/

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-04-22  0:46               ` We need an RFC procedure [Re: Services can now have a default value] ng0
@ 2017-04-22  7:12                 ` Ricardo Wurmus
  2017-04-22 10:08                   ` ng0
  0 siblings, 1 reply; 33+ messages in thread
From: Ricardo Wurmus @ 2017-04-22  7:12 UTC (permalink / raw)
  To: ng0; +Cc: guix-devel, Carlo Zancanaro


ng0 <contact.ng0@cryptolab.net> writes:

> I want an formal, publicly tracked (not *just* on the mailinglist) RFC (like in Rust or similar projects) procedure for all things which
> can break currently existing configurations. Introducing these changes would
> require to document properly what needs to changed so that people can read
> about how to fix the mistakes.

[…]

API changes are usually explained in the release announcement’s
changelog.  This doesn’t really help between releases, though.  So,
either we release more often (yay!) or we support the old APIs until the
next release (boo!).

-- 
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
https://elephly.net

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-04-22  7:12                 ` Ricardo Wurmus
@ 2017-04-22 10:08                   ` ng0
  2017-04-22 22:55                     ` Ludovic Courtès
  0 siblings, 1 reply; 33+ messages in thread
From: ng0 @ 2017-04-22 10:08 UTC (permalink / raw)
  To: Ricardo Wurmus; +Cc: guix-devel, Carlo Zancanaro

Ricardo Wurmus transcribed 0.7K bytes:
> 
> ng0 <contact.ng0@cryptolab.net> writes:
> 
> > I want an formal, publicly tracked (not *just* on the mailinglist) RFC (like in Rust or similar projects) procedure for all things which
> > can break currently existing configurations. Introducing these changes would
> > require to document properly what needs to changed so that people can read
> > about how to fix the mistakes.
> 
> […]
> 
> API changes are usually explained in the release announcement’s
> changelog.  This doesn’t really help between releases, though.  So,
> either we release more often (yay!) or we support the old APIs until the
> next release (boo!).

Okay, then let me be more specific as you skipped the last part of the
message, which explained my intention.

Let's take this thread, starting at
"https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00329.html".
Ludovic worked on something, pushed it, did some changes to the relevant
documentation but further examples in the documentation which are now
affected weren't fixed with the push. We spent time answering questions
about broken configurations, assuming everyone who uses GuixSD now and
in the future has a fairly competent knowledge of Guile, explaining changes
which could have been avoided - or at least reduced in frequency of questions
asked - by changing examples.
If Ludovic would've presented this change before applying it, it would've
been one of the obvious problems: don't just document the change, change
further documentation sections which rely on this. This way we don't have
a documentation which presents people examples but contradicts itself later
on.
I'm pretty sure I don't have to tell you that casual users would not waste
their time with getting to the solution, and admins want something which in
case of breakage documents the changes before they happen.

Announcing the changes after the discussion about the changes happened is
another thing.
Gentoo sent out "Mails" (local mail) which was then displayed and kept in
the system of the user and it would be visible in the portage (comparable
to "guix package") application.
A bug report on "oh no, my system imploded!" would then ask, have you read
the announcement message?
And archlinux does it in a similar fashion, for both systems changes are
made visible in news on the website.

Even when we would have a "stable" and "unstable" variant, documenting changes
and explaining how to solve problems arising from them should come natural and
in our case it shouldn't involve implied conclusions but rather a good set
of examples.
-- 
PGP and more: https://people.pragmatique.xyz/ng0/

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-21 22:04           ` Ludovic Courtès
  2017-04-21 23:41             ` Carlo Zancanaro
@ 2017-04-22 14:46             ` Christopher Allan Webber
  2017-04-22 14:59               ` Jan Nieuwenhuizen
  2017-04-22 22:57               ` Ludovic Courtès
  1 sibling, 2 replies; 33+ messages in thread
From: Christopher Allan Webber @ 2017-04-22 14:46 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel, Carlo Zancanaro

Ludovic Courtès writes:

> Hello,
>
> Carlo Zancanaro <carlo@zancanaro.id.au> skribis:
>
>> On Thu, Apr 20 2017, Ludovic Courtès wrote:
>>> There must be some sort of a mapping between service types and
>>> configuration types, indeed, but I’m not sure how to achieve it.
>>>
>>> One solution would be to have all the <foo-configuration> records
>>> inherit (in the OO sense) from <service>, or something along these
>>> lines.
>>
>> This was my first thought. I couldn't see how to do OO-style inheritance
>> with the SRFI-9 API, though. I'm not very experienced with Guile (or
>> scheme generally), so I might do some more reading about that.
>
> SRFI-99 supports inheritance, though there’s currently no SRFI-99 module
> in Guile proper:
>
>   https://srfi.schemers.org/srfi-99/srfi-99.html
>
> Oh and there’s also R6RS records, SRFI-35… no shortage of record APIs!
> :-)

A record interface with inheritance!  Neat.

Though hey, if you're going to add inheritance, we also have GOOPS, and
with the clone macro I sent to the mailing list a while ago that I
worked on with Janneke, we even have immutable GOOPS! ;)
Plus then you get generic methods!

 - Chris Webber, who may only be slightly trolling and knows Guix will
   probably never adopt using GOOPS

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-22 14:46             ` Christopher Allan Webber
@ 2017-04-22 14:59               ` Jan Nieuwenhuizen
  2017-04-22 22:57               ` Ludovic Courtès
  1 sibling, 0 replies; 33+ messages in thread
From: Jan Nieuwenhuizen @ 2017-04-22 14:59 UTC (permalink / raw)
  To: Christopher Allan Webber; +Cc: guix-devel, Carlo Zancanaro

Christopher Allan Webber writes:

> A record interface with inheritance!  Neat.

I need to look at that...although ;-P

> Though hey, if you're going to add inheritance, we also have GOOPS, and
> with the clone macro I sent to the mailing list a while ago that I
> worked on with Janneke, we even have immutable GOOPS! ;)
> Plus then you get generic methods!

+1

>  - Chris Webber, who may only be slightly trolling and knows Guix will
>    probably never adopt using GOOPS

:-D

Greetings,
--janneke who'd like to see a lightweight functional GOOPS more
          prominently used

-- 
Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
Freelance IT http://JoyofSource.com | Avatar®  http://AvatarAcademy.nl  

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-04-22 10:08                   ` ng0
@ 2017-04-22 22:55                     ` Ludovic Courtès
  2017-04-23 10:13                       ` Ricardo Wurmus
  2017-04-23 11:52                       ` ng0
  0 siblings, 2 replies; 33+ messages in thread
From: Ludovic Courtès @ 2017-04-22 22:55 UTC (permalink / raw)
  To: Ricardo Wurmus; +Cc: guix-devel, Carlo Zancanaro

Hi ng0,

ng0 <contact.ng0@cryptolab.net> skribis:

> Let's take this thread, starting at
> "https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00329.html".
> Ludovic worked on something, pushed it, did some changes to the relevant
> documentation but further examples in the documentation which are now
> affected weren't fixed with the push. We spent time answering questions
> about broken configurations, assuming everyone who uses GuixSD now and
> in the future has a fairly competent knowledge of Guile, explaining changes
> which could have been avoided - or at least reduced in frequency of questions
> asked - by changing examples.

I think there’s a misunderstanding.  This change is what started the
discussion we’re having with Carlo, but it is a compatible change:
GuixSD configs that previously worked still do.

Thus I don’t think anyone spent time “answering questions about broken
configurations” in this case.  For the same reason, examples in the doc
that were valid before are still valid after the change.

> If Ludovic would've presented this change before applying it, it would've
> been one of the obvious problems: don't just document the change, change
> further documentation sections which rely on this. This way we don't have
> a documentation which presents people examples but contradicts itself later
> on.

What part of the documentation contradicts itself?  I’m confused.

As for posting the change before applying it, I should do more of that.
I’ve taken the bad habit of pushing what I consider as “simple” changes
directly to the repo, but perhaps the criteria should be reconsidered.
:-)

Thoughts?

Ludo’.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-22 14:46             ` Christopher Allan Webber
  2017-04-22 14:59               ` Jan Nieuwenhuizen
@ 2017-04-22 22:57               ` Ludovic Courtès
  1 sibling, 0 replies; 33+ messages in thread
From: Ludovic Courtès @ 2017-04-22 22:57 UTC (permalink / raw)
  To: Christopher Allan Webber; +Cc: guix-devel, Carlo Zancanaro

Christopher Allan Webber <cwebber@dustycloud.org> skribis:

> Ludovic Courtès writes:
>
>> Hello,
>>
>> Carlo Zancanaro <carlo@zancanaro.id.au> skribis:
>>
>>> On Thu, Apr 20 2017, Ludovic Courtès wrote:
>>>> There must be some sort of a mapping between service types and
>>>> configuration types, indeed, but I’m not sure how to achieve it.
>>>>
>>>> One solution would be to have all the <foo-configuration> records
>>>> inherit (in the OO sense) from <service>, or something along these
>>>> lines.
>>>
>>> This was my first thought. I couldn't see how to do OO-style inheritance
>>> with the SRFI-9 API, though. I'm not very experienced with Guile (or
>>> scheme generally), so I might do some more reading about that.
>>
>> SRFI-99 supports inheritance, though there’s currently no SRFI-99 module
>> in Guile proper:
>>
>>   https://srfi.schemers.org/srfi-99/srfi-99.html
>>
>> Oh and there’s also R6RS records, SRFI-35… no shortage of record APIs!
>> :-)
>
> A record interface with inheritance!  Neat.
>
> Though hey, if you're going to add inheritance, we also have GOOPS, and
> with the clone macro I sent to the mailing list a while ago that I
> worked on with Janneke, we even have immutable GOOPS! ;)
> Plus then you get generic methods!

Point taken!  :-)

I genuinely didn’t even think about GOOPS here ;-), but you’re right.

Ludo’.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-04-22 22:55                     ` Ludovic Courtès
@ 2017-04-23 10:13                       ` Ricardo Wurmus
  2017-04-23 12:02                         ` ng0
  2017-04-27 13:29                         ` Ludovic Courtès
  2017-04-23 11:52                       ` ng0
  1 sibling, 2 replies; 33+ messages in thread
From: Ricardo Wurmus @ 2017-04-23 10:13 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel, Carlo Zancanaro


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

> As for posting the change before applying it, I should do more of that.
> I’ve taken the bad habit of pushing what I consider as “simple” changes
> directly to the repo, but perhaps the criteria should be reconsidered.
> :-)

I think it’s fine to push simple changes directly.  There hasn’t been a
single instance when you pushed something where I thought that it
shouldn’t have been pushed.

Between releases we are free to change things; they only have to be
mentioned in the ChangeLog for the next release.  ABI breakage can get a
little annoying if one doesn’t know about it and the compilation fails
with unclear errors.

It’s a little unfortunate that packages are developed together with
everything else, because this means that there is no way for people to
opt out of breaking changes until the next release without also opting
out of getting any updates at all.

--
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
https://elephly.net

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-20  9:09         ` ng0
@ 2017-04-23 10:23           ` Ricardo Wurmus
  0 siblings, 0 replies; 33+ messages in thread
From: Ricardo Wurmus @ 2017-04-23 10:23 UTC (permalink / raw)
  To: ng0; +Cc: guix-devel


ng0 <contact.ng0@cryptolab.net> writes:

> Ricardo Wurmus transcribed 0.6K bytes:
>>
>> ng0 <contact.ng0@cryptolab.net> writes:
>>
>> > Because I still don't think modify-services is documented well enough
>>
>> What do you find under-documented about “modify-services”?  The manual
>> includes an example and a syntax definition, both of which are pretty
>> clear in my opinion.
>>
>> Could you please take a look at “6.2.15.3 Service Reference” (especially
>> where “modify-services” is documented) and “6.2.1 Using the
>> Configuration System” (sub-heading “System Services”), and tell us what
>> you consider to be unclear?
[…]
>
> It's probably well documented from a programmers point of view, I have
> no open question in that regard, but from a users point of view there
> is the question open how many modify-services can there be?

We don’t distinguish between programmers and users.  As the
documentation says, “modify-services” is just syntactic sugar for more
basic list operations.  It takes a list of services and returns another
list of services.  This means you can use it as often as you want and
glue the results together, though it doesn’t really make sense to use it
more often than once when you glue together a custom list of services
and pass that to it.

> If I want to keep %base-services as is and just want to modify one
> of the extra services (openssh for example), how does an example
> look like?

You just need to pass your list of services to “modify-services”.  You
don’t *have* to pass it a pre-defined list of services; *any* list of
services will be fine, even something like

    (cons (tor-service) %default-services)

> Questions like these. You think it's clear because the programming
> side is covered. Documentation includes the easy to understand
> user (I don't like the separation of btw) side.

I don’t see a big difference between these two groups in terms of what
instructions they need.  Users are programming when they write
configurations, and to make that easier we provide more readable syntax
macros like “modify-services”.  The “services” field of the
“operating-system” thing expects you to pass a list of services; it
doesn’t care how you get to that list.

--
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
https://elephly.net

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-04-22 22:55                     ` Ludovic Courtès
  2017-04-23 10:13                       ` Ricardo Wurmus
@ 2017-04-23 11:52                       ` ng0
  1 sibling, 0 replies; 33+ messages in thread
From: ng0 @ 2017-04-23 11:52 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel, Carlo Zancanaro

Ludovic Courtès transcribed 1.7K bytes:
> Hi ng0,
> 
> ng0 <contact.ng0@cryptolab.net> skribis:
> 
> > Let's take this thread, starting at
> > "https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00329.html".
> > Ludovic worked on something, pushed it, did some changes to the relevant
> > documentation but further examples in the documentation which are now
> > affected weren't fixed with the push. We spent time answering questions
> > about broken configurations, assuming everyone who uses GuixSD now and
> > in the future has a fairly competent knowledge of Guile, explaining changes
> > which could have been avoided - or at least reduced in frequency of questions
> > asked - by changing examples.
> 
> I think there’s a misunderstanding.  This change is what started the
> discussion we’re having with Carlo, but it is a compatible change:
> GuixSD configs that previously worked still do.

Yep, sorry. I figured out that much after having my GuixSD based mailserver
running. Cause and Reaction, okay... but what I've asked about still stands
on its own, it would be better if certain changes are discussed and we come
up with a solid system of announcing changes in case they should break something.
I like how Gentoo and Archlinux solved it.

> Thus I don’t think anyone spent time “answering questions about broken
> configurations” in this case.  For the same reason, examples in the doc
> that were valid before are still valid after the change.
> 
> > If Ludovic would've presented this change before applying it, it would've
> > been one of the obvious problems: don't just document the change, change
> > further documentation sections which rely on this. This way we don't have
> > a documentation which presents people examples but contradicts itself later
> > on.
> 
> What part of the documentation contradicts itself?  I’m confused.

None, the message you initially wrote about the change could've been less
implicit. Like "In addition to $OLD you can now write $NEW, $OLD is still
valid and will work".

> As for posting the change before applying it, I should do more of that.
> I’ve taken the bad habit of pushing what I consider as “simple” changes
> directly to the repo, but perhaps the criteria should be reconsidered.
> :-)
> 
> Thoughts?
> 
> Ludo’.
> 

-- 
PGP and more: https://people.pragmatique.xyz/ng0/

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-04-23 10:13                       ` Ricardo Wurmus
@ 2017-04-23 12:02                         ` ng0
  2017-04-27 13:29                         ` Ludovic Courtès
  1 sibling, 0 replies; 33+ messages in thread
From: ng0 @ 2017-04-23 12:02 UTC (permalink / raw)
  To: Ricardo Wurmus; +Cc: guix-devel, Carlo Zancanaro

Ricardo Wurmus transcribed 1.0K bytes:
> 
> Ludovic Courtès <ludo@gnu.org> writes:
> 
> > As for posting the change before applying it, I should do more of that.
> > I’ve taken the bad habit of pushing what I consider as “simple” changes
> > directly to the repo, but perhaps the criteria should be reconsidered.
> > :-)
> 
> I think it’s fine to push simple changes directly.  There hasn’t been a
> single instance when you pushed something where I thought that it
> shouldn’t have been pushed.
> 
> Between releases we are free to change things; they only have to be
> mentioned in the ChangeLog for the next release.  ABI breakage can get a
> little annoying if one doesn’t know about it and the compilation fails
> with unclear errors.
> 
> It’s a little unfortunate that packages are developed together with
> everything else, because this means that there is no way for people to
> opt out of breaking changes until the next release without also opting
> out of getting any updates at all.
> 
> --
> Ricardo
> 
> GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
> https://elephly.net

In my opinion it is simple as long as nothing else is affected (or affected
parts are changed at the same time). In other words, if it touches
the way services, packages etc are compossed or definitions which (canonically)
happen to be in the system config, it should be communicated in advance.

I think almost no change Ludovic commited in the time I'm involved broke something,
even if it wasn't simple changes.
To discuss changes doesn't hold them back, it gives others a clear view
on what is happening, on the intentions and maybe to help fix mistakes
in advance.
I don't think anyone produces intenionally bad code, it's just a difference
if you develop in reaction to changes you only know about once they are pushed
(or once feature branches are completed) or if you can discuss about them.
In the first case it's an isolated effort which ressembles a group to the outside,
in the second case it's getting closer to community work.
-- 
PGP and more: https://people.pragmatique.xyz/ng0/

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-04-23 10:13                       ` Ricardo Wurmus
  2017-04-23 12:02                         ` ng0
@ 2017-04-27 13:29                         ` Ludovic Courtès
  2017-04-27 16:37                           ` Petter
  1 sibling, 1 reply; 33+ messages in thread
From: Ludovic Courtès @ 2017-04-27 13:29 UTC (permalink / raw)
  To: Ricardo Wurmus; +Cc: guix-devel, Carlo Zancanaro

Ricardo Wurmus <rekado@elephly.net> skribis:

> It’s a little unfortunate that packages are developed together with
> everything else, because this means that there is no way for people to
> opt out of breaking changes until the next release without also opting
> out of getting any updates at all.

It’s both a strength and a weakness I guess.  The good thing is that we
can make changes that affect everything at once.  The bad thing is what
you mention.

We could use feature branches more, with the downside that they would
probably get little additional testing, precisely because one would have
to choose between features and packages.

Thoughts?

Ludo’.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-04-27 13:29                         ` Ludovic Courtès
@ 2017-04-27 16:37                           ` Petter
  2017-05-02 12:42                             ` Ludovic Courtès
  0 siblings, 1 reply; 33+ messages in thread
From: Petter @ 2017-04-27 16:37 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel, Carlo Zancanaro

If I may make a suggestion, coming from a place of ignorance.

How about a stable branch that would be opt-in?

On Thu, 27 Apr 2017 15:29:53 +0200
ludo@gnu.org (Ludovic Courtès) wrote:

> Ricardo Wurmus <rekado@elephly.net> skribis:
> 
> > It’s a little unfortunate that packages are developed together with
> > everything else, because this means that there is no way for people to
> > opt out of breaking changes until the next release without also opting
> > out of getting any updates at all.  
> 
> It’s both a strength and a weakness I guess.  The good thing is that we
> can make changes that affect everything at once.  The bad thing is what
> you mention.
> 
> We could use feature branches more, with the downside that they would
> probably get little additional testing, precisely because one would have
> to choose between features and packages.
> 
> Thoughts?
> 
> Ludo’.
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-04-27 16:37                           ` Petter
@ 2017-05-02 12:42                             ` Ludovic Courtès
  2017-05-22 21:23                               ` Ricardo Wurmus
  0 siblings, 1 reply; 33+ messages in thread
From: Ludovic Courtès @ 2017-05-02 12:42 UTC (permalink / raw)
  To: Petter; +Cc: guix-devel, Carlo Zancanaro

Petter <petter@mykolab.ch> skribis:

> If I may make a suggestion, coming from a place of ignorance.
>
> How about a stable branch that would be opt-in?

What would be stable in the “stable branch”, packages or Guix?  :-)

A branch where Guix itself is stable would be nice, though it would need
careful merging from master regularly.

A branch where packages are stable (à la Debian stable) would be too
much work (I’m even skeptical it makes any sense given that many
declared and undeclared security vulnerabilities get patched everytime a
piece of software is released…).

Ludo’.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-04-21 23:41             ` Carlo Zancanaro
  2017-04-22  0:46               ` We need an RFC procedure [Re: Services can now have a default value] ng0
@ 2017-05-13 10:39               ` Carlo Zancanaro
  2017-05-13 22:53                 ` Carlo Zancanaro
  1 sibling, 1 reply; 33+ messages in thread
From: Carlo Zancanaro @ 2017-05-13 10:39 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel


[-- Attachment #1.1: Type: text/plain, Size: 982 bytes --]


On Fri, Apr 21 2017, Carlo Zancanaro wrote:
> I'll have a go at it later today and see what I can come up with. (I'm
> not very familiar with guile/scheme libraries, but I have played around
> a fair bit with macros.)

Well, it's been a lot longer than "later today", but better late than
never, I guess!

I've attached two patches, one of which is the definition of
define-service-type, and the other which is me changing the
exim-service-type definition to use it.

I made a decision to not try to generate a define-configuration form,
and instead just generate an "old-style" define-record-type for the
configuration. That's mostly just because I don't know how to write
something that works with define-configuration and it felt more
complicated to me. If someone else wants to do that (or help me to
understand it) I'd be supportive.

I'm not really promoting this as something that should be merged at the
moment, but I'm mostly just offering it as food for thought.

Carlo


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: 0001-services-Add-define-service-type.patch --]
[-- Type: text/x-diff, Size: 2446 bytes --]

From da085158b30ae983cdaaf172ba2fb97b40d3207d Mon Sep 17 00:00:00 2001
From: Carlo Zancanaro <carlo@zancanaro.id.au>
Date: Sat, 13 May 2017 20:20:27 +1000
Subject: [PATCH 1/2] services: Add `define-service-type`.

* gnu/services.scm (id, define-service-type): New macros.
---
 gnu/services.scm | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/gnu/services.scm b/gnu/services.scm
index 5c314748d..837e75568 100644
--- a/gnu/services.scm
+++ b/gnu/services.scm
@@ -50,6 +50,8 @@
             service-type-extend
             service-type-default-value
 
+            define-service-type
+
             service
             service?
             service-kind
@@ -154,6 +156,37 @@
 
 (set-record-type-printer! <service-type> write-service-type)
 
+(define-syntax-rule (id ctx parts ...)
+  "Assemble PARTS into a raw (unhygienic)  identifier."
+  (datum->syntax ctx (symbol-append (if (symbol? parts)
+                                        parts
+                                        (syntax->datum parts)) ...)))
+
+(define-syntax define-service-type
+  (lambda (stx)
+    (syntax-case stx (extensions configuration)
+      ((define-service-type service-name
+         (extensions exts ...)
+         (configuration (fields tail ...) ...))
+       (with-syntax (((field-accessors ...)
+                      (map (lambda (field)
+                             (id #'stx #'service-name '-configuration- field))
+                           #'(fields ...))))
+         #`(begin
+             (define #,(id #'stx #'service-name '-service-type)
+               (service-type
+                (name 'service-name)
+                (extensions exts ...)))
+             (define-record-type* #,(id #'stx '< #'service-name '-configuration>)
+               #,(id #'stx #'service-name '-configuration)
+               #,(id #'stx 'make- #'service-name '-configuration)
+               #,(id #'stx #'service-name '-configuration?)
+               (fields field-accessors tail ...) ...)
+             (define-syntax-rule (#,(id #'stx #'service-name '-service) config (... ...))
+               (service
+                #,(id #'stx #'service-name '-service-type)
+                (#,(id #'stx #'service-name '-configuration) config (... ...))))))))))
+
 ;; Services of a given type.
 (define-record-type <service>
   (make-service type value)
-- 
2.12.2


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.3: 0002-services-Change-exim-service-type-to-use-define-serv.patch --]
[-- Type: text/x-diff, Size: 2435 bytes --]

From 69c471d4ebe6a24fe11e6488f93616a7afb4467a Mon Sep 17 00:00:00 2001
From: Carlo Zancanaro <carlo@zancanaro.id.au>
Date: Sat, 13 May 2017 20:27:15 +1000
Subject: [PATCH 2/2] services: Change exim-service-type to use
 define-service-type.

* gnu/services/mail.scm: Refactor code to use define-service-type.
---
 gnu/services/mail.scm | 33 +++++++++++++--------------------
 1 file changed, 13 insertions(+), 20 deletions(-)

diff --git a/gnu/services/mail.scm b/gnu/services/mail.scm
index 6305f06f8..ebc7e3d9e 100644
--- a/gnu/services/mail.scm
+++ b/gnu/services/mail.scm
@@ -1693,14 +1693,6 @@ accept from local for any relay
 ;;; Exim.
 ;;;
 
-(define-record-type* <exim-configuration> exim-configuration
-  make-exim-configuration
-  exim-configuration?
-  (package       exim-configuration-package ;<package>
-                 (default exim))
-  (config-file   exim-configuration-config-file ;file-like
-                 (default #f)))
-
 (define %exim-accounts
   (list (user-group
          (name "exim")
@@ -1752,15 +1744,16 @@ exim_group = exim
            (zero? (system* #$(file-append package "/bin/exim")
                            "-bV" "-C" #$(exim-computed-config-file package config-file))))))))
 
-(define exim-profile
-  (compose list exim-configuration-package))
-
-(define exim-service-type
-  (service-type
-   (name 'exim)
-   (extensions
-    (list (service-extension shepherd-root-service-type exim-shepherd-service)
-          (service-extension account-service-type (const %exim-accounts))
-          (service-extension activation-service-type exim-activation)
-          (service-extension profile-service-type exim-profile)
-          (service-extension mail-aliases-service-type (const '()))))))
+(define (exim-profile config)
+  (call-with-values (lambda () (exim-configuration-package config)) list))
+
+(define-service-type exim
+  (extensions (list
+               (service-extension shepherd-root-service-type exim-shepherd-service)
+               (service-extension account-service-type (const %exim-accounts))
+               (service-extension activation-service-type exim-activation)
+               (service-extension profile-service-type exim-profile)
+               (service-extension mail-aliases-service-type (const '()))))
+  (configuration
+   (package       (default exim))
+   (config-file   (default #f))))
-- 
2.12.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-05-13 10:39               ` Services can now have a default value Carlo Zancanaro
@ 2017-05-13 22:53                 ` Carlo Zancanaro
  2017-05-15 12:48                   ` Ludovic Courtès
  0 siblings, 1 reply; 33+ messages in thread
From: Carlo Zancanaro @ 2017-05-13 22:53 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

[-- Attachment #1: Type: text/plain, Size: 476 bytes --]


On Sat, May 13 2017, Carlo Zancanaro wrote:
> I've attached two patches, one of which is the definition of
> define-service-type, and the other which is me changing the
> exim-service-type definition to use it.

It turns out these patches don't work at all. I wrote the code for them
around a month ago and naively assumed they'd still work. They are quite
broken, so maybe just ignore them. I'm playing around with it again now,
so we'll see what I can come up with.

Carlo

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: Services can now have a default value
  2017-05-13 22:53                 ` Carlo Zancanaro
@ 2017-05-15 12:48                   ` Ludovic Courtès
  0 siblings, 0 replies; 33+ messages in thread
From: Ludovic Courtès @ 2017-05-15 12:48 UTC (permalink / raw)
  To: Carlo Zancanaro; +Cc: guix-devel

Heya,

Carlo Zancanaro <carlo@zancanaro.id.au> skribis:

> On Sat, May 13 2017, Carlo Zancanaro wrote:
>> I've attached two patches, one of which is the definition of
>> define-service-type, and the other which is me changing the
>> exim-service-type definition to use it.
>
> It turns out these patches don't work at all. I wrote the code for them
> around a month ago and naively assumed they'd still work. They are quite
> broken, so maybe just ignore them. I'm playing around with it again now,
> so we'll see what I can come up with.

OK!  Nothing significant changed in the meantime, so perhaps it’s just a
matter of “make clean-go && make”?

BTW, I realized that this won’t be usable directly with services that
use (gnu services configuration).  Maybe that’s OK as a first approach.

Ludo’.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-05-02 12:42                             ` Ludovic Courtès
@ 2017-05-22 21:23                               ` Ricardo Wurmus
  2017-05-22 22:45                                 ` Leo Famulari
  0 siblings, 1 reply; 33+ messages in thread
From: Ricardo Wurmus @ 2017-05-22 21:23 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel, Carlo Zancanaro


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

> Petter <petter@mykolab.ch> skribis:
>
>> If I may make a suggestion, coming from a place of ignorance.
>>
>> How about a stable branch that would be opt-in?
>
> What would be stable in the “stable branch”, packages or Guix?  :-)
>
> A branch where Guix itself is stable would be nice, though it would need
> careful merging from master regularly.

This would make sense.  It would require some restraint in moving
packages to different modules or breaking some underlying package
features, which would cause ABI breakage.

I do think it would be possible, though.

> A branch where packages are stable (à la Debian stable) would be too
> much work (I’m even skeptical it makes any sense given that many
> declared and undeclared security vulnerabilities get patched everytime a
> piece of software is released…).

Yeah, that wouldn’t make sense.  It’s hard enough to deal with security
issues in current software in a timely fashion.

--
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
https://elephly.net

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: We need an RFC procedure [Re: Services can now have a default value]
  2017-05-22 21:23                               ` Ricardo Wurmus
@ 2017-05-22 22:45                                 ` Leo Famulari
  0 siblings, 0 replies; 33+ messages in thread
From: Leo Famulari @ 2017-05-22 22:45 UTC (permalink / raw)
  To: Ricardo Wurmus; +Cc: guix-devel, Carlo Zancanaro

[-- Attachment #1: Type: text/plain, Size: 1256 bytes --]

On Mon, May 22, 2017 at 11:23:23PM +0200, Ricardo Wurmus wrote:
> Ludovic Courtès <ludo@gnu.org> writes:
> > What would be stable in the “stable branch”, packages or Guix?  :-)
> >
> > A branch where Guix itself is stable would be nice, though it would need
> > careful merging from master regularly.
> 
> This would make sense.  It would require some restraint in moving
> packages to different modules or breaking some underlying package
> features, which would cause ABI breakage.
> 
> I do think it would be possible, though.

It's definitely possible, but I'd like to see it proposed in more detail
by the group that will maintain it. It's not okay to start a "stable
branch" unless it will be properly supported.

> 
> > A branch where packages are stable (à la Debian stable) would be too
> > much work (I’m even skeptical it makes any sense given that many
> > declared and undeclared security vulnerabilities get patched everytime a
> > piece of software is released…).
> 
> Yeah, that wouldn’t make sense.  It’s hard enough to deal with security
> issues in current software in a timely fashion.

+1

Anyone who really needs this has a business use case that can support a
private fork, in my opinion.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2017-05-22 22:45 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-15 22:51 Services can now have a default value Ludovic Courtès
2017-04-15 23:11 ` ng0
2017-04-17 11:56   ` Ricardo Wurmus
2017-04-19 23:22     ` ng0
2017-04-20  8:53       ` Ricardo Wurmus
2017-04-20  9:09         ` ng0
2017-04-23 10:23           ` Ricardo Wurmus
2017-04-17 11:58 ` Ricardo Wurmus
2017-04-19 14:42 ` Carlo Zancanaro
2017-04-19 15:18   ` ng0
2017-04-19 21:20   ` Ludovic Courtès
     [not found]     ` <8737d32abz.fsf@zancanaro.id.au>
2017-04-20  8:42       ` Ludovic Courtès
2017-04-20 10:19         ` Carlo Zancanaro
2017-04-21 22:04           ` Ludovic Courtès
2017-04-21 23:41             ` Carlo Zancanaro
2017-04-22  0:46               ` We need an RFC procedure [Re: Services can now have a default value] ng0
2017-04-22  7:12                 ` Ricardo Wurmus
2017-04-22 10:08                   ` ng0
2017-04-22 22:55                     ` Ludovic Courtès
2017-04-23 10:13                       ` Ricardo Wurmus
2017-04-23 12:02                         ` ng0
2017-04-27 13:29                         ` Ludovic Courtès
2017-04-27 16:37                           ` Petter
2017-05-02 12:42                             ` Ludovic Courtès
2017-05-22 21:23                               ` Ricardo Wurmus
2017-05-22 22:45                                 ` Leo Famulari
2017-04-23 11:52                       ` ng0
2017-05-13 10:39               ` Services can now have a default value Carlo Zancanaro
2017-05-13 22:53                 ` Carlo Zancanaro
2017-05-15 12:48                   ` Ludovic Courtès
2017-04-22 14:46             ` Christopher Allan Webber
2017-04-22 14:59               ` Jan Nieuwenhuizen
2017-04-22 22:57               ` Ludovic Courtès

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).