Scénario #28951
Thot et import AAF au format ENT2VA: erreurs restantes
100%
Description
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:
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)
que j'ai résolu en m'inspirant de votre correction sur les 'OE'
dans eoleaaf/utils.py (fonction replace-dangerous_cars)
#prevent crashes #28819 'Œ':'OE', 'œ':'oe', 'É':'E',
2)erreur bloquante sur la génération de nouveaux id (aaf-complet-maj)
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
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)
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
<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>
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.
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)
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):
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
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):
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
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
Subtasks
Related issues
History
#1 Updated by arnaud grossir about 4 years ago
Bonjour,
Afin d'avancer un peu sur le point 2 de ma demande, j'ai modifié le script /usr/lib/python2.7/dist-packages/eoleaaf/util.py (afin d'avoir + d'infos dans mon log) ainsi:
def make_unique_random_id(rnd_buffer, sqlgen):
"""generates a unique id for the 'ENTPersons'
it uses the primary key in the 'randomids' sql table
while an id exists in the table, it is calculated again
"""
rnd = random_identifier()
rndfind = True
idx = 0
print "insert rnd: ", idx, rnd
while rndfind:
print "debut while"
idx += 1
try:
print "debut try"
if dbtype == "mongodb":
if rnd in rnd_buffer or db.fetchone("user", "uid", rnd):
rnd = random_identifier()
else:
rndfind = False
rnd_buffer.append(rnd)
else:
sql = sqlgen.insert({'id': rnd}, 'randomids')
print sql
db.execute(sql)
print "après db.execute"
rndfind = False
except DatabaseError as e:
print "Exception !", e
rndold = rnd
rnd = random_identifier()
print " nouveau rnd: ", idx, rnd, "ancien=", rndold
if idx == 10:
raise Exception('cannot generate ID')
return rnd.split("-")
Ce fut très instructif car je me suis rendu compte que l'incrément idx du loop fonctionnait très bien mais que mysql rejouait sans cesse le même insert sql lors de l'interception d'un DatabaseError:
insert rnd: 0 LZ-4843 debut while debut try INSERT into randomids (id) VALUES ("LZ-4843" ) ; Exception ! SQL error, (1062, "Duplicate entry 'LZ-4843' for key 'PRIMARY'") nouveau rnd: 1 SI-3387 ancien= LZ-4843 debut while debut try INSERT into randomids (id) VALUES ("SI-3387" ) ; Exception ! SQL error, (1062, "Duplicate entry 'LZ-4843' for key 'PRIMARY'") nouveau rnd: 2 IC-6089 ancien= SI-3387 debut while debut try INSERT into randomids (id) VALUES ("IC-6089" ) ; Exception ! SQL error, (1062, "Duplicate entry 'LZ-4843' for key 'PRIMARY'") nouveau rnd: 3 MX-7738 ancien= IC-6089 debut while debut try INSERT into randomids (id) VALUES ("MX-7738" ) ; Exception ! SQL error, (1062, "Duplicate entry 'LZ-4843' for key 'PRIMARY'") nouveau rnd: 4 GY-9882 ancien= MX-7738 debut while debut try INSERT into randomids (id) VALUES ("GY-9882" ) ; Exception ! SQL error, (1062, "Duplicate entry 'LZ-4843' for key 'PRIMARY'") nouveau rnd: 5 YK-3037 ancien= GY-9882 debut while debut try INSERT into randomids (id) VALUES ("YK-3037" ) ; Exception ! SQL error, (1062, "Duplicate entry 'LZ-4843' for key 'PRIMARY'") nouveau rnd: 6 EU-9876 ancien= YK-3037 debut while debut try INSERT into randomids (id) VALUES ("EU-9876" ) ; Exception ! SQL error, (1062, "Duplicate entry 'LZ-4843' for key 'PRIMARY'") nouveau rnd: 7 ZW-8216 ancien= EU-9876 debut while debut try INSERT into randomids (id) VALUES ("ZW-8216" ) ; Exception ! SQL error, (1062, "Duplicate entry 'LZ-4843' for key 'PRIMARY'") nouveau rnd: 8 UC-2821 ancien= ZW-8216 debut while debut try INSERT into randomids (id) VALUES ("UC-2821" ) ; Exception ! SQL error, (1062, "Duplicate entry 'LZ-4843' for key 'PRIMARY'") nouveau rnd: 9 QA-6797 ancien= UC-2821 debut while debut try INSERT into randomids (id) VALUES ("QA-6797" ) ; Exception ! SQL error, (1062, "Duplicate entry 'LZ-4843' for key 'PRIMARY'") nouveau rnd: 10 XK-5759 ancien= QA-6797 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 450, in parse_aaf_profs parse_aaf('administratif', profs_file, 'PersEducNat') 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 755, in get_new_id letters, numbers = make_unique_random_id(rnd_buffer, sqlgen) File "/usr/lib/python2.7/dist-packages/eoleaaf/util.py", line 742, in make_unique_random_id raise Exception('cannot generate ID') Exception: cannot generate ID
Après un rapide coup d'oeil je me suis apercu que vous initiez votre connection à mysql en autocommit=false, donc je me suis dit qu'un petit coup de db.commit ferait peut être du bien après l'interception de l'erreur
Donc j'ai ajouté ce db.commit(None)... et là ça fonctionne !
Je vous laisse le soin de vérifier cette hypothèse de résolution (peut-être qu'une autre solution existe, plus simple, mais j'ai fait vite)
def make_unique_random_id(rnd_buffer, sqlgen):
"""generates a unique id for the 'ENTPersons'
it uses the primary key in the 'randomids' sql table
while an id exists in the table, it is calculated again
"""
rnd = random_identifier()
rndfind = True
idx = 0
print "insert rnd: ", idx, rnd
while rndfind:
print "debut while"
idx += 1
try:
print "debut try"
if dbtype == "mongodb":
if rnd in rnd_buffer or db.fetchone("user", "uid", rnd):
rnd = random_identifier()
else:
rndfind = False
rnd_buffer.append(rnd)
else:
sql = sqlgen.insert({'id': rnd}, 'randomids')
print sql
db.execute(sql)
print "après db.execute"
rndfind = False
except DatabaseError as e:
print "Exception !", e
db.commit(None)
rndold = rnd
rnd = random_identifier()
print " nouveau rnd: ", idx, rnd, "ancien=", rndold
if idx == 10:
raise Exception('cannot generate ID')
return rnd.split("-")
et là ça fonctionne
... insert rnd: 0 ZP-7256 debut while debut try INSERT into randomids (id) VALUES ("ZP-7256" ) ; Exception ! SQL error, (1062, "Duplicate entry 'ZP-7256' for key 'PRIMARY'") nouveau rnd: 1 EH-0036 ancien= ZP-7256 debut while debut try INSERT into randomids (id) VALUES ("EH-0036" ) ; après db.execute ... etc etc
Voilà, en espérant que ça vous aide un peu :)
#2 Updated by Joël Cuissinat about 4 years ago
- Due date set to 09/02/2019
- Start date changed from 09/12/2019 to 09/02/2019
- Follows Scénario #28733: Thot et import AAF au format ENT2VA: nombreuses erreurs added
#3 Updated by Joël Cuissinat about 4 years ago
- Tracker changed from Demande to Scénario
- Due date changed from 09/02/2019 to 10/11/2019
- Assigned To set to Joël Cuissinat
- Target version set to sprint 2019 39-41 Equipe MENSR
- Start date changed from 09/02/2019 to 09/12/2019
- Release set to EOLE 2.7.1.2
- Story points set to 4.0
#4 Updated by Joël Cuissinat almost 4 years ago
- Copied to Scénario #29088: Les établissements de rattachement doivent être corrects dans l'annuaire Thot added
#5 Updated by Joël Cuissinat almost 4 years ago
- Status changed from Nouveau to Terminé (Sprint)