Projet

Général

Profil

Scénario #29088

Mis à jour par Joël Cuissinat il y a plus de 4 ans

h3. Extrait de la demande originale d'Arnaud Grossir

Bonjour,

Nous avons un serveur thot 2.6.2 mis à jour avec le dernier paquet python-eoleaaf (2.6.2-23)


un "aaf-complet" s'est bien passé (en tout cas je n'ai pas remarqué d'erreurs)


le lendemain, un "aaf-complet-maj" (nous utilisons des extraction AAF complètes) m'a remonté de nouvelles erreurs:

[ ... ] 1) une erreur bloquante sur un "é" majuscule dans les xml de l'AAF:

<pre>
deltas des enseignants...
Traceback (most recent call last):
File "/usr/sbin/genldif.py", line 521, in <module>
ldif_export_maj(sys.argv[2])
File "/usr/sbin/genldif.py", line 299, in ldif_export_maj
ldif_export_enseignants(ldif_dir)
File "/usr/sbin/genldif.py", line 347, in ldif_export_enseignants
'maj_enseignant.ldif', ldap_delta_update_filename)
File "/usr/sbin/genldif.py", line 413, in ldif_export_factory
dico = translator.translate_one(dbname, row)
File "/usr/lib/python2.7/dist-packages/eoleaaf/ldiftranslator.py", line 288, in translate_one
new_row[key] = self.transform_values(key, value, tablename)
File "/usr/lib/python2.7/dist-packages/eoleaaf/ldiftranslator.py", line 158, in transform_values
return fctname(value)
File "/usr/lib/python2.7/dist-packages/eoleaaf/ldiftranslator.py", line 195, in calc_structure_dn
values.append("cn=s{0},{1}${2}".format(struct, structsdn, '$'.join(groups)))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc9' in position 86: ordinal not in range(128)
</pre>


que j'ai résolu en m'inspirant de votre correction sur les 'OE'
dans eoleaaf/utils.py (fonction replace-dangerous_cars)

<pre>
#prevent crashes #28819
'Œ':'OE',
'œ':'oe',
'É':'E',
</pre>

2)erreur bloquante sur la génération de nouveaux id (aaf-complet-maj)

<pre>
Traitement des fichiers _Eleve_

Lecture du fichier /home/aaf-complet/THOT_Complet_20190909_Eleve_0000.xml
Lecture des eleves...
Traceback (most recent call last):
File "/usr/sbin/parseaaf.py", line 12, in <module>
main(path_aaf_complet, reset_db)
File "/usr/lib/python2.7/dist-packages/eoleaaf/parseaaf.py", line 40, in main
parse_xml_files(xmlfile['pattern'], xmlfile['function'], xml_files, aaf)
File "/usr/lib/python2.7/dist-packages/eoleaaf/miscutil.py", line 29, in parse_xml_files
getattr(lib, aaffunc)(fname)
File "/usr/lib/python2.7/dist-packages/eoleaaf/aaf.py", line 411, in parse_aaf_eleves
parse_aaf('eleve', eleve_file, 'Eleve')
File "/usr/lib/python2.7/dist-packages/eoleaaf/aaf.py", line 352, in parse_aaf
uid = userdata['uid'] = get_new_id(rnd_buffer, sqlgen)
File "/usr/lib/python2.7/dist-packages/eoleaaf/util.py", line 743, in get_new_id
letters, numbers = make_unique_random_id(rnd_buffer, sqlgen)
File "/usr/lib/python2.7/dist-packages/eoleaaf/util.py", line 730, in make_unique_random_id
raise Exception('cannot generate ID')
Exception: cannot generate ID
</pre>

Là, j'avoue que j'ai un peu triché, j'ai modifié le code de /usr/lib/python2.7/dist-packages/eoleaaf/util.py
(fonction def make_unique_random_id(rnd_buffer, sqlgen))
if idx == 10:

Car je pensait que "10" était un peu petit comme chiffre. Nous avons actuellement + de 95000 randomids dans la base mysql eoleaaf
J'ai passé le nombre maximum d'essais à 100. Quelques nouveaux ID ont été créés, puis ça a replanté...
J'ai augmenté jusque 1000000 (un million) et quelques nouveaux ID sont passés puis ça a replanté. J'ai trouvé ça vraiment étrange...
En fait il a fallu que je lance une bonne dizaine de fois aaf-complet-maj pour que tout passe.

Je pense que dans votre fonction def make_unique_random_id, il y a quelque chose qui ne se passe pas toujours bien.
On dirait qu'elle ne prend pas vraiment en compte la re-génération d'un identifiant (l'except de DatabaseError semble poser un pb...
peut-être mettre un bloc "else:" et/ou "finally:" à ajouter ?
mais en lisant la fonction, elle me semble vraiment bien...
le code sous l'except devrait s'exécuter puis la fonction devrait remonter au niveau du try...
ou alors c'est qu'une erreur est soulevée dans dans le bloc try et qu'elle n'est pas interceptée par l'except...
c'est un autre type que "Database"...?)

J'ai vérifié:le script génère bien des identifiants qui n'existent pas dans la base mais ça ne s'insère pas.

3) erreur non bloquante mais génératrice d'incohérences (une partie du point 5 de ma dernière demande) (nb : #28733)

