panda-server-source 0.8.1__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-0.8.1 → 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.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasAnalJobBroker.py +8 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/GenJobBroker.py +2 -2
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediTaskBuffer.py +0 -5
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/ContentsFeeder.py +6 -5
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JobGenerator.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JobSplitter.py +2 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/PostProcessorBase.py +22 -3
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedisetup/AtlasTaskSetupper.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/file_server_api.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/http_client.py +4 -4
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/job_api.py +1 -2
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/metaconfig_api.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/pilot_api.py +5 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/task_api.py +86 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/task_api_tests.py +47 -0
- {panda_server_source-0.8.1 → 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.1 → panda_server_source-1.0.0}/pandaserver/pandamcp/mcp_main.py +27 -1
- {panda_server_source-0.8.1 → 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.1 → panda_server_source-1.0.0}/pandaserver/server/panda.py +11 -96
- {panda_server_source-0.8.1 → 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.1 → panda_server_source-1.0.0}/pandaserver/srvcore/srv_msg_utils.py +0 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/TaskBuffer.py +4 -8
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/entity_module.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +0 -32
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +3 -2
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +4 -2
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +31 -10
- 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.1 → 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.1 → panda_server_source-1.0.0}/pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +3 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_base.py +7 -1
- {panda_server_source-0.8.1 → 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.1 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_parser.py +22 -14
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_utils.py +5 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pyproject-source.toml +5 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pyproject.toml +5 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_jedi.template +5 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_jedi_env.template +5 -1
- panda_server_source-0.8.1/PandaPkgInfo.py +0 -1
- panda_server_source-0.8.1/pandaserver/jobdispatcher/JobDispatcher.py +0 -1625
- panda_server_source-0.8.1/pandaserver/srvcore/allowed_methods.py +0 -100
- panda_server_source-0.8.1/pandaserver/taskbuffer/Utils.py +0 -848
- panda_server_source-0.8.1/pandaserver/taskbuffer/WrappedPickle.py +0 -88
- panda_server_source-0.8.1/pandaserver/userinterface/Client.py +0 -1686
- panda_server_source-0.8.1/pandaserver/userinterface/UserIF.py +0 -1799
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/.gitignore +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/.pre-commit-config.yaml +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/Dockerfile +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/Dockerfile.base +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/LICENSE.txt +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/README.md +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/package/hatch_build.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasBrokerUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasProdJobBroker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasProdTaskBroker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/JobBrokerBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/TaskBrokerBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediconfig/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediconfig/jedi_config.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/FactoryBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/Interaction.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediDBProxy.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediDBProxyPool.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediDBSchemaInfo.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediException.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediTaskBufferInterface.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/MsgWrapper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/ProcessUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/SiteCandidate.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/ThreadUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediddm/AtlasDDMClient.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediddm/DDMClientBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediddm/DDMInterface.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediddm/GenDDMClient.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediddm/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasAnalWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasDataCarouselWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasProdWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasQueueFillerWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/GenWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/JumboWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/TypicalWatchDogBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/WatchDogBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediexec/reniceJEDI.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedigen/AtlasTaskGenerator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedigen/TaskGeneratorBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedigen/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/base_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/forwarding_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/hpo_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/kafka_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/processing_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/status_report_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JediDaemon.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JediKnight.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JediMaster.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JediMsgProcessor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JobBroker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JobThrottler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/PostProcessor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskBroker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskCommando.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskGenerator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskRefiner.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskSetupper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/WatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/AtlasAnalPostProcessor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/AtlasPostProcessorUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/AtlasProdPostProcessor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/GenPostProcessor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/MailTemplates.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/AtlasAnalTaskRefiner.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/AtlasProdTaskRefiner.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/GenTaskRefiner.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/RefinerUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/TaskRefinerBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedisetup/GenTaskSetupper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedisetup/SimpleTaskSetupper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedisetup/TaskSetupperBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedisetup/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/SchemaChecker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addContWoSoTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addDataCarouselRequest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addEventServiceTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addHpoTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addIDDSStageInRequest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addNonAtlasTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addNonAtlasTaskEnc.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addTestTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addTestTaskParamToDEFT.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addTestTaskWithMerger.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/brokerTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/cancelDataCarouselRequest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/contentsFeederTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/contentsFeederTestWithTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/ddmTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/jobGenForOneTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/jobGeneratorTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/jobSplitterTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/jobThrottlerTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/msgProcessorTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/postProcessorTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/resubmitDataCarouselRequest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/resubmitTaskParam.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/taskBrokerTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/taskBrokerTestWithTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/taskBufferTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/taskCommandoTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/taskRefinerTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/testOneTaskToRefine.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/testOneTaskToTaskBroker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/testPandaDDMMap.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/updateDataCarouselRequestParams.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/watchDogTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/workQueueTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedithrottle/AtlasAnalJobThrottler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedithrottle/AtlasProdJobThrottler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedithrottle/GenJobThrottler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedithrottle/JobThrottlerBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedithrottle/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/common.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/credential_management_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/data_carousel_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/event_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/harvester_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/idds_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/statistics_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/system_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/credential_management_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/data_carousel_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/harvester_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/idds_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/job_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/pilot_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/statistics_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/system_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/version.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/workflow_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/brokerage/SiteMapper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/brokerage/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/brokerage/broker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/config/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/config/config_utils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/config/daemon_config.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/config/mcp_config.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/config/panda_config.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/configurator/Carbon.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/configurator/Configurator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/configurator/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/configurator/aux.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/master.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/master_systemd.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/add_main.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/add_sub.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/cache_pilots.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/cache_schedconfig.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/carbon.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/configurator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/copyArchive.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/datasetManager.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/dummy_test.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/evpPD2P.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/hs_scrapers.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/metric_collector.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/panda_activeusers_query.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/pilotStreaming.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/process_workflow_files_daemon.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/recover_lost_files_daemon.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/task_evaluator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/tmpwatch.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/utils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/DataServiceUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/ErrorCode.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/RecoverLostFilesCore.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/activator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_atlas_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_dummy_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_gen.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_plugin_base.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_result.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_simple_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/closer.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/closer_atlas_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/ddm.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/ddm_handler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/dyn_data_distributer.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/event_lookup_client_ei.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/event_picker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/finisher.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper_atlas_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper_dummy_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper_plugin_base.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/DispatcherUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/ErrorCode.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/Protocol.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/Watcher.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/pandamcp/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/pandamcp/mcp_test_client.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/proxycache/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/proxycache/panda_proxy_cache.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/proxycache/token_cache.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/server/.gacl +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/srvcore/MailUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/srvcore/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/srvcore/oidc_utils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/srvcore/panda_request.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ConBridge.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DBProxyPool.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DataCarousel.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DatasetSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DdmSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ErrorCode.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/EventServiceUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/FileSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/GlobalShares.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/HarvesterMetricsSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/Initializer.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/InputChunk.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediCacheSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediDatasetSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediFileSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediTaskSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JobSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JobUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/NucleusSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/OraDBProxy.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PanDAMsgProcessor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PandaDBSchemaInfo.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ParseJobXML.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PickleFileSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PickleJobSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PrioUtil.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ProcessGroups.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ResourceSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SQLDumper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SQLManager.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SiteSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SupErrors.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/TaskBufferInterface.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WorkQueue.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WorkQueueMapper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WorkerSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WrappedCursor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WrappedPostgresConn.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/base_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/worker_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/retryModule.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/task_split_rules.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/workflow_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/wrapped_oracle_conn.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/SchemaChecker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/banUser.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/boostPrio.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/boostUser.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/callbackDDM.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/daod_on_demand.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/finishJob.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/finishTaskJEDI.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/getJobs.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killJob.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killJobLowPrio.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killJobsInTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killTaskJEDI.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killUser.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/lsst/README.txt +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/lsst/lsstSubmit.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/lsst/lsstSubmitMERGEtest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/lsst/lsstSubmitPhosim332.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/reassignJobs.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/reassignSite.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/reassignTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/reassignWaiting.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/recoverLostFiles.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/reloadInputDS.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/sendCommandToJob.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/setDebugMode.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/setPriority.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testEvgen.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testEvgen17.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testG4sim.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testG4sim17.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testGlobalShares.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testReco.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testSimulReco14.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testSiteMap.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testUpdateWorkerPilotStatus.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/userinterface/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/data_handler_plugins/base_data_handler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/pcwl_test.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/pcwl_utils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/psnakemake_container.json +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/psnakemake_task.json +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/psnakemake_test.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/extensions.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/log.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/names.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/parser.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/utils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/step_handler_plugins/base_step_handler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_core_smoketest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/bin/panda_jedi-reniceJEDI.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/bin/panda_server-makeSlsXml.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/bin/panda_server-vomsrenew.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/init.d/panda_daemon.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/init.d/panda_httpd.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/init.d/panda_jedi.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/init.d/panda_mcp.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/init.d/panda_server.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/logrotate.d/panda_jedi.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/logrotate.d/panda_server.logrotate.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/panda_jedi.cfg.rpmnew.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/panda_jedi.cron.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/panda_server-httpd.conf.rpmnew.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/panda_server.cfg.rpmnew.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_jedi.sysconfig_for_systemd.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_server.sysconfig.rpmnew.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_server.sysconfig_for_systemd.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_server_env.systemd.rpmnew.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/systemd/panda.service.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/systemd/panda_daemon.service.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/systemd/panda_httpd.service.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/systemd/panda_jedi.service.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/systemd/panda_mcp.service.template +0 -0
|
@@ -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"
|
|
@@ -1117,7 +1117,14 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1117
1117
|
msg_map = {}
|
|
1118
1118
|
for tmpSiteName in self.get_unified_sites(scanSiteList):
|
|
1119
1119
|
tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
|
|
1120
|
-
# 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
|
|
1121
1128
|
if tmpSiteSpec.maxwdir:
|
|
1122
1129
|
if CoreUtils.use_direct_io_for_job(taskSpec, tmpSiteSpec, inputChunk):
|
|
1123
1130
|
minDiskCount = minDiskCountR
|
{panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/GenJobBroker.py
RENAMED
|
@@ -370,13 +370,13 @@ class GenJobBroker(JobBrokerBase):
|
|
|
370
370
|
# append candidates
|
|
371
371
|
newScanSiteList = []
|
|
372
372
|
for siteCandidateSpec in candidateSpecList:
|
|
373
|
-
# append
|
|
374
|
-
inputChunk.addSiteCandidate(siteCandidateSpec)
|
|
373
|
+
# append only if all files are available at the site when file dispatch is disabled
|
|
375
374
|
if panda_config.disable_file_dispatch and len(siteCandidateSpec.localDiskFiles) < total_num_files:
|
|
376
375
|
tmpLog.debug(
|
|
377
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})"
|
|
378
377
|
)
|
|
379
378
|
continue
|
|
379
|
+
inputChunk.addSiteCandidate(siteCandidateSpec)
|
|
380
380
|
newScanSiteList.append(siteCandidateSpec.siteName)
|
|
381
381
|
tmpLog.debug(f" use {siteCandidateSpec.siteName} with weight={siteCandidateSpec.weight} nFiles={len(siteCandidateSpec.localDiskFiles)}")
|
|
382
382
|
scanSiteList = newScanSiteList
|
{panda_server_source-0.8.1 → 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:
|
{panda_server_source-0.8.1 → 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)
|
|
@@ -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.1 → 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.1 → panda_server_source-1.0.0}/pandaserver/api/v1/file_server_api.py
RENAMED
|
@@ -687,7 +687,7 @@ def upload_file_recovery_request(
|
|
|
687
687
|
user_name = req.subprocess_env["SSL_CLIENT_S_DN"]
|
|
688
688
|
creation_time = naive_utcnow().strftime("%Y-%m-%d %H:%M:%S")
|
|
689
689
|
|
|
690
|
-
tmp_logger = LogWrapper(_logger, f"
|
|
690
|
+
tmp_logger = LogWrapper(_logger, f"upload_file_recovery_request < task_id={task_id} >")
|
|
691
691
|
tmp_logger.debug(f"Start user={user_name}")
|
|
692
692
|
|
|
693
693
|
try:
|
|
@@ -34,10 +34,6 @@ class HttpClient:
|
|
|
34
34
|
# request a compressed response
|
|
35
35
|
self.compress = True
|
|
36
36
|
|
|
37
|
-
# SSL cert/key
|
|
38
|
-
self.ssl_certificate = self._x509()
|
|
39
|
-
self.ssl_key = self._x509()
|
|
40
|
-
|
|
41
37
|
# OIDC
|
|
42
38
|
self.oidc = os.getenv("PANDA_AUTH") == "oidc"
|
|
43
39
|
self.auth_vo = os.getenv("PANDA_AUTH_VO") if self.oidc else None
|
|
@@ -46,6 +42,10 @@ class HttpClient:
|
|
|
46
42
|
with open(self.id_token[5:], "r") as f:
|
|
47
43
|
self.id_token = f.read().strip()
|
|
48
44
|
|
|
45
|
+
# SSL cert/key
|
|
46
|
+
self.ssl_certificate = self._x509() if not self.oidc else None
|
|
47
|
+
self.ssl_key = self._x509() if not self.oidc else None
|
|
48
|
+
|
|
49
49
|
def _x509(self):
|
|
50
50
|
# retrieve the X509_USER_PROXY from the environment variables
|
|
51
51
|
try:
|
|
@@ -78,7 +78,7 @@ def get_status(req: PandaRequest, job_ids: List[int], timeout: int = 60) -> Dict
|
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
@request_validation(_logger, secure=True)
|
|
81
|
-
def get_description(
|
|
81
|
+
def get_description(req: PandaRequest, job_ids: List[int]) -> Dict:
|
|
82
82
|
"""
|
|
83
83
|
Get description of a job.
|
|
84
84
|
|
|
@@ -300,7 +300,6 @@ def reassign(req: PandaRequest, job_ids: List[int]):
|
|
|
300
300
|
Returns:
|
|
301
301
|
dict: The system response `{"success": True}`.
|
|
302
302
|
"""
|
|
303
|
-
# TODO: think about the default values for for_pending and first_submission. The resolve_true and resolve_false functions are confusing me.
|
|
304
303
|
|
|
305
304
|
tmp_logger = LogWrapper(_logger, f"reassign job_ids={job_ids}")
|
|
306
305
|
tmp_logger.debug("Start")
|
{panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/metaconfig_api.py
RENAMED
|
@@ -88,7 +88,7 @@ def get_site_specs(req: PandaRequest, type: str = "analysis") -> dict:
|
|
|
88
88
|
return generate_response(True, data=site_specs)
|
|
89
89
|
|
|
90
90
|
|
|
91
|
-
@request_validation(_logger, secure=True,
|
|
91
|
+
@request_validation(_logger, secure=True, request_method="GET")
|
|
92
92
|
def get_resource_types(req: PandaRequest):
|
|
93
93
|
"""
|
|
94
94
|
Get resource types
|
|
@@ -153,6 +153,10 @@ def acquire_jobs(
|
|
|
153
153
|
except (ValueError, TypeError):
|
|
154
154
|
remaining_time = 0
|
|
155
155
|
|
|
156
|
+
# harvester ID was not set, but we haver the scheduler ID, which should be the same
|
|
157
|
+
if not harvester_id and scheduler_id:
|
|
158
|
+
harvester_id = scheduler_id
|
|
159
|
+
|
|
156
160
|
tmp_logger.debug(
|
|
157
161
|
f"{site_name}, n_jobs={n_jobs}, memory={memory}, disk={disk_space}, source_label={prod_source_label}, "
|
|
158
162
|
f"node={node}, ce={computing_element}, user={prod_user_id}, proxy={get_proxy_key}, "
|
|
@@ -715,7 +719,7 @@ def update_worker_status(req: PandaRequest, worker_id, harvester_id, status, tim
|
|
|
715
719
|
"""
|
|
716
720
|
tmp_logger = LogWrapper(
|
|
717
721
|
_logger,
|
|
718
|
-
f"
|
|
722
|
+
f"update_worker_status worker_id={worker_id} harvester_id={harvester_id} status={status} node_id={node_id} PID={os.getpid()}",
|
|
719
723
|
)
|
|
720
724
|
tmp_logger.debug("Start")
|
|
721
725
|
|
|
@@ -1132,6 +1132,92 @@ def get_tasks_modified_since(req, since: str, dn: str = None, full: bool = False
|
|
|
1132
1132
|
return generate_response(True, data=tasks)
|
|
1133
1133
|
|
|
1134
1134
|
|
|
1135
|
+
@request_validation(_logger, secure=True, request_method="GET")
|
|
1136
|
+
def get_tasks_detailed_info_since(req, since: str, filters: str = None, n_tasks: int = 500) -> Dict[str, Any]:
|
|
1137
|
+
"""
|
|
1138
|
+
Get detailed task info for tasks modified since a given time.
|
|
1139
|
+
|
|
1140
|
+
Fetches task IDs for tasks modified since ``since`` (max 30-day window), applies optional
|
|
1141
|
+
field filters, and returns full detail (all JediTaskSpec fields + jobParamsTemplate +
|
|
1142
|
+
taskParams) for each matching task. The request is always scoped to the authenticated user
|
|
1143
|
+
(DN from the request certificate) unless userName is explicity specified in the filters.
|
|
1144
|
+
|
|
1145
|
+
Filters are split server-side: plain-value patterns (no regex metacharacters) become SQL
|
|
1146
|
+
equality conditions pushed to the DB; patterns with metacharacters are applied in Python via
|
|
1147
|
+
``re.search`` on the full task dict returned by ``get_task_details_json``.
|
|
1148
|
+
|
|
1149
|
+
API details:
|
|
1150
|
+
HTTP Method: GET
|
|
1151
|
+
Path: /v1/task/get_tasks_detailed_info_since
|
|
1152
|
+
|
|
1153
|
+
Args:
|
|
1154
|
+
req(PandaRequest): internally generated request object
|
|
1155
|
+
since(str): time in the format ``%Y-%m-%d %H:%M:%S``
|
|
1156
|
+
filters(str, optional): JSON-encoded dict of {field: pattern} pairs.
|
|
1157
|
+
Plain values (no regex metacharacters) become SQL equality conditions.
|
|
1158
|
+
Regex patterns (containing ``|``, ``.``, ``*``, etc.) are matched with
|
|
1159
|
+
``re.search`` after fetching full task details. Unrecognised field names are
|
|
1160
|
+
silently ignored. Example: ``{"status": "finished|done", "prodSourceLabel": "user"}``
|
|
1161
|
+
n_tasks(int, optional): maximum number of task IDs to retrieve (default 500)
|
|
1162
|
+
|
|
1163
|
+
Returns:
|
|
1164
|
+
dict: The system response ``{"success": success, "message": message, "data": data}``.
|
|
1165
|
+
On success ``data`` is a list of task detail dicts.
|
|
1166
|
+
"""
|
|
1167
|
+
tmp_logger = LogWrapper(_logger, "get_tasks_detailed_info_since")
|
|
1168
|
+
tmp_logger.debug("Start")
|
|
1169
|
+
|
|
1170
|
+
compact_dn = clean_user_id(get_dn(req)) or get_dn(req)
|
|
1171
|
+
|
|
1172
|
+
# userName is always the authenticated user; other filters come from the caller
|
|
1173
|
+
sql_criteria = {"userName": compact_dn}
|
|
1174
|
+
regex_filters = {}
|
|
1175
|
+
if filters:
|
|
1176
|
+
try:
|
|
1177
|
+
parsed_filters = json.loads(filters)
|
|
1178
|
+
if not isinstance(parsed_filters, dict):
|
|
1179
|
+
return generate_response(False, message="filters must be a JSON object")
|
|
1180
|
+
for field, pattern in parsed_filters.items():
|
|
1181
|
+
if re.escape(pattern) == pattern:
|
|
1182
|
+
sql_criteria[field] = pattern
|
|
1183
|
+
else:
|
|
1184
|
+
regex_filters[field] = pattern
|
|
1185
|
+
except (json.JSONDecodeError, ValueError):
|
|
1186
|
+
return generate_response(False, message="filters is not valid JSON")
|
|
1187
|
+
|
|
1188
|
+
tmp_logger.debug(f"parameters dn:{compact_dn} since:{since} sql_criteria:{sql_criteria} regex_filters:{regex_filters} n_tasks:{n_tasks}")
|
|
1189
|
+
|
|
1190
|
+
# Step 1: get task IDs via SQL (time range + equality criteria)
|
|
1191
|
+
task_ids = global_task_buffer.getTaskIDsWithCriteria_JEDI(sql_criteria, since=since, nTasks=n_tasks)
|
|
1192
|
+
if task_ids is None:
|
|
1193
|
+
return generate_response(False, message="Failed to retrieve task IDs")
|
|
1194
|
+
|
|
1195
|
+
# Step 2: fetch full details and apply Python regex filters
|
|
1196
|
+
result = []
|
|
1197
|
+
for task_id in task_ids:
|
|
1198
|
+
details = global_task_buffer.get_task_details_json(task_id)
|
|
1199
|
+
if details is None:
|
|
1200
|
+
continue
|
|
1201
|
+
if regex_filters:
|
|
1202
|
+
skip = False
|
|
1203
|
+
for field, pattern in regex_filters.items():
|
|
1204
|
+
if field not in details:
|
|
1205
|
+
continue # silently ignore unrecognised fields
|
|
1206
|
+
try:
|
|
1207
|
+
if re.search(pattern, str(details[field])) is None:
|
|
1208
|
+
skip = True
|
|
1209
|
+
break
|
|
1210
|
+
except re.error:
|
|
1211
|
+
skip = True
|
|
1212
|
+
break
|
|
1213
|
+
if skip:
|
|
1214
|
+
continue
|
|
1215
|
+
result.append(details)
|
|
1216
|
+
|
|
1217
|
+
tmp_logger.debug(f"Done, returning {len(result)} tasks")
|
|
1218
|
+
return generate_response(True, data=result)
|
|
1219
|
+
|
|
1220
|
+
|
|
1135
1221
|
@request_validation(_logger, secure=True, request_method="GET")
|
|
1136
1222
|
def get_datasets_and_files(req, task_id, dataset_types: List[str] = ("input", "pseudo_input")) -> Dict[str, Any]:
|
|
1137
1223
|
"""
|
{panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/task_api_tests.py
RENAMED
|
@@ -541,6 +541,53 @@ class TestTaskAPI(unittest.TestCase):
|
|
|
541
541
|
expected_response = {"status": 0, "success": output["success"]}
|
|
542
542
|
self.assertEqual(output, expected_response)
|
|
543
543
|
|
|
544
|
+
def test_get_tasks_detailed_info_since(self):
|
|
545
|
+
url = f"{api_url_ssl}/task/get_tasks_detailed_info_since"
|
|
546
|
+
print(f"Testing URL: {url}")
|
|
547
|
+
|
|
548
|
+
one_week_ago = datetime.now() - timedelta(weeks=1)
|
|
549
|
+
since_str = one_week_ago.strftime("%Y-%m-%d %H:%M:%S")
|
|
550
|
+
|
|
551
|
+
# Basic call without filters: always succeeds; data is a list
|
|
552
|
+
data = {"since": since_str}
|
|
553
|
+
status, output = self.http_client.get(url, data)
|
|
554
|
+
print(output)
|
|
555
|
+
self.assertEqual(status, 0)
|
|
556
|
+
self.assertTrue(output["success"])
|
|
557
|
+
self.assertIsInstance(output["data"], list)
|
|
558
|
+
|
|
559
|
+
# Plain-value filter pushed to SQL
|
|
560
|
+
import json
|
|
561
|
+
|
|
562
|
+
data = {"since": since_str, "filters": json.dumps({"prodSourceLabel": "user"})}
|
|
563
|
+
status, output = self.http_client.get(url, data)
|
|
564
|
+
print(output)
|
|
565
|
+
self.assertEqual(status, 0)
|
|
566
|
+
self.assertTrue(output["success"])
|
|
567
|
+
self.assertIsInstance(output["data"], list)
|
|
568
|
+
|
|
569
|
+
# Regex filter applied in Python
|
|
570
|
+
data = {"since": since_str, "filters": json.dumps({"status": "finished|done"})}
|
|
571
|
+
status, output = self.http_client.get(url, data)
|
|
572
|
+
print(output)
|
|
573
|
+
self.assertEqual(status, 0)
|
|
574
|
+
self.assertTrue(output["success"])
|
|
575
|
+
self.assertIsInstance(output["data"], list)
|
|
576
|
+
|
|
577
|
+
# Invalid JSON filters → success=False
|
|
578
|
+
data = {"since": since_str, "filters": "not_valid_json"}
|
|
579
|
+
status, output = self.http_client.get(url, data)
|
|
580
|
+
print(output)
|
|
581
|
+
self.assertEqual(status, 0)
|
|
582
|
+
self.assertFalse(output["success"])
|
|
583
|
+
|
|
584
|
+
if JEDI_TASK_ID != -1:
|
|
585
|
+
# Real task: verify each returned dict has expected keys
|
|
586
|
+
data = {"since": since_str}
|
|
587
|
+
status, output = self.http_client.get(url, data)
|
|
588
|
+
for task_info in output.get("data", []):
|
|
589
|
+
self.assertIn("jediTaskID", task_info)
|
|
590
|
+
self.assertIn("status", task_info)
|
|
544
591
|
|
|
545
592
|
def test_get_job_descriptions(self):
|
|
546
593
|
# def get_job_descriptions(req: PandaRequest, task_id: int, unsuccessful_only: bool = False) -> Dict:
|
|
@@ -4,8 +4,9 @@ import traceback
|
|
|
4
4
|
|
|
5
5
|
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
6
6
|
from pandacommon.pandautils.thread_utils import GenericThread
|
|
7
|
+
|
|
7
8
|
from pandaserver.config import panda_config
|
|
8
|
-
from pandaserver.
|
|
9
|
+
from pandaserver.srvcore.CoreUtils import create_shards
|
|
9
10
|
|
|
10
11
|
# logger
|
|
11
12
|
_logger = PandaLogger().getLogger("worker_sync")
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# get_panda_token.sh
|
|
3
|
+
# Replicates panda-client's device authorization flow to get an id_token.
|
|
4
|
+
# Usage: source get_panda_token.sh
|
|
5
|
+
|
|
6
|
+
PANDA_SERVER=${PANDA_SERVER:-"https://pandaserver.cern.ch:25443"}
|
|
7
|
+
VO=${VO:-"atlas"}
|
|
8
|
+
TOKEN_FILE=${TOKEN_FILE:-"${HOME}/.panda_id_token"}
|
|
9
|
+
|
|
10
|
+
echo "==> Fetching auth config from ${PANDA_SERVER}/auth/${VO}_auth_config.json"
|
|
11
|
+
# -k disables TLS certificate verification; acceptable for a developer helper script
|
|
12
|
+
AUTH_CONFIG=$(curl -sk "${PANDA_SERVER}/auth/${VO}_auth_config.json")
|
|
13
|
+
if [ -z "$AUTH_CONFIG" ]; then
|
|
14
|
+
echo "ERROR: Failed to fetch auth config"
|
|
15
|
+
return 1 2>/dev/null || exit 1
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# Parse the fields from the auth config
|
|
19
|
+
read -r CLIENT_ID CLIENT_SECRET AUDIENCE OIDC_CONFIG_URL < <(
|
|
20
|
+
python3 -c "
|
|
21
|
+
import sys, json
|
|
22
|
+
d = json.load(sys.stdin)
|
|
23
|
+
print(d['client_id'], d.get('client_secret') or '', d['audience'], d['oidc_config_url'])
|
|
24
|
+
" <<< "$AUTH_CONFIG")
|
|
25
|
+
|
|
26
|
+
echo "==> client_id: $CLIENT_ID"
|
|
27
|
+
echo "==> audience: $AUDIENCE"
|
|
28
|
+
|
|
29
|
+
# Fetch OIDC endpoints
|
|
30
|
+
OIDC_CONFIG=$(curl -sk "$OIDC_CONFIG_URL")
|
|
31
|
+
read -r DEVICE_ENDPOINT TOKEN_ENDPOINT < <(
|
|
32
|
+
python3 -c "
|
|
33
|
+
import sys, json
|
|
34
|
+
d = json.load(sys.stdin)
|
|
35
|
+
print(d['device_authorization_endpoint'], d['token_endpoint'])
|
|
36
|
+
" <<< "$OIDC_CONFIG")
|
|
37
|
+
|
|
38
|
+
echo "==> Requesting device code..."
|
|
39
|
+
DEVICE_RESPONSE=$(curl -sk -X POST "$DEVICE_ENDPOINT" \
|
|
40
|
+
-H "Content-Type: application/x-www-form-urlencoded" \
|
|
41
|
+
-d "client_id=${CLIENT_ID}&scope=openid profile email offline_access&audience=${AUDIENCE}")
|
|
42
|
+
|
|
43
|
+
# Parse device response
|
|
44
|
+
# device_code: code to include in token request
|
|
45
|
+
# verification_uri_complete: URL to open in browser for user authentication
|
|
46
|
+
# expires_in: time in seconds before device code expires
|
|
47
|
+
# Interval: polling interval in seconds
|
|
48
|
+
read -r DEVICE_CODE VERIFICATION_URI EXPIRES_IN INTERVAL < <(
|
|
49
|
+
python3 -c "
|
|
50
|
+
import sys, json
|
|
51
|
+
d = json.load(sys.stdin)
|
|
52
|
+
print(d['device_code'], d['verification_uri_complete'], d['expires_in'], d.get('interval', 5))
|
|
53
|
+
" <<< "$DEVICE_RESPONSE")
|
|
54
|
+
|
|
55
|
+
if ! [[ "$EXPIRES_IN" =~ ^[0-9]+$ ]] || ! [[ "$INTERVAL" =~ ^[0-9]+$ ]]; then
|
|
56
|
+
echo "ERROR: Invalid expires_in or interval in device response"
|
|
57
|
+
return 1 2>/dev/null || exit 1
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
echo ""
|
|
61
|
+
echo "==> Please open the following URL in your browser and sign in:"
|
|
62
|
+
echo ""
|
|
63
|
+
echo " $VERIFICATION_URI"
|
|
64
|
+
echo ""
|
|
65
|
+
read -rp "Press Enter once you have signed in..."
|
|
66
|
+
|
|
67
|
+
# Poll for token
|
|
68
|
+
echo "==> Polling for token..."
|
|
69
|
+
ELAPSED=0
|
|
70
|
+
while [ "$ELAPSED" -lt "$EXPIRES_IN" ]; do
|
|
71
|
+
# client_secret is empty for public clients; included here for confidential client support
|
|
72
|
+
TOKEN_RESPONSE=$(curl -sk -X POST "$TOKEN_ENDPOINT" \
|
|
73
|
+
-H "Content-Type: application/x-www-form-urlencoded" \
|
|
74
|
+
-d "client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}&grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=${DEVICE_CODE}")
|
|
75
|
+
|
|
76
|
+
ERROR=$(echo "$TOKEN_RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin).get('error',''))" 2>/dev/null)
|
|
77
|
+
|
|
78
|
+
if [ "$ERROR" == "authorization_pending" ]; then
|
|
79
|
+
# RFC 8628 requires waiting at least interval seconds between polls; +1 adds a small buffer
|
|
80
|
+
sleep $((INTERVAL + 1))
|
|
81
|
+
ELAPSED=$((ELAPSED + INTERVAL + 1))
|
|
82
|
+
continue
|
|
83
|
+
elif [ -z "$ERROR" ]; then
|
|
84
|
+
read -r ID_TOKEN TOKEN_EXPIRES_IN < <(
|
|
85
|
+
python3 -c "
|
|
86
|
+
import sys, json
|
|
87
|
+
d = json.load(sys.stdin)
|
|
88
|
+
print(d['id_token'], d.get('expires_in', ''))
|
|
89
|
+
" <<< "$TOKEN_RESPONSE")
|
|
90
|
+
echo "$TOKEN_RESPONSE" > "$TOKEN_FILE"
|
|
91
|
+
EXPIRY_STR=$(date -d "+${TOKEN_EXPIRES_IN} seconds" 2>/dev/null || date -v "+${TOKEN_EXPIRES_IN}S" 2>/dev/null || echo "unknown")
|
|
92
|
+
echo ""
|
|
93
|
+
echo "==> Token saved to $TOKEN_FILE"
|
|
94
|
+
echo "==> Token expires at: $EXPIRY_STR"
|
|
95
|
+
break
|
|
96
|
+
else
|
|
97
|
+
echo "ERROR: $TOKEN_RESPONSE"
|
|
98
|
+
return 1 2>/dev/null || exit 1
|
|
99
|
+
fi
|
|
100
|
+
done
|
|
101
|
+
|
|
102
|
+
if [ -z "$ID_TOKEN" ]; then
|
|
103
|
+
echo "ERROR: Timed out waiting for authentication"
|
|
104
|
+
return 1 2>/dev/null || exit 1
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
echo "==> Token generated successfully!"
|
|
108
|
+
|
|
109
|
+
# Executed as source get_panda_token.sh: export token to current shell
|
|
110
|
+
if [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then
|
|
111
|
+
# id_token is exported as ACCESS_TOKEN to match the name panda-client tools expect
|
|
112
|
+
export ACCESS_TOKEN=$ID_TOKEN
|
|
113
|
+
# TOKEN_FILE exported so callers can extract other fields (e.g. refresh_token) without hardcoding the path
|
|
114
|
+
export TOKEN_FILE
|
|
115
|
+
echo "==> ACCESS_TOKEN exported to current shell (full response in \$TOKEN_FILE: $TOKEN_FILE)"
|
|
116
|
+
# Executed as ./get_panda_token.sh: print instructions to export token manually since we can't modify the parent shell's environment
|
|
117
|
+
else
|
|
118
|
+
echo ""
|
|
119
|
+
echo "Run the following to set your token:"
|
|
120
|
+
echo ""
|
|
121
|
+
echo " export ACCESS_TOKEN=$ID_TOKEN"
|
|
122
|
+
echo " export TOKEN_FILE=$TOKEN_FILE"
|
|
123
|
+
fi
|