Tâche #8684
Distribution EOLE - Scénario #8826: Gestion des conteneurs par les outils Creole
get_container_info ne fonctionne pas avec les groupes de conteneurs
Description
get_container_info est peu fiable (pourtant il est utilisé a beaucoup d'endroit). Il ne renvoi pas les informations des conteneurs de type groupes.
Par exemple si je regarde les interfaces du conteneur 'fichier' :
>>> d=c.get_container_infos('fichier') >>> d['interfaces'] [{u'activate': True, u'container': u'fichier', u'name': u'containers', u'ip': u'192.0.2.52', u'mask': u'255.255.255.0', u'gateway': u'192.0.2.1', u'method': u'bridge', u'container_group': u'partage', u'real_container': u'partage', u'bcast': u'192.0.2.255', u'linkto': u'br0'}, {u'activate': True, u'container': u'fichier', u'linkto': u'eth0', u'level': u'module', u'ip': u'192.168.2.3', u'mask': u'255.255.255.0', u'real_container': u'partage', u'container_group': u'partage', u'bcast': u'192.168.2.255', u'method': u'macvlan', u'name': u'eth1'}, {u'activate': True, u'container': u'fichier', u'name': u'eth1', u'level': u'module', u'ip': u'192.168.2.3', u'mask': u'255.255.255.0', u'container_group': u'partage', u'real_container': u'partage', u'method': u'macvlan', u'bcast': u'192.168.2.255', u'linkto': u'eth1'}]
On voit :
- que le conteneur fait parti du groupe 'partage'
- qu'il y a deux interfaces
Maintenant regardons la configuration du groupe de conteneur :
>>> d=c.get_container_infos('partage') >>> d['interfaces'] [{u'activate': True, u'container': u'partage', u'name': u'containers', u'ip': u'192.0.2.52', u'mask': u'255.255.255.0', u'method': u'bridge', u'container_group': u'partage', u'real_container': u'partage', u'gateway': u'192.0.2.1', u'bcast': u'192.0.2.255', u'linkto': u'br0'}]
Il y a moins d'interface dans le groupe de conteneur que dans le conteneur inclut dans ce groupe !
Demandes liées
Révisions associées
Toujours retourner les infos du groupe de conteneurs
- creole/client.py (CreoleClient.get_container_infos): Extrait le nom du
groupe et retourne les informations de celui-ci.
Fixes: #8684 @2h
Historique
#1 Mis à jour par Emmanuel GARETTE il y a plus de 9 ans
- Description mis à jour (diff)
#2 Mis à jour par Emmanuel GARETTE il y a plus de 9 ans
Après diagnostic il faut utiliser get_group_infos et non get_container_infos.
Le problème c'est que certaines applications utilisent l'un et d'autre l'autre.
C'est totalement problématique. Voici un exemple :
root@amonecole:~# cat test %%current_container['interfaces'] root@amonecole:~# CreoleCat -s test -o test.fichier -c fichier root@amonecole:~# CreoleCat -s test -o test.partage -c partage root@amonecole:~# md5sum test.partage test.fichier 34890f87ae91d14f077dd439370eabbf test.partage 6c0da116cda3116bb262153b2aeb253f test.fichier
CreoleCat n'est pas fiable !
#3 Mis à jour par Emmanuel GARETTE il y a plus de 9 ans
Voici un code fiable :
root@amonecole:~# cat test.py from creole.client import CreoleClient, NotFoundError import sys cont = sys.argv[1] c = CreoleClient() try: print c.get_group_infos(cont)['interfaces'] except NotFoundError: print c.get_container_infos(cont)['interfaces']
Il faut modifier tous les appels à get_group_infos et get_container_infos par ce code.
Outre le fait que le code est peu compréhensible, il génère inutilement de temps de chargement inutilement lent. Ne voudrait-il mieux pas fusionner les deux méthodes par une seule fiable ?
Avec un conteneur, il génère 31 requêtes sur le serveur et prend 1s50.
Avec un groupe de conteneur, il génère 13 requêtes sur le serveur et prend 1s30.
#4 Mis à jour par Daniel Dehennin il y a plus de 9 ans
Si je comprends bien, il faudrait :
- Retourner les informations du groupe de conteneurs lorsque l’on demande les informations d’un des conteneurs de ce groupe ;
- Retourner les informations du conteneurs s’il ne fait pas parti du groupe.
Dans ce cas, nous pouvons modifier CreoleClient.get_container_infos()
(source:creole/client.py@4183ad6#L608) :
def get_container_infos(self, container): """Get all components of a container or its group :param container: container name :type container: `str` :return: components of the container or its group :rtype: `dict` """ container_info = self.get_container(container) if container != container_info['group']: container_info = self.get_group_infos(container_info['group']) else: container_info.update(self.get_containers_components([container])) return container_info
#5 Mis à jour par Joël Cuissinat il y a plus de 9 ans
- Tâche parente mis à #8326
#6 Mis à jour par Joël Cuissinat il y a plus de 9 ans
- Tâche parente changé de #8326 à #8826
#7 Mis à jour par Daniel Dehennin il y a plus de 9 ans
- Temps estimé mis à 4.00 h
#8 Mis à jour par Daniel Dehennin il y a plus de 9 ans
- Restant à faire (heures) mis à 4.0
#9 Mis à jour par Daniel Dehennin il y a plus de 9 ans
- Statut changé de Nouveau à En cours
#10 Mis à jour par Daniel Dehennin il y a plus de 9 ans
- Assigné à mis à Daniel Dehennin
#11 Mis à jour par Daniel Dehennin il y a plus de 9 ans
- Statut changé de En cours à Résolu
- % réalisé changé de 0 à 100
Appliqué par commit 4f036302e1180407001deab44de6da8e088feb01.
#12 Mis à jour par Joël Cuissinat il y a plus de 9 ans
- Restant à faire (heures)
4.0supprimé
#13 Mis à jour par Benjamin Bohard il y a plus de 9 ans
- Statut changé de Résolu à Fermé
Paquet testé : 2.4.1-11