]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA9/Macro/test_temps_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA9 / Macro / test_temps_ops.py
1 #@ MODIF test_temps_ops Macro  DATE 05/09/2008   AUTEUR COURTOIS M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2008  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
9 # (AT YOUR OPTION) ANY LATER VERSION.                                                  
10 #                                                                       
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
15 #                                                                       
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
19 # ======================================================================
20 # RESPONSABLE COURTOIS M.COURTOIS
21
22 """
23 for m in clpaster clp50a8 claut626 clau5aaa aster
24 do
25    echo "------ $m   :  `ssh $m hostid` -------"
26    ssh $m cat /proc/cpuinfo > $m.cpuinfo
27    ssh $m python -c '"import os ; print os.uname()[-1]"'
28    grep 'cpu MHz' $m.cpuinfo | head -1
29    grep -i bogomips $m.cpuinfo | head -1
30 done
31 """
32
33 import sys
34 import os
35 import re
36 from glob import glob
37
38 #-------------------------------------------------------------------------------
39 # formats
40 tab_header = """
41    !--------------------------------------------------------------------------------------------------!
42    ! Commande               ! Ordre  ! Reference  ! Mesure     ! Difference ! Tolerance  ! Diagnostic !
43    !--------------------------------------------------------------------------------------------------!"""
44 tab_line = """   ! %(cmde)-22s ! %(nume)6d ! %(refe)10.2f ! %(vale)10.2f ! %(diff)10.2f ! %(prec)10.2f !    %(diag)4s    !"""
45 tab_footer = """   !--------------------------------------------------------------------------------------------------!
46 """
47
48 #-------------------------------------------------------------------------------
49 def get_idperf(conf):
50    """Retourne l'identifiant utilisé pour la mesure des performances.
51    Soit on le trouve dans le fichier config.txt de la version utilisée,
52    soit on le détermine à partir de : "kernel name - hardware name"
53    """
54    machine = ''
55    compiler = 'unknown'
56    if conf is not None:
57       machine = conf['ID_PERF'][0]
58       compiler = os.path.basename(conf['F77'][0].split()[0])
59    
60    if machine == '':
61       machine = '%s-%s-%s' %(os.uname()[0], os.uname()[4], compiler)
62    return machine
63
64 #-------------------------------------------------------------------------------
65 def as_list(value):
66    """Retourne 'value' si c'est une liste, sinon le singleton [value,]."""
67    if type(value) not in (list, tuple):
68       value = [value,]
69    return value
70
71 #-------------------------------------------------------------------------------
72 def test_temps_ops(self, RESU, INFO, **args):
73    """
74    Macro TEST_TEMPS permettant de vérifier le temps passé dans les commandes.
75    """
76    import aster
77    from Accas import _F
78    from Utilitai.Utmess import UTMESS, MessageLog
79    from Utilitai.System import ExecCommand
80
81    # On importe les definitions des commandes a utiliser dans la macro
82    # Le nom de la variable doit etre obligatoirement le nom de la commande
83    DETRUIRE        = self.get_cmd('DETRUIRE')
84    CREA_TABLE      = self.get_cmd('CREA_TABLE')
85    TEST_TABLE      = self.get_cmd('TEST_TABLE')
86    
87    #----------------------------------------------
88    ier = 0
89    # La macro compte pour 1 dans la numerotation des commandes
90    self.set_icmd(1)
91
92    # ----- récupération du fichier de config
93    ficconf = '?'
94    conf = None
95    try:
96       # recuperation de la variable ASTER_ROOT
97       aster_root = os.environ.get('ASTER_ROOT')
98       assert aster_root != None, "<TEST_TEMPS> Variable d'environnement ASTER_ROOT non definie."
99       sys.path.append(os.path.join(aster_root, 'ASTK', 'ASTK_SERV', 'lib'))
100       from as_profil import ASTER_PROFIL
101       from as_config import ASTER_CONFIG
102       
103       l_export = glob('*.export')
104       assert len(l_export) > 0, "<TEST_TEMPS> pas de fichier export dans le repertoire de travail."
105       
106       ficconf = 'config.txt'
107       if not os.path.isfile(ficconf):         # if as_run.__version__ < 1.6.3
108          prof = ASTER_PROFIL(l_export[0])
109          if prof.Get('D', typ='conf'):
110             print '<TEST_TEMPS> Surcharge du fichier config.txt non supportée.'
111          REPREF  = os.path.join(aster_root, prof['version'][0])
112          ficconf = os.path.join(REPREF, 'config.txt')
113       conf = ASTER_CONFIG(ficconf)
114    except Exception, err:
115       print err
116       
117    machine = get_idperf(conf)
118    
119    # liste des timers par ordre d'apparition : dict_cmde['commande'] = [timer1, timer2, ...]
120    dict_cmde = {}
121    for num, timer in self.jdc.timer.getsortedtimers():
122       cmde  = timer['name']
123       dict_cmde[cmde] = dict_cmde.get(cmde, [])
124       dict_cmde[cmde].append(timer)
125    
126    tab = get_cmde_timers(self.jdc)
127    if INFO == 2:
128       aster.affiche('MESSAGE', repr(tab))
129    
130    #----------------------------------------------
131    # boucle sur les commandes a tester
132    alarm9 = True
133    infos = []
134    for res_i in RESU:
135          dres = res_i.cree_dict_valeurs(res_i.mc_liste)
136          current = {
137             'cmde' : dres['COMMANDE'],
138             'nume' : dres['NUME_ORDRE'],
139             'refe' : 0.,
140             'vale' : 0.,
141             'diff' : 0.,
142             'prec' : 0.,
143             'diag' : 'NOOK',
144          }
145          error = False
146          l_mach = as_list(dres['MACHINE'])
147          l_vale = as_list(dres['VALE'])
148          if len(l_mach) != len(l_vale):
149             UTMESS('E', 'TEST0_10')
150             error = True
151
152          l_prec = as_list(dres['PRECISION'])
153          if len(l_prec) == 1:
154             l_prec = l_prec * len(l_vale)
155          if len(l_prec) != len(l_vale):
156             UTMESS('E', 'TEST0_8')
157             error = True
158
159          tres = (tab.COMMANDE == dres['COMMANDE']) & (tab.NUME_ORDRE == dres['NUME_ORDRE'])
160          if len(tres) != 1:
161             UTMESS('E', 'TEST0_7', valk=dres['COMMANDE'], vali=dres['NUME_ORDRE'])
162             error = True
163          
164          if error:
165             infos.append(current)
166             continue
167
168          # comparaison des valeurs
169          valtest = getattr(tres, dres['TYPE_TEST'])
170          assert len(valtest) == 1, 'TYPE_TEST invalide'
171          valtest = valtest[0]
172          
173          current['vale'] = valtest
174
175          # reference, precision
176          dref = {}
177          for mach, vale, precision in zip(l_mach, l_vale, l_prec):
178             if dres['CRITERE'] == 'RELATIF':
179                precision = precision * vale
180             dref[mach.upper()] = {
181                'vale'   : vale,
182                'prec'   : precision,
183                'valmin' : vale - precision,
184                'valmax' : vale + precision
185             }
186          dmach = dref.get(machine.upper())
187          # si on n'a pas de référence pour cette machine, on prend la première
188          if not dmach:
189             dmach = dref[l_mach[0].upper()]
190             if alarm9:
191                alarm9 = False
192                UTMESS('A', 'TEST0_9', valk=(machine, l_mach[0]))
193          current['refe'] = dmach['vale']
194          current['prec'] = dmach['prec']
195          current['diff'] = valtest - dmach['vale']
196          if dmach['valmin'] < valtest < dmach['valmax']:
197             current['diag'] = 'OK'
198          infos.append(current)
199    
200    # tableau de resultats
201    text_id = MessageLog.GetText('I', 'TEST0_5', valk=(ficconf, machine))
202    is_ok = 1
203    txt = [text_id, tab_header,]
204    for line in infos:
205       txt.append(tab_line % line)
206       if line['diag'] != 'OK':
207          is_ok = 0
208    txt.append(tab_footer)
209    for unit in ('MESSAGE', 'RESULTAT'):
210       aster.affiche(unit, os.linesep.join(txt))
211
212    # test_resu
213    tab1__ = CREA_TABLE(LISTE=(_F(PARA='DIAGNOSTIC',  LISTE_I=is_ok),),)
214    
215    TEST_TABLE(TABLE=tab1__,
216               NOM_PARA='DIAGNOSTIC',
217               VALE_I=1,
218               CRITERE='ABSOLU',
219               PRECISION=0,)
220
221    return ier
222
223
224 #-------------------------------------------------------------------------------
225 def get_cmde_timers(jdc):
226    """Retourne un objet Table contenant les mesures de temps pour
227    les commandes terminées.
228    """
229    from Utilitai.Table import Table
230    tab = Table()
231
232    # liste des timers par ordre d'apparition
233    dnum = {}
234    for num, timer in jdc.timer.getsortedtimers():
235       if timer['state'] != 'stop' \
236             or re.sub('[A-Z_]', '', timer['name']).strip() != '':  # timers superviseur
237          continue
238       line = {}
239       for k in ('name', 'cpu_dt', 'sys_dt', 'tot_dt'):
240          line[k] = timer[k]
241       line['USER+SYS'] = timer['cpu_dt'] + timer['sys_dt']
242       dnum[line['name']] = dnum.get(line['name'], 0) + 1
243       line['NUME_ORDRE'] = dnum[line['name']]
244       tab.append(line)
245    tab.Renomme('name',   'COMMANDE')
246    tab.Renomme('cpu_dt', 'USER')
247    tab.Renomme('sys_dt', 'SYSTEM')
248    tab.Renomme('tot_dt', 'ELAPSED')
249    tab = tab['NUME_ORDRE', 'COMMANDE', 'USER', 'SYSTEM', 'USER+SYS', 'ELAPSED']
250    return tab
251