Project

General

Profile

Scénario #28951

Thot et import AAF au format ENT2VA: erreurs restantes

Added by arnaud grossir over 3 years ago. Updated over 3 years ago.

Status:
Terminé (Sprint)
Priority:
Normal
Assigned To:
Category:
-
Start date:
09/23/2019
Due date:
10/11/2019
% Done:

100%

Story points:
4.0
Remaining (hours):
0.00 hour
Velocity based estimate:
Release:
Release relationship:
Auto

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

Tâche #28977: Vérifier et résoudre le problème d'encodage signaléFerméJoël Cuissinat

Tâche #28978: Vérifier et résoudre le problème de génération des nouveaux identifiants uniquesFerméJoël Cuissinat


Related issues

Follows Thot - Scénario #28733: Thot et import AAF au format ENT2VA: nombreuses erreurs Terminé (Sprint) 06/07/2019 08/30/2019
Copied to Thot - Scénario #29088: Les établissements de rattachement doivent être corrects dans l'annuaire Thot Terminé (Sprint) 09/23/2019 11/22/2019

History

#1 Updated by arnaud grossir over 3 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 over 3 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 over 3 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 over 3 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 over 3 years ago

  • Status changed from Nouveau to Terminé (Sprint)

Also available in: Atom PDF