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,280 @@
|
|
|
1
|
+
import traceback
|
|
2
|
+
|
|
3
|
+
from pandacommon.pandalogger.LogWrapper import LogWrapper
|
|
4
|
+
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
5
|
+
|
|
6
|
+
from pandaserver.workflow.step_handler_plugins.base_step_handler import BaseStepHandler
|
|
7
|
+
from pandaserver.workflow.workflow_base import (
|
|
8
|
+
WFStepSpec,
|
|
9
|
+
WFStepStatus,
|
|
10
|
+
WFStepTargetCancelResult,
|
|
11
|
+
WFStepTargetCheckResult,
|
|
12
|
+
WFStepTargetSubmitResult,
|
|
13
|
+
WFStepType,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
# main logger
|
|
17
|
+
logger = PandaLogger().getLogger(__name__.split(".")[-1])
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class PandaTaskStepHandler(BaseStepHandler):
|
|
21
|
+
"""
|
|
22
|
+
Handler for PanDA task steps in the workflow.
|
|
23
|
+
This class is responsible for managing the execution of PanDA tasks within a workflow.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, *args, **kwargs):
|
|
27
|
+
"""
|
|
28
|
+
Initialize the step handler with necessary parameters.
|
|
29
|
+
"""
|
|
30
|
+
# Initialize base class or any required modules here
|
|
31
|
+
super().__init__(*args, **kwargs)
|
|
32
|
+
# plugin flavor
|
|
33
|
+
self.plugin_flavor = "panda_task"
|
|
34
|
+
|
|
35
|
+
def submit_target(self, step_spec: WFStepSpec, **kwargs) -> WFStepTargetSubmitResult:
|
|
36
|
+
"""
|
|
37
|
+
Submit a target for processing the PanDA task step.
|
|
38
|
+
This method should be implemented to handle the specifics of PanDA task submission.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
step_spec (WFStepSpec): The workflow step specification containing details about the step to be processed.
|
|
42
|
+
**kwargs: Additional keyword arguments that may be required for submission.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
WFStepTargetSubmitResult: An object containing the result of the submission, including success status, target ID (task ID), and message.
|
|
46
|
+
"""
|
|
47
|
+
tmp_log = LogWrapper(logger, f"submit_target workflow_id={step_spec.workflow_id} step_id={step_spec.step_id}")
|
|
48
|
+
# Initialize
|
|
49
|
+
submit_result = WFStepTargetSubmitResult()
|
|
50
|
+
# Check step flavor
|
|
51
|
+
if step_spec.flavor != self.plugin_flavor:
|
|
52
|
+
tmp_log.warning(f"flavor={step_spec.flavor} not {self.plugin_flavor}; skipped")
|
|
53
|
+
submit_result.message = f"flavor not {self.plugin_flavor}; skipped"
|
|
54
|
+
return submit_result
|
|
55
|
+
...
|
|
56
|
+
# task_param_map = {}
|
|
57
|
+
# task_param_map["taskName"] = step_spec.name
|
|
58
|
+
# task_param_map["userName"] = workflow_spec.username
|
|
59
|
+
# task_param_map["vo"] = "atlas"
|
|
60
|
+
# task_param_map["taskPriority"] = 1000
|
|
61
|
+
# # task_param_map["architecture"] = "i686-slc5-gcc43-opt"
|
|
62
|
+
# # task_param_map["transUses"] = "Atlas-17.2.7"
|
|
63
|
+
# task_param_map["transUses"] = None
|
|
64
|
+
# # task_param_map["transHome"] = "AtlasProduction-17.2.8.10"
|
|
65
|
+
# task_param_map["transHome"] = None
|
|
66
|
+
# task_param_map["transPath"] = "runGen-00-00-02"
|
|
67
|
+
# task_param_map["processingType"] = "reco"
|
|
68
|
+
# task_param_map["prodSourceLabel"] = "user"
|
|
69
|
+
# # task_param_map["prodSourceLabel"] = "managed"
|
|
70
|
+
# task_param_map["taskType"] = "anal"
|
|
71
|
+
# # task_param_map["taskType"] = "prod"
|
|
72
|
+
# task_param_map["inputPreStaging"] = True
|
|
73
|
+
# # task_param_map["panda_data_carousel"] = True
|
|
74
|
+
# task_param_map["remove_rule_when_done"] = True
|
|
75
|
+
# # task_param_map["workingGroup"] = "AP_Higgs"
|
|
76
|
+
# task_param_map["coreCount"] = 1
|
|
77
|
+
# task_param_map["nFiles"] = 1
|
|
78
|
+
# # task_param_map["cloud"] = "US"
|
|
79
|
+
# logDatasetName = f"panda.jeditest.log.{uuid.uuid4()}"
|
|
80
|
+
# task_param_map["log"] = {
|
|
81
|
+
# "dataset": logDatasetName,
|
|
82
|
+
# "type": "template",
|
|
83
|
+
# "param_type": "log",
|
|
84
|
+
# "token": "ATLASDATADISK",
|
|
85
|
+
# "value": f"{logDatasetName}.${{SN}}.log.tgz",
|
|
86
|
+
# }
|
|
87
|
+
# outDatasetName = f"panda.jeditest.NTUP_EMBLLDN.{uuid.uuid4()}"
|
|
88
|
+
# task_param_map["jobParameters"] = [
|
|
89
|
+
# {
|
|
90
|
+
# "type": "template",
|
|
91
|
+
# "param_type": "input",
|
|
92
|
+
# "value": "inputAODFile=${IN}",
|
|
93
|
+
# "dataset": "mc23_13p6TeV:mc23_13p6TeV.602027.PhH7EG_NLO_LQ_S43_ResProd_lam22_5000_3p5.merge.AOD.e8531_e8528_s4162_s4114_r14622_r14663_tid34033945_00",
|
|
94
|
+
# "expand": True,
|
|
95
|
+
# },
|
|
96
|
+
# {"type": "template", "param_type": "pseudo_input", "value": "dummy_value", "dataset": "pseudo_dataset"},
|
|
97
|
+
# {"type": "constant", "value": "AMITag=p1462"},
|
|
98
|
+
# {
|
|
99
|
+
# "type": "template",
|
|
100
|
+
# "param_type": "output",
|
|
101
|
+
# "token": "ATLASDATADISK",
|
|
102
|
+
# "value": f"outputNTUP_EMBLLDNFile={outDatasetName}.${{SN}}.pool.root",
|
|
103
|
+
# "dataset": outDatasetName,
|
|
104
|
+
# },
|
|
105
|
+
# ]
|
|
106
|
+
try:
|
|
107
|
+
# Get step definition
|
|
108
|
+
step_definition = step_spec.definition_json_map
|
|
109
|
+
user_name = step_definition.get("user_name")
|
|
110
|
+
user_dn = step_definition.get("user_dn")
|
|
111
|
+
task_param_map = step_definition.get("task_params", {})
|
|
112
|
+
# task_param_map["userName"] = user_name
|
|
113
|
+
if not step_spec.get_parameter("all_inputs_complete"):
|
|
114
|
+
# Some inputs are not complete, set workflowHoldup to True to hold up the workflow until released by workflow processor
|
|
115
|
+
task_param_map["workflowHoldup"] = True
|
|
116
|
+
# Submit task
|
|
117
|
+
tmp_ret_flag, temp_ret_val = self.tbif.insertTaskParamsPanda(task_param_map, user_dn, False, decode=False)
|
|
118
|
+
if tmp_ret_flag:
|
|
119
|
+
submit_result.success = True
|
|
120
|
+
submit_result.target_id = str(temp_ret_val)
|
|
121
|
+
tmp_log.info(f"Submitted task target_id={submit_result.target_id}")
|
|
122
|
+
else:
|
|
123
|
+
submit_result.message = temp_ret_val
|
|
124
|
+
tmp_log.error(f"Failed to submit task: {submit_result.message}")
|
|
125
|
+
except Exception as e:
|
|
126
|
+
submit_result.message = f"exception {str(e)}"
|
|
127
|
+
tmp_log.error(f"Failed to submit task: {traceback.format_exc()}")
|
|
128
|
+
return submit_result
|
|
129
|
+
|
|
130
|
+
def check_target(self, step_spec: WFStepSpec, **kwargs) -> WFStepTargetCheckResult:
|
|
131
|
+
"""
|
|
132
|
+
Check the status of a submitted target for the given step.
|
|
133
|
+
This method should be implemented to handle the specifics of status checking.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
step_spec (WFStepSpec): The workflow step specification containing details about the step to be processed.
|
|
137
|
+
**kwargs: Additional keyword arguments that may be required for status checking.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
WFStepTargetCheckResult: An object containing the result of the status check, including success status, step status, native status, and message.
|
|
141
|
+
"""
|
|
142
|
+
tmp_log = LogWrapper(logger, f"check_target workflow_id={step_spec.workflow_id} step_id={step_spec.step_id}")
|
|
143
|
+
allowed_step_statuses = [WFStepStatus.starting, WFStepStatus.running]
|
|
144
|
+
try:
|
|
145
|
+
# Initialize
|
|
146
|
+
check_result = WFStepTargetCheckResult()
|
|
147
|
+
# Check preconditions
|
|
148
|
+
if step_spec.status not in allowed_step_statuses:
|
|
149
|
+
check_result.message = f"not in status to check; skipped"
|
|
150
|
+
tmp_log.warning(f"status={step_spec.status} not in status to check; skipped")
|
|
151
|
+
return check_result
|
|
152
|
+
if step_spec.flavor != self.plugin_flavor:
|
|
153
|
+
check_result.message = f"flavor not {self.plugin_flavor}; skipped"
|
|
154
|
+
tmp_log.warning(f"flavor={step_spec.flavor} not {self.plugin_flavor}; skipped")
|
|
155
|
+
return check_result
|
|
156
|
+
if step_spec.target_id is None:
|
|
157
|
+
check_result.message = f"target_id is None; skipped"
|
|
158
|
+
tmp_log.warning(f"target_id is None; skipped")
|
|
159
|
+
return check_result
|
|
160
|
+
# Get task ID and status
|
|
161
|
+
task_id = int(step_spec.target_id)
|
|
162
|
+
res = self.tbif.getTaskStatusSuperstatus(task_id)
|
|
163
|
+
if not res:
|
|
164
|
+
check_result.message = f"task_id={task_id} not found"
|
|
165
|
+
tmp_log.error(f"{check_result.message}")
|
|
166
|
+
return check_result
|
|
167
|
+
# Interpret status
|
|
168
|
+
task_status = res[0]
|
|
169
|
+
task_superstatus = res[1]
|
|
170
|
+
check_result.success = True
|
|
171
|
+
check_result.native_status = task_status
|
|
172
|
+
if task_status in ["running", "scouting", "scouted", "throttled", "prepared", "finishing", "passed"]:
|
|
173
|
+
check_result.step_status = WFStepStatus.running
|
|
174
|
+
elif task_status in ["defined", "assigned", "activated", "starting", "ready"]:
|
|
175
|
+
check_result.step_status = WFStepStatus.starting
|
|
176
|
+
elif task_status in ["pending"]:
|
|
177
|
+
# Check superstatus for repetitive status (e.g. pending) to distinguish between starting and running
|
|
178
|
+
if task_superstatus in ["running"]:
|
|
179
|
+
check_result.step_status = WFStepStatus.running
|
|
180
|
+
else:
|
|
181
|
+
check_result.step_status = WFStepStatus.starting
|
|
182
|
+
elif task_status in ["done", "finished"]:
|
|
183
|
+
check_result.step_status = WFStepStatus.done
|
|
184
|
+
elif task_status in ["failed", "exhausted", "aborted", "toabort", "aborting", "broken", "tobroken"]:
|
|
185
|
+
check_result.step_status = WFStepStatus.failed
|
|
186
|
+
else:
|
|
187
|
+
check_result.success = False
|
|
188
|
+
check_result.message = f"unknown task_status {task_status}"
|
|
189
|
+
tmp_log.error(f"{check_result.message}")
|
|
190
|
+
return check_result
|
|
191
|
+
tmp_log.info(f"Got task_id={task_id} task_status={task_status}")
|
|
192
|
+
except Exception as e:
|
|
193
|
+
check_result.success = False
|
|
194
|
+
check_result.message = f"exception {str(e)}"
|
|
195
|
+
tmp_log.error(f"Failed to check status: {traceback.format_exc()}")
|
|
196
|
+
return check_result
|
|
197
|
+
|
|
198
|
+
def on_all_inputs_done(self, step_spec: WFStepSpec, **kwargs) -> None:
|
|
199
|
+
"""
|
|
200
|
+
Hook method called when all inputs for the step are done.
|
|
201
|
+
For PanDA task steps, unset workflowHoldup of the target task to allow it to proceed.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
step_spec (WFStepSpec): The workflow step specification containing details about the step.
|
|
205
|
+
**kwargs: Additional keyword arguments.
|
|
206
|
+
"""
|
|
207
|
+
tmp_log = LogWrapper(logger, f"on_all_inputs_done workflow_id={step_spec.workflow_id} step_id={step_spec.step_id}")
|
|
208
|
+
try:
|
|
209
|
+
# Check step flavor
|
|
210
|
+
if step_spec.flavor != self.plugin_flavor:
|
|
211
|
+
tmp_log.warning(f"flavor={step_spec.flavor} not {self.plugin_flavor}; skipped")
|
|
212
|
+
return
|
|
213
|
+
if step_spec.target_id is None:
|
|
214
|
+
tmp_log.warning(f"target_id is None; skipped")
|
|
215
|
+
return
|
|
216
|
+
# Get task ID
|
|
217
|
+
task_id = int(step_spec.target_id)
|
|
218
|
+
# Get task spec
|
|
219
|
+
_, task_spec = self.tbif.getTaskWithID_JEDI(task_id)
|
|
220
|
+
if task_spec is None:
|
|
221
|
+
tmp_log.error(f"task_id={task_id} not found; skipped")
|
|
222
|
+
return
|
|
223
|
+
# Unset workflowHoldup and release the task
|
|
224
|
+
if task_spec.is_workflow_holdup():
|
|
225
|
+
task_spec.set_workflow_holdup(False)
|
|
226
|
+
self.tbif.updateTask_JEDI(task_spec, {"jediTaskID": task_spec.jediTaskID})
|
|
227
|
+
tmp_log.info(f"task_id={task_id} unset workflowHoldup")
|
|
228
|
+
if task_spec.status == "pending":
|
|
229
|
+
tmp_ret = self.tbif.release_task_on_hold(task_id)
|
|
230
|
+
if not tmp_ret:
|
|
231
|
+
tmp_log.error(f"task_id={task_id} failed to release from pending")
|
|
232
|
+
else:
|
|
233
|
+
tmp_log.info(f"task_id={task_id} released from pending")
|
|
234
|
+
# Done
|
|
235
|
+
tmp_log.debug(f"Done")
|
|
236
|
+
except Exception as e:
|
|
237
|
+
tmp_log.error(f"Failed with: {traceback.format_exc()}")
|
|
238
|
+
|
|
239
|
+
def cancel_target(self, step_spec, **kwargs) -> WFStepTargetCancelResult:
|
|
240
|
+
"""
|
|
241
|
+
Cancel the target task for the given step.
|
|
242
|
+
This method should be implemented to handle the specifics of task cancellation.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
step_spec (WFStepSpec): The workflow step specification containing details about the step to be processed.
|
|
246
|
+
**kwargs: Additional keyword arguments that may be required for cancellation.
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
WFStepTargetCancelResult: An object containing the result of the cancellation, including success status and message.
|
|
250
|
+
"""
|
|
251
|
+
tmp_log = LogWrapper(logger, f"cancel_target workflow_id={step_spec.workflow_id} step_id={step_spec.step_id}")
|
|
252
|
+
cancel_result = WFStepTargetCancelResult()
|
|
253
|
+
try:
|
|
254
|
+
# Check step flavor
|
|
255
|
+
if step_spec.flavor != self.plugin_flavor:
|
|
256
|
+
cancel_result.message = f"flavor not {self.plugin_flavor}; skipped"
|
|
257
|
+
tmp_log.warning(f"flavor={step_spec.flavor} not {self.plugin_flavor}; skipped")
|
|
258
|
+
return cancel_result
|
|
259
|
+
if step_spec.target_id is None:
|
|
260
|
+
# If target_id is None, consider it as already cancelled since there is no task to cancel
|
|
261
|
+
cancel_result.success = True
|
|
262
|
+
cancel_result.message = f"target_id is None so considered already cancelled; skipped"
|
|
263
|
+
tmp_log.debug(f"{cancel_result.message}")
|
|
264
|
+
return cancel_result
|
|
265
|
+
# Get task ID
|
|
266
|
+
task_id = int(step_spec.target_id)
|
|
267
|
+
# Cancel task
|
|
268
|
+
ret_val, ret_str = self.tbif.sendCommandTaskPanda(task_id, "PanDA Task Step Handler cancel_target", True, "kill", properErrorCode=True)
|
|
269
|
+
# check if ok
|
|
270
|
+
if ret_val == 0:
|
|
271
|
+
cancel_result.success = True
|
|
272
|
+
tmp_log.info(f"target_id={step_spec.target_id} cancelled")
|
|
273
|
+
else:
|
|
274
|
+
cancel_result.success = False
|
|
275
|
+
cancel_result.message = f"failed to cancel the task: error_code={ret_val} {ret_str}"
|
|
276
|
+
tmp_log.warning(f"{cancel_result.message}")
|
|
277
|
+
except Exception as e:
|
|
278
|
+
cancel_result.message = f"exception {str(e)}"
|
|
279
|
+
tmp_log.error(f"Failed to cancel task: {traceback.format_exc()}")
|
|
280
|
+
return cancel_result
|