1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2024 CEA/DEN, EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
33 from datetime import datetime
40 def unProxyfy( objs ):
42 objs is a list of SenderByte
45 fileNamesProxyOut = []
47 ret3 = pickle.loads( SALOME_PyNode.SeqByteReceiver(ret2).data() )
49 fileNameProxyOut = None
50 if SALOME_PyNode.GetBigObjectOnDiskThreshold() != -1:
51 if isinstance( ret3, SALOME_PyNode.BigObjectOnDiskBase ):
54 raise RuntimeError("Oooops")
55 ret3.unlinkOnDestructor()
56 fileNameProxyOut = ret3.getFileName()
57 logging.debug("Prxy file : {}".format( fileNameProxyOut ))
59 fileNamesProxyOut.append( fileNameProxyOut )
60 return ret, fileNamesProxyOut
62 class testPerfLogManager1(unittest.TestCase):
63 def testPerfLogManager0(self):
65 [EDF29150] : This test checks measure performance methods
67 hostname = "localhost"
68 cp = pylauncher.GetRequestForGiveContainer(hostname,"container_test")
72 with SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.FileSystemMonitoring(1000,os.path.dirname( salome.__file__ )) ) as monitoringParamsForFileMaster:
73 with SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.CPUMemoryMonitoring(1000) ) as monitoringParamsMaster:
74 with tempfile.TemporaryDirectory() as tmpdirnameMonitoring:
75 monitoringFile = os.path.join( str( tmpdirnameMonitoring ), "zeHtop.pckl" )
76 monitoringFileTwo = os.path.join( str( tmpdirnameMonitoring ), "zeHtopTwo.pckl" )
77 iorLogm = os.path.join( str( tmpdirnameMonitoring ), "logm.ior" )
78 with open(iorLogm,"w") as f:
79 f.write( salome.orb.object_to_string(salome.logm) )
80 logging.debug("Monitoring file : {}".format(monitoringFile))
81 with tempfile.TemporaryDirectory() as tmpdirname:
82 with salome.LogManagerLaunchMonitoringFileCtxMgr(250,monitoringFile) as monitoringParams:
83 pyFileContainingCodeOfMonitoring = monitoringParams.pyFileName.filename
84 logging.debug("Python file containing code of monitoring : {}".format(pyFileContainingCodeOfMonitoring))
85 val_for_big_obj = str( tmpdirname )
86 KernelBasis.SetBigObjOnDiskDirectory( val_for_big_obj )
87 # Override environement for all containers launched
88 salome.cm.SetBigObjOnDiskDirectory(val_for_big_obj)
89 salome.cm.SetBigObjOnDiskThreshold(PROXY_THRES)
90 salome.cm.SetOverrideEnvForContainersSimple(env = [])
91 salome.cm.SetDeltaTimeBetweenCPUMemMeasureInMilliSecond( 250 )
92 cont = salome.cm.GiveContainer(cp)
93 logging.debug("{} {}".format(40*"*",cont.getPID()))
98 from datetime import datetime
99 cst = KernelBasis.GetTimeAdjustmentCst()
100 logging.debug("constant = {}".format(cst))
102 my_log_4_this_session.addFreestyleAndFlush( ("a",datetime.now()) ) # exemple of custom tracking
103 print("coucou {} {}".format(len(zeinput0),len(zeinput1)))
104 logging.debug("debug or not debug")
105 ob = [ [ bytes(3000000) ] ]
106 pihm, ts = KernelBasis.HeatMarcel(1 * nbcore * cst,nbcore)
107 print("Time ellapse spent : {} s".format(ts))
108 ob2 = [ [ bytes(100000) ] ]
109 pihm, ts = KernelBasis.HeatMarcel(1 * nbcore * cst,nbcore)
110 print("Time ellapse spent : {} s".format(ts))
111 sys.stderr.write("fake error message\\n")
113 poa = salome.orb.resolve_initial_references("RootPOA")
114 zeinput0 = [ bytes(100000000) ]
115 if SALOME_PyNode.GetBigObjectOnDiskThreshold() != -1:
116 zeinput0 = SALOME_PyNode.ProxyfyPickeled( zeinput0 )
117 zeinput0.unlinkOnDestructor()
118 obj = SALOME_PyNode.SenderByte_i(poa,pickle.dumps( (["zeinput0"],{"zeinput0": [zeinput0], "zeinput1": [ [zeinput0], [zeinput0] ] }) ))
119 id_o = poa.activate_object(obj)
120 refPtr = poa.id_to_reference(id_o)
121 pyscript2 = cont.createPyScriptNode("testScript2",script_st)
122 pyscript2.executeFirst(refPtr)
123 ret2 = pyscript2.executeSecond(["ob","ob2"])# generate a DeprecationWarning: PY_SSIZE_T_CLEAN will be required for '#' formats on debian11 ?
124 ret3, fileNamesProxyOut = unProxyfy( ret2 )
125 logging.getLogger().debug("test logging 1")
126 logging.debug("test logging 2")
127 logging.debug( salome.orb.object_to_string( salome.logm ) )
128 a = salome.logm.NaiveFetch()
130 fs = a[0][1][0].get().freestyle
131 self.assertEqual(len(fs),1)
132 self.assertEqual(fs[0][0],"a")
133 self.assertTrue( isinstance( fs[0][1], datetime ) )
134 logging.debug(a[0][1][0])
135 logging.debug( a[0][1][0].get()._input_hdd_mem._data[0]._data[0]._hdd_mem ) # important
136 logging.debug( a[0][1][0].get()._input_hdd_mem._data[1]._data[0]._data[0]._hdd_mem ) # important
137 fileNameProxyIn = a[0][1][0].get()._input_hdd_mem._data[0]._data[0]._file_name
138 logging.debug( fileNameProxyIn )
141 import gc ; gc.collect()
142 if fileNameProxyIn is not None:
143 if os.path.exists(fileNameProxyIn):
144 raise RuntimeError("Oooops 2")
145 for fileNameProxyOut in fileNamesProxyOut:
146 if fileNameProxyOut is not None:
147 if os.path.exists(fileNameProxyOut):
148 raise RuntimeError("Oooops 3")
149 # execution #2 inside last
153 logging.debug("Execution 2")
157 obj2 = SALOME_PyNode.SenderByte_i(poa,pickle.dumps((["a"],{"a":3})))
158 id2_o = poa.activate_object(obj2)
159 refPtr2 = poa.id_to_reference(id2_o)
160 pyscript2.assignNewCompiledCode(script_st2)
161 pyscript2.executeFirst(refPtr2)
162 ret2_0 = pyscript2.executeSecond(["b"])
163 ret2_1, fileNamesProxyOut2 = unProxyfy( ret2_0 )
164 logging.debug( fileNamesProxyOut2 )
165 a = salome.logm.NaiveFetch()
167 import gc ; gc.collect()
168 for fileNameProxyOut in fileNamesProxyOut2:
169 if fileNameProxyOut is not None:
170 if os.path.exists(fileNameProxyOut):
171 raise RuntimeError("Oooops 3")
173 fname = os.path.join(str( tmpdirname ),"perf.log")
174 salome.logm.DumpInFile( fname )
175 logManagerInst0 = salome.LogManagerLoadFromFile( fname )
176 logging.debug( logManagerInst0[0][1][0].get()._input_hdd_mem._data[1]._data[0]._data[0]._hdd_mem ) # important
177 logManagerInst = salome.logm.Fetch(True)
178 logManagerInst2 = salome.logm.Fetch(True)
179 logging.debug( salome.LogManagerLoadFromIORFile( iorLogm )[0][1][0].get() )
180 salome.logm.putStructInFileAtomic(False,monitoringFileTwo)
181 logging.debug( salome.LogManagerLoadFromFile(monitoringFileTwo)[0][1][0].get() )
182 logging.debug( logManagerInst[0][1][0].get()._input_hdd_mem._data[1]._data[0]._data[0]._hdd_mem ) # important
183 self.assertTrue( logManagerInst2[0][1][0].get() is None )
184 self.assertTrue( logManagerInst[0][1][1].get()._output_hdd_mem._data[0]._file_name == fileNamesProxyOut2[0] )
185 logging.debug( logManagerInst[0][1][1].log() )
186 # 2 files because a backup file is stored in case of unexpected kill during
187 self.assertEqual( len( glob.glob("{}*".format(monitoringFile) ) ) , 2 )
188 # leaving MonitoringFile Manager -> backup file is killed
190 #self.assertEqual(monitoringFileSafe, monitoringFile)
191 self.assertEqual( len( glob.glob("{}*".format(monitoringFile) ) ) , 1 )
192 logging.debug( salome.LogManagerLoadFromFile(monitoringFile)[0][1][0].get() )
194 import gc ; gc.collect()
195 self.assertFalse( os.path.exists(pyFileContainingCodeOfMonitoring) )
197 fnToTest0 = monitoringParamsMaster.outFileName.filename
198 cpumeminfo = SALOME_PyNode.ReadCPUMemInfo( monitoringParamsMaster )
199 self.assertTrue( isinstance(monitoringParamsMaster.outFileName,SALOME_PyNode.FileDeleter) )
200 del monitoringParamsMaster
203 self.assertTrue( os.path.exists( fnToTest0 ) )
204 dirInfo = SALOME_PyNode.ReadInodeSizeInfo( monitoringParamsForFileMaster )
205 self.assertTrue( isinstance(monitoringParamsForFileMaster.outFileName,SALOME_PyNode.FileDeleter) )
206 self.assertFalse( os.path.exists( fnToTest0 ) )
207 logging.debug( cpumeminfo )
208 logging.debug( dirInfo )
210 def testPerfLogManager1(self):
212 [EDF29150] : Similar than testPerfLogManager1 but with out fileName precised for CPU/Mem monitoring and FS monitoring
214 hostname = "localhost"
215 cp = pylauncher.GetRequestForGiveContainer(hostname,"container_test_three")
219 with tempfile.TemporaryDirectory() as tmpdirnameMonitoring:
220 fsMonitoringFile = os.path.join( str( tmpdirnameMonitoring ), "zeFS.txt" )
221 cpuMemMonitoringFile = os.path.join( str( tmpdirnameMonitoring ), "zeCPUMem.txt" )
222 with SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.FileSystemMonitoring(1000,os.path.dirname( salome.__file__ ),fsMonitoringFile) ) as monitoringParamsForFileMaster:
223 with SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.CPUMemoryMonitoring(1000,cpuMemMonitoringFile) ) as monitoringParamsMaster:
224 monitoringFile = os.path.join( str( tmpdirnameMonitoring ), "zeHtop.pckl" )
225 monitoringFileTwo = os.path.join( str( tmpdirnameMonitoring ), "zeHtopTwo.pckl" )
226 iorLogm = os.path.join( str( tmpdirnameMonitoring ), "logm.ior" )
227 with open(iorLogm,"w") as f:
228 f.write( salome.orb.object_to_string(salome.logm) )
229 logging.debug("Monitoring file : {}".format(monitoringFile))
230 with tempfile.TemporaryDirectory() as tmpdirname:
231 with salome.LogManagerLaunchMonitoringFileCtxMgr(250,monitoringFile) as monitoringParams:
232 pyFileContainingCodeOfMonitoring = monitoringParams.pyFileName.filename
233 logging.debug("Python file containing code of monitoring : {}".format(pyFileContainingCodeOfMonitoring))
234 val_for_big_obj = str( tmpdirname )
235 KernelBasis.SetBigObjOnDiskDirectory( val_for_big_obj )
236 salome.cm.SetBigObjOnDiskDirectory(val_for_big_obj)
237 salome.cm.SetBigObjOnDiskThreshold(PROXY_THRES)
238 # Override environement for all containers launched
239 salome.cm.SetOverrideEnvForContainersSimple(env = [])
240 salome.cm.SetDeltaTimeBetweenCPUMemMeasureInMilliSecond( 250 )
241 cont = salome.cm.GiveContainer(cp)
242 logging.debug("{} {}".format(40*"*",cont.getPID()))
247 from datetime import datetime
248 cst = KernelBasis.GetTimeAdjustmentCst()
249 logging.debug("constant = {}".format(cst))
251 my_log_4_this_session.addFreestyleAndFlush( ("a",datetime.now()) ) # exemple of custom tracking
252 print("coucou {} {}".format(len(zeinput0),len(zeinput1)))
253 logging.debug("debug or not debug")
254 ob = [ [ bytes(3000000) ] ]
255 pihm, ts = KernelBasis.HeatMarcel(1 * nbcore * cst,nbcore)
256 print("Time ellapse spent : {} s".format(ts))
257 ob2 = [ [ bytes(100000) ] ]
258 pihm, ts = KernelBasis.HeatMarcel(1 * nbcore * cst,nbcore)
259 print("Time ellapse spent : {} s".format(ts))
260 sys.stderr.write("fake error message\\n")
262 poa = salome.orb.resolve_initial_references("RootPOA")
263 zeinput0 = [ bytes(100000000) ]
264 if SALOME_PyNode.GetBigObjectOnDiskThreshold() != -1:
265 zeinput0 = SALOME_PyNode.ProxyfyPickeled( zeinput0 )
266 zeinput0.unlinkOnDestructor()
267 obj = SALOME_PyNode.SenderByte_i(poa,pickle.dumps( (["zeinput0"],{"zeinput0": [zeinput0], "zeinput1": [ [zeinput0], [zeinput0] ] }) ))
268 id_o = poa.activate_object(obj)
269 refPtr = poa.id_to_reference(id_o)
270 pyscript2 = cont.createPyScriptNode("testScript2",script_st)
271 pyscript2.executeFirst(refPtr)
272 ret2 = pyscript2.executeSecond(["ob","ob2"])# generate a DeprecationWarning: PY_SSIZE_T_CLEAN will be required for '#' formats on debian11 ?
273 ret3, fileNamesProxyOut = unProxyfy( ret2 )
274 logging.getLogger().debug("test logging 1")
275 logging.debug("test logging 2")
276 logging.debug( salome.orb.object_to_string( salome.logm ) )
277 a = salome.logm.NaiveFetch()
280 cpumeminfo = SALOME_PyNode.ReadCPUMemInfo( monitoringParamsMaster )
281 self.assertTrue( isinstance(monitoringParamsMaster.outFileName,SALOME_PyNode.FileHolder) )
282 dirInfo = SALOME_PyNode.ReadInodeSizeInfo( monitoringParamsForFileMaster )
283 self.assertTrue( isinstance(monitoringParamsForFileMaster.outFileName,SALOME_PyNode.FileHolder) )
284 self.assertTrue( os.path.exists( fsMonitoringFile ) )
285 self.assertTrue( os.path.exists( cpuMemMonitoringFile ) )
286 logging.debug( cpumeminfo )
287 logging.debug( dirInfo )
288 self.assertFalse( os.path.exists( fsMonitoringFile ) )
289 self.assertFalse( os.path.exists( cpuMemMonitoringFile ) )
291 def testEasyNamingService(self):
293 [EDF29150] : This test checks measure performance methods
295 hostname = "localhost"
296 cp = pylauncher.GetRequestForGiveContainer(hostname,"container_test_two")
299 with tempfile.TemporaryDirectory() as tmpdirname:
300 ior_ns_file = os.path.join(tmpdirname,"ns.ior")
301 val_for_big_obj = str( tmpdirname )
302 salome.cm.SetBigObjOnDiskDirectory(val_for_big_obj)
303 salome.cm.SetBigObjOnDiskThreshold(PROXY_THRES)
304 salome.cm.SetOverrideEnvForContainersSimple(env = [])
305 salome.cm.SetDeltaTimeBetweenCPUMemMeasureInMilliSecond( 250 )
306 salome.naming_service.DumpIORInFile( ior_ns_file )
307 cont = salome.cm.GiveContainer(cp)
309 from SALOME_Embedded_NamingService_ClientPy import SALOME_Embedded_NamingService_ClientPy
310 ior_ns_file = "{ior_ns_file}"
311 ns = SALOME_Embedded_NamingService_ClientPy.BuildFromIORFile( ior_ns_file )
313 """.format(**locals())
314 cont = salome.cm.GiveContainer(cp)
315 pyscript2 = cont.createPyScriptNode("testScript3",script_st)
316 retCoarse = pickle.loads( pyscript2.execute( ["ret"], pickle.dumps( ([],{} ) ) ) )
318 self.assertTrue( isinstance(ret,list) and isinstance(ret[0],str) )
322 if __name__ == '__main__':
323 from salome_utils import positionVerbosityOfLoggerRegardingState,setVerboseLevel,setVerbose
327 setVerboseLevel(logging.DEBUG)
328 positionVerbosityOfLoggerRegardingState()