panda-server-source 0.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- panda_server_source-0.8.0.dist-info/METADATA +55 -0
- panda_server_source-0.8.0.dist-info/RECORD +375 -0
- panda_server_source-0.8.0.dist-info/WHEEL +4 -0
- panda_server_source-0.8.0.dist-info/licenses/LICENSE.txt +202 -0
- pandajedi/__init__.py +0 -0
- pandajedi/jedibrokerage/AtlasAnalJobBroker.py +2343 -0
- pandajedi/jedibrokerage/AtlasBrokerUtils.py +1292 -0
- pandajedi/jedibrokerage/AtlasProdJobBroker.py +2064 -0
- pandajedi/jedibrokerage/AtlasProdTaskBroker.py +629 -0
- pandajedi/jedibrokerage/GenJobBroker.py +381 -0
- pandajedi/jedibrokerage/JobBrokerBase.py +133 -0
- pandajedi/jedibrokerage/TaskBrokerBase.py +15 -0
- pandajedi/jedibrokerage/__init__.py +0 -0
- pandajedi/jediconfig/__init__.py +0 -0
- pandajedi/jediconfig/jedi_config.py +40 -0
- pandajedi/jedicore/FactoryBase.py +182 -0
- pandajedi/jedicore/Interaction.py +433 -0
- pandajedi/jedicore/JediDBProxy.py +56 -0
- pandajedi/jedicore/JediDBProxyPool.py +37 -0
- pandajedi/jedicore/JediDBSchemaInfo.py +17 -0
- pandajedi/jedicore/JediException.py +13 -0
- pandajedi/jedicore/JediTaskBuffer.py +984 -0
- pandajedi/jedicore/JediTaskBufferInterface.py +50 -0
- pandajedi/jedicore/MsgWrapper.py +124 -0
- pandajedi/jedicore/ProcessUtils.py +34 -0
- pandajedi/jedicore/SiteCandidate.py +90 -0
- pandajedi/jedicore/ThreadUtils.py +205 -0
- pandajedi/jedicore/__init__.py +0 -0
- pandajedi/jediddm/AtlasDDMClient.py +1708 -0
- pandajedi/jediddm/DDMClientBase.py +16 -0
- pandajedi/jediddm/DDMInterface.py +83 -0
- pandajedi/jediddm/GenDDMClient.py +17 -0
- pandajedi/jediddm/__init__.py +0 -0
- pandajedi/jedidog/AtlasAnalWatchDog.py +648 -0
- pandajedi/jedidog/AtlasDataCarouselWatchDog.py +189 -0
- pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +215 -0
- pandajedi/jedidog/AtlasProdWatchDog.py +443 -0
- pandajedi/jedidog/AtlasQueueFillerWatchDog.py +800 -0
- pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +245 -0
- pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +63 -0
- pandajedi/jedidog/GenWatchDog.py +21 -0
- pandajedi/jedidog/JumboWatchDog.py +147 -0
- pandajedi/jedidog/TypicalWatchDogBase.py +122 -0
- pandajedi/jedidog/WatchDogBase.py +53 -0
- pandajedi/jedidog/__init__.py +0 -0
- pandajedi/jediexec/reniceJEDI.py +25 -0
- pandajedi/jedigen/AtlasTaskGenerator.py +110 -0
- pandajedi/jedigen/TaskGeneratorBase.py +15 -0
- pandajedi/jedigen/__init__.py +0 -0
- pandajedi/jedimsgprocessor/__init__.py +0 -0
- pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +71 -0
- pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +66 -0
- pandajedi/jedimsgprocessor/base_msg_processor.py +33 -0
- pandajedi/jedimsgprocessor/forwarding_msg_processor.py +29 -0
- pandajedi/jedimsgprocessor/hpo_msg_processor.py +93 -0
- pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +63 -0
- pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +185 -0
- pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +82 -0
- pandajedi/jedimsgprocessor/kafka_msg_processor.py +44 -0
- pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +182 -0
- pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +74 -0
- pandajedi/jedimsgprocessor/processing_msg_processor.py +134 -0
- pandajedi/jedimsgprocessor/status_report_msg_processor.py +129 -0
- pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +118 -0
- pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +89 -0
- pandajedi/jediorder/ContentsFeeder.py +785 -0
- pandajedi/jediorder/JediDaemon.py +27 -0
- pandajedi/jediorder/JediKnight.py +55 -0
- pandajedi/jediorder/JediMaster.py +238 -0
- pandajedi/jediorder/JediMsgProcessor.py +32 -0
- pandajedi/jediorder/JobBroker.py +33 -0
- pandajedi/jediorder/JobGenerator.py +2763 -0
- pandajedi/jediorder/JobSplitter.py +308 -0
- pandajedi/jediorder/JobThrottler.py +28 -0
- pandajedi/jediorder/PostProcessor.py +166 -0
- pandajedi/jediorder/TaskBroker.py +268 -0
- pandajedi/jediorder/TaskCommando.py +334 -0
- pandajedi/jediorder/TaskGenerator.py +17 -0
- pandajedi/jediorder/TaskRefiner.py +611 -0
- pandajedi/jediorder/TaskSetupper.py +17 -0
- pandajedi/jediorder/WatchDog.py +79 -0
- pandajedi/jediorder/__init__.py +0 -0
- pandajedi/jedipprocess/AtlasAnalPostProcessor.py +404 -0
- pandajedi/jedipprocess/AtlasPostProcessorUtils.py +50 -0
- pandajedi/jedipprocess/AtlasProdPostProcessor.py +178 -0
- pandajedi/jedipprocess/GenPostProcessor.py +35 -0
- pandajedi/jedipprocess/MailTemplates.py +185 -0
- pandajedi/jedipprocess/PostProcessorBase.py +269 -0
- pandajedi/jedipprocess/__init__.py +0 -0
- pandajedi/jedirefine/AtlasAnalTaskRefiner.py +259 -0
- pandajedi/jedirefine/AtlasProdTaskRefiner.py +162 -0
- pandajedi/jedirefine/GenTaskRefiner.py +61 -0
- pandajedi/jedirefine/RefinerUtils.py +154 -0
- pandajedi/jedirefine/TaskRefinerBase.py +996 -0
- pandajedi/jedirefine/__init__.py +0 -0
- pandajedi/jedisetup/AtlasTaskSetupper.py +309 -0
- pandajedi/jedisetup/GenTaskSetupper.py +16 -0
- pandajedi/jedisetup/SimpleTaskSetupper.py +152 -0
- pandajedi/jedisetup/TaskSetupperBase.py +15 -0
- pandajedi/jedisetup/__init__.py +0 -0
- pandajedi/jeditest/SchemaChecker.py +41 -0
- pandajedi/jeditest/addContWoSoTask.py +54 -0
- pandajedi/jeditest/addDataCarouselRequest.py +47 -0
- pandajedi/jeditest/addEventServiceTask.py +101 -0
- pandajedi/jeditest/addHpoTask.py +81 -0
- pandajedi/jeditest/addIDDSStageInRequest.py +56 -0
- pandajedi/jeditest/addNonAtlasTask.py +71 -0
- pandajedi/jeditest/addNonAtlasTaskEnc.py +64 -0
- pandajedi/jeditest/addTestTask.py +124 -0
- pandajedi/jeditest/addTestTaskParamToDEFT.py +70 -0
- pandajedi/jeditest/addTestTaskWithMerger.py +97 -0
- pandajedi/jeditest/brokerTest.py +78 -0
- pandajedi/jeditest/cancelDataCarouselRequest.py +35 -0
- pandajedi/jeditest/contentsFeederTest.py +28 -0
- pandajedi/jeditest/contentsFeederTestWithTask.py +18 -0
- pandajedi/jeditest/ddmTest.py +4 -0
- pandajedi/jeditest/jobGenForOneTask.py +38 -0
- pandajedi/jeditest/jobGeneratorTest.py +43 -0
- pandajedi/jeditest/jobSplitterTest.py +104 -0
- pandajedi/jeditest/jobThrottlerTest.py +22 -0
- pandajedi/jeditest/msgProcessorTest.py +9 -0
- pandajedi/jeditest/postProcessorTest.py +18 -0
- pandajedi/jeditest/resubmitDataCarouselRequest.py +35 -0
- pandajedi/jeditest/resubmitTaskParam.py +20 -0
- pandajedi/jeditest/taskBrokerTest.py +22 -0
- pandajedi/jeditest/taskBrokerTestWithTask.py +38 -0
- pandajedi/jeditest/taskBufferTest.py +5 -0
- pandajedi/jeditest/taskCommandoTest.py +28 -0
- pandajedi/jeditest/taskRefinerTest.py +30 -0
- pandajedi/jeditest/testOneTaskToRefine.py +49 -0
- pandajedi/jeditest/testOneTaskToTaskBroker.py +42 -0
- pandajedi/jeditest/testPandaDDMMap.py +62 -0
- pandajedi/jeditest/updateDataCarouselRequestParams.py +50 -0
- pandajedi/jeditest/watchDogTest.py +25 -0
- pandajedi/jeditest/workQueueTest.py +22 -0
- pandajedi/jedithrottle/AtlasAnalJobThrottler.py +19 -0
- pandajedi/jedithrottle/AtlasProdJobThrottler.py +18 -0
- pandajedi/jedithrottle/GenJobThrottler.py +26 -0
- pandajedi/jedithrottle/JobThrottlerBase.py +496 -0
- pandajedi/jedithrottle/__init__.py +0 -0
- pandaserver/__init__.py +0 -0
- pandaserver/api/__init__.py +0 -0
- pandaserver/api/v1/__init__.py +0 -0
- pandaserver/api/v1/common.py +339 -0
- pandaserver/api/v1/credential_management_api.py +372 -0
- pandaserver/api/v1/data_carousel_api.py +264 -0
- pandaserver/api/v1/event_api.py +269 -0
- pandaserver/api/v1/file_server_api.py +942 -0
- pandaserver/api/v1/harvester_api.py +445 -0
- pandaserver/api/v1/http_client.py +166 -0
- pandaserver/api/v1/idds_api.py +180 -0
- pandaserver/api/v1/job_api.py +463 -0
- pandaserver/api/v1/metaconfig_api.py +122 -0
- pandaserver/api/v1/pilot_api.py +895 -0
- pandaserver/api/v1/statistics_api.py +207 -0
- pandaserver/api/v1/system_api.py +186 -0
- pandaserver/api/v1/task_api.py +1520 -0
- pandaserver/api/v1/tests/__init__.py +0 -0
- pandaserver/api/v1/tests/credential_management_api_tests.py +116 -0
- pandaserver/api/v1/tests/data_carousel_api_tests.py +82 -0
- pandaserver/api/v1/tests/harvester_api_tests.py +188 -0
- pandaserver/api/v1/tests/idds_api_tests.py +45 -0
- pandaserver/api/v1/tests/job_api_tests.py +112 -0
- pandaserver/api/v1/tests/pilot_api_tests.py +154 -0
- pandaserver/api/v1/tests/statistics_api_tests.py +104 -0
- pandaserver/api/v1/tests/system_api_tests.py +58 -0
- pandaserver/api/v1/tests/task_api_tests.py +590 -0
- pandaserver/api/v1/version.py +2 -0
- pandaserver/api/v1/workflow_api.py +136 -0
- pandaserver/brokerage/SiteMapper.py +406 -0
- pandaserver/brokerage/__init__.py +0 -0
- pandaserver/brokerage/broker.py +272 -0
- pandaserver/config/__init__.py +0 -0
- pandaserver/config/config_utils.py +15 -0
- pandaserver/config/daemon_config.py +29 -0
- pandaserver/config/mcp_config.py +38 -0
- pandaserver/config/panda_config.py +233 -0
- pandaserver/configurator/Carbon.py +65 -0
- pandaserver/configurator/Configurator.py +908 -0
- pandaserver/configurator/__init__.py +0 -0
- pandaserver/configurator/aux.py +73 -0
- pandaserver/daemons/__init__.py +0 -0
- pandaserver/daemons/master.py +110 -0
- pandaserver/daemons/master_systemd.py +79 -0
- pandaserver/daemons/scripts/__init__.py +0 -0
- pandaserver/daemons/scripts/add_main.py +264 -0
- pandaserver/daemons/scripts/add_sub.py +221 -0
- pandaserver/daemons/scripts/cache_pilots.py +47 -0
- pandaserver/daemons/scripts/cache_schedconfig.py +286 -0
- pandaserver/daemons/scripts/carbon.py +50 -0
- pandaserver/daemons/scripts/configurator.py +94 -0
- pandaserver/daemons/scripts/copyArchive.py +1387 -0
- pandaserver/daemons/scripts/datasetManager.py +1154 -0
- pandaserver/daemons/scripts/dummy_test.py +25 -0
- pandaserver/daemons/scripts/evpPD2P.py +144 -0
- pandaserver/daemons/scripts/hs_scrapers.py +264 -0
- pandaserver/daemons/scripts/metric_collector.py +927 -0
- pandaserver/daemons/scripts/panda_activeusers_query.py +80 -0
- pandaserver/daemons/scripts/pilotStreaming.py +109 -0
- pandaserver/daemons/scripts/process_workflow_files_daemon.py +166 -0
- pandaserver/daemons/scripts/recover_lost_files_daemon.py +177 -0
- pandaserver/daemons/scripts/task_evaluator.py +405 -0
- pandaserver/daemons/scripts/tmpwatch.py +70 -0
- pandaserver/daemons/scripts/worker_synchronization.py +97 -0
- pandaserver/daemons/utils.py +753 -0
- pandaserver/dataservice/DataServiceUtils.py +323 -0
- pandaserver/dataservice/ErrorCode.py +25 -0
- pandaserver/dataservice/RecoverLostFilesCore.py +322 -0
- pandaserver/dataservice/__init__.py +0 -0
- pandaserver/dataservice/activator.py +79 -0
- pandaserver/dataservice/adder_atlas_plugin.py +1106 -0
- pandaserver/dataservice/adder_dummy_plugin.py +31 -0
- pandaserver/dataservice/adder_gen.py +954 -0
- pandaserver/dataservice/adder_plugin_base.py +27 -0
- pandaserver/dataservice/adder_result.py +75 -0
- pandaserver/dataservice/adder_simple_plugin.py +160 -0
- pandaserver/dataservice/closer.py +247 -0
- pandaserver/dataservice/closer_atlas_plugin.py +90 -0
- pandaserver/dataservice/ddm.py +1381 -0
- pandaserver/dataservice/ddm_handler.py +95 -0
- pandaserver/dataservice/dyn_data_distributer.py +824 -0
- pandaserver/dataservice/event_lookup_client_ei.py +77 -0
- pandaserver/dataservice/event_picker.py +268 -0
- pandaserver/dataservice/finisher.py +194 -0
- pandaserver/dataservice/setupper.py +225 -0
- pandaserver/dataservice/setupper_atlas_plugin.py +1851 -0
- pandaserver/dataservice/setupper_dummy_plugin.py +47 -0
- pandaserver/dataservice/setupper_plugin_base.py +67 -0
- pandaserver/jobdispatcher/DispatcherUtils.py +35 -0
- pandaserver/jobdispatcher/ErrorCode.py +19 -0
- pandaserver/jobdispatcher/JobDispatcher.py +1625 -0
- pandaserver/jobdispatcher/Protocol.py +443 -0
- pandaserver/jobdispatcher/Watcher.py +186 -0
- pandaserver/jobdispatcher/__init__.py +0 -0
- pandaserver/pandamcp/__init__.py +0 -0
- pandaserver/pandamcp/mcp_main.py +56 -0
- pandaserver/pandamcp/mcp_test_client.py +95 -0
- pandaserver/pandamcp/mcp_utils.py +74 -0
- pandaserver/proxycache/__init__.py +0 -0
- pandaserver/proxycache/panda_proxy_cache.py +240 -0
- pandaserver/proxycache/token_cache.py +141 -0
- pandaserver/server/.gacl +6 -0
- pandaserver/server/panda.py +539 -0
- pandaserver/srvcore/CoreUtils.py +572 -0
- pandaserver/srvcore/MailUtils.py +106 -0
- pandaserver/srvcore/__init__.py +0 -0
- pandaserver/srvcore/allowed_methods.py +100 -0
- pandaserver/srvcore/oidc_utils.py +152 -0
- pandaserver/srvcore/panda_request.py +196 -0
- pandaserver/srvcore/srv_msg_utils.py +42 -0
- pandaserver/taskbuffer/ConBridge.py +513 -0
- pandaserver/taskbuffer/DBProxyPool.py +95 -0
- pandaserver/taskbuffer/DataCarousel.py +3053 -0
- pandaserver/taskbuffer/DatasetSpec.py +137 -0
- pandaserver/taskbuffer/DdmSpec.py +201 -0
- pandaserver/taskbuffer/ErrorCode.py +87 -0
- pandaserver/taskbuffer/EventServiceUtils.py +396 -0
- pandaserver/taskbuffer/FileSpec.py +290 -0
- pandaserver/taskbuffer/GlobalShares.py +244 -0
- pandaserver/taskbuffer/HarvesterMetricsSpec.py +92 -0
- pandaserver/taskbuffer/Initializer.py +82 -0
- pandaserver/taskbuffer/InputChunk.py +1080 -0
- pandaserver/taskbuffer/JediCacheSpec.py +57 -0
- pandaserver/taskbuffer/JediDatasetSpec.py +588 -0
- pandaserver/taskbuffer/JediFileSpec.py +242 -0
- pandaserver/taskbuffer/JediTaskSpec.py +1687 -0
- pandaserver/taskbuffer/JobSpec.py +1006 -0
- pandaserver/taskbuffer/JobUtils.py +232 -0
- pandaserver/taskbuffer/NucleusSpec.py +116 -0
- pandaserver/taskbuffer/OraDBProxy.py +174 -0
- pandaserver/taskbuffer/PanDAMsgProcessor.py +8 -0
- pandaserver/taskbuffer/PandaDBSchemaInfo.py +18 -0
- pandaserver/taskbuffer/ParseJobXML.py +350 -0
- pandaserver/taskbuffer/PickleFileSpec.py +18 -0
- pandaserver/taskbuffer/PickleJobSpec.py +25 -0
- pandaserver/taskbuffer/PrioUtil.py +40 -0
- pandaserver/taskbuffer/ProcessGroups.py +111 -0
- pandaserver/taskbuffer/ResourceSpec.py +175 -0
- pandaserver/taskbuffer/SQLDumper.py +37 -0
- pandaserver/taskbuffer/SQLManager.py +60 -0
- pandaserver/taskbuffer/SiteSpec.py +304 -0
- pandaserver/taskbuffer/SupErrors.py +10 -0
- pandaserver/taskbuffer/TaskBuffer.py +2882 -0
- pandaserver/taskbuffer/TaskBufferInterface.py +163 -0
- pandaserver/taskbuffer/Utils.py +848 -0
- pandaserver/taskbuffer/WorkQueue.py +227 -0
- pandaserver/taskbuffer/WorkQueueMapper.py +203 -0
- pandaserver/taskbuffer/WorkerSpec.py +143 -0
- pandaserver/taskbuffer/WrappedCursor.py +487 -0
- pandaserver/taskbuffer/WrappedPickle.py +88 -0
- pandaserver/taskbuffer/WrappedPostgresConn.py +24 -0
- pandaserver/taskbuffer/__init__.py +0 -0
- pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
- pandaserver/taskbuffer/db_proxy_mods/__init__.py +7 -0
- pandaserver/taskbuffer/db_proxy_mods/base_module.py +841 -0
- pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +772 -0
- pandaserver/taskbuffer/db_proxy_mods/entity_module.py +3804 -0
- pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +5661 -0
- pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +2640 -0
- pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +874 -0
- pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +4272 -0
- pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +6172 -0
- pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +4953 -0
- pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +4999 -0
- pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +2063 -0
- pandaserver/taskbuffer/db_proxy_mods/worker_module.py +1944 -0
- pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +832 -0
- pandaserver/taskbuffer/retryModule.py +552 -0
- pandaserver/taskbuffer/task_split_rules.py +308 -0
- pandaserver/taskbuffer/workflow_processor.py +249 -0
- pandaserver/taskbuffer/wrapped_oracle_conn.py +18 -0
- pandaserver/test/SchemaChecker.py +40 -0
- pandaserver/test/__init__.py +0 -0
- pandaserver/test/banUser.py +43 -0
- pandaserver/test/boostPrio.py +19 -0
- pandaserver/test/boostUser.py +35 -0
- pandaserver/test/callbackDDM.py +11 -0
- pandaserver/test/daod_on_demand.py +95 -0
- pandaserver/test/finishJob.py +184 -0
- pandaserver/test/finishTaskJEDI.py +11 -0
- pandaserver/test/getJobs.py +53 -0
- pandaserver/test/killJob.py +79 -0
- pandaserver/test/killJobLowPrio.py +99 -0
- pandaserver/test/killJobsInTask.py +56 -0
- pandaserver/test/killTask.py +80 -0
- pandaserver/test/killTaskJEDI.py +11 -0
- pandaserver/test/killUser.py +83 -0
- pandaserver/test/lsst/README.txt +7 -0
- pandaserver/test/lsst/lsstSubmit.py +139 -0
- pandaserver/test/lsst/lsstSubmitMERGEtest.py +141 -0
- pandaserver/test/lsst/lsstSubmitPhosim332.py +53 -0
- pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +41 -0
- pandaserver/test/reassignJobs.py +17 -0
- pandaserver/test/reassignSite.py +82 -0
- pandaserver/test/reassignTask.py +117 -0
- pandaserver/test/reassignWaiting.py +39 -0
- pandaserver/test/recoverLostFiles.py +7 -0
- pandaserver/test/reloadInputDS.py +51 -0
- pandaserver/test/sendCommandToJob.py +26 -0
- pandaserver/test/setDebugMode.py +38 -0
- pandaserver/test/setPriority.py +28 -0
- pandaserver/test/testEvgen.py +60 -0
- pandaserver/test/testEvgen17.py +58 -0
- pandaserver/test/testG4sim.py +81 -0
- pandaserver/test/testG4sim17.py +90 -0
- pandaserver/test/testGlobalShares.py +131 -0
- pandaserver/test/testReco.py +103 -0
- pandaserver/test/testSimulReco14.py +98 -0
- pandaserver/test/testSiteMap.py +26 -0
- pandaserver/test/testUpdateWorkerPilotStatus.py +9 -0
- pandaserver/userinterface/Client.py +1686 -0
- pandaserver/userinterface/UserIF.py +1799 -0
- pandaserver/userinterface/__init__.py +0 -0
- pandaserver/workflow/__init__.py +0 -0
- pandaserver/workflow/data_handler_plugins/base_data_handler.py +48 -0
- pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +100 -0
- pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +140 -0
- pandaserver/workflow/pcwl_test.py +122 -0
- pandaserver/workflow/pcwl_utils.py +384 -0
- pandaserver/workflow/psnakemake_container.json +68 -0
- pandaserver/workflow/psnakemake_task.json +62 -0
- pandaserver/workflow/psnakemake_test.py +60 -0
- pandaserver/workflow/snakeparser/__init__.py +3 -0
- pandaserver/workflow/snakeparser/extensions.py +74 -0
- pandaserver/workflow/snakeparser/log.py +53 -0
- pandaserver/workflow/snakeparser/names.py +3 -0
- pandaserver/workflow/snakeparser/parser.py +332 -0
- pandaserver/workflow/snakeparser/utils.py +29 -0
- pandaserver/workflow/step_handler_plugins/base_step_handler.py +85 -0
- pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +280 -0
- pandaserver/workflow/workflow_base.py +531 -0
- pandaserver/workflow/workflow_core.py +1974 -0
- pandaserver/workflow/workflow_core_smoketest.py +388 -0
- pandaserver/workflow/workflow_parser.py +222 -0
- pandaserver/workflow/workflow_utils.py +1047 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
|
|
3
|
+
from pandajedi.jediconfig import jedi_config
|
|
4
|
+
|
|
5
|
+
proc = subprocess.Popen(
|
|
6
|
+
f"ps -l x -U {jedi_config.master.uname}",
|
|
7
|
+
shell=True,
|
|
8
|
+
stdout=subprocess.PIPE,
|
|
9
|
+
)
|
|
10
|
+
stdoutList = str(proc.communicate()[0]).split("\n")
|
|
11
|
+
for line in stdoutList:
|
|
12
|
+
try:
|
|
13
|
+
items = line.split()
|
|
14
|
+
if len(items) < 6:
|
|
15
|
+
continue
|
|
16
|
+
pid = items[3]
|
|
17
|
+
nice = int(items[7])
|
|
18
|
+
if "JediMaster.py" in line and nice > 0:
|
|
19
|
+
reniceProc = subprocess.Popen(
|
|
20
|
+
f"renice 0 {pid}",
|
|
21
|
+
shell=True,
|
|
22
|
+
stdout=subprocess.PIPE,
|
|
23
|
+
)
|
|
24
|
+
except Exception:
|
|
25
|
+
pass
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import re
|
|
3
|
+
import sys
|
|
4
|
+
import uuid
|
|
5
|
+
|
|
6
|
+
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
7
|
+
|
|
8
|
+
from pandajedi.jedicore import Interaction
|
|
9
|
+
from pandajedi.jedicore.MsgWrapper import MsgWrapper
|
|
10
|
+
|
|
11
|
+
from .TaskGeneratorBase import TaskGeneratorBase
|
|
12
|
+
|
|
13
|
+
logger = PandaLogger().getLogger(__name__.split(".")[-1])
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# task generator for ATLAS
|
|
17
|
+
class AtlasTaskGenerator(TaskGeneratorBase):
|
|
18
|
+
# constructor
|
|
19
|
+
def __init__(self, taskBufferIF, ddmIF):
|
|
20
|
+
TaskGeneratorBase.__init__(self, taskBufferIF, ddmIF)
|
|
21
|
+
|
|
22
|
+
# main to generate task
|
|
23
|
+
def doGenerate(self, taskSpec, taskParamMap, **varMap):
|
|
24
|
+
# make logger
|
|
25
|
+
tmpLog = MsgWrapper(logger, f"<jediTaskID={taskSpec.jediTaskID}>")
|
|
26
|
+
tmpLog.info(f"start taskType={taskSpec.taskType}")
|
|
27
|
+
tmpLog.info(str(varMap))
|
|
28
|
+
# returns
|
|
29
|
+
retFatal = self.SC_FATAL
|
|
30
|
+
retTmpError = self.SC_FAILED
|
|
31
|
+
retOK = self.SC_SUCCEEDED
|
|
32
|
+
try:
|
|
33
|
+
# check prodSourceLabel
|
|
34
|
+
if taskSpec.prodSourceLabel in ["managed", "test"]:
|
|
35
|
+
# check taskType
|
|
36
|
+
if taskSpec.taskType == "recov":
|
|
37
|
+
# generate parent tasks for lost file recovery if it is not yet generated
|
|
38
|
+
if "parentGenerated" in taskParamMap:
|
|
39
|
+
tmpLog.info("skip since already generated parent tasks")
|
|
40
|
+
else:
|
|
41
|
+
tmpLog.info("generating parent tasks for lost file recovery")
|
|
42
|
+
# missing files are undefined
|
|
43
|
+
if "missingFilesMap" not in varMap:
|
|
44
|
+
tmpLog.error("missing files are undefined")
|
|
45
|
+
return retFatal
|
|
46
|
+
missingFilesMap = varMap["missingFilesMap"]
|
|
47
|
+
# check datasets
|
|
48
|
+
for datasetName, datasetValMap in missingFilesMap.items():
|
|
49
|
+
# dataset needs specify container
|
|
50
|
+
datasetSpec = datasetValMap["datasetSpec"]
|
|
51
|
+
if datasetSpec.containerName in ["", None]:
|
|
52
|
+
errStr = f"cannot make parent tasks due to undefined container for datasetID={datasetSpec.datasetID}:{datasetName}"
|
|
53
|
+
taskSpec.setErrDiag(errStr)
|
|
54
|
+
tmpLog.error(errStr)
|
|
55
|
+
return retFatal
|
|
56
|
+
# make parameters for new task
|
|
57
|
+
newJsonStrList = []
|
|
58
|
+
for datasetName, datasetValMap in missingFilesMap.items():
|
|
59
|
+
datasetSpec = datasetValMap["datasetSpec"]
|
|
60
|
+
newTaskParamMap = {}
|
|
61
|
+
newTaskParamMap["oldDatasetName"] = datasetName
|
|
62
|
+
newTaskParamMap["lostFiles"] = datasetValMap["missingFiles"]
|
|
63
|
+
newTaskParamMap["vo"] = taskSpec.vo
|
|
64
|
+
newTaskParamMap["cloud"] = taskSpec.cloud
|
|
65
|
+
newTaskParamMap["taskPriority"] = taskSpec.taskPriority
|
|
66
|
+
newTaskParamMap["taskType"] = taskSpec.taskType
|
|
67
|
+
newTaskParamMap["prodSourceLabel"] = taskSpec.prodSourceLabel
|
|
68
|
+
logDatasetName = f"panda.jedi{taskSpec.taskType}.log.{uuid.uuid4()}"
|
|
69
|
+
newTaskParamMap["log"] = {
|
|
70
|
+
"dataset": logDatasetName,
|
|
71
|
+
"type": "template",
|
|
72
|
+
"param_type": "log",
|
|
73
|
+
"token": "ATLASDATADISK",
|
|
74
|
+
"value": f"{logDatasetName}.${{SN}}.log.tgz",
|
|
75
|
+
}
|
|
76
|
+
# make new datasetname
|
|
77
|
+
outDatasetName = datasetName
|
|
78
|
+
# remove /
|
|
79
|
+
outDatasetName = re.sub("/$", "", outDatasetName)
|
|
80
|
+
# remove extension
|
|
81
|
+
outDatasetName = re.sub(f"\\.{taskSpec.taskType}\\d+$", "", outDatasetName)
|
|
82
|
+
# add extension
|
|
83
|
+
outDatasetName = outDatasetName + f".{taskSpec.taskType}{taskSpec.jediTaskID}"
|
|
84
|
+
newTaskParamMap["output"] = {"dataset": outDatasetName}
|
|
85
|
+
if datasetSpec.containerName not in ["", None]:
|
|
86
|
+
newTaskParamMap["output"]["container"] = datasetSpec.containerName
|
|
87
|
+
# make json
|
|
88
|
+
jsonStr = json.dumps(newTaskParamMap)
|
|
89
|
+
newJsonStrList.append(jsonStr)
|
|
90
|
+
# change original task parameters to not repeat the same procedure and to use newly produced files
|
|
91
|
+
taskParamMap["parentGenerated"] = True
|
|
92
|
+
taskParamMap["useInFilesInContainer"] = True
|
|
93
|
+
taskParamMap["useInFilesWithNewAttemptNr"] = True
|
|
94
|
+
jsonStr = json.dumps(taskParamMap)
|
|
95
|
+
# insert and update task parameters
|
|
96
|
+
sTmp, newJediTaskIDs = self.taskBufferIF.insertUpdateTaskParams_JEDI(
|
|
97
|
+
taskSpec.jediTaskID, taskSpec.vo, taskSpec.prodSourceLabel, jsonStr, newJsonStrList
|
|
98
|
+
)
|
|
99
|
+
if sTmp:
|
|
100
|
+
tmpLog.info(f"inserted/updated tasks in DB : new jediTaskIDs={str(newJediTaskIDs)}")
|
|
101
|
+
else:
|
|
102
|
+
tmpLog.error("failed to insert/update tasks in DB")
|
|
103
|
+
return retFatal
|
|
104
|
+
# return
|
|
105
|
+
tmpLog.info("done")
|
|
106
|
+
return retOK
|
|
107
|
+
except Exception:
|
|
108
|
+
errtype, errvalue = sys.exc_info()[:2]
|
|
109
|
+
tmpLog.error(f"doGenerate failed with {errtype.__name__}:{errvalue}")
|
|
110
|
+
return retFatal
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from pandajedi.jedicore import Interaction
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# base class for task generator
|
|
5
|
+
class TaskGeneratorBase(object):
|
|
6
|
+
def __init__(self, taskBufferIF, ddmIF):
|
|
7
|
+
self.ddmIF = ddmIF
|
|
8
|
+
self.taskBufferIF = taskBufferIF
|
|
9
|
+
self.refresh()
|
|
10
|
+
|
|
11
|
+
def refresh(self):
|
|
12
|
+
self.siteMapper = self.taskBufferIF.get_site_mapper()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
Interaction.installSC(TaskGeneratorBase)
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
from pandacommon.pandalogger import logger_utils
|
|
4
|
+
|
|
5
|
+
from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin
|
|
6
|
+
|
|
7
|
+
base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# AI parameter adjuster plugin
|
|
11
|
+
class AIParameterAdjuster(BaseMsgProcPlugin):
|
|
12
|
+
"""
|
|
13
|
+
Parameter adjuster message processor whose source messages generated by external AI
|
|
14
|
+
Used for scout prediction, etc.
|
|
15
|
+
"""
|
|
16
|
+
def process(self, msg_obj, decoded_data=None):
|
|
17
|
+
tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
|
|
18
|
+
# start
|
|
19
|
+
tmp_log.info("start")
|
|
20
|
+
tmp_log.debug(f"sub_id={msg_obj.sub_id} ; msg_id={msg_obj.msg_id}")
|
|
21
|
+
# parse
|
|
22
|
+
if decoded_data is None:
|
|
23
|
+
# json decode
|
|
24
|
+
try:
|
|
25
|
+
msg_dict = json.loads(msg_obj.data)
|
|
26
|
+
except Exception as e:
|
|
27
|
+
err_str = f"failed to parse message json {msg_obj.data} , skipped. {e.__class__.__name__} : {e}"
|
|
28
|
+
tmp_log.error(err_str)
|
|
29
|
+
raise
|
|
30
|
+
else:
|
|
31
|
+
msg_dict = decoded_data
|
|
32
|
+
# sanity check
|
|
33
|
+
try:
|
|
34
|
+
task_id = int(msg_dict["task_id"])
|
|
35
|
+
# message type
|
|
36
|
+
msg_type = msg_dict["msg_type"]
|
|
37
|
+
if msg_type == "scout_prediction":
|
|
38
|
+
pass
|
|
39
|
+
elif msg_type == "test":
|
|
40
|
+
pass
|
|
41
|
+
else:
|
|
42
|
+
raise ValueError(f"invalid msg_type value: {msg_type}")
|
|
43
|
+
except Exception as e:
|
|
44
|
+
err_str = f"failed to parse message object dict {msg_dict} , skipped. {e.__class__.__name__} : {e}"
|
|
45
|
+
tmp_log.error(err_str)
|
|
46
|
+
raise
|
|
47
|
+
# run
|
|
48
|
+
try:
|
|
49
|
+
# initialize to_proceed
|
|
50
|
+
to_proceed = False
|
|
51
|
+
# type filters
|
|
52
|
+
if msg_type in ["scout_prediction", "test"]:
|
|
53
|
+
to_proceed = True
|
|
54
|
+
# whether to proceed the targets
|
|
55
|
+
if to_proceed:
|
|
56
|
+
# initialize
|
|
57
|
+
pass
|
|
58
|
+
# loop over targets
|
|
59
|
+
if msg_type == "scout_prediction":
|
|
60
|
+
#TODO: to complete once the format of scout prediction messages is decided
|
|
61
|
+
pass
|
|
62
|
+
pass
|
|
63
|
+
else:
|
|
64
|
+
# do nothing
|
|
65
|
+
tmp_log.debug(f"task_id={task_id}, msg_type={msg_type}, nothing done")
|
|
66
|
+
except Exception as e:
|
|
67
|
+
err_str = f"failed to process the message, skipped. {e.__class__.__name__} : {e}"
|
|
68
|
+
tmp_log.error(err_str)
|
|
69
|
+
raise
|
|
70
|
+
# done
|
|
71
|
+
tmp_log.info("done")
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
from pandacommon.pandalogger import logger_utils
|
|
4
|
+
|
|
5
|
+
from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin
|
|
6
|
+
from pandajedi.jedimsgprocessor.hpo_msg_processor import HPOMsgProcPlugin
|
|
7
|
+
from pandajedi.jedimsgprocessor.processing_msg_processor import ProcessingMsgProcPlugin
|
|
8
|
+
from pandajedi.jedimsgprocessor.tape_carousel_msg_processor import (
|
|
9
|
+
TapeCarouselMsgProcPlugin,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Atlas iDDS message processing plugin, a bridge connect to other idds related message processing plugins
|
|
16
|
+
class AtlasIddsMsgProcPlugin(BaseMsgProcPlugin):
|
|
17
|
+
def initialize(self):
|
|
18
|
+
BaseMsgProcPlugin.initialize(self)
|
|
19
|
+
self.plugin_TapeCarousel = TapeCarouselMsgProcPlugin()
|
|
20
|
+
self.plugin_HPO = HPOMsgProcPlugin()
|
|
21
|
+
self.plugin_Processing = ProcessingMsgProcPlugin()
|
|
22
|
+
# for each plugin
|
|
23
|
+
for _plugin in [self.plugin_TapeCarousel, self.plugin_HPO, self.plugin_Processing]:
|
|
24
|
+
# initialize each
|
|
25
|
+
_plugin.initialize(in_collective=True)
|
|
26
|
+
# use the same taskBuffer interface
|
|
27
|
+
_plugin.tbIF = self.tbIF
|
|
28
|
+
|
|
29
|
+
def process(self, msg_obj):
|
|
30
|
+
tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
|
|
31
|
+
# start
|
|
32
|
+
tmp_log.info("start")
|
|
33
|
+
tmp_log.debug(f"sub_id={msg_obj.sub_id} ; msg_id={msg_obj.msg_id}")
|
|
34
|
+
# parse json
|
|
35
|
+
try:
|
|
36
|
+
msg_dict = json.loads(msg_obj.data)
|
|
37
|
+
except Exception as e:
|
|
38
|
+
err_str = f"failed to parse message json {msg_obj.data} , skipped. {e.__class__.__name__} : {e}"
|
|
39
|
+
tmp_log.error(err_str)
|
|
40
|
+
raise
|
|
41
|
+
# sanity check
|
|
42
|
+
try:
|
|
43
|
+
msg_type = msg_dict.get("msg_type")
|
|
44
|
+
except Exception as e:
|
|
45
|
+
err_str = f"failed to parse message object dict {msg_dict} , skipped. {e.__class__.__name__} : {e}"
|
|
46
|
+
tmp_log.error(err_str)
|
|
47
|
+
raise
|
|
48
|
+
# run different plugins according to message type
|
|
49
|
+
try:
|
|
50
|
+
if msg_type in ("file_stagein", "collection_stagein", "work_stagein"):
|
|
51
|
+
tmp_log.debug("to tape_carousel")
|
|
52
|
+
self.plugin_TapeCarousel.process(msg_obj, decoded_data=msg_dict)
|
|
53
|
+
elif msg_type in ("file_hyperparameteropt", "collection_hyperparameteropt", "work_hyperparameteropt"):
|
|
54
|
+
tmp_log.debug("to hpo")
|
|
55
|
+
self.plugin_HPO.process(msg_obj, decoded_data=msg_dict)
|
|
56
|
+
elif msg_type in ("file_processing", "collection_processing", "work_processing"):
|
|
57
|
+
tmp_log.debug("to processing")
|
|
58
|
+
self.plugin_Processing.process(msg_obj, decoded_data=msg_dict)
|
|
59
|
+
else:
|
|
60
|
+
# Asked by iDDS and message broker guys, JEDI needs to consume unknown types of messages and do nothing...
|
|
61
|
+
warn_str = f"unknown msg_type: {msg_type} msg_dict: {str(msg_dict)}"
|
|
62
|
+
tmp_log.warning(warn_str)
|
|
63
|
+
except Exception:
|
|
64
|
+
raise
|
|
65
|
+
# done
|
|
66
|
+
tmp_log.info("done")
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from pandacommon.pandamsgbkr.msg_processor import SimpleMsgProcPluginBase
|
|
2
|
+
|
|
3
|
+
from pandajedi.jedicore.JediTaskBuffer import JediTaskBuffer
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# Base simple message processing plugin
|
|
7
|
+
class BaseMsgProcPlugin(SimpleMsgProcPluginBase):
|
|
8
|
+
def initialize(self, in_collective=False):
|
|
9
|
+
"""
|
|
10
|
+
initialize plugin instance, run once before loop in thread
|
|
11
|
+
"""
|
|
12
|
+
if in_collective:
|
|
13
|
+
# run in collective msg_proc plugin
|
|
14
|
+
pass
|
|
15
|
+
else:
|
|
16
|
+
# run as individual msg_proc plugin
|
|
17
|
+
self.set_tbIF()
|
|
18
|
+
|
|
19
|
+
def set_tbIF(self):
|
|
20
|
+
"""
|
|
21
|
+
set up JEDI TaskBuffer interface
|
|
22
|
+
"""
|
|
23
|
+
# set nDBConnection = n_threads to avoid DBProxy blocking amongs threads
|
|
24
|
+
n_db_conns = getattr(self, "n_threads", 1)
|
|
25
|
+
self.tbIF = JediTaskBuffer(None, nDBConnection=n_db_conns)
|
|
26
|
+
|
|
27
|
+
def process(self, msg_obj):
|
|
28
|
+
"""
|
|
29
|
+
process the message
|
|
30
|
+
Get msg_obj from the incoming MQ (if any; otherwise msg_obj is None)
|
|
31
|
+
Returned value will be sent to the outgoing MQ (if any)
|
|
32
|
+
"""
|
|
33
|
+
pass
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from pandacommon.pandalogger import logger_utils
|
|
2
|
+
|
|
3
|
+
from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin
|
|
4
|
+
|
|
5
|
+
base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# forwarding message processing plugin
|
|
9
|
+
class ForwardingMsgProcPlugin(BaseMsgProcPlugin):
|
|
10
|
+
"""
|
|
11
|
+
Simply forward the message from one queue to another
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def process(self, msg_obj):
|
|
15
|
+
tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
|
|
16
|
+
# start
|
|
17
|
+
# tmp_log.info('start')
|
|
18
|
+
# tmp_log.debug('sub_id={0} ; msg_id={1}'.format(msg_obj.sub_id, msg_obj.msg_id))
|
|
19
|
+
# run
|
|
20
|
+
try:
|
|
21
|
+
msg = msg_obj.data
|
|
22
|
+
tmp_log.debug(f"forward message {msg}")
|
|
23
|
+
except Exception as e:
|
|
24
|
+
err_str = f"failed to run, skipped. {e.__class__.__name__} : {e}"
|
|
25
|
+
tmp_log.error(err_str)
|
|
26
|
+
raise
|
|
27
|
+
# done
|
|
28
|
+
# tmp_log.info('done')
|
|
29
|
+
return msg
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
from pandacommon.pandalogger import logger_utils
|
|
4
|
+
|
|
5
|
+
from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin
|
|
6
|
+
|
|
7
|
+
base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Hyper-Parameter-Optimization message processing plugin
|
|
11
|
+
class HPOMsgProcPlugin(BaseMsgProcPlugin):
|
|
12
|
+
def process(self, msg_obj, decoded_data=None):
|
|
13
|
+
tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
|
|
14
|
+
# start
|
|
15
|
+
tmp_log.info("start")
|
|
16
|
+
tmp_log.debug(f"sub_id={msg_obj.sub_id} ; msg_id={msg_obj.msg_id}")
|
|
17
|
+
# parse
|
|
18
|
+
if decoded_data is None:
|
|
19
|
+
# json decode
|
|
20
|
+
try:
|
|
21
|
+
msg_dict = json.loads(msg_obj.data)
|
|
22
|
+
except Exception as e:
|
|
23
|
+
err_str = f"failed to parse message json {msg_obj.data} , skipped. {e.__class__.__name__} : {e}"
|
|
24
|
+
tmp_log.error(err_str)
|
|
25
|
+
raise
|
|
26
|
+
else:
|
|
27
|
+
msg_dict = decoded_data
|
|
28
|
+
# sanity check
|
|
29
|
+
try:
|
|
30
|
+
msg_type = msg_dict["msg_type"]
|
|
31
|
+
jeditaskid = int(msg_dict["workload_id"])
|
|
32
|
+
if msg_type == "file_hyperparameteropt":
|
|
33
|
+
target_list = msg_dict["files"]
|
|
34
|
+
elif msg_type == "collection_hyperparameteropt":
|
|
35
|
+
# to finish the task
|
|
36
|
+
pass
|
|
37
|
+
elif msg_type == "work_hyperparameteropt":
|
|
38
|
+
pass
|
|
39
|
+
else:
|
|
40
|
+
raise ValueError(f"invalid msg_type value: {msg_type}")
|
|
41
|
+
except Exception as e:
|
|
42
|
+
err_str = f"failed to parse message object dict {msg_dict} , skipped. {e.__class__.__name__} : {e}"
|
|
43
|
+
tmp_log.error(err_str)
|
|
44
|
+
raise
|
|
45
|
+
# run
|
|
46
|
+
if msg_type == "file_hyperparameteropt":
|
|
47
|
+
# insert HPO events
|
|
48
|
+
try:
|
|
49
|
+
# event ids from the targets
|
|
50
|
+
event_id_list = []
|
|
51
|
+
for target in target_list:
|
|
52
|
+
if target["status"] != "New":
|
|
53
|
+
continue
|
|
54
|
+
model_id = None
|
|
55
|
+
try:
|
|
56
|
+
path = json.loads(target["path"])
|
|
57
|
+
if isinstance(path[0], (list, tuple)):
|
|
58
|
+
model_id = path[0][0]
|
|
59
|
+
except Exception:
|
|
60
|
+
pass
|
|
61
|
+
event_id_list.append((target["name"], model_id))
|
|
62
|
+
if event_id_list:
|
|
63
|
+
n_events = len(event_id_list)
|
|
64
|
+
# insert events
|
|
65
|
+
res = self.tbIF.insertHpoEventAboutIdds_JEDI(jedi_task_id=jeditaskid, event_id_list=event_id_list)
|
|
66
|
+
# check if ok
|
|
67
|
+
if res:
|
|
68
|
+
tmp_log.debug(f"jeditaskid={jeditaskid}, inserted {n_events} events: {event_id_list}")
|
|
69
|
+
else:
|
|
70
|
+
tmp_log.warning(f"jeditaskid={jeditaskid}, failed to insert events: {event_id_list}")
|
|
71
|
+
except Exception as e:
|
|
72
|
+
err_str = f"failed to parse message object, skipped. {e.__class__.__name__} : {e}"
|
|
73
|
+
tmp_log.error(err_str)
|
|
74
|
+
raise
|
|
75
|
+
elif msg_type == "collection_hyperparameteropt":
|
|
76
|
+
# finish the task
|
|
77
|
+
try:
|
|
78
|
+
# send finish command
|
|
79
|
+
retVal, retStr = self.tbIF.sendCommandTaskPanda(jeditaskid, "iDDS. HPO task finished", True, "finish", comQualifier="soft")
|
|
80
|
+
# check if ok
|
|
81
|
+
if retVal:
|
|
82
|
+
tmp_log.debug(f"jeditaskid={jeditaskid}, finished the task")
|
|
83
|
+
else:
|
|
84
|
+
tmp_log.warning(f"jeditaskid={jeditaskid}, failed finish the task: {retStr}")
|
|
85
|
+
except Exception as e:
|
|
86
|
+
err_str = f"failed to parse message object, skipped. {e.__class__.__name__} : {e}"
|
|
87
|
+
tmp_log.error(err_str)
|
|
88
|
+
raise
|
|
89
|
+
else:
|
|
90
|
+
# do nothing
|
|
91
|
+
tmp_log.debug(f"jeditaskid={jeditaskid}, msg_type={msg_type}, did nothing")
|
|
92
|
+
# done
|
|
93
|
+
tmp_log.info("done")
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
from pandacommon.pandalogger import logger_utils
|
|
4
|
+
|
|
5
|
+
from pandajedi.jediddm.DDMInterface import DDMInterface
|
|
6
|
+
from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin
|
|
7
|
+
from pandajedi.jediorder.ContentsFeeder import ContentsFeederThread
|
|
8
|
+
|
|
9
|
+
base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# Jedi Contents Feeder message processor plugin
|
|
13
|
+
class JediContentsFeederMsgProcPlugin(BaseMsgProcPlugin):
|
|
14
|
+
"""
|
|
15
|
+
Message-driven Contents Feeder
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def initialize(self):
|
|
19
|
+
BaseMsgProcPlugin.initialize(self)
|
|
20
|
+
ddmIF = DDMInterface()
|
|
21
|
+
ddmIF.setupInterface()
|
|
22
|
+
the_pid = self.get_pid()
|
|
23
|
+
self.contents_feeder_thread_obj = ContentsFeederThread(taskDsList=None, threadPool=None, taskbufferIF=self.tbIF, ddmIF=ddmIF, pid=the_pid)
|
|
24
|
+
|
|
25
|
+
def process(self, msg_obj):
|
|
26
|
+
tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
|
|
27
|
+
# start
|
|
28
|
+
tmp_log.info("start")
|
|
29
|
+
tmp_log.debug(f"sub_id={msg_obj.sub_id} ; msg_id={msg_obj.msg_id}")
|
|
30
|
+
# parse json
|
|
31
|
+
try:
|
|
32
|
+
msg_dict = json.loads(msg_obj.data)
|
|
33
|
+
except Exception as e:
|
|
34
|
+
err_str = f"failed to parse message json {msg_obj.data} , skipped. {e.__class__.__name__} : {e}"
|
|
35
|
+
tmp_log.error(err_str)
|
|
36
|
+
raise
|
|
37
|
+
# sanity check
|
|
38
|
+
try:
|
|
39
|
+
msg_type = msg_dict["msg_type"]
|
|
40
|
+
except Exception as e:
|
|
41
|
+
err_str = f"failed to parse message object dict {msg_dict} , skipped. {e.__class__.__name__} : {e}"
|
|
42
|
+
tmp_log.error(err_str)
|
|
43
|
+
raise
|
|
44
|
+
if msg_type != "jedi_contents_feeder":
|
|
45
|
+
# FIXME
|
|
46
|
+
err_str = f"got unknown msg_type {msg_type} , skipped "
|
|
47
|
+
tmp_log.error(err_str)
|
|
48
|
+
raise
|
|
49
|
+
# run
|
|
50
|
+
try:
|
|
51
|
+
task_id = msg_dict["taskid"]
|
|
52
|
+
task_ds_list = self.tbIF.getDatasetsToFeedContents_JEDI(vo=None, prodSourceLabel=None, task_id=task_id)
|
|
53
|
+
if task_ds_list:
|
|
54
|
+
self.contents_feeder_thread_obj.feed_contents_to_tasks(task_ds_list)
|
|
55
|
+
tmp_log.info(f"fed datasets to task {task_id}")
|
|
56
|
+
else:
|
|
57
|
+
tmp_log.debug(f"got empty list of datasets to feed to task {task_id}; skipped ")
|
|
58
|
+
except Exception as e:
|
|
59
|
+
err_str = f"failed to run, skipped. {e.__class__.__name__} : {e}"
|
|
60
|
+
tmp_log.error(err_str)
|
|
61
|
+
raise
|
|
62
|
+
# done
|
|
63
|
+
tmp_log.info("done")
|