Certains enseignants ont des cours sur deux établissements (leur établissement de rattachement + un autre), mais lors
de l'aaf-complet-maj, les fichiers finaux ldif contiennent bien les deux lignes attendues mais elles ne sont pas cohérentes.
(j'ai repéré pour les professeurs les attributs
"ENTAuxEnsMatiereEnseignEtab" et "ENTAuxEnsClasses", mais il y en a peut-être d'autres...)

J'ai donc vérifié pour une enseignante de musique qui a ce problème (j'ai anonymisé la personne):

-le fichier AAF est correct elle a un etablissement de rattachement:1535 et un autre établissement ou elle dispense des cours également:1441
<pre>
<addRequest>
<operationalAttributes><attr name="categoriePersonne"><value>PersEducNat</value></attr></operationalAttributes>
<identifier><id>15381</id></identifier>
<attributes>
<attr name="ENTPersonJointure"><value>15381</value></attr>
<attr name="ENTPersonDateNaissance"><value>XXXXXXXXXX</value></attr>
<attr name="ENTPersonNomPatro"><value>XXXXXXXX</value></attr>
<attr name="sn"><value>XXXXXXXX</value></attr>
<attr name="givenName"><value>XXXXXXX</value></attr>
<attr name="personalTitle"><value>Mme</value></attr>
<attr name="mail"><value>XXXXXXXXXXXX</value></attr>
<attr name="ENTPersonStructRattach"><value>1535</value></attr>
<attr name="ENTAuxEnsCategoDiscipline"><value>17$EDUCATION MUSICALE</value></attr>
<attr name="ENTAuxEnsDisciplinesPoste"><value>EDUCATION MUSICALE$17</value></attr>
<attr name="ENTAuxEnsMEF"><value>1535$10310019110$3EME</value><value>1535$1031001911U$3EME ULIS</value><value>1535$1021000111U$4EME ULIS</value><value>1535$10210001110$4EME</value><value>1535$10110001110$5EME</value><value>1535$1011000111U$5EME ULIS</value><value>1535$10010012110$6EME</value><value>1535$1001001211U$6EME ULIS</value><value>1441$10210001110$4EME</value><value>1441$1021000111U$4EME ULIS</value><value>1441$10210001117$4EME SPORTIVE</value><value>1441$10010012110$6EME</value><value>1441$10010012117$6EME SPORTIVE</value></attr>
<attr name="ENTAuxEnsMatiereEnseignEtab"><value>1535$EDUCATION MUSICALE</value><value>1441$EDUCATION MUSICALE</value></attr>
<attr name="ENTAuxEnsClasses"><value>1535$3A</value><value>1535$3B</value><value>1535$3C</value><value>1535$4A</value><value>1535$4B</value><value>1535$4C</value><value>1535$5A</value><value>1535$5B</value><value>1535$5C</value><value>1535$6A</value><value>1535$6B</value><value>1535$6C</value><value>1441$42</value><value>1441$46</value><value>1441$67</value><value>1441$68</value></attr>
<attr name="ENTAuxEnsGroupes"><value/></attr>
<attr name="ENTAuxEnsClassesMatieres"><value>1535$3A$081300</value><value>1535$3B$081300</value><value>1535$3C$081300</value><value>1535$4A$081300</value><value>1535$4B$081300</value><value>1535$4C$081300</value><value>1535$5A$081300</value><value>1535$5B$081300</value><value>1535$5C$081300</value><value>1535$6A$081300</value><value>1535$6B$081300</value><value>1535$6C$081300</value><value>1441$42$081300</value><value>1441$46$081300</value><value>1441$67$081300</value><value>1441$68$081300</value></attr>
<attr name="ENTAuxEnsGroupesMatieres"><value/></attr>
<attr name="ENTAuxEnsClassesPrincipal"><value/></attr>
<attr name="ENTPersonFonctions"><value>1535$ENS$ENSEIGNEMENT$L1700$EDUCATION MUSICALE</value><value>1441$ENS$ENSEIGNEMENT$L1700$EDUCATION MUSICALE</value></attr>
<attr name="ENTPersonCategorieEnseignant"><value>O</value></attr>
<attr name="PersEducNatPresenceDevantEleves"><value>O</value></attr>
</attributes>
</addRequest>
</pre>

La base eoleaaf est correcte, et contient de bons renseignements. Vous remarquerez que j'ai également récupéré l'ENTPersonFonctions... vous verrez pourquoi ensuite.
<pre>
mysql> select ENTPersonFonctions from enseignant where uid='DKS99535';
+-----------------------------------------------------------------------------------------------+
| ENTPersonFonctions |
+-----------------------------------------------------------------------------------------------+
| 1535$ENS$ENSEIGNEMENT$L1700$EDUCATION MUSICALE
1441$ENS$ENSEIGNEMENT$L1700$EDUCATION MUSICALE |
+-----------------------------------------------------------------------------------------------+
1 row in set (0,01 sec)

