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,225 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module is responsible for setting up the dataset for the PanDA server.
|
|
3
|
+
This module contains the Setupper class, which is a thread that sets up the dataset for a list of jobs. The jobs are processed according to various parameters, such as whether the job is a resubmission and whether it's the first submission.
|
|
4
|
+
The Setupper class also contains methods for running the setup process and updating the status of jobs.
|
|
5
|
+
This module uses the PandaLogger for logging and the panda_config for configuration. It also imports several other modules from the pandaserver package.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import sys
|
|
9
|
+
import threading
|
|
10
|
+
import traceback
|
|
11
|
+
from typing import List
|
|
12
|
+
|
|
13
|
+
from pandacommon.pandalogger.LogWrapper import LogWrapper
|
|
14
|
+
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
15
|
+
|
|
16
|
+
from pandaserver.config import panda_config
|
|
17
|
+
from pandaserver.taskbuffer import EventServiceUtils
|
|
18
|
+
from pandaserver.taskbuffer.PickleJobSpec import PickleJobSpec
|
|
19
|
+
|
|
20
|
+
_logger = PandaLogger().getLogger("setupper")
|
|
21
|
+
|
|
22
|
+
panda_config.setupPlugin()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# main class
|
|
26
|
+
class Setupper(threading.Thread):
|
|
27
|
+
"""
|
|
28
|
+
The Setupper class is the main class responsible for setting up the dataset in the PanDA server.
|
|
29
|
+
The Setupper class is initialized with a list of jobs that need to be processed, along with several other parameters such as whether the job is a resubmission and whether it's the first submission.
|
|
30
|
+
The class contains a run method which is the main method for running the setup process. This method groups jobs per VO, gets the appropriate plugin for each VO, and runs the plugin. It also updates the jobs and executes the post process of the plugin.
|
|
31
|
+
The class also contains an update_jobs method which updates the status of jobs. This method sorts jobs by status, updates the jobs in the task buffer, and updates the database.
|
|
32
|
+
This class uses the PandaLogger for logging and the panda_config for configuration. It also imports several other modules from the pandaserver package.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
# constructor
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
taskBuffer,
|
|
39
|
+
jobs: List[object],
|
|
40
|
+
resubmit: bool = False,
|
|
41
|
+
first_submission: bool = True,
|
|
42
|
+
):
|
|
43
|
+
"""
|
|
44
|
+
Constructor for the Setupper class.
|
|
45
|
+
|
|
46
|
+
:param taskBuffer: The buffer for tasks.
|
|
47
|
+
:param jobs: The jobs to be processed.
|
|
48
|
+
:param resubmit: A flag to indicate if the job is a resubmission. Defaults to False.
|
|
49
|
+
:param first_submission: A flag to indicate if it's the first submission. Defaults to True.
|
|
50
|
+
"""
|
|
51
|
+
threading.Thread.__init__(self)
|
|
52
|
+
self.jobs = jobs
|
|
53
|
+
self.task_buffer = taskBuffer
|
|
54
|
+
# resubmission or not
|
|
55
|
+
self.resubmit = resubmit
|
|
56
|
+
# first submission
|
|
57
|
+
self.first_submission = first_submission
|
|
58
|
+
|
|
59
|
+
# main
|
|
60
|
+
def run(self) -> None:
|
|
61
|
+
"""
|
|
62
|
+
This is the main method for running the setup process. It is responsible for the following:
|
|
63
|
+
1. Creating a message instance for logging.
|
|
64
|
+
2. Making the job specifications pickleable for serialization.
|
|
65
|
+
3. Grouping jobs per Virtual Organization (VO).
|
|
66
|
+
4. Getting the appropriate plugin for each VO and running it.
|
|
67
|
+
5. Updating the jobs and executing the post process of the plugin.
|
|
68
|
+
This method handles any exceptions that occur during the setup process and logs the error message.
|
|
69
|
+
|
|
70
|
+
:return: None
|
|
71
|
+
"""
|
|
72
|
+
try:
|
|
73
|
+
# prefix: None will trigger to use a timestamp as prefix, which is used to group runs
|
|
74
|
+
tmp_log = LogWrapper(_logger, None)
|
|
75
|
+
# run main procedure in the same process
|
|
76
|
+
tmp_log.debug("start")
|
|
77
|
+
tmp_log.debug(f"first_submission={self.first_submission}")
|
|
78
|
+
# make Specs pickleable
|
|
79
|
+
p_job_list = []
|
|
80
|
+
for job_spec in self.jobs:
|
|
81
|
+
p_job = PickleJobSpec()
|
|
82
|
+
p_job.update(job_spec)
|
|
83
|
+
p_job_list.append(p_job)
|
|
84
|
+
self.jobs = p_job_list
|
|
85
|
+
# group jobs per VO
|
|
86
|
+
vo_jobs_map = {}
|
|
87
|
+
tmp_log.debug(f"{len(self.jobs)} jobs in total")
|
|
88
|
+
for tmp_job in self.jobs:
|
|
89
|
+
# set VO=local for DDM free
|
|
90
|
+
if tmp_job.destinationSE == "local":
|
|
91
|
+
tmp_vo = "local"
|
|
92
|
+
else:
|
|
93
|
+
tmp_vo = tmp_job.VO
|
|
94
|
+
# make map
|
|
95
|
+
vo_jobs_map.setdefault(tmp_vo, [])
|
|
96
|
+
vo_jobs_map[tmp_vo].append(tmp_job)
|
|
97
|
+
# loop over all VOs
|
|
98
|
+
for tmp_vo in vo_jobs_map:
|
|
99
|
+
tmp_job_list = vo_jobs_map[tmp_vo]
|
|
100
|
+
tmp_log.debug(f"vo={tmp_vo} has {len(tmp_job_list)} jobs")
|
|
101
|
+
# get plugin
|
|
102
|
+
setupper_plugin_class = panda_config.getPlugin("setupper_plugins", tmp_vo)
|
|
103
|
+
if setupper_plugin_class is None:
|
|
104
|
+
# use ATLAS plug-in by default
|
|
105
|
+
from pandaserver.dataservice.setupper_atlas_plugin import (
|
|
106
|
+
SetupperAtlasPlugin,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
setupper_plugin_class = SetupperAtlasPlugin
|
|
110
|
+
tmp_log.debug(f"plugin name -> {setupper_plugin_class.__name__}")
|
|
111
|
+
try:
|
|
112
|
+
# make plugin
|
|
113
|
+
setupper_plugin = setupper_plugin_class(
|
|
114
|
+
self.task_buffer,
|
|
115
|
+
self.jobs,
|
|
116
|
+
tmp_log,
|
|
117
|
+
resubmit=self.resubmit,
|
|
118
|
+
first_submission=self.first_submission,
|
|
119
|
+
)
|
|
120
|
+
# run plugin
|
|
121
|
+
tmp_log.debug("run plugin")
|
|
122
|
+
setupper_plugin.run()
|
|
123
|
+
# update jobs
|
|
124
|
+
tmp_log.debug("update jobs")
|
|
125
|
+
self.update_jobs(setupper_plugin.jobs + setupper_plugin.jumbo_jobs, tmp_log)
|
|
126
|
+
# execute post process
|
|
127
|
+
tmp_log.debug("post execute plugin")
|
|
128
|
+
setupper_plugin.post_run()
|
|
129
|
+
tmp_log.debug("done plugin")
|
|
130
|
+
except Exception as e:
|
|
131
|
+
tmp_log.error(f"plugin failed with {str(e)} {traceback.format_exc()}")
|
|
132
|
+
tmp_log.debug("end")
|
|
133
|
+
except Exception as error:
|
|
134
|
+
tmp_log.error(f"failed with {str(error)} {traceback.format_exc()}")
|
|
135
|
+
|
|
136
|
+
# update jobs
|
|
137
|
+
def update_jobs(self, job_list: List[object], tmp_log: LogWrapper) -> None:
|
|
138
|
+
"""
|
|
139
|
+
This method is responsible for updating the status of jobs in the PanDA server.
|
|
140
|
+
It sorts the jobs by their status into different categories: failed, waiting, no input, and normal jobs.
|
|
141
|
+
For each category, it performs the appropriate actions. For example, it changes their status to "assigned".
|
|
142
|
+
It also handles the activation of jobs. If a job should not discard any events, all events in the job are okay, and the job is not an Event Service Merge job, then the job's status is updated to "finished".
|
|
143
|
+
This method also updates the database with the new job statuses.
|
|
144
|
+
|
|
145
|
+
:param job_list: The list of jobs to be updated.
|
|
146
|
+
:param tmp_log: The logger to be used for logging.
|
|
147
|
+
:return: None
|
|
148
|
+
"""
|
|
149
|
+
update_jobs = []
|
|
150
|
+
failed_jobs = []
|
|
151
|
+
activate_jobs = []
|
|
152
|
+
waiting_jobs = []
|
|
153
|
+
# sort jobs by status
|
|
154
|
+
for job in job_list:
|
|
155
|
+
# failed jobs
|
|
156
|
+
if job.jobStatus in ["failed", "cancelled"]:
|
|
157
|
+
failed_jobs.append(job)
|
|
158
|
+
# waiting
|
|
159
|
+
elif job.jobStatus == "waiting":
|
|
160
|
+
waiting_jobs.append(job)
|
|
161
|
+
# no input jobs
|
|
162
|
+
elif job.dispatchDBlock == "NULL":
|
|
163
|
+
activate_jobs.append(job)
|
|
164
|
+
# normal jobs
|
|
165
|
+
else:
|
|
166
|
+
# change status
|
|
167
|
+
job.jobStatus = "assigned"
|
|
168
|
+
update_jobs.append(job)
|
|
169
|
+
|
|
170
|
+
# trigger merge generation if all events are done
|
|
171
|
+
new_activate_jobs = []
|
|
172
|
+
n_finished = 0
|
|
173
|
+
# Iterate over each job in the activate_jobs list
|
|
174
|
+
for job in activate_jobs:
|
|
175
|
+
# Check if the job should not discard events, if all events are okay, and if the job is not an Event Service Merge job
|
|
176
|
+
# notDiscardEvents() returns True if the job should not discard any events
|
|
177
|
+
# allOkEvents() returns True if all events in the job are okay (no errors or issues)
|
|
178
|
+
if job.notDiscardEvents() and job.allOkEvents() and not EventServiceUtils.isEventServiceMerge(job):
|
|
179
|
+
# If all conditions are met, update the job in the task buffer
|
|
180
|
+
self.task_buffer.updateJobs([job])
|
|
181
|
+
# Change the job status to "finished"
|
|
182
|
+
job.jobStatus = "finished"
|
|
183
|
+
# Update the job in the task buffer again with the new status
|
|
184
|
+
# The second parameter False indicates that the job status should not be checked before the update
|
|
185
|
+
self.task_buffer.updateJobs([job], False)
|
|
186
|
+
# Increment the counter for finished jobs
|
|
187
|
+
n_finished += 1
|
|
188
|
+
else:
|
|
189
|
+
# If any of the conditions are not met, add the job to a new list new_activate_jobs
|
|
190
|
+
new_activate_jobs.append(job)
|
|
191
|
+
# Replace the activate_jobs list with new_activate_jobs
|
|
192
|
+
activate_jobs = new_activate_jobs
|
|
193
|
+
tmp_log.debug(f"# of finished jobs in activated : {n_finished}")
|
|
194
|
+
new_update_jobs = []
|
|
195
|
+
n_finished = 0
|
|
196
|
+
# Repeat a similar process for the update_jobs list
|
|
197
|
+
for job in update_jobs:
|
|
198
|
+
if job.notDiscardEvents() and job.allOkEvents() and not EventServiceUtils.isEventServiceMerge(job):
|
|
199
|
+
# The second parameter True indicates that the job status should be checked before the update
|
|
200
|
+
self.task_buffer.updateJobs([job], True)
|
|
201
|
+
# change status
|
|
202
|
+
job.jobStatus = "finished"
|
|
203
|
+
self.task_buffer.updateJobs([job], True)
|
|
204
|
+
n_finished += 1
|
|
205
|
+
else:
|
|
206
|
+
new_update_jobs.append(job)
|
|
207
|
+
update_jobs = new_update_jobs
|
|
208
|
+
tmp_log.debug(f"# of finished jobs in defined : {n_finished}")
|
|
209
|
+
# Update the database
|
|
210
|
+
tmp_log.debug(f"# of activated jobs : {len(activate_jobs)}")
|
|
211
|
+
self.task_buffer.activateJobs(activate_jobs)
|
|
212
|
+
tmp_log.debug(f"# of updated jobs : {len(update_jobs)}")
|
|
213
|
+
# Update the jobs in the 'update_jobs' list. The 'True' argument indicates that the jobs are to be updated immediately
|
|
214
|
+
self.task_buffer.updateJobs(update_jobs, True)
|
|
215
|
+
tmp_log.debug(f"# of failed jobs : {len(failed_jobs)}")
|
|
216
|
+
# Update the failed jobs in the 'failed_jobs' list. The 'True' argument indicates that the jobs are to be updated immediately
|
|
217
|
+
self.task_buffer.updateJobs(failed_jobs, True)
|
|
218
|
+
tmp_log.debug(f"# of waiting jobs : {len(waiting_jobs)}")
|
|
219
|
+
# Keep the jobs in the 'waiting_jobs' list in the waiting state
|
|
220
|
+
self.task_buffer.keepJobs(waiting_jobs)
|
|
221
|
+
# delete local values
|
|
222
|
+
del update_jobs
|
|
223
|
+
del failed_jobs
|
|
224
|
+
del activate_jobs
|
|
225
|
+
del waiting_jobs
|