panda-server-source 1.0.0__tar.gz → 1.0.2__tar.gz
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-1.0.0 → panda_server_source-1.0.2}/PKG-INFO +1 -1
- panda_server_source-1.0.2/PandaPkgInfo.py +1 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedibrokerage/AtlasAnalJobBroker.py +14 -7
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedibrokerage/AtlasBrokerUtils.py +46 -36
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedibrokerage/AtlasProdJobBroker.py +14 -6
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedibrokerage/AtlasProdTaskBroker.py +3 -2
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/JediTaskBuffer.py +18 -4
- panda_server_source-1.0.2/pandajedi/jedidog/AsyncRequestWatchDog.py +27 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/AtlasAnalWatchDog.py +28 -1
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/ContentsFeeder.py +18 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/JediMaster.py +0 -1
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/JobGenerator.py +10 -6
- panda_server_source-1.0.2/pandajedi/jediorder/PostProcessor.py +182 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/TaskRefiner.py +4 -1
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/WatchDog.py +2 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedipprocess/AtlasAnalPostProcessor.py +102 -69
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedipprocess/AtlasProdPostProcessor.py +54 -19
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedirefine/TaskRefinerBase.py +53 -40
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedithrottle/JobThrottlerBase.py +6 -2
- panda_server_source-1.0.2/pandaserver/api/v1/async_process_api.py +341 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/common.py +31 -1
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/credential_management_api.py +1 -1
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/file_server_api.py +3 -3
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/http_client.py +1 -2
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/task_api.py +29 -13
- panda_server_source-1.0.2/pandaserver/api/v1/tests/async_process_api_tests.py +221 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/tests/task_api_tests.py +25 -0
- {panda_server_source-1.0.0/pandaserver/brokerage → panda_server_source-1.0.2/pandaserver/asyncprocess}/__init__.py +0 -0
- panda_server_source-1.0.2/pandaserver/asyncprocess/processor.py +181 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/brokerage/SiteMapper.py +3 -2
- {panda_server_source-1.0.0/pandaserver/config → panda_server_source-1.0.2/pandaserver/brokerage}/__init__.py +0 -0
- {panda_server_source-1.0.0/pandaserver/dataservice → panda_server_source-1.0.2/pandaserver/daemons/scripts}/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/add_main.py +15 -2
- panda_server_source-1.0.2/pandaserver/daemons/scripts/async_request_daemon.py +37 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/recover_lost_files_daemon.py +0 -3
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/RecoverLostFilesCore.py +8 -7
- {panda_server_source-1.0.0/pandaserver/pandamcp → panda_server_source-1.0.2/pandaserver/jobdispatcher}/__init__.py +0 -0
- panda_server_source-1.0.2/pandaserver/pandamcp/client_utils/get_panda_token.py +151 -0
- panda_server_source-1.0.2/pandaserver/pandamcp/client_utils/panda_mcp_proxy.py +390 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/pandamcp/mcp_test_client.py +12 -3
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/server/panda.py +4 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/srvcore/CoreUtils.py +1 -1
- {panda_server_source-1.0.0/pandaserver/taskbuffer → panda_server_source-1.0.2/pandaserver/srvcore}/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/DdmSpec.py +3 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/JediDatasetSpec.py +6 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/JediFileSpec.py +1 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/JediTaskSpec.py +22 -2
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/OraDBProxy.py +2 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/PrioUtil.py +1 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/TaskBuffer.py +78 -3
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/WrappedCursor.py +9 -4
- {panda_server_source-1.0.0/pandaserver/test → panda_server_source-1.0.2/pandaserver/taskbuffer}/__init__.py +0 -0
- panda_server_source-1.0.2/pandaserver/taskbuffer/db_proxy_mods/async_request_module.py +548 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/base_module.py +55 -3
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +122 -28
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +118 -34
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +151 -153
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +60 -26
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +45 -18
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/worker_module.py +36 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/boostUser.py +1 -1
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/daod_on_demand.py +1 -1
- panda_server_source-1.0.2/pandaserver/workflow/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/workflow_base.py +2 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/workflow_core.py +87 -25
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/workflow_utils.py +3 -3
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/panda_jedi.cfg.rpmnew.template +4 -4
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/panda_server-httpd.conf.rpmnew.template +1 -1
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/panda_server.cfg.rpmnew.template +3 -1
- panda_server_source-1.0.0/PandaPkgInfo.py +0 -1
- panda_server_source-1.0.0/pandajedi/jediorder/PostProcessor.py +0 -166
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/.gitignore +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/.pre-commit-config.yaml +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/Dockerfile +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/Dockerfile.base +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/LICENSE.txt +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/README.md +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/package/hatch_build.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedibrokerage/GenJobBroker.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedibrokerage/JobBrokerBase.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedibrokerage/TaskBrokerBase.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedibrokerage/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediconfig/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediconfig/jedi_config.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/FactoryBase.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/Interaction.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/JediDBProxy.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/JediDBProxyPool.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/JediDBSchemaInfo.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/JediException.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/JediTaskBufferInterface.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/MsgWrapper.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/ProcessUtils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/SiteCandidate.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/ThreadUtils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediddm/AtlasDDMClient.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediddm/DDMClientBase.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediddm/DDMInterface.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediddm/GenDDMClient.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediddm/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/AtlasDataCarouselWatchDog.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/AtlasProdWatchDog.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/AtlasQueueFillerWatchDog.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/GenWatchDog.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/JumboWatchDog.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/TypicalWatchDogBase.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/WatchDogBase.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediexec/reniceJEDI.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedigen/AtlasTaskGenerator.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedigen/TaskGeneratorBase.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedigen/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/base_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/forwarding_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/hpo_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/kafka_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/processing_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/status_report_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/JediDaemon.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/JediKnight.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/JediMsgProcessor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/JobBroker.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/JobSplitter.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/JobThrottler.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/TaskBroker.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/TaskCommando.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/TaskGenerator.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/TaskSetupper.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedipprocess/AtlasPostProcessorUtils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedipprocess/GenPostProcessor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedipprocess/MailTemplates.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedipprocess/PostProcessorBase.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedipprocess/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedirefine/AtlasAnalTaskRefiner.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedirefine/AtlasProdTaskRefiner.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedirefine/GenTaskRefiner.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedirefine/RefinerUtils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedirefine/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedisetup/AtlasTaskSetupper.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedisetup/GenTaskSetupper.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedisetup/SimpleTaskSetupper.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedisetup/TaskSetupperBase.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedisetup/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/SchemaChecker.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/addContWoSoTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/addDataCarouselRequest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/addEventServiceTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/addHpoTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/addIDDSStageInRequest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/addNonAtlasTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/addNonAtlasTaskEnc.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/addTestTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/addTestTaskParamToDEFT.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/addTestTaskWithMerger.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/brokerTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/cancelDataCarouselRequest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/contentsFeederTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/contentsFeederTestWithTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/ddmTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/jobGenForOneTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/jobGeneratorTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/jobSplitterTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/jobThrottlerTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/msgProcessorTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/postProcessorTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/resubmitDataCarouselRequest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/resubmitTaskParam.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/taskBrokerTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/taskBrokerTestWithTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/taskBufferTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/taskCommandoTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/taskRefinerTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/testOneTaskToRefine.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/testOneTaskToTaskBroker.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/testPandaDDMMap.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/updateDataCarouselRequestParams.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/watchDogTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jeditest/workQueueTest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedithrottle/AtlasAnalJobThrottler.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedithrottle/AtlasProdJobThrottler.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedithrottle/GenJobThrottler.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedithrottle/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/data_carousel_api.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/event_api.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/harvester_api.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/idds_api.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/job_api.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/metaconfig_api.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/pilot_api.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/statistics_api.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/system_api.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/tests/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/tests/credential_management_api_tests.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/tests/data_carousel_api_tests.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/tests/harvester_api_tests.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/tests/idds_api_tests.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/tests/job_api_tests.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/tests/pilot_api_tests.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/tests/statistics_api_tests.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/tests/system_api_tests.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/version.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/api/v1/workflow_api.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/brokerage/broker.py +0 -0
- {panda_server_source-1.0.0/pandaserver/configurator → panda_server_source-1.0.2/pandaserver/config}/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/config/config_utils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/config/daemon_config.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/config/mcp_config.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/config/panda_config.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/configurator/Carbon.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/configurator/Configurator.py +0 -0
- {panda_server_source-1.0.0/pandaserver/daemons → panda_server_source-1.0.2/pandaserver/configurator}/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/configurator/aux.py +0 -0
- {panda_server_source-1.0.0/pandaserver/daemons/scripts → panda_server_source-1.0.2/pandaserver/daemons}/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/master.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/master_systemd.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/add_sub.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/cache_pilots.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/cache_schedconfig.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/carbon.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/configurator.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/copyArchive.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/datasetManager.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/dummy_test.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/evpPD2P.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/hs_scrapers.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/metric_collector.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/panda_activeusers_query.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/pilotStreaming.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/process_workflow_files_daemon.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/task_evaluator.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/tmpwatch.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/scripts/worker_synchronization.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/daemons/utils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/DataServiceUtils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/ErrorCode.py +0 -0
- {panda_server_source-1.0.0/pandaserver/jobdispatcher → panda_server_source-1.0.2/pandaserver/dataservice}/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/activator.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/adder_atlas_plugin.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/adder_dummy_plugin.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/adder_gen.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/adder_plugin_base.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/adder_result.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/adder_simple_plugin.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/closer.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/closer_atlas_plugin.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/ddm.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/ddm_handler.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/dyn_data_distributer.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/event_lookup_client_ei.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/event_picker.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/finisher.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/setupper.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/setupper_atlas_plugin.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/setupper_dummy_plugin.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/dataservice/setupper_plugin_base.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/jobdispatcher/DispatcherUtils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/jobdispatcher/ErrorCode.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/jobdispatcher/Protocol.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/jobdispatcher/Watcher.py +0 -0
- {panda_server_source-1.0.0/pandaserver/proxycache → panda_server_source-1.0.2/pandaserver/pandamcp}/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/pandamcp/client_utils/get_panda_token.sh +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/pandamcp/client_utils/panda_mcp_wrapper.sh +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/pandamcp/mcp_main.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/pandamcp/mcp_utils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/pandamcp/panda_mcp_endpoints.json +0 -0
- {panda_server_source-1.0.0/pandaserver/srvcore → panda_server_source-1.0.2/pandaserver/proxycache}/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/proxycache/panda_proxy_cache.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/proxycache/token_cache.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/server/.gacl +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/srvcore/MailUtils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/srvcore/allowed_methods.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/srvcore/oidc_utils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/srvcore/panda_request.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/srvcore/srv_msg_utils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/ConBridge.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/DBProxyPool.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/DataCarousel.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/DatasetSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/ErrorCode.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/EventServiceUtils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/FileSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/GlobalShares.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/HarvesterMetricsSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/Initializer.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/InputChunk.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/JediCacheSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/JobSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/JobUtils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/NucleusSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/PanDAMsgProcessor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/PandaDBSchemaInfo.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/ParseJobXML.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/PickleFileSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/PickleJobSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/ProcessGroups.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/ResourceSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/SQLDumper.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/SQLManager.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/SiteSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/SupErrors.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/TaskBufferInterface.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/WorkQueue.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/WorkQueueMapper.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/WorkerSpec.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/WrappedPostgresConn.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/entity_module.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/retryModule.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/task_split_rules.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/workflow_processor.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/taskbuffer/wrapped_oracle_conn.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/SchemaChecker.py +0 -0
- {panda_server_source-1.0.0/pandaserver/userinterface → panda_server_source-1.0.2/pandaserver/test}/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/banUser.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/boostPrio.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/callbackDDM.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/finishJob.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/finishTaskJEDI.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/getJobs.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/killJob.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/killJobLowPrio.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/killJobsInTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/killTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/killTaskJEDI.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/killUser.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/lsst/README.txt +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/lsst/lsstSubmit.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/lsst/lsstSubmitMERGEtest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/lsst/lsstSubmitPhosim332.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/reassignJobs.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/reassignSite.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/reassignTask.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/reassignWaiting.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/recoverLostFiles.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/reloadInputDS.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/sendCommandToJob.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/setDebugMode.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/setPriority.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/testEvgen.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/testEvgen17.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/testG4sim.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/testG4sim17.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/testGlobalShares.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/testReco.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/testSimulReco14.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/testSiteMap.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/test/testUpdateWorkerPilotStatus.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/userinterface/Client.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/userinterface/UserIF.py +0 -0
- {panda_server_source-1.0.0/pandaserver/workflow → panda_server_source-1.0.2/pandaserver/userinterface}/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/data_handler_plugins/base_data_handler.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/examples/multistep_merge_wfd.yaml +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/pcwl_test.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/pcwl_utils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/psnakemake_container.json +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/psnakemake_task.json +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/psnakemake_test.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/snakeparser/__init__.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/snakeparser/extensions.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/snakeparser/log.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/snakeparser/names.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/snakeparser/parser.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/snakeparser/utils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/step_handler_plugins/base_step_handler.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/workflow_core_smoketest.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/workflow_native_utils.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandaserver/workflow/workflow_parser.py +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pyproject-source.toml +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/pyproject.toml +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/bin/panda_jedi-reniceJEDI.exe.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/bin/panda_server-makeSlsXml.exe.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/bin/panda_server-vomsrenew.exe.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/init.d/panda_daemon.exe.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/init.d/panda_httpd.exe.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/init.d/panda_jedi.exe.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/init.d/panda_mcp.exe.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/init.d/panda_server.exe.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/logrotate.d/panda_jedi.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/logrotate.d/panda_server.logrotate.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/panda_jedi.cron.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/sysconfig/panda_jedi.sysconfig_for_systemd.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/sysconfig/panda_jedi.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/sysconfig/panda_jedi_env.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/sysconfig/panda_server.sysconfig.rpmnew.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/sysconfig/panda_server.sysconfig_for_systemd.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/sysconfig/panda_server_env.systemd.rpmnew.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/systemd/panda.service.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/systemd/panda_daemon.service.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/systemd/panda_httpd.service.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/systemd/panda_jedi.service.template +0 -0
- {panda_server_source-1.0.0 → panda_server_source-1.0.2}/templates/systemd/panda_mcp.service.template +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
release_version = "1.0.2"
|
|
@@ -47,6 +47,13 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
47
47
|
logger.error("Failed to load the WN architecture level map!!!")
|
|
48
48
|
self.architecture_level_map = {}
|
|
49
49
|
|
|
50
|
+
# load the worker node GPU map
|
|
51
|
+
try:
|
|
52
|
+
self.wn_gpu_map = taskBufferIF.get_worker_node_gpu_map()
|
|
53
|
+
except BaseException:
|
|
54
|
+
logger.error("Failed to load the WN GPU map!!!")
|
|
55
|
+
self.wn_gpu_map = {}
|
|
56
|
+
|
|
50
57
|
# main
|
|
51
58
|
def doBrokerage(self, taskSpec, cloudName, inputChunk, taskParamMap):
|
|
52
59
|
# make logger
|
|
@@ -834,7 +841,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
834
841
|
newScanSiteList = []
|
|
835
842
|
oldScanSiteList = copy.copy(scanSiteList)
|
|
836
843
|
msg_map = {}
|
|
837
|
-
jsonCheck = AtlasBrokerUtils.JsonSoftwareCheck(self.siteMapper, self.sw_map, self.architecture_level_map)
|
|
844
|
+
jsonCheck = AtlasBrokerUtils.JsonSoftwareCheck(self.siteMapper, self.sw_map, self.architecture_level_map, self.wn_gpu_map)
|
|
838
845
|
for tmpSiteName in scanSiteList:
|
|
839
846
|
tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
|
|
840
847
|
if tmpSiteSpec.isGPU() and not taskSpec.is_hpo_workflow():
|
|
@@ -1289,7 +1296,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1289
1296
|
continue
|
|
1290
1297
|
|
|
1291
1298
|
######################################
|
|
1292
|
-
# selection
|
|
1299
|
+
# selection to skip short walltime: scouts, merges, and walltime-undefined jobs
|
|
1293
1300
|
# must only go to sites with at least 24hr*10HS06s of available walltime
|
|
1294
1301
|
if (
|
|
1295
1302
|
(not sitePreAssigned and inputChunk.useScout())
|
|
@@ -1325,16 +1332,16 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1325
1332
|
if siteMaxTime != 0 and siteMaxTime < minTimeForZeroWalltime:
|
|
1326
1333
|
tmpMsg = f" skip site={tmpSiteName} due to site walltime {tmpSiteStr} (site upper limit) insufficient "
|
|
1327
1334
|
if inputChunk.useScout():
|
|
1328
|
-
tmpMsg += f"for
|
|
1329
|
-
tmpMsg += "criteria=-
|
|
1335
|
+
tmpMsg += f"for scout jobs (requireing {str_minTimeForZeroWalltime} at least) "
|
|
1336
|
+
tmpMsg += "criteria=-scout_walltime"
|
|
1330
1337
|
else:
|
|
1331
|
-
tmpMsg += f"for
|
|
1332
|
-
tmpMsg += "criteria=-
|
|
1338
|
+
tmpMsg += f"for merge or walltime-undefined jobs (requiring {str_minTimeForZeroWalltime} at least) "
|
|
1339
|
+
tmpMsg += "criteria=-min_walltime"
|
|
1333
1340
|
msg_map[tmpSiteSpec.get_unified_name()] = tmpMsg
|
|
1334
1341
|
continue
|
|
1335
1342
|
newScanSiteList.append(tmpSiteName)
|
|
1336
1343
|
scanSiteList = newScanSiteList
|
|
1337
|
-
self.add_summary_message(oldScanSiteList, scanSiteList, "
|
|
1344
|
+
self.add_summary_message(oldScanSiteList, scanSiteList, "minimum walltime capacity check", tmpLog, msg_map)
|
|
1338
1345
|
if not scanSiteList:
|
|
1339
1346
|
self.dump_summary(tmpLog)
|
|
1340
1347
|
tmpLog.error("no candidates")
|
{panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedibrokerage/AtlasBrokerUtils.py
RENAMED
|
@@ -17,6 +17,7 @@ from pandaserver.brokerage.SiteMapper import SiteMapper
|
|
|
17
17
|
from pandaserver.dataservice import DataServiceUtils
|
|
18
18
|
from pandaserver.dataservice.DataServiceUtils import select_scope
|
|
19
19
|
from pandaserver.taskbuffer import JobUtils, ProcessGroups, SiteSpec
|
|
20
|
+
from pandaserver.taskbuffer.DdmSpec import DOWNTIME_STATUSES
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
# get nuclei where data is available
|
|
@@ -932,6 +933,8 @@ def compare_version_string(version_string, comparison_string):
|
|
|
932
933
|
return None
|
|
933
934
|
|
|
934
935
|
operator = match.group(1).strip()
|
|
936
|
+
if operator == "=":
|
|
937
|
+
operator = "=="
|
|
935
938
|
version_to_compare = match.group(2).strip()
|
|
936
939
|
|
|
937
940
|
try:
|
|
@@ -959,10 +962,11 @@ def compare_version_string(version_string, comparison_string):
|
|
|
959
962
|
# check SW with json
|
|
960
963
|
class JsonSoftwareCheck:
|
|
961
964
|
# constructor
|
|
962
|
-
def __init__(self, site_mapper, sw_map, wn_architecture_level_map):
|
|
965
|
+
def __init__(self, site_mapper, sw_map, wn_architecture_level_map, wn_gpu_map=None):
|
|
963
966
|
self.siteMapper = site_mapper
|
|
964
967
|
self.sw_map = sw_map
|
|
965
968
|
self.wn_architecture_level_map = wn_architecture_level_map
|
|
969
|
+
self.wn_gpu_map = wn_gpu_map or {}
|
|
966
970
|
|
|
967
971
|
# get lists
|
|
968
972
|
def check(
|
|
@@ -1081,53 +1085,59 @@ class JsonSoftwareCheck:
|
|
|
1081
1085
|
|
|
1082
1086
|
# check GPU
|
|
1083
1087
|
if host_gpu_spec:
|
|
1084
|
-
# GPU not
|
|
1088
|
+
# CRIC is the GPU capability gate: skip queue if not GPU-capable per CRIC
|
|
1085
1089
|
if "gpu" not in architecture_map:
|
|
1086
1090
|
continue
|
|
1087
1091
|
|
|
1092
|
+
# All attribute checks use WN GPU monitoring (MV_WORKER_NODE_GPU_SUMMARY)
|
|
1093
|
+
# which has richer per-host data (vram, architecture, driver version)
|
|
1094
|
+
wn_gpus = self.wn_gpu_map.get(tmp_site_name, [])
|
|
1095
|
+
|
|
1088
1096
|
# check vendor
|
|
1089
|
-
if host_gpu_spec["vendor"]
|
|
1090
|
-
|
|
1091
|
-
if "vendor" in architecture_map["gpu"] and "excl" in architecture_map["gpu"]["vendor"]:
|
|
1092
|
-
continue
|
|
1093
|
-
else:
|
|
1094
|
-
# task specifies a vendor and PQ doesn't request any specific vendor
|
|
1095
|
-
if "vendor" not in architecture_map["gpu"]:
|
|
1096
|
-
continue
|
|
1097
|
-
# task specifies a vendor and PQ doesn't accept any vendor or the specific vendor
|
|
1098
|
-
if "any" not in architecture_map["gpu"]["vendor"] and host_gpu_spec["vendor"] not in architecture_map["gpu"]["vendor"]:
|
|
1097
|
+
if host_gpu_spec["vendor"] != "*":
|
|
1098
|
+
if not wn_gpus or not any(g.get("vendor") and re.match(host_gpu_spec["vendor"], g["vendor"], re.IGNORECASE) for g in wn_gpus):
|
|
1099
1099
|
continue
|
|
1100
1100
|
|
|
1101
|
-
# check model
|
|
1102
|
-
if host_gpu_spec["model"]
|
|
1103
|
-
if "model" in architecture_map["gpu"] and "excl" in architecture_map["gpu"]["model"]:
|
|
1104
|
-
continue
|
|
1105
|
-
else:
|
|
1101
|
+
# check model (include or exclude pattern)
|
|
1102
|
+
if host_gpu_spec["model"] != "*":
|
|
1106
1103
|
if isinstance(host_gpu_spec["model"], dict):
|
|
1107
1104
|
model_pattern = host_gpu_spec["model"]["pattern"]
|
|
1108
1105
|
model_excl = host_gpu_spec["model"].get("excl", False)
|
|
1109
1106
|
else:
|
|
1110
1107
|
model_pattern = host_gpu_spec["model"]
|
|
1111
1108
|
model_excl = False
|
|
1112
|
-
if
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1109
|
+
if not wn_gpus:
|
|
1110
|
+
continue
|
|
1111
|
+
matches = any(g.get("model") and re.match(model_pattern, g["model"], re.IGNORECASE) for g in wn_gpus)
|
|
1112
|
+
if matches == model_excl:
|
|
1113
|
+
continue
|
|
1114
|
+
|
|
1115
|
+
# check VRAM (in MB); supports operators: ==, >=, <=, >, <, != (e.g. ">=40960")
|
|
1116
|
+
if "vram" in host_gpu_spec:
|
|
1117
|
+
if not wn_gpus or not any(g.get("vram") and compare_version_string(str(g["vram"]), host_gpu_spec["vram"]) for g in wn_gpus):
|
|
1117
1118
|
continue
|
|
1118
1119
|
|
|
1119
|
-
# check
|
|
1120
|
+
# check GPU microarchitecture generation (e.g. Ampere, Hopper, Ada Lovelace)
|
|
1121
|
+
if "microarchitecture" in host_gpu_spec:
|
|
1122
|
+
req_arch = host_gpu_spec["microarchitecture"]
|
|
1123
|
+
if isinstance(req_arch, str):
|
|
1124
|
+
req_arch = [req_arch]
|
|
1125
|
+
if not wn_gpus or not any(g.get("architecture") in req_arch for g in wn_gpus):
|
|
1126
|
+
continue
|
|
1127
|
+
|
|
1128
|
+
# check minimum CUDA version
|
|
1120
1129
|
if "version" in host_gpu_spec:
|
|
1121
|
-
if
|
|
1122
|
-
|
|
1130
|
+
if not wn_gpus or not any(
|
|
1131
|
+
g.get("framework_version") and compare_version_string(g["framework_version"], host_gpu_spec["version"]) for g in wn_gpus
|
|
1132
|
+
):
|
|
1133
|
+
continue
|
|
1134
|
+
|
|
1135
|
+
# check minimum GPU driver version (kernel driver, e.g. 575.57.08)
|
|
1136
|
+
if "driver_version" in host_gpu_spec:
|
|
1137
|
+
if not wn_gpus or not any(
|
|
1138
|
+
g.get("driver_version") and compare_version_string(g["driver_version"], host_gpu_spec["driver_version"]) for g in wn_gpus
|
|
1139
|
+
):
|
|
1123
1140
|
continue
|
|
1124
|
-
elif "any" == architecture_map["gpu"]["version"]:
|
|
1125
|
-
# PQ accepts any version
|
|
1126
|
-
pass
|
|
1127
|
-
else:
|
|
1128
|
-
# check version at PQ
|
|
1129
|
-
if not compare_version_string(architecture_map["gpu"]["version"], host_gpu_spec["version"]):
|
|
1130
|
-
continue
|
|
1131
1141
|
go_ahead = True
|
|
1132
1142
|
except Exception as e:
|
|
1133
1143
|
if log_stream:
|
|
@@ -1251,12 +1261,12 @@ def check_endpoints_with_blacklist(
|
|
|
1251
1261
|
tmp_read_input_over_lan = tmp_input_endpoint["detailed_status"].get("read_lan")
|
|
1252
1262
|
tmp_receive_input_over_wan = tmp_input_endpoint["detailed_status"].get("write_wan")
|
|
1253
1263
|
# can read input from local
|
|
1254
|
-
if tmp_read_input_over_lan not in
|
|
1264
|
+
if tmp_read_input_over_lan not in DOWNTIME_STATUSES:
|
|
1255
1265
|
read_input_over_lan = True
|
|
1256
1266
|
# can receive input from remote to local
|
|
1257
1267
|
if tmp_site_name not in sites_in_nucleus:
|
|
1258
1268
|
# satellite sites
|
|
1259
|
-
if tmp_receive_input_over_wan not in
|
|
1269
|
+
if tmp_receive_input_over_wan not in DOWNTIME_STATUSES:
|
|
1260
1270
|
receive_input_over_wan = True
|
|
1261
1271
|
else:
|
|
1262
1272
|
# NA for nucleus sites
|
|
@@ -1267,12 +1277,12 @@ def check_endpoints_with_blacklist(
|
|
|
1267
1277
|
tmp_write_output_over_lan = tmp_output_endpoint["detailed_status"].get("write_lan")
|
|
1268
1278
|
tmp_send_output_over_wan = tmp_output_endpoint["detailed_status"].get("read_wan")
|
|
1269
1279
|
# can write output to local
|
|
1270
|
-
if tmp_write_output_over_lan not in
|
|
1280
|
+
if tmp_write_output_over_lan not in DOWNTIME_STATUSES:
|
|
1271
1281
|
write_output_over_lan = True
|
|
1272
1282
|
# can send output from local to remote
|
|
1273
1283
|
if tmp_site_name not in sites_in_nucleus:
|
|
1274
1284
|
# satellite sites
|
|
1275
|
-
if tmp_send_output_over_wan not in
|
|
1285
|
+
if tmp_send_output_over_wan not in DOWNTIME_STATUSES:
|
|
1276
1286
|
send_output_over_wan = True
|
|
1277
1287
|
else:
|
|
1278
1288
|
# NA for nucleus sites
|
|
@@ -12,6 +12,7 @@ from pandaserver.dataservice import DataServiceUtils
|
|
|
12
12
|
from pandaserver.dataservice.DataServiceUtils import select_scope
|
|
13
13
|
from pandaserver.srvcore import CoreUtils
|
|
14
14
|
from pandaserver.taskbuffer import EventServiceUtils, JobUtils
|
|
15
|
+
from pandaserver.taskbuffer.DdmSpec import DOWNTIME_STATUSES
|
|
15
16
|
|
|
16
17
|
from . import AtlasBrokerUtils
|
|
17
18
|
from .JobBrokerBase import JobBrokerBase
|
|
@@ -96,6 +97,13 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
96
97
|
logger.error("Failed to load the WN architecture level map!!!")
|
|
97
98
|
self.architecture_level_map = {}
|
|
98
99
|
|
|
100
|
+
# load the worker node GPU map
|
|
101
|
+
try:
|
|
102
|
+
self.wn_gpu_map = taskBufferIF.get_worker_node_gpu_map()
|
|
103
|
+
except BaseException:
|
|
104
|
+
logger.error("Failed to load the WN GPU map!!!")
|
|
105
|
+
self.wn_gpu_map = {}
|
|
106
|
+
|
|
99
107
|
def convertMBpsToWeight(self, mbps):
|
|
100
108
|
"""
|
|
101
109
|
Takes MBps value and converts to a weight between 1 and 2
|
|
@@ -255,7 +263,7 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
255
263
|
if not default_endpoint_out:
|
|
256
264
|
continue
|
|
257
265
|
receive_output_over_wan = default_endpoint_out["detailed_status"].get("write_wan")
|
|
258
|
-
if receive_output_over_wan in
|
|
266
|
+
if receive_output_over_wan in DOWNTIME_STATUSES:
|
|
259
267
|
nucleus_with_storages_unwritable_over_wan[tmp_name] = receive_output_over_wan
|
|
260
268
|
|
|
261
269
|
else:
|
|
@@ -754,7 +762,7 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
754
762
|
resolved_platforms = {}
|
|
755
763
|
preference_weight_map = {}
|
|
756
764
|
if taskSpec.transHome is not None:
|
|
757
|
-
jsonCheck = AtlasBrokerUtils.JsonSoftwareCheck(self.siteMapper, self.sw_map, self.architecture_level_map)
|
|
765
|
+
jsonCheck = AtlasBrokerUtils.JsonSoftwareCheck(self.siteMapper, self.sw_map, self.architecture_level_map, self.wn_gpu_map)
|
|
758
766
|
unified_site_list = self.get_unified_sites(scanSiteList)
|
|
759
767
|
|
|
760
768
|
host_cpu_spec = taskSpec.get_host_cpu_spec()
|
|
@@ -1126,11 +1134,11 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
1126
1134
|
if siteMaxTime != 0 and siteMaxTime < minTimeForZeroWalltime:
|
|
1127
1135
|
tmp_msg = f" skip site={tmpSiteName} due to site walltime {tmpSiteStr} (site upper limit) insufficient "
|
|
1128
1136
|
if inputChunk.useScout():
|
|
1129
|
-
tmp_msg += f"for
|
|
1130
|
-
tmp_msg += "criteria=-
|
|
1137
|
+
tmp_msg += f"for scout jobs (requireing {str_minTimeForZeroWalltime} at least) "
|
|
1138
|
+
tmp_msg += "criteria=-scout_walltime"
|
|
1131
1139
|
else:
|
|
1132
|
-
tmp_msg += f"for
|
|
1133
|
-
tmp_msg += "criteria=-
|
|
1140
|
+
tmp_msg += f"for walltime-undefined jobs (requiring {str_minTimeForZeroWalltime} at least) "
|
|
1141
|
+
tmp_msg += "criteria=-min_walltime"
|
|
1134
1142
|
msg_map[tmpSiteSpec.get_unified_name()] = tmp_msg
|
|
1135
1143
|
continue
|
|
1136
1144
|
# check min walltime at the site
|
|
@@ -18,6 +18,7 @@ from pandajedi.jedicore.ThreadUtils import (
|
|
|
18
18
|
)
|
|
19
19
|
from pandajedi.jedirefine import RefinerUtils
|
|
20
20
|
from pandaserver.dataservice import DataServiceUtils
|
|
21
|
+
from pandaserver.taskbuffer.DdmSpec import DOWNTIME_STATUSES
|
|
21
22
|
|
|
22
23
|
from . import AtlasBrokerUtils
|
|
23
24
|
from .AtlasProdJobBroker import AtlasProdJobBroker
|
|
@@ -345,14 +346,14 @@ class AtlasProdTaskBrokerThread(WorkerThread):
|
|
|
345
346
|
break
|
|
346
347
|
# check blacklist
|
|
347
348
|
read_wan_status = tmpEP["detailed_status"].get("read_wan")
|
|
348
|
-
if read_wan_status in
|
|
349
|
+
if read_wan_status in DOWNTIME_STATUSES:
|
|
349
350
|
tmpLog.info(
|
|
350
351
|
f" skip nucleus={tmpNucleus} since {tmp_ddm_endpoint_name} has read_wan={read_wan_status} criteria=-source_blacklist"
|
|
351
352
|
)
|
|
352
353
|
to_skip = True
|
|
353
354
|
break
|
|
354
355
|
write_wan_status = tmpEP["detailed_status"].get("write_wan")
|
|
355
|
-
if write_wan_status in
|
|
356
|
+
if write_wan_status in DOWNTIME_STATUSES:
|
|
356
357
|
tmpLog.info(
|
|
357
358
|
f" skip nucleus={tmpNucleus} since {tmp_ddm_endpoint_name} has write_wan={write_wan_status} criteria=-destination_blacklist"
|
|
358
359
|
)
|
{panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedicore/JediTaskBuffer.py
RENAMED
|
@@ -74,6 +74,7 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
74
74
|
order_by,
|
|
75
75
|
maxFileRecords,
|
|
76
76
|
skip_short_output,
|
|
77
|
+
lfn_constituent_map=None,
|
|
77
78
|
):
|
|
78
79
|
with self.proxyPool.get() as proxy:
|
|
79
80
|
return proxy.insertFilesForDataset_JEDI(
|
|
@@ -111,6 +112,7 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
111
112
|
order_by,
|
|
112
113
|
maxFileRecords,
|
|
113
114
|
skip_short_output,
|
|
115
|
+
lfn_constituent_map=lfn_constituent_map,
|
|
114
116
|
)
|
|
115
117
|
|
|
116
118
|
# get files from the JEDI contents table with jediTaskID and/or datasetID
|
|
@@ -250,9 +252,9 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
250
252
|
)
|
|
251
253
|
|
|
252
254
|
# get tasks to be processed
|
|
253
|
-
def checkWaitingTaskPrio_JEDI(self, vo, workQueue, prodSourceLabel, cloudName, resource_name=None):
|
|
255
|
+
def checkWaitingTaskPrio_JEDI(self, vo, workQueue, prodSourceLabel, cloudName, resource_name=None, pid=None):
|
|
254
256
|
with self.proxyPool.get() as proxy:
|
|
255
|
-
return proxy.getTasksToBeProcessed_JEDI(
|
|
257
|
+
return proxy.getTasksToBeProcessed_JEDI(pid, vo, workQueue, prodSourceLabel, cloudName, isPeeking=True, resource_name=resource_name)
|
|
256
258
|
|
|
257
259
|
# get job statistics with work queue
|
|
258
260
|
def getJobStatisticsWithWorkQueue_JEDI(self, vo, prodSourceLabel, minPriority=None):
|
|
@@ -409,6 +411,7 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
409
411
|
unmergeDatasetSpecMap,
|
|
410
412
|
uniqueTaskName,
|
|
411
413
|
oldTaskStatus,
|
|
414
|
+
in_content_dataset_spec_list,
|
|
412
415
|
):
|
|
413
416
|
with self.proxyPool.get() as proxy:
|
|
414
417
|
return proxy.registerTaskInOneShot_JEDI(
|
|
@@ -424,6 +427,7 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
424
427
|
unmergeDatasetSpecMap,
|
|
425
428
|
uniqueTaskName,
|
|
426
429
|
oldTaskStatus,
|
|
430
|
+
in_content_dataset_spec_list,
|
|
427
431
|
)
|
|
428
432
|
|
|
429
433
|
# set tasks to be assigned
|
|
@@ -590,9 +594,9 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
590
594
|
)
|
|
591
595
|
|
|
592
596
|
# append input datasets for incremental execution
|
|
593
|
-
def appendDatasets_JEDI(self, jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList):
|
|
597
|
+
def appendDatasets_JEDI(self, jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList, in_content_dataset_specs):
|
|
594
598
|
with self.proxyPool.get() as proxy:
|
|
595
|
-
return proxy.appendDatasets_JEDI(jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList)
|
|
599
|
+
return proxy.appendDatasets_JEDI(jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList, in_content_dataset_specs)
|
|
596
600
|
|
|
597
601
|
# record retry history
|
|
598
602
|
def recordRetryHistory_JEDI(self, jediTaskID, oldNewPandaIDs, relationType):
|
|
@@ -922,6 +926,11 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
922
926
|
with self.proxyPool.get() as proxy:
|
|
923
927
|
return proxy.get_tasks_inputdatasets_JEDI(vo)
|
|
924
928
|
|
|
929
|
+
# get dataset locality for a task and dataset
|
|
930
|
+
def get_dataset_locality(self, jedi_taskid, datasetid):
|
|
931
|
+
with self.proxyPool.get() as proxy:
|
|
932
|
+
return proxy.get_dataset_locality(jedi_taskid, datasetid)
|
|
933
|
+
|
|
925
934
|
# update dataset locality
|
|
926
935
|
def updateDatasetLocality_JEDI(self, jedi_taskid, datasetid, rse):
|
|
927
936
|
with self.proxyPool.get() as proxy:
|
|
@@ -986,3 +995,8 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
986
995
|
def get_task_failure_metrics(self, jedi_task_id):
|
|
987
996
|
with self.proxyPool.get() as proxy:
|
|
988
997
|
return proxy.get_task_failure_metrics(jedi_task_id)
|
|
998
|
+
|
|
999
|
+
# reset frozen time of a task to avoid being exausted
|
|
1000
|
+
def reset_frozen_time_for_task(self, task_id):
|
|
1001
|
+
with self.proxyPool.get() as proxy:
|
|
1002
|
+
return proxy.reset_frozen_time_for_task(task_id)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
2
|
+
|
|
3
|
+
from pandajedi.jedicore.MsgWrapper import MsgWrapper
|
|
4
|
+
from pandaserver.asyncprocess import processor
|
|
5
|
+
|
|
6
|
+
from .WatchDogBase import WatchDogBase
|
|
7
|
+
|
|
8
|
+
logger = PandaLogger().getLogger(__name__.split(".")[-1])
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# watchdog that processes async requests on JEDI machines
|
|
12
|
+
class AsyncRequestWatchDog(WatchDogBase):
|
|
13
|
+
# constructor
|
|
14
|
+
def __init__(self, taskBufferIF, ddmIF):
|
|
15
|
+
WatchDogBase.__init__(self, taskBufferIF, ddmIF)
|
|
16
|
+
|
|
17
|
+
# main
|
|
18
|
+
def doAction(self):
|
|
19
|
+
tmpLog = MsgWrapper(logger)
|
|
20
|
+
tmpLog.debug("start")
|
|
21
|
+
try:
|
|
22
|
+
processor.run(service_name="jedi", tbuf=self.taskBufferIF)
|
|
23
|
+
except Exception as e:
|
|
24
|
+
tmpLog.error(f"failed to process async requests with {e}")
|
|
25
|
+
return self.SC_FAILED
|
|
26
|
+
tmpLog.debug("done")
|
|
27
|
+
return self.SC_SUCCEEDED
|
{panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jedidog/AtlasAnalWatchDog.py
RENAMED
|
@@ -8,6 +8,7 @@ from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
|
8
8
|
|
|
9
9
|
from pandajedi.jedicore.MsgWrapper import MsgWrapper
|
|
10
10
|
from pandaserver.dataservice.activator import Activator
|
|
11
|
+
from pandaserver.taskbuffer.JediDatasetSpec import JediDatasetSpec
|
|
11
12
|
|
|
12
13
|
from .TypicalWatchDogBase import TypicalWatchDogBase
|
|
13
14
|
|
|
@@ -27,6 +28,8 @@ class AtlasAnalWatchDog(TypicalWatchDogBase):
|
|
|
27
28
|
orig_tmp_log = MsgWrapper(logger)
|
|
28
29
|
try:
|
|
29
30
|
orig_tmp_log.debug("start")
|
|
31
|
+
# site mapper
|
|
32
|
+
self.site_mapper = self.taskBufferIF.get_site_mapper()
|
|
30
33
|
# handle waiting jobs
|
|
31
34
|
self.doForWaitingJobs()
|
|
32
35
|
# throttle tasks if so many prestaging requests
|
|
@@ -718,6 +721,11 @@ class AtlasAnalWatchDog(TypicalWatchDogBase):
|
|
|
718
721
|
|
|
719
722
|
# periodic task action
|
|
720
723
|
def do_periodic_action(self):
|
|
724
|
+
"""
|
|
725
|
+
Perform periodic action on tasks
|
|
726
|
+
* extend lifetime of output containers for analysis tasks
|
|
727
|
+
* reset frozen time of pending tasks if input dataset is available only at RSEs in downtime, to avoid unnecessary exhaustion
|
|
728
|
+
"""
|
|
721
729
|
tmp_log = MsgWrapper(logger, " do_periodic_action label=user")
|
|
722
730
|
tmp_log.debug("start")
|
|
723
731
|
try:
|
|
@@ -731,7 +739,7 @@ class AtlasAnalWatchDog(TypicalWatchDogBase):
|
|
|
731
739
|
# get tasks
|
|
732
740
|
task_list = self.taskBufferIF.get_tasks_for_periodic_action(self.vo, self.prodSourceLabel)
|
|
733
741
|
for task_id in task_list:
|
|
734
|
-
# get datasets
|
|
742
|
+
# get output datasets
|
|
735
743
|
_, tmp_datasets = self.taskBufferIF.getDatasetsWithJediTaskID_JEDI(task_id, ["output"])
|
|
736
744
|
done_containers = set()
|
|
737
745
|
for dataset_spec in tmp_datasets:
|
|
@@ -744,5 +752,24 @@ class AtlasAnalWatchDog(TypicalWatchDogBase):
|
|
|
744
752
|
dataset_spec.containerName,
|
|
745
753
|
{"type=.+": {"lifetime": lifetime}, "(SCRATCH|USER)DISK": {"lifetime": lifetime}},
|
|
746
754
|
)
|
|
755
|
+
# get input datasets
|
|
756
|
+
_, tmp_datasets = self.taskBufferIF.getDatasetsWithJediTaskID_JEDI(task_id, ["input", JediDatasetSpec.get_constituent_input_type()])
|
|
757
|
+
for dataset_spec in tmp_datasets:
|
|
758
|
+
# get locations
|
|
759
|
+
rses = self.taskBufferIF.get_dataset_locality(task_id, dataset_spec.datasetID)
|
|
760
|
+
# check if all locations are in downtime
|
|
761
|
+
if rses:
|
|
762
|
+
all_in_downtime = True
|
|
763
|
+
for rse in rses:
|
|
764
|
+
if self.site_mapper.is_readable_locally(rse):
|
|
765
|
+
all_in_downtime = False
|
|
766
|
+
break
|
|
767
|
+
if all_in_downtime:
|
|
768
|
+
tmp_log.debug(
|
|
769
|
+
f"reset frozen time for taskID={task_id} since all locations {rses} of input dataset {dataset_spec.datasetName} are in downtime"
|
|
770
|
+
)
|
|
771
|
+
self.taskBufferIF.reset_frozen_time_for_task(task_id)
|
|
772
|
+
break
|
|
773
|
+
|
|
747
774
|
except Exception as e:
|
|
748
775
|
tmp_log.error(f"failed with {str(e)}{traceback.format_exc()}")
|
{panda_server_source-1.0.0 → panda_server_source-1.0.2}/pandajedi/jediorder/ContentsFeeder.py
RENAMED
|
@@ -13,6 +13,7 @@ from pandajedi.jedicore import Interaction
|
|
|
13
13
|
from pandajedi.jedicore.MsgWrapper import MsgWrapper
|
|
14
14
|
from pandajedi.jedicore.ThreadUtils import ListWithLock, ThreadPool, WorkerThread
|
|
15
15
|
from pandajedi.jedirefine import RefinerUtils
|
|
16
|
+
from pandaserver.taskbuffer.JediDatasetSpec import JediDatasetSpec
|
|
16
17
|
|
|
17
18
|
from .JediKnight import JediKnight
|
|
18
19
|
|
|
@@ -129,6 +130,12 @@ class ContentsFeederThread(WorkerThread):
|
|
|
129
130
|
if not tmpStat or taskSpec is None:
|
|
130
131
|
self.logger.debug(f"failed to get taskSpec for jediTaskID={jediTaskID}")
|
|
131
132
|
continue
|
|
133
|
+
# get constituent datasets grouped by their master input datasetID
|
|
134
|
+
constituent_by_master = {}
|
|
135
|
+
_, c_datasets = self.taskBufferIF.getDatasetsWithJediTaskID_JEDI(jediTaskID, [JediDatasetSpec.get_constituent_input_type()])
|
|
136
|
+
if c_datasets:
|
|
137
|
+
for c_ds in c_datasets:
|
|
138
|
+
constituent_by_master.setdefault(c_ds.masterID, []).append((c_ds.datasetID, c_ds.datasetName))
|
|
132
139
|
|
|
133
140
|
# make logger
|
|
134
141
|
try:
|
|
@@ -531,6 +538,16 @@ class ContentsFeederThread(WorkerThread):
|
|
|
531
538
|
orderBy = taskSpec.order_input_by()
|
|
532
539
|
else:
|
|
533
540
|
orderBy = None
|
|
541
|
+
# build LFN -> constituent datasetID map for this input dataset
|
|
542
|
+
lfn_constituent_map = {}
|
|
543
|
+
if datasetSpec.datasetID in constituent_by_master:
|
|
544
|
+
for c_id, c_name in constituent_by_master[datasetSpec.datasetID]:
|
|
545
|
+
try:
|
|
546
|
+
c_files = ddmIF.getFilesInDataset(c_name)
|
|
547
|
+
for f_data in c_files.values():
|
|
548
|
+
lfn_constituent_map[str(f_data["lfn"])] = c_id
|
|
549
|
+
except Exception:
|
|
550
|
+
tmpLog.warning(f"failed to get files for constituent dataset {c_name}")
|
|
534
551
|
# feed files to the contents table
|
|
535
552
|
tmpLog.debug("update contents")
|
|
536
553
|
res_dict = self.taskBufferIF.insertFilesForDataset_JEDI(
|
|
@@ -568,6 +585,7 @@ class ContentsFeederThread(WorkerThread):
|
|
|
568
585
|
orderBy,
|
|
569
586
|
maxFileRecords,
|
|
570
587
|
skip_short_output,
|
|
588
|
+
lfn_constituent_map=lfn_constituent_map,
|
|
571
589
|
)
|
|
572
590
|
retDB = res_dict["ret_val"]
|
|
573
591
|
missingFileList = res_dict["missingFileList"]
|
|
@@ -1393,7 +1393,7 @@ class JobGeneratorThread(WorkerThread):
|
|
|
1393
1393
|
# check if merging
|
|
1394
1394
|
if taskSpec.mergeOutput() and tmpDatasetSpec.isMaster() and not tmpDatasetSpec.toMerge():
|
|
1395
1395
|
isUnMerging = True
|
|
1396
|
-
# tarball is
|
|
1396
|
+
# tarball is transferred by DDM
|
|
1397
1397
|
tarball_via_pilot = taskParamMap.get("tarBallViaDDM")
|
|
1398
1398
|
if tarball_via_pilot:
|
|
1399
1399
|
tmp_file_spec = FileSpec()
|
|
@@ -1402,10 +1402,13 @@ class JobGeneratorThread(WorkerThread):
|
|
|
1402
1402
|
tmp_file_spec.attemptNr = 0
|
|
1403
1403
|
tmp_file_spec.jediTaskID = taskSpec.jediTaskID
|
|
1404
1404
|
tmp_file_spec.dataset = tarball_via_pilot.split(":")[0]
|
|
1405
|
-
tmp_file_spec.dispatchDBlock = tmp_file_spec.dataset
|
|
1406
1405
|
tmp_file_spec.prodDBlockToken = "local"
|
|
1407
|
-
tmp_file_spec.status =
|
|
1406
|
+
tmp_file_spec.status = None
|
|
1408
1407
|
jobSpec.addFile(tmp_file_spec)
|
|
1408
|
+
if jobSpec.prodDBlock in [None, "NULL", ""]:
|
|
1409
|
+
# set prodDBlock to transfer tarball via dispatch dataset
|
|
1410
|
+
jobSpec.prodDBlock = tmp_file_spec.dataset
|
|
1411
|
+
|
|
1409
1412
|
specialHandling = specialHandling[:-1]
|
|
1410
1413
|
# using job cloning
|
|
1411
1414
|
if setSpecialHandlingForJC:
|
|
@@ -2035,7 +2038,7 @@ class JobGeneratorThread(WorkerThread):
|
|
|
2035
2038
|
paramMap["SURL"] = taskParamMap["sourceURL"]
|
|
2036
2039
|
# job parameter
|
|
2037
2040
|
jobSpec.jobParameters = self.makeBuildJobParameters(taskParamMap["buildSpec"]["jobParameters"], paramMap)
|
|
2038
|
-
# tarball is
|
|
2041
|
+
# tarball is transferred by DDM
|
|
2039
2042
|
tarball_via_pilot = taskParamMap["buildSpec"].get("tarBallViaDDM")
|
|
2040
2043
|
if tarball_via_pilot:
|
|
2041
2044
|
tmp_file_spec = FileSpec()
|
|
@@ -2044,10 +2047,11 @@ class JobGeneratorThread(WorkerThread):
|
|
|
2044
2047
|
tmp_file_spec.attemptNr = 0
|
|
2045
2048
|
tmp_file_spec.jediTaskID = taskSpec.jediTaskID
|
|
2046
2049
|
tmp_file_spec.dataset = tarball_via_pilot.split(":")[0]
|
|
2047
|
-
tmp_file_spec.dispatchDBlock = tmp_file_spec.dataset
|
|
2048
2050
|
tmp_file_spec.prodDBlockToken = "local"
|
|
2049
|
-
tmp_file_spec.status =
|
|
2051
|
+
tmp_file_spec.status = None
|
|
2050
2052
|
jobSpec.addFile(tmp_file_spec)
|
|
2053
|
+
# set prodDBlock to transfer tarball via dispatch dataset
|
|
2054
|
+
jobSpec.prodDBlock = tmp_file_spec.dataset
|
|
2051
2055
|
# make file spec which will be used by runJobs
|
|
2052
2056
|
runFileSpec = copy.copy(lib_file_spec)
|
|
2053
2057
|
runFileSpec.dispatchDBlock = lib_file_spec.dataset
|