panda-server-source 0.8.0__tar.gz → 1.0.0__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/.gitignore +41 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/Dockerfile +2 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/PKG-INFO +3 -1
- panda_server_source-1.0.0/PandaPkgInfo.py +1 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasAnalJobBroker.py +33 -2
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasProdJobBroker.py +48 -16
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasProdTaskBroker.py +1 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/GenJobBroker.py +9 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/JediTaskBuffer.py +11 -7
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasAnalWatchDog.py +105 -5
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/ContentsFeeder.py +6 -5
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/JobGenerator.py +4 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/JobSplitter.py +2 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedipprocess/PostProcessorBase.py +22 -3
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedirefine/AtlasAnalTaskRefiner.py +3 -3
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedisetup/AtlasTaskSetupper.py +1 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/data_carousel_api.py +62 -2
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/file_server_api.py +1 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/http_client.py +4 -4
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/job_api.py +1 -2
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/metaconfig_api.py +1 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/pilot_api.py +5 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/task_api.py +87 -52
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/task_api_tests.py +43 -16
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/brokerage/SiteMapper.py +2 -6
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/config/panda_config.py +6 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/hs_scrapers.py +3 -3
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/worker_synchronization.py +2 -1
- panda_server_source-1.0.0/pandaserver/pandamcp/client_utils/get_panda_token.sh +123 -0
- panda_server_source-1.0.0/pandaserver/pandamcp/client_utils/panda_mcp_wrapper.sh +92 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/pandamcp/mcp_main.py +27 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/pandamcp/mcp_utils.py +18 -12
- panda_server_source-1.0.0/pandaserver/pandamcp/panda_mcp_endpoints.json +77 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/server/panda.py +11 -96
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/srvcore/CoreUtils.py +26 -0
- panda_server_source-1.0.0/pandaserver/srvcore/allowed_methods.py +14 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/srvcore/srv_msg_utils.py +0 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DataCarousel.py +127 -8
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediTaskSpec.py +26 -23
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JobSpec.py +45 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SiteSpec.py +38 -4
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/TaskBuffer.py +11 -10
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/entity_module.py +7 -4
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +48 -32
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +11 -10
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +3 -2
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +4 -2
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +192 -24
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/worker_module.py +1 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/task_split_rules.py +35 -1
- panda_server_source-1.0.0/pandaserver/userinterface/Client.py +808 -0
- panda_server_source-1.0.0/pandaserver/userinterface/UserIF.py +540 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +15 -4
- panda_server_source-1.0.0/pandaserver/workflow/examples/multistep_merge_wfd.yaml +45 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +3 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_base.py +7 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_core.py +25 -12
- panda_server_source-1.0.0/pandaserver/workflow/workflow_native_utils.py +893 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_parser.py +22 -14
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_utils.py +5 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pyproject-source.toml +5 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pyproject.toml +5 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/sysconfig/panda_jedi.template +5 -1
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/sysconfig/panda_jedi_env.template +5 -1
- panda_server_source-0.8.0/PandaPkgInfo.py +0 -1
- panda_server_source-0.8.0/pandaserver/jobdispatcher/JobDispatcher.py +0 -1625
- panda_server_source-0.8.0/pandaserver/srvcore/allowed_methods.py +0 -100
- panda_server_source-0.8.0/pandaserver/taskbuffer/Utils.py +0 -848
- panda_server_source-0.8.0/pandaserver/taskbuffer/WrappedPickle.py +0 -88
- panda_server_source-0.8.0/pandaserver/userinterface/Client.py +0 -1686
- panda_server_source-0.8.0/pandaserver/userinterface/UserIF.py +0 -1799
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/.pre-commit-config.yaml +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/Dockerfile.base +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/LICENSE.txt +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/README.md +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/package/hatch_build.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasBrokerUtils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/JobBrokerBase.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/TaskBrokerBase.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediconfig/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediconfig/jedi_config.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/FactoryBase.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/Interaction.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/JediDBProxy.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/JediDBProxyPool.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/JediDBSchemaInfo.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/JediException.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/JediTaskBufferInterface.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/MsgWrapper.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/ProcessUtils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/SiteCandidate.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/ThreadUtils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediddm/AtlasDDMClient.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediddm/DDMClientBase.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediddm/DDMInterface.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediddm/GenDDMClient.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediddm/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasDataCarouselWatchDog.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasProdWatchDog.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasQueueFillerWatchDog.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/GenWatchDog.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/JumboWatchDog.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/TypicalWatchDogBase.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/WatchDogBase.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediexec/reniceJEDI.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedigen/AtlasTaskGenerator.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedigen/TaskGeneratorBase.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedigen/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/base_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/forwarding_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/hpo_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/kafka_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/processing_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/status_report_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/JediDaemon.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/JediKnight.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/JediMaster.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/JediMsgProcessor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/JobBroker.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/JobThrottler.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/PostProcessor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskBroker.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskCommando.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskGenerator.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskRefiner.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskSetupper.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/WatchDog.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedipprocess/AtlasAnalPostProcessor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedipprocess/AtlasPostProcessorUtils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedipprocess/AtlasProdPostProcessor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedipprocess/GenPostProcessor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedipprocess/MailTemplates.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedipprocess/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedirefine/AtlasProdTaskRefiner.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedirefine/GenTaskRefiner.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedirefine/RefinerUtils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedirefine/TaskRefinerBase.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedirefine/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedisetup/GenTaskSetupper.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedisetup/SimpleTaskSetupper.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedisetup/TaskSetupperBase.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedisetup/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/SchemaChecker.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/addContWoSoTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/addDataCarouselRequest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/addEventServiceTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/addHpoTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/addIDDSStageInRequest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/addNonAtlasTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/addNonAtlasTaskEnc.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/addTestTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/addTestTaskParamToDEFT.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/addTestTaskWithMerger.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/brokerTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/cancelDataCarouselRequest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/contentsFeederTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/contentsFeederTestWithTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/ddmTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/jobGenForOneTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/jobGeneratorTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/jobSplitterTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/jobThrottlerTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/msgProcessorTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/postProcessorTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/resubmitDataCarouselRequest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/resubmitTaskParam.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/taskBrokerTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/taskBrokerTestWithTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/taskBufferTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/taskCommandoTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/taskRefinerTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/testOneTaskToRefine.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/testOneTaskToTaskBroker.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/testPandaDDMMap.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/updateDataCarouselRequestParams.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/watchDogTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jeditest/workQueueTest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedithrottle/AtlasAnalJobThrottler.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedithrottle/AtlasProdJobThrottler.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedithrottle/GenJobThrottler.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedithrottle/JobThrottlerBase.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedithrottle/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/common.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/credential_management_api.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/event_api.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/harvester_api.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/idds_api.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/statistics_api.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/system_api.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/credential_management_api_tests.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/data_carousel_api_tests.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/harvester_api_tests.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/idds_api_tests.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/job_api_tests.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/pilot_api_tests.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/statistics_api_tests.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/system_api_tests.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/version.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/api/v1/workflow_api.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/brokerage/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/brokerage/broker.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/config/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/config/config_utils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/config/daemon_config.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/config/mcp_config.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/configurator/Carbon.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/configurator/Configurator.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/configurator/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/configurator/aux.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/master.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/master_systemd.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/add_main.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/add_sub.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/cache_pilots.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/cache_schedconfig.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/carbon.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/configurator.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/copyArchive.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/datasetManager.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/dummy_test.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/evpPD2P.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/metric_collector.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/panda_activeusers_query.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/pilotStreaming.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/process_workflow_files_daemon.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/recover_lost_files_daemon.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/task_evaluator.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/tmpwatch.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/daemons/utils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/DataServiceUtils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/ErrorCode.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/RecoverLostFilesCore.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/activator.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_atlas_plugin.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_dummy_plugin.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_gen.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_plugin_base.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_result.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_simple_plugin.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/closer.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/closer_atlas_plugin.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/ddm.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/ddm_handler.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/dyn_data_distributer.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/event_lookup_client_ei.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/event_picker.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/finisher.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper_atlas_plugin.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper_dummy_plugin.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper_plugin_base.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/DispatcherUtils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/ErrorCode.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/Protocol.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/Watcher.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/pandamcp/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/pandamcp/mcp_test_client.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/proxycache/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/proxycache/panda_proxy_cache.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/proxycache/token_cache.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/server/.gacl +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/srvcore/MailUtils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/srvcore/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/srvcore/oidc_utils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/srvcore/panda_request.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ConBridge.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DBProxyPool.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DatasetSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DdmSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ErrorCode.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/EventServiceUtils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/FileSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/GlobalShares.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/HarvesterMetricsSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/Initializer.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/InputChunk.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediCacheSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediDatasetSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediFileSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JobUtils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/NucleusSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/OraDBProxy.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PanDAMsgProcessor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PandaDBSchemaInfo.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ParseJobXML.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PickleFileSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PickleJobSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PrioUtil.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ProcessGroups.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ResourceSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SQLDumper.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SQLManager.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SupErrors.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/TaskBufferInterface.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WorkQueue.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WorkQueueMapper.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WorkerSpec.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WrappedCursor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WrappedPostgresConn.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/base_module.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/retryModule.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/workflow_processor.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/taskbuffer/wrapped_oracle_conn.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/SchemaChecker.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/banUser.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/boostPrio.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/boostUser.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/callbackDDM.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/daod_on_demand.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/finishJob.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/finishTaskJEDI.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/getJobs.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/killJob.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/killJobLowPrio.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/killJobsInTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/killTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/killTaskJEDI.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/killUser.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/lsst/README.txt +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/lsst/lsstSubmit.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/lsst/lsstSubmitMERGEtest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/lsst/lsstSubmitPhosim332.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/reassignJobs.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/reassignSite.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/reassignTask.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/reassignWaiting.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/recoverLostFiles.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/reloadInputDS.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/sendCommandToJob.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/setDebugMode.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/setPriority.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/testEvgen.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/testEvgen17.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/testG4sim.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/testG4sim17.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/testGlobalShares.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/testReco.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/testSimulReco14.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/testSiteMap.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/test/testUpdateWorkerPilotStatus.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/userinterface/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/data_handler_plugins/base_data_handler.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/pcwl_test.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/pcwl_utils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/psnakemake_container.json +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/psnakemake_task.json +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/psnakemake_test.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/__init__.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/extensions.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/log.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/names.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/parser.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/utils.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/step_handler_plugins/base_step_handler.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_core_smoketest.py +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/bin/panda_jedi-reniceJEDI.exe.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/bin/panda_server-makeSlsXml.exe.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/bin/panda_server-vomsrenew.exe.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/init.d/panda_daemon.exe.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/init.d/panda_httpd.exe.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/init.d/panda_jedi.exe.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/init.d/panda_mcp.exe.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/init.d/panda_server.exe.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/logrotate.d/panda_jedi.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/logrotate.d/panda_server.logrotate.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/panda_jedi.cfg.rpmnew.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/panda_jedi.cron.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/panda_server-httpd.conf.rpmnew.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/panda_server.cfg.rpmnew.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/sysconfig/panda_jedi.sysconfig_for_systemd.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/sysconfig/panda_server.sysconfig.rpmnew.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/sysconfig/panda_server.sysconfig_for_systemd.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/sysconfig/panda_server_env.systemd.rpmnew.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/systemd/panda.service.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/systemd/panda_daemon.service.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/systemd/panda_httpd.service.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/systemd/panda_jedi.service.template +0 -0
- {panda_server_source-0.8.0 → panda_server_source-1.0.0}/templates/systemd/panda_mcp.service.template +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.pyo
|
|
5
|
+
*.pyd
|
|
6
|
+
*.so
|
|
7
|
+
*.egg
|
|
8
|
+
*.egg-info/
|
|
9
|
+
dist/
|
|
10
|
+
build/
|
|
11
|
+
.eggs/
|
|
12
|
+
|
|
13
|
+
# Virtual environments
|
|
14
|
+
.venv/
|
|
15
|
+
venv/
|
|
16
|
+
env/
|
|
17
|
+
|
|
18
|
+
# Distribution / packaging
|
|
19
|
+
*.whl
|
|
20
|
+
*.tar.gz
|
|
21
|
+
|
|
22
|
+
# Testing
|
|
23
|
+
.tox/
|
|
24
|
+
.coverage
|
|
25
|
+
.coverage.*
|
|
26
|
+
htmlcov/
|
|
27
|
+
.pytest_cache/
|
|
28
|
+
*.log
|
|
29
|
+
|
|
30
|
+
# IDEs
|
|
31
|
+
.idea/
|
|
32
|
+
.vscode/
|
|
33
|
+
*.swp
|
|
34
|
+
*~
|
|
35
|
+
|
|
36
|
+
# OS
|
|
37
|
+
.DS_Store
|
|
38
|
+
Thumbs.db
|
|
39
|
+
|
|
40
|
+
# Claude
|
|
41
|
+
.claude/
|
|
@@ -11,6 +11,8 @@ RUN /opt/panda/bin/pip install --no-cache-dir .[postgres,oracle,mcp]
|
|
|
11
11
|
RUN /opt/panda/bin/pip install --no-cache-dir rucio-clients
|
|
12
12
|
RUN /opt/panda/bin/pip install --no-cache-dir "git+https://github.com/PanDAWMS/panda-cacheschedconfig.git"
|
|
13
13
|
RUN ln -s /opt/panda/lib/python*/site-packages/mod_wsgi/server/mod_wsgi*.so /etc/httpd/modules/mod_wsgi.so
|
|
14
|
+
# Remove the default OS ssl.conf which references a non-existent localhost.crt and conflicts with panda's SSL config
|
|
15
|
+
RUN rm -f /etc/httpd/conf.d/ssl.conf
|
|
14
16
|
|
|
15
17
|
WORKDIR /
|
|
16
18
|
RUN rm -rf /tmp/src
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: panda-server-source
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.0
|
|
4
4
|
Summary: Unified PanDA Server and JEDI Package - Source Only
|
|
5
5
|
Project-URL: Homepage, https://panda-wms.readthedocs.io/en/latest/
|
|
6
6
|
Author-email: PanDA Team <panda-support@cern.ch>
|
|
@@ -11,6 +11,8 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.12
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.13
|
|
13
13
|
Requires-Python: >=3.10
|
|
14
|
+
Requires-Dist: panda-client-light
|
|
15
|
+
Requires-Dist: panda-common
|
|
14
16
|
Description-Content-Type: text/markdown
|
|
15
17
|
|
|
16
18
|
# Monorepo for the PanDA Server and JEDI
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
release_version = "1.0.0"
|
|
@@ -161,7 +161,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
161
161
|
totalJobStat = self.taskBufferIF.countJobsPerTarget_JEDI(taskSpec.origUserName, True)
|
|
162
162
|
self.set_task_common("totalJobStat", totalJobStat)
|
|
163
163
|
# check total to cap
|
|
164
|
-
if totalJobStat:
|
|
164
|
+
if totalJobStat and not inputChunk.isMerging:
|
|
165
165
|
if taskSpec.workingGroup:
|
|
166
166
|
gdp_token_jobs = "CAP_RUNNING_GROUP_JOBS"
|
|
167
167
|
gdp_token_cores = "CAP_RUNNING_GROUP_CORES"
|
|
@@ -756,6 +756,30 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
756
756
|
retVal = retTmpError
|
|
757
757
|
continue
|
|
758
758
|
|
|
759
|
+
######################################
|
|
760
|
+
# selection with IO intensity
|
|
761
|
+
if taskSpec.ioIntensity and not inputChunk.isMerging:
|
|
762
|
+
newScanSiteList = []
|
|
763
|
+
oldScanSiteList = copy.copy(scanSiteList)
|
|
764
|
+
msg_map = {}
|
|
765
|
+
for tmpSiteName in scanSiteList:
|
|
766
|
+
tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
|
|
767
|
+
max_io_intensity = tmpSiteSpec.get_max_io_intensity()
|
|
768
|
+
if max_io_intensity is None or taskSpec.ioIntensity <= max_io_intensity:
|
|
769
|
+
newScanSiteList.append(tmpSiteName)
|
|
770
|
+
else:
|
|
771
|
+
msg_map[tmpSiteSpec.get_unified_name()] = (
|
|
772
|
+
f" skip site={tmpSiteSpec.get_unified_name()} since ioIntensity={taskSpec.ioIntensity} "
|
|
773
|
+
f"is larger than site max_io_intensity={max_io_intensity} criteria=-max_io_intensity"
|
|
774
|
+
)
|
|
775
|
+
scanSiteList = newScanSiteList
|
|
776
|
+
self.add_summary_message(oldScanSiteList, scanSiteList, "max IO intensity check", tmpLog, msg_map)
|
|
777
|
+
if not scanSiteList:
|
|
778
|
+
self.dump_summary(tmpLog)
|
|
779
|
+
tmpLog.error("no candidates")
|
|
780
|
+
retVal = retTmpError
|
|
781
|
+
continue
|
|
782
|
+
|
|
759
783
|
######################################
|
|
760
784
|
# selection for VP
|
|
761
785
|
if taskSpec.avoid_vp() or avoidVP or not checkDataLocality:
|
|
@@ -1093,7 +1117,14 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1093
1117
|
msg_map = {}
|
|
1094
1118
|
for tmpSiteName in self.get_unified_sites(scanSiteList):
|
|
1095
1119
|
tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
|
|
1096
|
-
# check
|
|
1120
|
+
# check direct access
|
|
1121
|
+
if taskSpec.allowInputLAN() == "only" and not tmpSiteSpec.isDirectIO() and not tmpSiteSpec.always_use_direct_io() and not inputChunk.isMerging:
|
|
1122
|
+
tmp_msg = f" skip site={tmpSiteName} since direct IO is disabled "
|
|
1123
|
+
tmp_msg += "criteria=-remoteio"
|
|
1124
|
+
msg_map[tmpSiteName] = tmp_msg
|
|
1125
|
+
continue
|
|
1126
|
+
|
|
1127
|
+
# check disk space
|
|
1097
1128
|
if tmpSiteSpec.maxwdir:
|
|
1098
1129
|
if CoreUtils.use_direct_io_for_job(taskSpec, tmpSiteSpec, inputChunk):
|
|
1099
1130
|
minDiskCount = minDiskCountR
|
|
@@ -1406,6 +1406,30 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
1406
1406
|
taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
|
|
1407
1407
|
return retTmpError
|
|
1408
1408
|
|
|
1409
|
+
######################################
|
|
1410
|
+
# selection with IO intensity
|
|
1411
|
+
if taskSpec.ioIntensity and not inputChunk.isMerging:
|
|
1412
|
+
newScanSiteList = []
|
|
1413
|
+
oldScanSiteList = copy.copy(scanSiteList)
|
|
1414
|
+
msg_map = {}
|
|
1415
|
+
for tmpSiteName in scanSiteList:
|
|
1416
|
+
tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
|
|
1417
|
+
max_io_intensity = tmpSiteSpec.get_max_io_intensity()
|
|
1418
|
+
if max_io_intensity is None or taskSpec.ioIntensity <= max_io_intensity:
|
|
1419
|
+
newScanSiteList.append(tmpSiteName)
|
|
1420
|
+
else:
|
|
1421
|
+
msg_map[tmpSiteSpec.get_unified_name()] = (
|
|
1422
|
+
f" skip site={tmpSiteSpec.get_unified_name()} since ioIntensity={taskSpec.ioIntensity} "
|
|
1423
|
+
f"is larger than site max_io_intensity={max_io_intensity} criteria=-max_io_intensity"
|
|
1424
|
+
)
|
|
1425
|
+
scanSiteList = newScanSiteList
|
|
1426
|
+
self.add_summary_message(oldScanSiteList, scanSiteList, "max IO intensity check", tmpLog, msg_map)
|
|
1427
|
+
if not scanSiteList:
|
|
1428
|
+
self.dump_summary(tmpLog)
|
|
1429
|
+
tmpLog.error("no candidates")
|
|
1430
|
+
taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
|
|
1431
|
+
return retTmpError
|
|
1432
|
+
|
|
1409
1433
|
######################################
|
|
1410
1434
|
# selection for full chain
|
|
1411
1435
|
if nucleusSpec:
|
|
@@ -1679,6 +1703,8 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
1679
1703
|
tmpLog.error("failed to get job statistics with priority")
|
|
1680
1704
|
taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
|
|
1681
1705
|
return retTmpError
|
|
1706
|
+
# get resource types per site
|
|
1707
|
+
site_resource_type_map = self.taskBufferIF.get_distinct_resource_types_per_site(taskSpec.jediTaskID)
|
|
1682
1708
|
workerStat = self.taskBufferIF.ups_load_worker_stats()
|
|
1683
1709
|
upsQueues = set(self.taskBufferIF.ups_get_queues())
|
|
1684
1710
|
tmpLog.info(f"calculate weight and check cap for {len(scanSiteList)} candidates")
|
|
@@ -1767,31 +1793,37 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
1767
1793
|
useAssigned = True
|
|
1768
1794
|
# stat with resource type
|
|
1769
1795
|
RT_Cap = 2
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1796
|
+
useCapRT = False
|
|
1797
|
+
tmpRTqueue = 0
|
|
1798
|
+
tmpRTrunning = 0
|
|
1799
|
+
resource_type_str = taskSpec.resource_type
|
|
1800
|
+
if tmpSiteName in tmpStatMapRT:
|
|
1801
|
+
# loop over all resource types for the site since task and job may have different resource types
|
|
1802
|
+
tmp_resource_types = site_resource_type_map.get(tmpSiteName, [taskSpec.resource_type])
|
|
1803
|
+
resource_type_str = ",".join(tmp_resource_types)
|
|
1804
|
+
for tmp_resource_type in tmp_resource_types:
|
|
1805
|
+
if tmp_resource_type in tmpStatMapRT[tmpSiteName]:
|
|
1806
|
+
useCapRT = True
|
|
1807
|
+
tmpRTrunning += tmpStatMapRT[tmpSiteName][tmp_resource_type].get("running", 0)
|
|
1808
|
+
tmpRTqueue += tmpStatMapRT[tmpSiteName][tmp_resource_type].get("defined", 0)
|
|
1809
|
+
if useAssigned:
|
|
1810
|
+
tmpRTqueue += tmpStatMapRT[tmpSiteName][tmp_resource_type].get("assigned", 0)
|
|
1811
|
+
tmpRTqueue += tmpStatMapRT[tmpSiteName][tmp_resource_type].get("activated", 0)
|
|
1812
|
+
tmpRTqueue += tmpStatMapRT[tmpSiteName][tmp_resource_type].get("starting", 0)
|
|
1813
|
+
if useCapRT:
|
|
1814
|
+
tmpRTrunning = max(tmpRTrunning, nRunning)
|
|
1783
1815
|
if totalSize == 0 or totalSize - siteSizeMap[tmpSiteName] <= 0:
|
|
1784
1816
|
weight = float(nRunning + 1) / float(nActivated + nStarting + nDefined + 10)
|
|
1785
1817
|
weightStr = (
|
|
1786
1818
|
f"nRun={nRunning} nAct={nActivated} nStart={nStarting} nDef={nDefined} nPilot={nPilot}{corrNumPilotStr} "
|
|
1787
|
-
f"totalSizeMB={int(totalSize / 1024 / 1024)} totalNumFiles={maxNumFiles} nRun_rt={tmpRTrunning} nQueued_rt={tmpRTqueue} "
|
|
1819
|
+
f"totalSizeMB={int(totalSize / 1024 / 1024)} totalNumFiles={maxNumFiles} nRun_rt={tmpRTrunning} nQueued_rt={tmpRTqueue} resource_type={resource_type_str} "
|
|
1788
1820
|
)
|
|
1789
1821
|
else:
|
|
1790
1822
|
weight = float(nRunning + 1) / float(nActivated + nAssigned + nStarting + nDefined + 10) / manyAssigned
|
|
1791
1823
|
weightStr = (
|
|
1792
1824
|
f"nRun={nRunning} nAct={nActivated} nAss={nAssigned} nStart={nStarting} nDef={nDefined} manyAss={manyAssigned} "
|
|
1793
1825
|
f"nPilot={nPilot}{corrNumPilotStr} totalSizeMB={int(totalSize / 1024 / 1024)} "
|
|
1794
|
-
f"totalNumFiles={maxNumFiles} nRun_rt={tmpRTrunning} nQueued_rt={tmpRTqueue} "
|
|
1826
|
+
f"totalNumFiles={maxNumFiles} nRun_rt={tmpRTrunning} nQueued_rt={tmpRTqueue} resource_type={resource_type_str} "
|
|
1795
1827
|
)
|
|
1796
1828
|
|
|
1797
1829
|
# reduce weights by taking data availability into account
|
|
@@ -1954,7 +1986,7 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
1954
1986
|
ngMsg += f"nDefined_rt+nActivated_rt+nAssigned_rt+nStarting_rt={tmpRTqueue} "
|
|
1955
1987
|
else:
|
|
1956
1988
|
ngMsg += f"nDefined_rt+nActivated_rt+nStarting_rt={tmpRTqueue} (nAssigned_rt ignored due to data locally available) "
|
|
1957
|
-
ngMsg += "with gshare+resource_type is greater than max({cutOffValue},{RT_Cap}*nRun_rt={RT_Cap}*{tmpRTrunning}) criteria=-cap_rt"
|
|
1989
|
+
ngMsg += f"with gshare+resource_type({resource_type_str}) is greater than max({cutOffValue},{RT_Cap}*nRun_rt={RT_Cap}*{tmpRTrunning}) criteria=-cap_rt"
|
|
1958
1990
|
elif (
|
|
1959
1991
|
nRunning + nActivated + nAssigned + nStarting + nDefined == 0
|
|
1960
1992
|
and taskSpec.currentPriority <= self.max_prio_for_bootstrap
|
|
@@ -354,7 +354,7 @@ class AtlasProdTaskBrokerThread(WorkerThread):
|
|
|
354
354
|
write_wan_status = tmpEP["detailed_status"].get("write_wan")
|
|
355
355
|
if write_wan_status in ["OFF", "TEST"]:
|
|
356
356
|
tmpLog.info(
|
|
357
|
-
f" skip nucleus={tmpNucleus} since {tmp_ddm_endpoint_name} has write_wan={
|
|
357
|
+
f" skip nucleus={tmpNucleus} since {tmp_ddm_endpoint_name} has write_wan={write_wan_status} criteria=-destination_blacklist"
|
|
358
358
|
)
|
|
359
359
|
to_skip = True
|
|
360
360
|
break
|
{panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/GenJobBroker.py
RENAMED
|
@@ -7,6 +7,7 @@ from pandajedi.jedicore import Interaction
|
|
|
7
7
|
from pandajedi.jedicore.MsgWrapper import MsgWrapper
|
|
8
8
|
from pandajedi.jedicore.SiteCandidate import SiteCandidate
|
|
9
9
|
from pandajedi.jedirefine import RefinerUtils
|
|
10
|
+
from pandaserver.config import panda_config
|
|
10
11
|
from pandaserver.srvcore import CoreUtils
|
|
11
12
|
|
|
12
13
|
from . import AtlasBrokerUtils
|
|
@@ -277,6 +278,7 @@ class GenJobBroker(JobBrokerBase):
|
|
|
277
278
|
######################################
|
|
278
279
|
# get list of available files
|
|
279
280
|
availableFileMap = {}
|
|
281
|
+
total_num_files = 0
|
|
280
282
|
for datasetSpec in inputChunk.getDatasets():
|
|
281
283
|
try:
|
|
282
284
|
# get list of site to be scanned
|
|
@@ -312,6 +314,7 @@ class GenJobBroker(JobBrokerBase):
|
|
|
312
314
|
if tmpAvFileMap is None:
|
|
313
315
|
raise Interaction.JEDITemporaryError("ddmIF.getAvailableFiles failed")
|
|
314
316
|
availableFileMap[datasetSpec.datasetName] = tmpAvFileMap
|
|
317
|
+
total_num_files += len(datasetSpec.Files)
|
|
315
318
|
except Exception as e:
|
|
316
319
|
tmpLog.error(f"failed to get available files with {e}")
|
|
317
320
|
taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
|
|
@@ -367,7 +370,12 @@ class GenJobBroker(JobBrokerBase):
|
|
|
367
370
|
# append candidates
|
|
368
371
|
newScanSiteList = []
|
|
369
372
|
for siteCandidateSpec in candidateSpecList:
|
|
370
|
-
# append
|
|
373
|
+
# append only if all files are available at the site when file dispatch is disabled
|
|
374
|
+
if panda_config.disable_file_dispatch and len(siteCandidateSpec.localDiskFiles) < total_num_files:
|
|
375
|
+
tmpLog.debug(
|
|
376
|
+
f" skip {siteCandidateSpec.siteName} due to input file dispatch is disabled and not all files are available at the site ({len(siteCandidateSpec.localDiskFiles)} < {total_num_files})"
|
|
377
|
+
)
|
|
378
|
+
continue
|
|
371
379
|
inputChunk.addSiteCandidate(siteCandidateSpec)
|
|
372
380
|
newScanSiteList.append(siteCandidateSpec.siteName)
|
|
373
381
|
tmpLog.debug(f" use {siteCandidateSpec.siteName} with weight={siteCandidateSpec.weight} nFiles={len(siteCandidateSpec.localDiskFiles)}")
|
{panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedicore/JediTaskBuffer.py
RENAMED
|
@@ -198,11 +198,6 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
198
198
|
with self.proxyPool.get() as proxy:
|
|
199
199
|
return proxy.getTaskDatasetsWithID_JEDI(jediTaskID, pid, lockTask)
|
|
200
200
|
|
|
201
|
-
# get JEDI tasks with selection criteria
|
|
202
|
-
def getTaskIDsWithCriteria_JEDI(self, criteria, nTasks=50):
|
|
203
|
-
with self.proxyPool.get() as proxy:
|
|
204
|
-
return proxy.getTaskIDsWithCriteria_JEDI(criteria, nTasks)
|
|
205
|
-
|
|
206
201
|
# get JEDI tasks to be finished
|
|
207
202
|
def getTasksToBeFinished_JEDI(self, vo, prodSourceLabel, pid, nTasks=50, target_tasks=None):
|
|
208
203
|
with self.proxyPool.get() as proxy:
|
|
@@ -677,6 +672,11 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
677
672
|
with self.proxyPool.get() as proxy:
|
|
678
673
|
return proxy.throttleTask_JEDI(jediTaskID, waitTime, errorDialog)
|
|
679
674
|
|
|
675
|
+
# throttle tasks of a user or working group and get the list of throttled tasks
|
|
676
|
+
def throttle_tasks_with_uid(self, vo: str, prod_source_label: str, wait_time: int, dialog: str, uid: str, is_user: bool = True):
|
|
677
|
+
with self.proxyPool.get() as proxy:
|
|
678
|
+
return proxy.throttle_tasks_with_uid(vo, prod_source_label, wait_time, dialog, uid, is_user)
|
|
679
|
+
|
|
680
680
|
# release throttled tasks
|
|
681
681
|
def releaseThrottledTasks_JEDI(self, vo, prodSourceLabel):
|
|
682
682
|
with self.proxyPool.get() as proxy:
|
|
@@ -757,12 +757,16 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
757
757
|
with self.proxyPool.get() as proxy:
|
|
758
758
|
return proxy.getFailureCountsForTask_JEDI(jediTaskID, timeWindow)
|
|
759
759
|
|
|
760
|
-
|
|
761
|
-
|
|
760
|
+
# count the number of queued jobs per user or working group
|
|
762
761
|
def countJobsPerTarget_JEDI(self, target, is_user):
|
|
763
762
|
with self.proxyPool.get() as proxy:
|
|
764
763
|
return proxy.countJobsPerTarget_JEDI(target, is_user)
|
|
765
764
|
|
|
765
|
+
# count the number of jobs and cores per user or working group in VO and production source label
|
|
766
|
+
def count_jobs_per_uid_JEDI(self, vo, prod_source_label):
|
|
767
|
+
with self.proxyPool.get() as proxy:
|
|
768
|
+
return proxy.count_jobs_per_uid_JEDI(vo, prod_source_label)
|
|
769
|
+
|
|
766
770
|
# get old merge job PandaIDs
|
|
767
771
|
def getOldMergeJobPandaIDs_JEDI(self, jediTaskID, pandaID):
|
|
768
772
|
with self.proxyPool.get() as proxy:
|
{panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasAnalWatchDog.py
RENAMED
|
@@ -149,7 +149,8 @@ class AtlasAnalWatchDog(TypicalWatchDogBase):
|
|
|
149
149
|
maxTransfer = 1024
|
|
150
150
|
# throttle interval
|
|
151
151
|
thrInterval = 120
|
|
152
|
-
# loop over all
|
|
152
|
+
# loop over all user tasks with data motion
|
|
153
|
+
user_motion_to_keep_throttled = {}
|
|
153
154
|
for userName, userDict in dispUserTasks.items():
|
|
154
155
|
# loop over all transfer types
|
|
155
156
|
for transferType, maxSize in [("prestaging", maxPrestaging), ("transfer", maxTransfer)]:
|
|
@@ -166,17 +167,116 @@ class AtlasAnalWatchDog(TypicalWatchDogBase):
|
|
|
166
167
|
tmpLog.debug(f"action=throttle_{transferType} jediTaskID={taskID} for user={userName}")
|
|
167
168
|
errDiag = f"throttled since transferring large data volume in total={userTotal}GB > limit={maxSize}GB type={transferType}"
|
|
168
169
|
self.taskBufferIF.throttleTask_JEDI(taskID, thrInterval, errDiag)
|
|
169
|
-
#
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
# release users
|
|
170
|
+
# keep throttled
|
|
171
|
+
user_motion_to_keep_throttled.setdefault(userName, set()).add(transferType)
|
|
172
|
+
# release tasks related to data motion
|
|
173
173
|
for userName, taskData in thrUserTasks.items():
|
|
174
174
|
for transferType, taskIDs in taskData.items():
|
|
175
|
+
if transferType not in ["prestaging", "transfer"]:
|
|
176
|
+
continue
|
|
177
|
+
if userName in user_motion_to_keep_throttled and transferType in user_motion_to_keep_throttled[userName]:
|
|
178
|
+
continue
|
|
175
179
|
tmpLog.debug(f"user={userName} release throttled tasks with {transferType}")
|
|
176
180
|
# unthrottle tasks
|
|
177
181
|
for taskID in taskIDs:
|
|
178
182
|
tmpLog.debug(f"action=release_{transferType} jediTaskID={taskID} for user={userName}")
|
|
179
183
|
self.taskBufferIF.release_task_on_hold(taskID, "throttled")
|
|
184
|
+
|
|
185
|
+
# throttle users with too many running/queued jobs
|
|
186
|
+
queue_factor = 2
|
|
187
|
+
throttle_threshold = 0.95
|
|
188
|
+
release_threshold = 0.85
|
|
189
|
+
gdp_token_group_jobs = "CAP_RUNNING_GROUP_JOBS"
|
|
190
|
+
gdp_token_group_cores = "CAP_RUNNING_GROUP_CORES"
|
|
191
|
+
max_num_run_group_jobs = self.taskBufferIF.getConfigValue("prio_mgr", gdp_token_group_jobs)
|
|
192
|
+
max_num_run_group_cores = self.taskBufferIF.getConfigValue("prio_mgr", gdp_token_group_cores)
|
|
193
|
+
gdp_token_user_jobs = "CAP_RUNNING_USER_JOBS"
|
|
194
|
+
gdp_token_user_cores = "CAP_RUNNING_USER_CORES"
|
|
195
|
+
max_num_run_user_jobs = self.taskBufferIF.getConfigValue("prio_mgr", gdp_token_user_jobs)
|
|
196
|
+
max_num_run_user_cores = self.taskBufferIF.getConfigValue("prio_mgr", gdp_token_user_cores)
|
|
197
|
+
# get job count per uid
|
|
198
|
+
job_count_per_uid = self.taskBufferIF.count_jobs_per_uid_JEDI(self.vo, self.prodSourceLabel)
|
|
199
|
+
users_to_keep_throttled = set()
|
|
200
|
+
for uid, count_dict in job_count_per_uid.items():
|
|
201
|
+
to_throttle = True
|
|
202
|
+
to_release = True
|
|
203
|
+
msg = None
|
|
204
|
+
if count_dict["is_user"]:
|
|
205
|
+
# user
|
|
206
|
+
if max_num_run_user_jobs:
|
|
207
|
+
if count_dict["nRunJobs"] > max_num_run_user_jobs * throttle_threshold:
|
|
208
|
+
msg = f"""throttle due to too many running jobs {count_dict["nRunJobs"]} > {gdp_token_user_jobs}x{throttle_threshold} type=jobs"""
|
|
209
|
+
elif count_dict["nQueuedJobs"] > max_num_run_user_jobs * queue_factor * throttle_threshold:
|
|
210
|
+
msg = f"""throttle due to too many queued jobs {count_dict["nQueuedJobs"]} > {gdp_token_user_jobs}x{throttle_threshold}x{queue_factor} type=jobs"""
|
|
211
|
+
if msg is None and max_num_run_user_cores:
|
|
212
|
+
if count_dict["nRunCores"] > max_num_run_user_cores:
|
|
213
|
+
msg = (
|
|
214
|
+
f"""throttle due to too many running cores {count_dict["nRunCores"]} > {gdp_token_user_cores}x{throttle_threshold} type=jobs"""
|
|
215
|
+
)
|
|
216
|
+
elif count_dict["nQueuedCores"] > max_num_run_user_cores * queue_factor * throttle_threshold:
|
|
217
|
+
msg = f"""throttle due to too many queued cores {count_dict["nQueuedCores"]} > {gdp_token_user_cores}x{throttle_threshold}x{queue_factor} type=jobs"""
|
|
218
|
+
if msg is None:
|
|
219
|
+
to_throttle = False
|
|
220
|
+
# check if can be released
|
|
221
|
+
if max_num_run_user_jobs:
|
|
222
|
+
if (
|
|
223
|
+
count_dict["nRunJobs"] > max_num_run_user_jobs * release_threshold
|
|
224
|
+
or count_dict["nQueuedJobs"] > max_num_run_user_jobs * queue_factor * release_threshold
|
|
225
|
+
):
|
|
226
|
+
to_release = False
|
|
227
|
+
if max_num_run_user_cores:
|
|
228
|
+
if (
|
|
229
|
+
count_dict["nRunCores"] > max_num_run_user_cores * release_threshold
|
|
230
|
+
or count_dict["nQueuedCores"] > max_num_run_user_cores * queue_factor * release_threshold
|
|
231
|
+
):
|
|
232
|
+
to_release = False
|
|
233
|
+
else:
|
|
234
|
+
# group
|
|
235
|
+
if max_num_run_group_jobs:
|
|
236
|
+
if count_dict["nRunJobs"] > max_num_run_group_jobs:
|
|
237
|
+
msg = f"""throttle due to too many running jobs {count_dict["nRunJobs"]} > {gdp_token_group_jobs}x{throttle_threshold} type=jobs"""
|
|
238
|
+
elif count_dict["nQueuedJobs"] > max_num_run_group_jobs * queue_factor * throttle_threshold:
|
|
239
|
+
msg = f"""throttle due to too many queued jobs {count_dict["nQueuedJobs"]} > {gdp_token_group_jobs}x{throttle_threshold}x{queue_factor} type=jobs"""
|
|
240
|
+
if msg is None and max_num_run_group_cores:
|
|
241
|
+
if count_dict["nRunCores"] > max_num_run_group_cores:
|
|
242
|
+
msg = (
|
|
243
|
+
f"""throttle due to too many running cores {count_dict["nRunCores"]} > {gdp_token_group_cores}x{throttle_threshold} type=jobs"""
|
|
244
|
+
)
|
|
245
|
+
elif count_dict["nQueuedCores"] > max_num_run_group_cores * queue_factor * throttle_threshold:
|
|
246
|
+
msg = f"""throttle due to too many queued cores {count_dict["nQueuedCores"]} > {gdp_token_group_cores}x{throttle_threshold}x{queue_factor} type=jobs"""
|
|
247
|
+
if msg is None:
|
|
248
|
+
to_throttle = False
|
|
249
|
+
# check if can be released
|
|
250
|
+
if max_num_run_group_jobs:
|
|
251
|
+
if (
|
|
252
|
+
count_dict["nRunJobs"] > max_num_run_group_jobs * release_threshold
|
|
253
|
+
or count_dict["nQueuedJobs"] > max_num_run_group_jobs * queue_factor * release_threshold
|
|
254
|
+
):
|
|
255
|
+
to_release = False
|
|
256
|
+
if max_num_run_group_cores:
|
|
257
|
+
if (
|
|
258
|
+
count_dict["nRunCores"] > max_num_run_group_cores * release_threshold
|
|
259
|
+
or count_dict["nQueuedCores"] > max_num_run_group_cores * queue_factor * release_threshold
|
|
260
|
+
):
|
|
261
|
+
to_release = False
|
|
262
|
+
if to_throttle:
|
|
263
|
+
tmpLog.debug(f"uid={uid} {msg}")
|
|
264
|
+
throttled_tasks = self.taskBufferIF.throttle_tasks_with_uid(self.vo, self.prodSourceLabel, thrInterval, msg, uid, count_dict["is_user"])
|
|
265
|
+
tmpLog.debug(f"throttled tasks: {throttled_tasks}")
|
|
266
|
+
if to_throttle or not to_release:
|
|
267
|
+
users_to_keep_throttled.add(uid)
|
|
268
|
+
# unthrottle users which are currently throttled but no more exceed the limit
|
|
269
|
+
for userName, taskData in thrUserTasks.items():
|
|
270
|
+
for transferType, taskIDs in taskData.items():
|
|
271
|
+
if transferType not in ["jobs"]:
|
|
272
|
+
continue
|
|
273
|
+
if userName in users_to_keep_throttled:
|
|
274
|
+
continue
|
|
275
|
+
tmpLog.debug(f"user={userName} release throttled tasks since no more excess of queued and running job counts")
|
|
276
|
+
# unthrottle tasks
|
|
277
|
+
for taskID in taskIDs:
|
|
278
|
+
tmpLog.debug(f"action=release_{transferType} jediTaskID={taskID} for user={userName}")
|
|
279
|
+
self.taskBufferIF.release_task_on_hold(taskID, "throttled")
|
|
180
280
|
tmpLog.debug("done")
|
|
181
281
|
except Exception:
|
|
182
282
|
errtype, errvalue = sys.exc_info()[:2]
|
{panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jediorder/ContentsFeeder.py
RENAMED
|
@@ -125,7 +125,7 @@ class ContentsFeederThread(WorkerThread):
|
|
|
125
125
|
datasetsIdxConsistency = []
|
|
126
126
|
|
|
127
127
|
# get task
|
|
128
|
-
tmpStat, taskSpec = self.taskBufferIF.getTaskWithID_JEDI(jediTaskID, False, real_run, self.pid, 10
|
|
128
|
+
tmpStat, taskSpec = self.taskBufferIF.getTaskWithID_JEDI(jediTaskID, False, real_run, self.pid, 10)
|
|
129
129
|
if not tmpStat or taskSpec is None:
|
|
130
130
|
self.logger.debug(f"failed to get taskSpec for jediTaskID={jediTaskID}")
|
|
131
131
|
continue
|
|
@@ -627,14 +627,15 @@ class ContentsFeederThread(WorkerThread):
|
|
|
627
627
|
setFrozenTime = False
|
|
628
628
|
skip_secondaries = True
|
|
629
629
|
tmpLog.debug("end loop")
|
|
630
|
-
# task holdup by workflow if
|
|
631
|
-
|
|
630
|
+
# task holdup by workflow if not enough master inputs are ready and parent steps are not all done
|
|
631
|
+
insufficient_ready_files = nFilesMasterReady == 0 or (nFilesPerJob and nFilesMasterReady < nFilesPerJob)
|
|
632
|
+
if not taskOnHold and not taskBroken and allUpdated and insufficient_ready_files and checkedMaster and taskSpec.is_workflow_holdup():
|
|
632
633
|
# hold up by the workflow
|
|
633
634
|
taskOnHold = True
|
|
634
635
|
tmpLog.debug("task to hold up by workflow")
|
|
635
636
|
# no master input
|
|
636
637
|
if not taskOnHold and not taskBroken and allUpdated and nFilesMaster == 0 and checkedMaster:
|
|
637
|
-
tmpErrStr = "
|
|
638
|
+
tmpErrStr = "primary input dataset is empty or all files are excluded "
|
|
638
639
|
if master_offset:
|
|
639
640
|
tmpErrStr += f" with offset={master_offset}"
|
|
640
641
|
tmpLog.error(tmpErrStr)
|
|
@@ -688,7 +689,7 @@ class ContentsFeederThread(WorkerThread):
|
|
|
688
689
|
allRet = self.taskBufferIF.updateTaskStatusByContFeeder_JEDI(jediTaskID, taskSpec, pid=self.pid, setFrozenTime=setFrozenTime)
|
|
689
690
|
elif allUpdated:
|
|
690
691
|
# all OK
|
|
691
|
-
|
|
692
|
+
_, newTaskStatus = self.taskBufferIF.updateTaskStatusByContFeeder_JEDI(
|
|
692
693
|
jediTaskID, getTaskStatus=True, pid=self.pid, useWorldCloud=taskSpec.useWorldCloud()
|
|
693
694
|
)
|
|
694
695
|
tmpMsg = f"set task_status={newTaskStatus}"
|
|
@@ -1318,7 +1318,7 @@ class JobGeneratorThread(WorkerThread):
|
|
|
1318
1318
|
jobSpec.transferType = siteCandidate.remoteProtocol
|
|
1319
1319
|
jobSpec.sourceSite = siteCandidate.remoteSource
|
|
1320
1320
|
elif not inputChunk.isMerging and not taskSpec.useLocalIO() and (taskSpec.allowInputLAN() is not None and siteSpec.isDirectIO()):
|
|
1321
|
-
jobSpec.transferType = "direct"
|
|
1321
|
+
jobSpec.transferType = taskParamMap.get("transferType", "direct")
|
|
1322
1322
|
# collect old PandaIDs
|
|
1323
1323
|
if tmpFileSpec.PandaID is not None and tmpFileSpec.PandaID not in subOldPandaIDs:
|
|
1324
1324
|
subOldPandaIDs.append(tmpFileSpec.PandaID)
|
|
@@ -1503,6 +1503,8 @@ class JobGeneratorThread(WorkerThread):
|
|
|
1503
1503
|
# on-site merging
|
|
1504
1504
|
if taskSpec.on_site_merging():
|
|
1505
1505
|
jobSpec.set_on_site_merging()
|
|
1506
|
+
if inputChunk.isMerging:
|
|
1507
|
+
jobSpec.set_pmerge_job_flag()
|
|
1506
1508
|
# set task queued time
|
|
1507
1509
|
jobSpec.set_task_queued_time(task_queued_time)
|
|
1508
1510
|
# extract middle name
|
|
@@ -1985,6 +1987,7 @@ class JobGeneratorThread(WorkerThread):
|
|
|
1985
1987
|
specialHandling = specialHandling[:-1]
|
|
1986
1988
|
if specialHandling != "":
|
|
1987
1989
|
jobSpec.specialHandling = specialHandling
|
|
1990
|
+
jobSpec.set_build_job_flag()
|
|
1988
1991
|
jobSpec.set_task_queued_time(taskSpec.get_queued_time())
|
|
1989
1992
|
libDsFileNameBase = libDsName + ".$JEDIFILEID"
|
|
1990
1993
|
# make lib.tgz
|
|
@@ -210,6 +210,8 @@ class JobSplitter:
|
|
|
210
210
|
maxWalltime = taskSpec.getMaxWalltime()
|
|
211
211
|
if maxWalltime is None:
|
|
212
212
|
maxWalltime = siteSpec.maxtime
|
|
213
|
+
elif maxWalltime > siteSpec.maxtime:
|
|
214
|
+
maxWalltime = siteSpec.maxtime
|
|
213
215
|
# core count
|
|
214
216
|
if siteSpec.coreCount:
|
|
215
217
|
coreCount = siteSpec.coreCount
|
{panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedipprocess/PostProcessorBase.py
RENAMED
|
@@ -8,6 +8,7 @@ from pandacommon.pandautils.PandaUtils import naive_utcnow
|
|
|
8
8
|
from pandajedi.jedicore import Interaction
|
|
9
9
|
from pandaserver.config import panda_config
|
|
10
10
|
from pandaserver.taskbuffer import EventServiceUtils
|
|
11
|
+
from pandaserver.taskbuffer.JediTaskSpec import JediTaskSpec
|
|
11
12
|
|
|
12
13
|
# port for SMTP server
|
|
13
14
|
smtpPortList = [25, 587]
|
|
@@ -60,7 +61,7 @@ class PostProcessorBase(object):
|
|
|
60
61
|
def doBasicPostProcess(self, taskSpec, tmpLog):
|
|
61
62
|
# update task status
|
|
62
63
|
taskSpec.lockedBy = None
|
|
63
|
-
taskSpec.status = self.getFinalTaskStatus(taskSpec)
|
|
64
|
+
taskSpec.status = self.getFinalTaskStatus(taskSpec, update_error_dialog=True)
|
|
64
65
|
if taskSpec.status == "failed":
|
|
65
66
|
# set dialog for preprocess
|
|
66
67
|
if taskSpec.usePrePro() and not taskSpec.checkPreProcessed():
|
|
@@ -177,7 +178,17 @@ class PostProcessorBase(object):
|
|
|
177
178
|
return nFiles, nFilesFinished, totalInputEvents, totalOkEvents, taskCompleteness
|
|
178
179
|
|
|
179
180
|
# get final task status
|
|
180
|
-
def getFinalTaskStatus(self, taskSpec, checkParent=True, checkGoal=False):
|
|
181
|
+
def getFinalTaskStatus(self, taskSpec: JediTaskSpec, checkParent: bool = True, checkGoal: bool = False, update_error_dialog: bool = False):
|
|
182
|
+
"""
|
|
183
|
+
Get final task status based on the number of files and events, and the status of parent task if needed.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
- taskSpec: the task specification object
|
|
187
|
+
- checkParent: if True, check the status of parent task and set failed if the parent task is failed, broken, or aborted. If False, ignore the parent status.
|
|
188
|
+
- checkGoal: if True, return True if the goal is reached and False otherwise. If False, return the final task status.
|
|
189
|
+
- update_error_dialog: if True, update error dialog for failed tasks
|
|
190
|
+
|
|
191
|
+
"""
|
|
181
192
|
# count nFiles and nEvents
|
|
182
193
|
nFiles, nFilesFinished, totalInputEvents, totalOkEvents, taskCompleteness = self.getTaskCompleteness(taskSpec)
|
|
183
194
|
# set new task status
|
|
@@ -189,12 +200,16 @@ class PostProcessorBase(object):
|
|
|
189
200
|
status = "paused"
|
|
190
201
|
elif self.failOnZeroOkFile and nFiles == nFilesFinished == 0:
|
|
191
202
|
status = "failed"
|
|
203
|
+
if update_error_dialog:
|
|
204
|
+
taskSpec.setErrDiag("failed due to no input", True)
|
|
192
205
|
elif nFiles == nFilesFinished:
|
|
193
206
|
# check parent status
|
|
194
207
|
if checkParent and taskSpec.parent_tid not in [None, taskSpec.jediTaskID]:
|
|
195
208
|
parent_status = self.taskBufferIF.getTaskStatus_JEDI(taskSpec.parent_tid)
|
|
196
209
|
if parent_status in ["failed", "broken", "aborted"]:
|
|
197
210
|
status = "failed"
|
|
211
|
+
if update_error_dialog:
|
|
212
|
+
taskSpec.setErrDiag(f"failed since the parent task is {parent_status} although all files were processed", True)
|
|
198
213
|
elif parent_status != "done":
|
|
199
214
|
status = "finished"
|
|
200
215
|
else:
|
|
@@ -212,6 +227,8 @@ class PostProcessorBase(object):
|
|
|
212
227
|
status = "done"
|
|
213
228
|
elif nFilesFinished == 0:
|
|
214
229
|
status = "failed"
|
|
230
|
+
if update_error_dialog:
|
|
231
|
+
taskSpec.setErrDiag("failed since no file was successfully processed", True)
|
|
215
232
|
else:
|
|
216
233
|
status = "finished"
|
|
217
234
|
# task goal
|
|
@@ -227,6 +244,8 @@ class PostProcessorBase(object):
|
|
|
227
244
|
):
|
|
228
245
|
if taskCompleteness < taskGoal:
|
|
229
246
|
status = "failed"
|
|
247
|
+
if update_error_dialog:
|
|
248
|
+
taskSpec.setErrDiag(f"failed since the task completeness {taskCompleteness:.1f} is less than the goal {taskGoal:.1f}", True)
|
|
230
249
|
# HPO tasks always go to finished
|
|
231
250
|
if taskSpec.is_hpo_workflow():
|
|
232
251
|
event_stat = self.taskBufferIF.get_event_statistics(taskSpec.jediTaskID)
|
|
@@ -242,7 +261,7 @@ class PostProcessorBase(object):
|
|
|
242
261
|
return status
|
|
243
262
|
|
|
244
263
|
# pre-check
|
|
245
|
-
def doPreCheck(self, taskSpec, tmpLog):
|
|
264
|
+
def doPreCheck(self, taskSpec: JediTaskSpec, tmpLog):
|
|
246
265
|
# send task to exhausted
|
|
247
266
|
if (
|
|
248
267
|
taskSpec.useExhausted()
|
{panda_server_source-0.8.0 → panda_server_source-1.0.0}/pandajedi/jedirefine/AtlasAnalTaskRefiner.py
RENAMED
|
@@ -241,11 +241,11 @@ class AtlasAnalTaskRefiner(TaskRefinerBase):
|
|
|
241
241
|
self.taskSpec.reqID = tmpJobID
|
|
242
242
|
# site limitation
|
|
243
243
|
if "excludedSite" in taskParamMap and "includedSite" in taskParamMap:
|
|
244
|
-
self.taskSpec.setLimitedSites("
|
|
244
|
+
self.taskSpec.setLimitedSites("with_allow_and_denylist")
|
|
245
245
|
elif "excludedSite" in taskParamMap:
|
|
246
|
-
self.taskSpec.setLimitedSites("
|
|
246
|
+
self.taskSpec.setLimitedSites("with_denylist")
|
|
247
247
|
elif "includedSite" in taskParamMap:
|
|
248
|
-
self.taskSpec.setLimitedSites("
|
|
248
|
+
self.taskSpec.setLimitedSites("with_allowlist")
|
|
249
249
|
# input prestaging
|
|
250
250
|
if self.taskSpec.inputPreStaging():
|
|
251
251
|
# set first contents feed flag
|