[Nix-dev] Service composition
Ertugrul Söylemez
ertesx at gmx.de
Wed Dec 31 14:53:59 CET 2014
Hi Ludovic,
>> As a first approximation there would be a Service monoid, which would
>> combine certain typical attributes about a service, including startup
>> scripts, required bind-mounts, required system resources and if
>> really necessary shutdown scripts (most programs should shutdown
>> properly when the container goes down).
>>
>> Service : Mon
>>
>> Its identity idS would be the empty service, which you can think of
>> as an empty group of processes with no mounts, no resources, etc.
>>
>> The Bitlbee service would be constructed through a regular function
>> that takes the typical bitlbee options. Nothing special here:
>>
>> bitlbee : BitlbeeConf -> Service
>
> OK. I suppose ‘Service’ would specify required user accounts, PAM
> services, etc., right?
Yes. It specifies everything to build a machine for the purpose of
carrying out the task that the service denotes, but in such a way that
two such machines can be combined into a single machine.
I still need to figure out a few details though, especially since I'm
relying on a lot of Linux technology here. I'd like to keep it
sufficiently general that users of other kernels (most notably FreeBSD)
can benefit from it as well.
>> The nginx function is more interesting. It involves a second monoid,
>> the monoid of web services (identity idW):
>>
>> WebService : Mon
>>
>> Then nginx is a monoid morphism,
>>
>> nginx : WebService -> Service
>>
>> that is a function with additional structure, in particular:
>>
>> nginx x ◇ nginx y ≡ nginx (x ◇ y)
>> nginx idW ≡ idS
>
> Very interesting. I wonder what other types of services would benefit
> from similar treatment.
It would split the view on the configuration into two parts: services
and environment. For example networking belongs to the environment, so
requirements on the network as well as networking options will be part
of a service.
This means that creating a bridge device amounts not to adding a
service, but to applying a service morphism:
withBridge brCfg (br:
service1 br <> service2 br)
This reminds me that it would be great if Nix would allow some way to
define custom infix operators or at least provide a few generic ones.
At this point we will need to use prefix notation, which might make this
a bit uglier:
withBridge brCfg (br:
compose (service1 br)
(service2 br))
Although it's just monoid composition, so using a list argument would do
the trick. Just a nice-to-have.
Greets,
Ertugrul
More information about the nix-dev
mailing list