Projet

Général

Profil

Tâche #12764

Distribution EOLE - Scénario #12978: Assistance aux utilisateurs (39-41)

Diagnose des conteneurs de fonctionne pas

Ajouté par Philippe Caseiro il y a plus de 8 ans. Mis à jour il y a plus de 8 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Début:
01/09/2015
Echéance:
% réalisé:

100%

Temps estimé:
1.00 h
Temps passé:
Restant à faire (heures):
0.0

Description

Sur un AmonEcole 2.5 les conteneurs sont toujours en erreur dans le diagnose même si tout vas bien.

Il semblerais que la commande lxc-info ai légèrement changé.

En 2.4 elle affiche

status: RUNNING

en 2.5 elle affiche

Status: RUNNING

Le code de pyeole diagnose cherche "status" et non "Status".


Demandes liées

Lié à Distribution EOLE - Tâche #13120: Générer l’image ISO 2.5.1-β1 Fermé 22/09/2015
Lié à Distribution EOLE - Tâche #23205: Problème au diagnose en mode conteneur Fermé 05/03/2018

Révisions associées

Révision 42b7d766 (diff)
Ajouté par Daniel Dehennin il y a plus de 8 ans

Correction du diagnose « test_containers() »

Les variables « OK » et « NOK » ne doivent pas être évaluées dans un
contexte booléen.

De plus, la commande « lxc-info » a évolué et permet de n’interroger que
l’état d’un conteneur, évitant d’avoir à chercher parmis plusieurs
lignes.

  • pyeole/diagnose/diagnose.py (test_container): Nouvelle fonction
    testant si le status LXC d’un conteneur est « RUNNING » et si l’accès
    SSH est fonctionnel.
    (test_containers): Utilisation de la nouvelle fonction.

Ref: #12764

Historique

#1 Mis à jour par Philippe Caseiro il y a plus de 8 ans

  • Projet changé de eole-common à python-pyeole

#3 Mis à jour par Daniel Dehennin il y a plus de 8 ans

En fait il s’agit d’une erreur basique de logique.

OK = 0
NOK = 1
NOT_AVAILABLE = 2

On ne peut pas utiliser ces valeurs en tant que booléen.

Je propose le diff suivant:

diff --git a/pyeole/diagnose/diagnose.py b/pyeole/diagnose/diagnose.py
index 93d957b..560f2a9 100644
--- a/pyeole/diagnose/diagnose.py
+++ b/pyeole/diagnose/diagnose.py
@@ -273,12 +273,11 @@ def test_containers():
                 state:   RUNNING
                 pid:     19301
             """ 
-            is_stated = NOK
+            ret[container] = False
             for line in out.split('\n'):
-                if line.startswith('state: ') and line.split()[-1] == 'RUNNING':
-                    is_stated = OK
+                if line.startswith('State: ') and line.split()[-1] == 'RUNNING':
+                    ret[container] = True
                     break
-            ret[container] = is_stated
     return ret

#4 Mis à jour par Daniel Dehennin il y a plus de 8 ans

Il y a beaucoup mieux en fait:

diff --git a/pyeole/diagnose/diagnose.py b/pyeole/diagnose/diagnose.py
index 93d957b..a8eef36 100644
--- a/pyeole/diagnose/diagnose.py
+++ b/pyeole/diagnose/diagnose.py
@@ -26,7 +26,9 @@ import logging

 from creole.client import CreoleClient
 from creole.config import VIRTMASTER
-from pyeole.process import system_code, system_out
+from pyeole.process import system_code
+from pyeole.process import system_out
+from pyeole.process import tcpcheck

 log = logging.getLogger(__name__)

@@ -258,27 +260,50 @@ def test_clamd():
         return ''

+def test_container(name, ip=None):
+    """Test if a container is running and reachable
+
+    Check the state with the ``lxc-info`` command.
+
+    If :data:`ip` is provided and the state is OK, check if SSH port
+    is open.
+
+    :param name: name of the container
+    :type name: `str`
+    :return: if the container is running and reachable
+    :rtype: `bool`
+
+    """ 
+    is_running = False
+    code, out, err = system_out(['lxc-info', '--state', '-n', name])
+    if code == 0:
+        """ 
+        lxc-info --state returns something like:
+            State:   RUNNING
+        """ 
+        is_running = out.strip().endswith('RUNNING')
+
+    if is_running and ip is not None:
+        is_running = tcpcheck(ip, '22', '2')
+
+    return is_running
+
+
 def test_containers():
+    """Check if the containers are running
+
+    :return: The running state for each container
+    :rtype: `dict`
+
+    """ 
     client = CreoleClient()
     ret = {}
     for container in client.get_groups():
         if container in ['all', VIRTMASTER]:
             continue
-        code, out, err = system_out(['lxc-info', '-n', container])
-        if code != 0:
-            ret[container] = False
-        else:
-            """ 
-            lxc-info returns something like:
-                state:   RUNNING
-                pid:     19301
-            """ 
-            is_stated = NOK
-            for line in out.split('\n'):
-                if line.startswith('state: ') and line.split()[-1] == 'RUNNING':
-                    is_stated = OK
-                    break
-            ret[container] = is_stated
+        ip = client.get_creole('adresse_ip_{0}'.format(container))
+        ret[container] = test_container(container, ip)
+
     return ret

J’ai ça sur une branche, à voir si nous l’appliquons pour la 2.5.1.

#5 Mis à jour par Daniel Dehennin il y a plus de 8 ans

  • Tâche parente mis à #12978

#6 Mis à jour par Daniel Dehennin il y a plus de 8 ans

  • Assigné à mis à Daniel Dehennin
  • Restant à faire (heures) mis à 1.0

#7 Mis à jour par Daniel Dehennin il y a plus de 8 ans

  • Statut changé de Nouveau à En cours
  • % réalisé changé de 0 à 100

Passage du patch en 2.5.1.

#8 Mis à jour par Daniel Dehennin il y a plus de 8 ans

  • Restant à faire (heures) changé de 1.0 à 0.25

#9 Mis à jour par Scrum Master il y a plus de 8 ans

  • Statut changé de En cours à Résolu

#10 Mis à jour par Joël Cuissinat il y a plus de 8 ans

  • Statut changé de Résolu à Fermé
  • Restant à faire (heures) changé de 0.25 à 0.0

OK

#11 Mis à jour par Joël Cuissinat il y a environ 6 ans

  • Lié à Tâche #23205: Problème au diagnose en mode conteneur ajouté

Formats disponibles : Atom PDF