Actualmente he estado trabajando en un proyecto que me permite revisar a detalle el código fuente de OpenStack, por lo que me he topado con una funcionalidad que me ha parecido interesante. Esta es la ejecucion de tareas periódicas en el proyecto de Nova, y si bien la documentación oficial hace una analogia de estas con los cron jobs de Linux vale la pena profundizar un poco mas sobre el tema.
Su funcionalidad es sencilla, como su nombre lo indica son funciones que se ejecutan con cierto grado de periodicidad. Estas funciones van desde la actualización de los estados de las maquinas hasta la verificación del caché de que almacena las imagenes. En cada función se define, entre otras cosas, la frecuencia de ejecución y si es necesario que sea ejecutada de forma inmediata.
A nivel de código podemos encontrar su implementación en el proyecto de oslo.service como un metodo decorador de funciones. Este decorador define el comportamiento de cada función, ademas de proveer la conexion entre el valor de configuración provisto por el usuario y la definicion del tarea periodica, un claro ejemplo es la función que sincroniza los estados de las maquinas.
Cada una de las funciones es registradas a traves de una clase Manager, que a su vez hace uso de los metodos definidos por una metaclase llamada _PeriodicTasksMeta en su metodo _add_periodic_task.
Por último y una vez registradas cada una de las funciones es necesario conocer el motor que manda ejecutar cada una de ellas de forma periódica. De igual forma estas son ejecutadas por la clase Manager en su funcion periodic_tasks que a su vez manda llamar a clase padre en su metodo run_periodic_tasks este ultimo iterando y ejecutando cada elemento de la lista de funciones. Y si se estan preguntando quien manda llamar a esta clase Manager, cada servicio(nova-api, nova-cert, nova-compute, nova-conductor, nova-consoleauth, nova-network, nova-novncproxy, nova-scheduler) tienen definida una propiedad que hace referencia a una subclase de esta clase Manager, es desde ahí donde se hace la llamada a sus tareas periodicas.
Esta funcionalidad está habilitada por defecto y puede ser deshabilitada via archivo de configuracion en la variable periodic_enable de la seccion DEFAULT del archivo nova.conf.