Next: , Previous: , Up: Definición de servicios   [Contents][Index]


12.18.2 Tipos de servicios y servicios

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:

  1. Un nombre, cuyo único propósito es facilitar la inspección y la depuración.
  2. Una lista de extensiones de servicio, donde cada extensión designa el tipo de servicio a extender y un procedimiento que, dados los parámetros del servicio, devuelve una lista de objetos para extender el servicio de dicho tipo.

    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.

  3. De manera opcional, un valor predeterminado para instancias de este tipo.

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:

(service 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]