From: Anthony Geay Date: Mon, 26 Feb 2024 10:33:09 +0000 (+0100) Subject: [EDF29576] : WIP X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=e8de0043ee0d54cec493710c63e8787656c9a731;p=modules%2Fyacs.git [EDF29576] : WIP --- diff --git a/src/yacsloader/driver b/src/yacsloader/driver old mode 100644 new mode 100755 index b7e6e89ec..48c4cedb2 --- a/src/yacsloader/driver +++ b/src/yacsloader/driver @@ -26,210 +26,34 @@ # driver -x -g 2 -s -e "popo.xml" -v -kt -i "PyScript0.p1=7" -f "tutu.xml" micro_schema2.xml # driver micro_schema3.xml +import driver_internal +import subprocess as sp import salome -import logging +import SALOME_Embedded_NamingService_ClientPy -my_runtime_yacs = None +import signal +import SALOMERuntime +import os -def initializeSALOME(): - import SALOMERuntime - global my_runtime_yacs - if my_runtime_yacs: - return - salome.salome_init() - flags = SALOMERuntime.RuntimeSALOME.UsePython + SALOMERuntime.RuntimeSALOME.UseCorba + SALOMERuntime.RuntimeSALOME.UseXml + SALOMERuntime.RuntimeSALOME.UseCpp + SALOMERuntime.RuntimeSALOME.UseSalome - SALOMERuntime.RuntimeSALOME.setRuntime( flags ) - my_runtime_yacs = SALOMERuntime.getSALOMERuntime() - anIOR = salome.orb.object_to_string ( salome.modulcat ) - aCatalog = my_runtime_yacs.loadCatalog( "session", anIOR ) - my_runtime_yacs.addCatalog( aCatalog ) +proc = None +ior_file = None -def SALOMEInitializationNeeded(func): - def decaratedFunc(*args,**kwargs): - initializeSALOME() - return func(*args,**kwargs) - return decaratedFunc - -@SALOMEInitializationNeeded -def loadGraph( xmlFileName ): - """ - Args: - ----- - xmlFileName : XML file containing YACS schema - - Returns - ------- - - SALOMERuntime.SalomeProc : YACS graph instance - """ - import loader - l=loader.YACSLoader() - p=l.load( xmlFileName ) - return p - -def patchGraph( proc, squeezeMemory, initPorts, xmlSchema, loadStateXmlFile, reset, display): - """ - Args: - ----- - - proc ( SALOMERuntime.SalomeProc ) : YACS Proc instance to be evaluated - squeezeMemory ( bool ) : squeezememory to be activated - initPorts (list) : list of bloc.node.port=value. - xmlSchema (string) : - loadStateXmlFile (string) : file if any of state to be loaded inside proc - reset (int) : - display (int) : - """ - import SALOMERuntime - import loader - def parse_init_port(input): - """ - Returns - ------- - node, port, value - """ - node_port, value = input.split("=") - nodePortSpl = node_port.split(".") - port = nodePortSpl[-1] - node = ".".join( nodePortSpl[:-1] ) - return node,port,value - - if squeezeMemory: - logging.info("SqueezeMemory requested -> update proc") - allNodes = proc.getAllRecursiveNodes() - for node in allNodes: - if isinstance(proc,SALOMERuntime.PythonNode): - node.setSqueezeStatus( True ) - # - for initPort in initPorts: - node,port,value = parse_init_port(initPort) - init_state = proc.setInPortValue(node, port, value) - if init_state != value: - raise RuntimeError(f"Error on initialization of {initPort}") - # - if xmlSchema: - SALOMERuntime.VisitorSaveSalomeSchemaUnsafe(proc,xmlSchema) - pass - # - if loadStateXmlFile: - loader.loadState( proc, loadStateXmlFile ) - if reset > 0: - proc.resetState(reset) - proc.exUpdateState() - # - if display > 0: - proc.writeDotInFile("toto") - -@SALOMEInitializationNeeded -def prepareExecution(proc, isStop, dumpErrorFile): - """ - Returns - ------- - - pilot.ExecutorSwig : Instance of executor - """ - import pilot - ex=pilot.ExecutorSwig() - if isStop: - logging.info(f"Stop has been activated with {dumpErrorFile}") - ex.setStopOnError( dumpErrorFile!="", dumpErrorFile ) - return ex - -@SALOMEInitializationNeeded -def executeGraph( executor, xmlfilename, proc, dump, finalDump, display, shutdown ): - """ - Args: - ----- - - executor (pilot.ExecutorSwig) : Executor in charge of evaluation. - proc ( SALOMERuntime.SalomeProc ) : YACS Proc instance to be evaluated - xmlfilename (string) - dump (int) : time interval between 2 dump state - finalDump ( string ) : filename containing final result of graph, if any. - display (int) : - shutdown (int) : shutdown level - """ - import signal - import SALOMERuntime - def handler(signum, frame): - print('Signal handler called with signal', signum) - proc.cleanNodes() - if finalDump: - SALOMERuntime.schemaSaveStateUnsafe( proc, finalDump ) - if shutdown < 999: - print(100*"shutdown") - proc.shutdown(shutdown) - - signal.signal(signal.SIGINT, handler) - signal.signal(signal.SIGTERM, handler) - dump_thread = None - import pilot - import os - - if dump != 0: - dumpFile = "dumpState_{}".format( os.path.basename(xmlfilename) ) - lockFile = "{}.lock".format( os.path.splitext( os.path.basename(xmlfilename) )[0] ) - dump_thread = SALOMERuntime.ThreadDumpState(proc,dump,dumpFile,lockFile) - dump_thread.start() - - executor.RunPy(proc,display,isPyThread=True,fromscratch=True) # same as RunW but releasing GIL - if proc.getEffectiveState() != pilot.DONE: - raise RuntimeError( proc.getErrorReport() ) - # - if display > 0: - proc.writeDotInFile("titi") - # - if dump_thread: - dump_thread.join() - # - if finalDump: - logging.info(f"Final dump requested : {finalDump}") - SALOMERuntime.schemaSaveStateUnsafe( proc, finalDump ) - -@SALOMEInitializationNeeded -def destroyElementsGeneratedByExecutionOfGraph( proc, shutdown ): - """ - Args: - ----- - - shutdown (int) : shutdown level - - """ - if shutdown < 999: - proc.shutdown(shutdown) - salome.dsm.shutdownScopes() - my_runtime_yacs.fini( False ) +def handler(signum, frame): + global proc + print('Signal handler called with signal', signum, proc.pid) + ns = SALOME_Embedded_NamingService_ClientPy.SALOME_Embedded_NamingService_ClientPy( salome.naming_service.LoadIORInFile( ior_file ) ) + print( ns.repr() ) + cm = ns.Resolve(salome.CM_NAME_IN_NS) + cm.ShutdownContainers() + os.kill( proc.pid, signal.SIGKILL ) if __name__ == "__main__": - from salome_utils import positionVerbosityOfLoggerRegardingState,setVerboseLevel,setVerbose - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('xmlfilename',help = "XML file containing YACS schema to be executed") - parser.add_argument("-d", "--display", dest = "display", type=int, default=[0], nargs=1, help="Display dot files: 0=never to 3=very often") - parser.add_argument("-v", "--verbose", dest = "verbose",help="Produce verbose output", action='store_true') - parser.add_argument("-s","--stop-on-error",dest="stop",help="Stop on first error", action='store_true') - parser.add_argument("-e","--dump-on-error",dest="dumpErrorFile", type=str, const='dumpErrorState.xml', default="", nargs='?', help="Stop on first error and dump state") - parser.add_argument("-g","--dump",dest="dump", type=int, const=60, default=0, nargs='?', help="dump state") - parser.add_argument("-kt", "--kerneltrace", dest = "kerneltrace",help="Produce verbose of SALOME/KERNEL", action='store_true') - parser.add_argument("-f","--dump-final", dest ="finalDump", type=str, const='finalDumpState.xml', default="", nargs='?', help="dump final state") - parser.add_argument("-l","--load-state", dest="loadState", type=str, default="", help="Load State from a previous partial execution") - parser.add_argument("-x","--save-xml-schema", dest="saveXMLSchema", type=str, const="saveSchema.xml", nargs='?', default="", help = "dump xml schema") - parser.add_argument("-t","--shutdown", dest = 'shutdown', type=int , default=1, help="Shutdown the schema: 0=no shutdown to 3=full shutdown") - parser.add_argument("-r","--reset", dest = "reset", type=int , default = 0, help="Reset the schema before execution: 0=nothing, 1=reset error nodes to ready state") - parser.add_argument("-i","--init-port", dest = 'init_port', type=str, default ="", help="Initialisation value of a port, specified as bloc.node.port=value.") - parser.add_argument("-z","--donotsqueeze", dest = "donotsqueeze", help = "Desactivate squeeze memory optimization.", action='store_true') - args = parser.parse_args() - args.display = args.display[0] - # - if args.verbose: - setVerbose( args.kerneltrace ) - setVerboseLevel(logging.INFO) - positionVerbosityOfLoggerRegardingState() - # - proc = loadGraph( args.xmlfilename ) - patchGraph( proc, not args.donotsqueeze, [elt for elt in args.init_port.split(",") if elt !=""], args.saveXMLSchema, args.loadState, args.reset, args.display) - executor = prepareExecution( proc, args.stop, args.dumpErrorFile) - # - executeGraph( executor, args.xmlfilename, proc, args.dump, args.finalDump, args.display, args.shutdown) - # - destroyElementsGeneratedByExecutionOfGraph( proc, args.shutdown ) + salome.salome_init() + import sys + signal.signal(signal.SIGINT, handler) + signal.signal(signal.SIGTERM, handler) + ior_file = "toto.ior" + iorStuff = "{}={}".format( driver_internal.IOREntryInCMD, ior_file) + argv = [elt for elt in sys.argv[1:] if elt != ""] + proc = sp.Popen( ["python3",driver_internal.__file__] + [ iorStuff ] + argv ) + proc.communicate() diff --git a/src/yacsloader/driver_internal.py b/src/yacsloader/driver_internal.py index 49f8e1e40..38f680431 100644 --- a/src/yacsloader/driver_internal.py +++ b/src/yacsloader/driver_internal.py @@ -21,14 +21,20 @@ import salome import logging +IOREntryInCMD = "--ior-ns" + my_runtime_yacs = None +my_ior_ns = None + def initializeSALOME(): import SALOMERuntime global my_runtime_yacs if my_runtime_yacs: return salome.salome_init() + if my_ior_ns: + salome.naming_service.DumpIORInFile( my_ior_ns ) flags = SALOMERuntime.RuntimeSALOME.UsePython + SALOMERuntime.RuntimeSALOME.UseCorba + SALOMERuntime.RuntimeSALOME.UseXml + SALOMERuntime.RuntimeSALOME.UseCpp + SALOMERuntime.RuntimeSALOME.UseSalome SALOMERuntime.RuntimeSALOME.setRuntime( flags ) my_runtime_yacs = SALOMERuntime.getSALOMERuntime() @@ -141,19 +147,7 @@ def executeGraph( executor, xmlfilename, proc, dump, finalDump, display, shutdow display (int) : shutdown (int) : shutdown level """ - import signal import SALOMERuntime - def handler(signum, frame): - print('Signal handler called with signal', signum) - proc.cleanNodes() - if finalDump: - SALOMERuntime.schemaSaveStateUnsafe( proc, finalDump ) - if shutdown < 999: - print(100*"shutdown") - proc.shutdown(shutdown) - - signal.signal(signal.SIGINT, handler) - signal.signal(signal.SIGTERM, handler) dump_thread = None import pilot import os @@ -192,36 +186,49 @@ def destroyElementsGeneratedByExecutionOfGraph( proc, shutdown ): salome.dsm.shutdownScopes() my_runtime_yacs.fini( False ) +def getArgumentParser(): + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('xmlfilename',help = "XML file containing YACS schema to be executed") + parser.add_argument("-d", "--display", dest = "display", type=int, default=[0], nargs=1, help="Display dot files: 0=never to 3=very often") + parser.add_argument("-v", "--verbose", dest = "verbose",help="Produce verbose output", action='store_true') + parser.add_argument("-s","--stop-on-error",dest="stop",help="Stop on first error", action='store_true') + parser.add_argument("-e","--dump-on-error",dest="dumpErrorFile", type=str, const='dumpErrorState.xml', default="", nargs='?', help="Stop on first error and dump state") + parser.add_argument("-g","--dump",dest="dump", type=int, const=60, default=0, nargs='?', help="dump state") + parser.add_argument("-kt", "--kerneltrace", dest = "kerneltrace",help="Produce verbose of SALOME/KERNEL", action='store_true') + parser.add_argument("-f","--dump-final", dest ="finalDump", type=str, const='finalDumpState.xml', default="", nargs='?', help="dump final state") + parser.add_argument("-l","--load-state", dest="loadState", type=str, default="", help="Load State from a previous partial execution") + parser.add_argument("-x","--save-xml-schema", dest="saveXMLSchema", type=str, const="saveSchema.xml", nargs='?', default="", help = "dump xml schema") + parser.add_argument("-t","--shutdown", dest = 'shutdown', type=int , default=1, help="Shutdown the schema: 0=no shutdown to 3=full shutdown") + parser.add_argument("-r","--reset", dest = "reset", type=int , default = 0, help="Reset the schema before execution: 0=nothing, 1=reset error nodes to ready state") + parser.add_argument("-i","--init-port", dest = 'init_port', type=str, default ="", help="Initialisation value of a port, specified as bloc.node.port=value.") + parser.add_argument("-z","--donotsqueeze", dest = "donotsqueeze", help = "Desactivate squeeze memory optimization.", action='store_true') + parser.add_argument(IOREntryInCMD, dest = "iorNS", type=str, default ="", help="file inside which the ior of NS will be stored") + return parser + +def mainRun( args ): + global my_ior_ns + from salome_utils import positionVerbosityOfLoggerRegardingState,setVerboseLevel,setVerbose + args.display = args.display[0] + # + if args.iorNS: + my_ior_ns = args.iorNS + # + if args.verbose: + setVerbose( args.kerneltrace ) + setVerboseLevel(logging.INFO) + positionVerbosityOfLoggerRegardingState() + # + proc = loadGraph( args.xmlfilename ) + patchGraph( proc, not args.donotsqueeze, [elt for elt in args.init_port.split(",") if elt !=""], args.saveXMLSchema, args.loadState, args.reset, args.display) + executor = prepareExecution( proc, args.stop, args.dumpErrorFile) + # + executeGraph( executor, args.xmlfilename, proc, args.dump, args.finalDump, args.display, args.shutdown) + # + destroyElementsGeneratedByExecutionOfGraph( proc, args.shutdown ) + + if __name__ == "__main__": - from salome_utils import positionVerbosityOfLoggerRegardingState,setVerboseLevel,setVerbose - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('xmlfilename',help = "XML file containing YACS schema to be executed") - parser.add_argument("-d", "--display", dest = "display", type=int, default=[0], nargs=1, help="Display dot files: 0=never to 3=very often") - parser.add_argument("-v", "--verbose", dest = "verbose",help="Produce verbose output", action='store_true') - parser.add_argument("-s","--stop-on-error",dest="stop",help="Stop on first error", action='store_true') - parser.add_argument("-e","--dump-on-error",dest="dumpErrorFile", type=str, const='dumpErrorState.xml', default="", nargs='?', help="Stop on first error and dump state") - parser.add_argument("-g","--dump",dest="dump", type=int, const=60, default=0, nargs='?', help="dump state") - parser.add_argument("-kt", "--kerneltrace", dest = "kerneltrace",help="Produce verbose of SALOME/KERNEL", action='store_true') - parser.add_argument("-f","--dump-final", dest ="finalDump", type=str, const='finalDumpState.xml', default="", nargs='?', help="dump final state") - parser.add_argument("-l","--load-state", dest="loadState", type=str, default="", help="Load State from a previous partial execution") - parser.add_argument("-x","--save-xml-schema", dest="saveXMLSchema", type=str, const="saveSchema.xml", nargs='?', default="", help = "dump xml schema") - parser.add_argument("-t","--shutdown", dest = 'shutdown', type=int , default=1, help="Shutdown the schema: 0=no shutdown to 3=full shutdown") - parser.add_argument("-r","--reset", dest = "reset", type=int , default = 0, help="Reset the schema before execution: 0=nothing, 1=reset error nodes to ready state") - parser.add_argument("-i","--init-port", dest = 'init_port', type=str, default ="", help="Initialisation value of a port, specified as bloc.node.port=value.") - parser.add_argument("-z","--donotsqueeze", dest = "donotsqueeze", help = "Desactivate squeeze memory optimization.", action='store_true') - args = parser.parse_args() - args.display = args.display[0] - # - if args.verbose: - setVerbose( args.kerneltrace ) - setVerboseLevel(logging.INFO) - positionVerbosityOfLoggerRegardingState() - # - proc = loadGraph( args.xmlfilename ) - patchGraph( proc, not args.donotsqueeze, [elt for elt in args.init_port.split(",") if elt !=""], args.saveXMLSchema, args.loadState, args.reset, args.display) - executor = prepareExecution( proc, args.stop, args.dumpErrorFile) - # - executeGraph( executor, args.xmlfilename, proc, args.dump, args.finalDump, args.display, args.shutdown) - # - destroyElementsGeneratedByExecutionOfGraph( proc, args.shutdown ) + parser = getArgumentParser() + args = parser.parse_args() + mainRun( args )