mysql> select ENTAuxEnsMatiereEnseignEtab from enseignant where uid='DKS99535';
+-------------------------------------------------+
| ENTAuxEnsMatiereEnseignEtab |
+-------------------------------------------------+
| 1535$EDUCATION MUSICALE
1441$EDUCATION MUSICALE |
+-------------------------------------------------+
1 row in set (0,00 sec)
</pre>

Ensuite c'est là que ça se complique, le traitement mysql->fichiers ldif ne prend que l'autre établissement (1441) alors que l'attribut
ENTPersonFonctions est correct (comme s'il passait par un autre traitement dans les scripts python):
<pre>
dn: uid=DKS99535,ou=personnes,dc=enoe,dc=net
changetype: modify
etc etc...
-
replace: ENTPersonStructRattach
ENTPersonStructRattach: cn=s1535,ou=structures,dc=enoe,dc=net
-
replace: ENTPersonFonctions
ENTPersonFonctions: 1535$ENS$ENSEIGNEMENT$L1700$EDUCATION MUSICALE
ENTPersonFonctions: 1441$ENS$ENSEIGNEMENT$L1700$EDUCATION MUSICALE
-
replace: ENTPersonDateNaissance
ENTPersonDateNaissance: 14/04/1978
-
replace: ENTAuxEnsCategoDiscipline
ENTAuxEnsCategoDiscipline: 17$EDUCATION MUSICALE
-
replace: ENTAuxEnsMatiereEnseignEtab
ENTAuxEnsMatiereEnseignEtab: cn=s1441,ou=structures,dc=enoe,dc=net$EDUCATION MUSICALE
ENTAuxEnsMatiereEnseignEtab: cn=s1441,ou=structures,dc=enoe,dc=net$EDUCATION MUSICALE
-
replace: ENTAuxEnsClasses
ENTAuxEnsClasses: cn=s1441,ou=structures,dc=enoe,dc=net$3A$3B$3C$4A$4B$4C$5A$5B$5C$6A$6B$6C
ENTAuxEnsClasses: cn=s1441,ou=structures,dc=enoe,dc=net$42$46$67$68
</pre>

et dans le ldap (l'annuaire en cours sur Thot) j'ai ceci, (c'est l'établissement principal qui 1535 qui est présent à des places où l'on devrait trouver 1441):

<pre>
ENTPersonStructRattach: cn=s1535,ou=structures,dc=enoe,dc=net
ENTPersonFonctions: 1535$ENS$ENSEIGNEMENT$L1700$EDUCATION MUSICALE
ENTPersonFonctions: 1441$ENS$ENSEIGNEMENT$L1700$EDUCATION MUSICALE
etc etc
ENTAuxEnsCategoDiscipline: 17$EDUCATION MUSICALE
ENTAuxEnsMatiereEnseignEtab: cn=s1535,ou=structures,dc=enoe,dc=net$EDUCATION MUSICALE
ENTAuxEnsMatiereEnseignEtab: cn=s1535,ou=structures,dc=enoe,dc=net$EDUCATION MUSICALE
ENTAuxEnsClasses: cn=s1535,ou=structures,dc=enoe,dc=net$3A$3B$3C$4A$4B$4C$5A$5
B$5C$6A$6B$6C
ENTAuxEnsClasses: cn=s1535,ou=structures,dc=enoe,dc=net$42$46$67$68
</pre>
</pre>

C'est assez déroutant, on dirait (ce n'est qu'une supposition)
- que aaf-complet met l'établissement de rattachement (1535) à la place du second etablissement (1441)
- que aaf-complet-maj fait exactement l'inverse

D'autre part, je ne comprend pas comment on peut avoir ces deux valeurs identiques dans l'annuaire actif, ça devrait soulever une erreur ?!:
ENTAuxEnsMatiereEnseignEtab: cn=s1535,ou=structures,dc=enoe,dc=net$EDUCATION MUSICALE
ENTAuxEnsMatiereEnseignEtab: cn=s1535,ou=structures,dc=enoe,dc=net$EDUCATION MUSICALE

Voilà, merci encore pour le travail déjà effectué.. et pour celui arrive en cet instant !

Cordialement

h3. Solutions à mettre en œuvre

* implémenter les évolutions sur EOLE >= 2.6.2
* reproduire étudier et corriger le problème
* tester la non régression dans le test Jenkins "test-thot-aaf-complet-1901":https://dev-eole.ac-dijon.fr/jenkins/job/2.6.2/job/test-thot-aaf-complet-1901-2.6.2-amd64/

h3. Critères d'acceptation

le test Jenkins "test-thot-aaf-complet-1901":https://dev-eole.ac-dijon.fr/jenkins/job/2.6.2/job/test-thot-aaf-complet-1901-2.6.2-amd64/ est passant

Retour