Next: Referencia de servicios, Previous: Composición de servicios, Up: Definición de servicios [Contents][Index]
Un tipo de servicio es un nodo en el GAD descrito
previamente. Empecemos con un ejemplo simple, el tipo de servicio para el
daemon de construcción Guix (see Invocación de guix-daemon
):
(define guix-service-type
(service-type
(name 'guix)
(extensions
(list (service-extension shepherd-root-service-type guix-shepherd-service)
(service-extension account-service-type guix-accounts)
(service-extension activation-service-type guix-activation)))
(default-value (guix-configuration))))
Define tres cosas:
Cada tipo de servicio tiene al menos una extensión de servicio. La única excepción es el tipo de servicio de arranque, que es el último servicio.
En este ejemplo, guix-service-type
extiende tres servicios:
shepherd-root-service-type
El procedimiento guix-shepherd-service
define cómo se extiende el
servicio de Shepherd. Es decir, devuelve un objeto <shepherd-service>
que define cómo se arranca y para guix-daemon
(see Servicios de Shepherd).
account-service-type
guix-accounts
crea la implementación de esta extensión para este
servicio, la cual devuelve una lista de objetos user-group
y
user-account
que representan las cuentas de usuarias de construcción
(see Invocación de guix-daemon
).
activation-service-type
Aquí guix-activation
es un procedimiento que devuelve una
expresión-G, que es un fragmento de código a ejecutar en “tiempo de
activación”—por ejemplo, cuando el servicio se arranca.
Un servicio de este tipo se puede instanciar de esta manera:
(service guix-service-type
(guix-configuration
(build-accounts 5)
(extra-options '("--gc-keep-derivations"))))
El segundo parámetro a la forma service
es un valor que representa
los parámetros de esta instancia específica del
servicio. See guix-configuration
, para
información acerca del tipo de datos guix-configuration
. Cuando se
omite el valor, se usa el valor predeterminado por guix-service-type
:
guix-service-type
es bastante simple puesto que extiende otros
servicios pero no es extensible a su vez.
El tipo de servicio para un servicio extensible puede tener esta forma:
(define udev-service-type
(service-type (name 'udev)
(extensions
(list (service-extension shepherd-root-service-type
udev-shepherd-service)))
(compose concatenate) ;concatena la lista de reglas
(extend (lambda (config rules)
(match config
(($ <udev-configuration> udev initial-rules)
(udev-configuration
(udev udev) ;el paquete udev usado
(rules (append initial-rules rules)))))))))
Este es el tipo de servicio para el
daemon de gestión de
dispositivos eudev. En comparación con el ejemplo previo, además de una
extensión de shepherd-root-service-type
, podemos ver dos nuevos
campos:
compose
Este es el procedimiento para componer la lista de extensiones en servicios de este tipo.
Los servicios pueden extender el servicio udev proporcionandole una lista de reglas; componemos estas extensiones mediante una simple concatenación.
extend
Este procedimiento define cómo el valor del servicio se extiende con la composición de la extensión.
Las extensiones de udev se componen en una lista de reglas, pero el valor
del servicio udev es en sí un registro <udev-configuration>
. Por
tanto aquí extendemos el registro agregando la lista de reglas que contiene
al final de la lista de reglas que se contribuyeron.
description
Es una cadena que proporciona una descripción del tipo de servicio. Dicha
cadena puede contener lenguaje de marcado Texinfo (see Overview in GNU Texinfo). La orden guix system search
busca estas
cadenas y las muestra (see Invoking guix system
).
Puede haber únicamente una instancia de un tipo de servicio extensible como
udev-service-type
. Si hubiese más, las especificaciones
service-extension
serían ambiguas.
¿Todavía aquí? La siguiente sección proporciona una referencia de la interfaz programática de los servicios.
Next: Referencia de servicios, Previous: Composición de servicios, Up: Definición de servicios [Contents][Index]