Anomalie #5913
Gérer les services par groupe de conteneurs
Description
Actuellement, les services sont gérés par conteneur ce qui provoque une double action en cas de mode non conteneur (#5641).
Il faudrait gérer par groupe de conteneur avec du code équivalent à creole.template.instance_files()
(creole:source:creole/template.py?rev=7d41d59a#L474).
Related issues
Associated revisions
Nouvelle API de gestion des services: « manage_service() »
Cette nouvelle API permet de gérer les services par groupe de conteneurs.
Il y a deux points d’entrées dans l’API :
- « manage_services() » pour appliquer une action sur une liste de
services ou tous par défaut ;
- « manage_service() » pour appliquer une action sur un service unique.
Chaque « method » de service doit définir une interface identique définie
par le dictionnaire « pyeole.service._ACTION_DISPATCHER ».
Un squelette est fourni dans « pyeole/service/method-skelton.txt » pour
faciliter la mise en œuvre d’une nouvelle méthode.
- setup.py: Installation du nouveau paquet python « pyeole.service ».
- pyeole/service/__init__.py: Point d’entrée définissant les deux
fonctions « manage_services() » et « manage_service() ».
- pyeole/service/error.py: Exceptions de « pyeole.service ».
- pyeole/service/_apache.py: Gère les services de type « apache ».
- pyeole/service/_network.py: Gère le service réseau sur le contrôleur
LXC.
- pyeole/service/_service.py: Gère les service de type « System V ».
- pyeole/service/_upstart.py: Gère les service de type « upstart ».
- pyeole/service/method-skelton.txt: Squelette de gestionnaire de
service, basé sur le code de « upstart ».
History
#1 Updated by Daniel Dehennin about 10 years ago
Je ne vois pas bien comment m’en sortir avec le code existant (#5912).
Du coup, je ferais bien une nouvelle API gérant à la fois l’activation/désactivation et le lancement/arrêt des services ;-)
manage_service(action, name, container=None)
manage_services(action, names=None, container=None)
Ces deux fonctions gèrent la logique conteneur/groupe de conteneurs et passent le relais à une fonction qui fait le travail _manage_service(action, service, container=None)
en dispatchant par action/méthode sur d’autres fonctions privées.
Étant donné que le code actuel de service_out()
(source:pyeole/service.py?rev=a4b43345#L697) ne peut pas fonctionner, je me pose la question de l’intérêt de la double gestion.
#2 Updated by Daniel Dehennin about 10 years ago
- Status changed from Nouveau to En attente d'informations
Tout commentaire est le bienvenu avant de modifier quoique ce soit.
#3 Updated by Daniel Dehennin about 10 years ago
L’API donne à peu près ça :
_ACTION_DISPATCHER = {'enable': '_enable_service',
'disable': '_disable_service',
'status': '_status_service',
'start': '_start_service',
'stop': '_stop_service',
'restart': '_restart_service',
'reload': '_reload_service'}
def manage_services(action, names=None, container=None):
"""Apply :data:`action` to services.
If no service :data:`names` is provided, :data:`action` is
performed for all services.
if no :data:`container` is provided, services are looked-up in all
container groups.
:param action: action to perform
:type action: `str` in [``enable``, ``disable``, ``status``,
``start``, ``restart``, ``stop``, ``reload``,
``force-reload``]
:param names: names of services
:type names: `list` of `str`
:param container: name of the container where to perform :data:`action`
:type container: `str`
"""
containers_ctx = []
if container is not None:
containers_ctx = [creole_client.get_container_infos(container)]
else:
for group_name in creole_client.get_groups():
containers_ctx.append(creole_client.get_group_infos(group_name))
for ctx in containers_ctx:
_manage_service(action, services=names, ctx=ctx)
def manage_service(action, name, container=None):
"""Apply :data:`action` to one service.
if no :data:`container` is provided, services are looked-up in all
container groups.
:param action: action to perform
:type action: `str` in [``enable``, ``disable``, ``status``,
``start``, ``restart``, ``stop``, ``reload``,
``force-reload``]
:param name: name of service
:type name: `str`
:param container: name of the container where to perform :data:`action`
:type container: `str`
"""
containers_ctx = []
if container is not None:
containers_ctx = [creole_client.get_container_infos(container)]
else:
for group_name in creole_client.get_groups():
containers_ctx.append(creole_client.get_group_infos(group_name))
for ctx in containers_ctx:
_manage_service(action, services=[name], ctx=ctx)
def _manage_service(action, services, ctx):
"""Apply :data:`action` to :data:`services` in a container.
:param action: action to perform
:type action: `str` in [``enable``, ``disable``, ``status``,
``start``, ``restart``, ``stop``, ``reload``,
``force-reload``]
:param services: names of service
:type services: `list` of `str`
:param ctx: container context
:type ctx: `dict`
"""
if _ACTION_DISPATCHER.get(action, None) is None:
raise ValueError('Invalid action {0}'.format(action))
services_ctx = []
if services is None:
services_ctx = ctx['services']
else:
for service in ctx['services']:
if service['name'] in services:
services_ctx.append(service)
for service in services_ctx:
globals().get(_ACTION_DISPATCHER[action])(service, ctx=ctx)
def _enable_service(service, ctx):
log.debug("Enable service {0}".format(service['name']))
creole_update_rcd(service, 'set', ctx)
def _disable_service(service, ctx):
log.debug("Disable service {0}".format(service['name']))
creole_update_rcd(service, 'remove', ctx)
def _status_service(service, ctx):
log.debug("Status service {0}".format(service['name']))
pass
def _start_service(service, ctx):
log.debug("Start service {0}".format(service['name']))
pass
def _stop_service(service, ctx):
log.debug("Stop service {0}".format(service['name']))
pass
def _restart_service(service, ctx):
log.debug("Restart service {0}".format(service['name']))
pass
def _reload_service(service, ctx):
log.debug("Reload service {0}".format(service['name']))
pass
#4 Updated by Daniel Dehennin about 10 years ago
- Assigned To set to Daniel Dehennin
- Start date set to 08/27/2013
- % Done changed from 0 to 70
Merci de faire une relecture de source:pyeole/service.py?rev=feature/manage-services-per-group
Il s’agit d’une réécriture :
- pas de gestion de l’affichage des
OK/FAIL
pour l’intant - pas de gestion des méthodes autres que
service
(sysV-init) etupstart
Les fonctions par méthodes devraient être regroupées dans des bibliothèques dédiés afin de ne pas trop mélanger le code et de permettre d’ajouter facilement de nouvelle méthodes (avec fabrique et tout le tintouin)
#5 Updated by Daniel Dehennin about 10 years ago
Pour tester le code de source:pyeole/service.py?rev=feature/manage-services-per-group vous avez besoin de la version CreoleClient
de creole:source:creole/client.py?rev=feature/service-by-group.
#6 Updated by Daniel Dehennin about 10 years ago
- % Done changed from 70 to 80
Un commit de plus afin d’ajouter une couche de compatibilité avec l’ancien code et les deprecated
qui vont bien.
Toujours le même lien source:pyeole/service.py?rev=feature/manage-services-per-group
#7 Updated by Daniel Dehennin about 10 years ago
Je viens de découper pyeole.service
en un paquet:
- Interface publique dans source:pyeole/service/__init__.py?rev=feature/manage-services-per-group
manage_services()
manage_service()
- Les exceptions
- Gestion des services System V dans source:pyeole/service/_service.py?rev=feature/manage-services-per-group (à ne pas utiliser directement)
- Gestion des services upstart dans source:pyeole/service/_upstart.py?rev=feature/manage-services-per-group (à ne pas utiliser directement)
TODO¶
- pyeole.service._apache to manage Apache web sites
- pyeole.service._eoleflask to manage eoleflask applications
- pyeole.service._network to manage network which requires quite lot of special things :-/
#8 Updated by Daniel Dehennin about 10 years ago
J’ai modifié la commande creole:source:bin/CreoleService?rev=feature/service-by-group afin d’utiliser la nouvelle API.
Je note en passant que si l’action à appliquée au service était en premier argument on pourrait faire :
root@server:~# CreoleService <action> <service1> <service2> ...<serviceX>
au lieu de :
root@server:~# for service in <service1> <service2> ...<serviceX>; do CreoleService <action> $service; done
Ce qui serait nettement moins coûteux (requête CreoleClient
entre autre).
#9 Updated by Daniel Dehennin about 10 years ago
J’ai ajouté un squelette afin d’aider à la gestion d’un nouveau service source:pyeole/service/_method_skelton.py?rev=feature/manage-services-per-group)
Si vous souhaitez écrire la gestion des services Apache
, eoleflask
et d’autres… ;-)
#10 Updated by Daniel Dehennin about 10 years ago
- Target version set to Eole 2.4-alpha
C’est bien parti pour être finalisable ;-)
#11 Updated by Joël Cuissinat about 10 years ago
- Target version changed from Eole 2.4-alpha to Eole 2.4-alpha2
#12 Updated by Daniel Dehennin about 10 years ago
- Due date set to 09/27/2013
- % Done changed from 80 to 90
Un paquet experimental est disponible en version 2.4.0-58~1.gbp52691a
.
Dernière possibilité de relecture et de test ! Intégration la semaine prochaine !
#13 Updated by Daniel Dehennin about 10 years ago
- Status changed from En attente d'informations to Résolu
- % Done changed from 90 to 100
Appliqué par commit b4f231c9a3780eb6c55b8d96f7a0c6fe09076149.