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.
Files changed (416) hide show
  1. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/PKG-INFO +3 -1
  2. panda_server_source-1.0.0/PandaPkgInfo.py +1 -0
  3. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasAnalJobBroker.py +8 -1
  4. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/GenJobBroker.py +2 -2
  5. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediTaskBuffer.py +0 -5
  6. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/ContentsFeeder.py +6 -5
  7. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JobGenerator.py +1 -1
  8. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JobSplitter.py +2 -0
  9. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/PostProcessorBase.py +22 -3
  10. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedisetup/AtlasTaskSetupper.py +1 -1
  11. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/file_server_api.py +1 -1
  12. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/http_client.py +4 -4
  13. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/job_api.py +1 -2
  14. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/metaconfig_api.py +1 -1
  15. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/pilot_api.py +5 -1
  16. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/task_api.py +86 -0
  17. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/task_api_tests.py +47 -0
  18. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/worker_synchronization.py +2 -1
  19. panda_server_source-1.0.0/pandaserver/pandamcp/client_utils/get_panda_token.sh +123 -0
  20. panda_server_source-1.0.0/pandaserver/pandamcp/client_utils/panda_mcp_wrapper.sh +92 -0
  21. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/pandamcp/mcp_main.py +27 -1
  22. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/pandamcp/mcp_utils.py +18 -12
  23. panda_server_source-1.0.0/pandaserver/pandamcp/panda_mcp_endpoints.json +77 -0
  24. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/server/panda.py +11 -96
  25. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/srvcore/CoreUtils.py +26 -0
  26. panda_server_source-1.0.0/pandaserver/srvcore/allowed_methods.py +14 -0
  27. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/srvcore/srv_msg_utils.py +0 -1
  28. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/TaskBuffer.py +4 -8
  29. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/entity_module.py +1 -1
  30. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +0 -32
  31. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +1 -1
  32. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +3 -2
  33. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +4 -2
  34. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +31 -10
  35. panda_server_source-1.0.0/pandaserver/userinterface/Client.py +808 -0
  36. panda_server_source-1.0.0/pandaserver/userinterface/UserIF.py +540 -0
  37. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +15 -4
  38. panda_server_source-1.0.0/pandaserver/workflow/examples/multistep_merge_wfd.yaml +45 -0
  39. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +3 -1
  40. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_base.py +7 -1
  41. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_core.py +25 -12
  42. panda_server_source-1.0.0/pandaserver/workflow/workflow_native_utils.py +893 -0
  43. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_parser.py +22 -14
  44. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_utils.py +5 -0
  45. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pyproject-source.toml +5 -1
  46. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pyproject.toml +5 -1
  47. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_jedi.template +5 -1
  48. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_jedi_env.template +5 -1
  49. panda_server_source-0.8.1/PandaPkgInfo.py +0 -1
  50. panda_server_source-0.8.1/pandaserver/jobdispatcher/JobDispatcher.py +0 -1625
  51. panda_server_source-0.8.1/pandaserver/srvcore/allowed_methods.py +0 -100
  52. panda_server_source-0.8.1/pandaserver/taskbuffer/Utils.py +0 -848
  53. panda_server_source-0.8.1/pandaserver/taskbuffer/WrappedPickle.py +0 -88
  54. panda_server_source-0.8.1/pandaserver/userinterface/Client.py +0 -1686
  55. panda_server_source-0.8.1/pandaserver/userinterface/UserIF.py +0 -1799
  56. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/.gitignore +0 -0
  57. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/.pre-commit-config.yaml +0 -0
  58. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/Dockerfile +0 -0
  59. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/Dockerfile.base +0 -0
  60. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/LICENSE.txt +0 -0
  61. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/README.md +0 -0
  62. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/package/hatch_build.py +0 -0
  63. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/__init__.py +0 -0
  64. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasBrokerUtils.py +0 -0
  65. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasProdJobBroker.py +0 -0
  66. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/AtlasProdTaskBroker.py +0 -0
  67. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/JobBrokerBase.py +0 -0
  68. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/TaskBrokerBase.py +0 -0
  69. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedibrokerage/__init__.py +0 -0
  70. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediconfig/__init__.py +0 -0
  71. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediconfig/jedi_config.py +0 -0
  72. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/FactoryBase.py +0 -0
  73. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/Interaction.py +0 -0
  74. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediDBProxy.py +0 -0
  75. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediDBProxyPool.py +0 -0
  76. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediDBSchemaInfo.py +0 -0
  77. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediException.py +0 -0
  78. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/JediTaskBufferInterface.py +0 -0
  79. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/MsgWrapper.py +0 -0
  80. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/ProcessUtils.py +0 -0
  81. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/SiteCandidate.py +0 -0
  82. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/ThreadUtils.py +0 -0
  83. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedicore/__init__.py +0 -0
  84. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediddm/AtlasDDMClient.py +0 -0
  85. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediddm/DDMClientBase.py +0 -0
  86. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediddm/DDMInterface.py +0 -0
  87. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediddm/GenDDMClient.py +0 -0
  88. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediddm/__init__.py +0 -0
  89. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasAnalWatchDog.py +0 -0
  90. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasDataCarouselWatchDog.py +0 -0
  91. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +0 -0
  92. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasProdWatchDog.py +0 -0
  93. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasQueueFillerWatchDog.py +0 -0
  94. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +0 -0
  95. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +0 -0
  96. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/GenWatchDog.py +0 -0
  97. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/JumboWatchDog.py +0 -0
  98. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/TypicalWatchDogBase.py +0 -0
  99. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/WatchDogBase.py +0 -0
  100. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedidog/__init__.py +0 -0
  101. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediexec/reniceJEDI.py +0 -0
  102. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedigen/AtlasTaskGenerator.py +0 -0
  103. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedigen/TaskGeneratorBase.py +0 -0
  104. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedigen/__init__.py +0 -0
  105. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/__init__.py +0 -0
  106. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +0 -0
  107. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +0 -0
  108. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/base_msg_processor.py +0 -0
  109. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/forwarding_msg_processor.py +0 -0
  110. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/hpo_msg_processor.py +0 -0
  111. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +0 -0
  112. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +0 -0
  113. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +0 -0
  114. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/kafka_msg_processor.py +0 -0
  115. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +0 -0
  116. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +0 -0
  117. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/processing_msg_processor.py +0 -0
  118. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/status_report_msg_processor.py +0 -0
  119. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +0 -0
  120. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +0 -0
  121. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JediDaemon.py +0 -0
  122. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JediKnight.py +0 -0
  123. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JediMaster.py +0 -0
  124. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JediMsgProcessor.py +0 -0
  125. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JobBroker.py +0 -0
  126. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/JobThrottler.py +0 -0
  127. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/PostProcessor.py +0 -0
  128. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskBroker.py +0 -0
  129. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskCommando.py +0 -0
  130. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskGenerator.py +0 -0
  131. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskRefiner.py +0 -0
  132. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/TaskSetupper.py +0 -0
  133. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/WatchDog.py +0 -0
  134. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jediorder/__init__.py +0 -0
  135. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/AtlasAnalPostProcessor.py +0 -0
  136. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/AtlasPostProcessorUtils.py +0 -0
  137. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/AtlasProdPostProcessor.py +0 -0
  138. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/GenPostProcessor.py +0 -0
  139. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/MailTemplates.py +0 -0
  140. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedipprocess/__init__.py +0 -0
  141. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/AtlasAnalTaskRefiner.py +0 -0
  142. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/AtlasProdTaskRefiner.py +0 -0
  143. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/GenTaskRefiner.py +0 -0
  144. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/RefinerUtils.py +0 -0
  145. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/TaskRefinerBase.py +0 -0
  146. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedirefine/__init__.py +0 -0
  147. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedisetup/GenTaskSetupper.py +0 -0
  148. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedisetup/SimpleTaskSetupper.py +0 -0
  149. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedisetup/TaskSetupperBase.py +0 -0
  150. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedisetup/__init__.py +0 -0
  151. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/SchemaChecker.py +0 -0
  152. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addContWoSoTask.py +0 -0
  153. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addDataCarouselRequest.py +0 -0
  154. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addEventServiceTask.py +0 -0
  155. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addHpoTask.py +0 -0
  156. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addIDDSStageInRequest.py +0 -0
  157. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addNonAtlasTask.py +0 -0
  158. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addNonAtlasTaskEnc.py +0 -0
  159. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addTestTask.py +0 -0
  160. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addTestTaskParamToDEFT.py +0 -0
  161. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/addTestTaskWithMerger.py +0 -0
  162. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/brokerTest.py +0 -0
  163. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/cancelDataCarouselRequest.py +0 -0
  164. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/contentsFeederTest.py +0 -0
  165. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/contentsFeederTestWithTask.py +0 -0
  166. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/ddmTest.py +0 -0
  167. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/jobGenForOneTask.py +0 -0
  168. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/jobGeneratorTest.py +0 -0
  169. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/jobSplitterTest.py +0 -0
  170. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/jobThrottlerTest.py +0 -0
  171. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/msgProcessorTest.py +0 -0
  172. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/postProcessorTest.py +0 -0
  173. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/resubmitDataCarouselRequest.py +0 -0
  174. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/resubmitTaskParam.py +0 -0
  175. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/taskBrokerTest.py +0 -0
  176. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/taskBrokerTestWithTask.py +0 -0
  177. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/taskBufferTest.py +0 -0
  178. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/taskCommandoTest.py +0 -0
  179. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/taskRefinerTest.py +0 -0
  180. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/testOneTaskToRefine.py +0 -0
  181. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/testOneTaskToTaskBroker.py +0 -0
  182. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/testPandaDDMMap.py +0 -0
  183. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/updateDataCarouselRequestParams.py +0 -0
  184. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/watchDogTest.py +0 -0
  185. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jeditest/workQueueTest.py +0 -0
  186. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedithrottle/AtlasAnalJobThrottler.py +0 -0
  187. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedithrottle/AtlasProdJobThrottler.py +0 -0
  188. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedithrottle/GenJobThrottler.py +0 -0
  189. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedithrottle/JobThrottlerBase.py +0 -0
  190. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandajedi/jedithrottle/__init__.py +0 -0
  191. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/__init__.py +0 -0
  192. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/__init__.py +0 -0
  193. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/__init__.py +0 -0
  194. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/common.py +0 -0
  195. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/credential_management_api.py +0 -0
  196. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/data_carousel_api.py +0 -0
  197. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/event_api.py +0 -0
  198. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/harvester_api.py +0 -0
  199. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/idds_api.py +0 -0
  200. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/statistics_api.py +0 -0
  201. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/system_api.py +0 -0
  202. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/__init__.py +0 -0
  203. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/credential_management_api_tests.py +0 -0
  204. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/data_carousel_api_tests.py +0 -0
  205. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/harvester_api_tests.py +0 -0
  206. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/idds_api_tests.py +0 -0
  207. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/job_api_tests.py +0 -0
  208. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/pilot_api_tests.py +0 -0
  209. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/statistics_api_tests.py +0 -0
  210. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/tests/system_api_tests.py +0 -0
  211. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/version.py +0 -0
  212. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/api/v1/workflow_api.py +0 -0
  213. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/brokerage/SiteMapper.py +0 -0
  214. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/brokerage/__init__.py +0 -0
  215. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/brokerage/broker.py +0 -0
  216. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/config/__init__.py +0 -0
  217. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/config/config_utils.py +0 -0
  218. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/config/daemon_config.py +0 -0
  219. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/config/mcp_config.py +0 -0
  220. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/config/panda_config.py +0 -0
  221. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/configurator/Carbon.py +0 -0
  222. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/configurator/Configurator.py +0 -0
  223. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/configurator/__init__.py +0 -0
  224. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/configurator/aux.py +0 -0
  225. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/__init__.py +0 -0
  226. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/master.py +0 -0
  227. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/master_systemd.py +0 -0
  228. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/__init__.py +0 -0
  229. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/add_main.py +0 -0
  230. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/add_sub.py +0 -0
  231. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/cache_pilots.py +0 -0
  232. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/cache_schedconfig.py +0 -0
  233. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/carbon.py +0 -0
  234. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/configurator.py +0 -0
  235. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/copyArchive.py +0 -0
  236. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/datasetManager.py +0 -0
  237. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/dummy_test.py +0 -0
  238. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/evpPD2P.py +0 -0
  239. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/hs_scrapers.py +0 -0
  240. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/metric_collector.py +0 -0
  241. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/panda_activeusers_query.py +0 -0
  242. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/pilotStreaming.py +0 -0
  243. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/process_workflow_files_daemon.py +0 -0
  244. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/recover_lost_files_daemon.py +0 -0
  245. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/task_evaluator.py +0 -0
  246. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/scripts/tmpwatch.py +0 -0
  247. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/daemons/utils.py +0 -0
  248. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/DataServiceUtils.py +0 -0
  249. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/ErrorCode.py +0 -0
  250. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/RecoverLostFilesCore.py +0 -0
  251. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/__init__.py +0 -0
  252. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/activator.py +0 -0
  253. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_atlas_plugin.py +0 -0
  254. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_dummy_plugin.py +0 -0
  255. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_gen.py +0 -0
  256. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_plugin_base.py +0 -0
  257. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_result.py +0 -0
  258. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/adder_simple_plugin.py +0 -0
  259. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/closer.py +0 -0
  260. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/closer_atlas_plugin.py +0 -0
  261. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/ddm.py +0 -0
  262. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/ddm_handler.py +0 -0
  263. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/dyn_data_distributer.py +0 -0
  264. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/event_lookup_client_ei.py +0 -0
  265. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/event_picker.py +0 -0
  266. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/finisher.py +0 -0
  267. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper.py +0 -0
  268. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper_atlas_plugin.py +0 -0
  269. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper_dummy_plugin.py +0 -0
  270. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/dataservice/setupper_plugin_base.py +0 -0
  271. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/DispatcherUtils.py +0 -0
  272. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/ErrorCode.py +0 -0
  273. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/Protocol.py +0 -0
  274. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/Watcher.py +0 -0
  275. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/jobdispatcher/__init__.py +0 -0
  276. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/pandamcp/__init__.py +0 -0
  277. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/pandamcp/mcp_test_client.py +0 -0
  278. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/proxycache/__init__.py +0 -0
  279. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/proxycache/panda_proxy_cache.py +0 -0
  280. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/proxycache/token_cache.py +0 -0
  281. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/server/.gacl +0 -0
  282. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/srvcore/MailUtils.py +0 -0
  283. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/srvcore/__init__.py +0 -0
  284. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/srvcore/oidc_utils.py +0 -0
  285. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/srvcore/panda_request.py +0 -0
  286. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ConBridge.py +0 -0
  287. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DBProxyPool.py +0 -0
  288. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DataCarousel.py +0 -0
  289. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DatasetSpec.py +0 -0
  290. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/DdmSpec.py +0 -0
  291. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ErrorCode.py +0 -0
  292. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/EventServiceUtils.py +0 -0
  293. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/FileSpec.py +0 -0
  294. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/GlobalShares.py +0 -0
  295. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/HarvesterMetricsSpec.py +0 -0
  296. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/Initializer.py +0 -0
  297. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/InputChunk.py +0 -0
  298. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediCacheSpec.py +0 -0
  299. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediDatasetSpec.py +0 -0
  300. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediFileSpec.py +0 -0
  301. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JediTaskSpec.py +0 -0
  302. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JobSpec.py +0 -0
  303. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/JobUtils.py +0 -0
  304. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/NucleusSpec.py +0 -0
  305. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/OraDBProxy.py +0 -0
  306. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PanDAMsgProcessor.py +0 -0
  307. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PandaDBSchemaInfo.py +0 -0
  308. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ParseJobXML.py +0 -0
  309. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PickleFileSpec.py +0 -0
  310. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PickleJobSpec.py +0 -0
  311. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/PrioUtil.py +0 -0
  312. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ProcessGroups.py +0 -0
  313. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/ResourceSpec.py +0 -0
  314. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SQLDumper.py +0 -0
  315. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SQLManager.py +0 -0
  316. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SiteSpec.py +0 -0
  317. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/SupErrors.py +0 -0
  318. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/TaskBufferInterface.py +0 -0
  319. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WorkQueue.py +0 -0
  320. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WorkQueueMapper.py +0 -0
  321. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WorkerSpec.py +0 -0
  322. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WrappedCursor.py +0 -0
  323. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/WrappedPostgresConn.py +0 -0
  324. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/__init__.py +0 -0
  325. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
  326. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/__init__.py +0 -0
  327. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/base_module.py +0 -0
  328. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +0 -0
  329. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +0 -0
  330. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +0 -0
  331. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +0 -0
  332. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/worker_module.py +0 -0
  333. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +0 -0
  334. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/retryModule.py +0 -0
  335. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/task_split_rules.py +0 -0
  336. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/workflow_processor.py +0 -0
  337. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/taskbuffer/wrapped_oracle_conn.py +0 -0
  338. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/SchemaChecker.py +0 -0
  339. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/__init__.py +0 -0
  340. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/banUser.py +0 -0
  341. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/boostPrio.py +0 -0
  342. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/boostUser.py +0 -0
  343. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/callbackDDM.py +0 -0
  344. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/daod_on_demand.py +0 -0
  345. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/finishJob.py +0 -0
  346. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/finishTaskJEDI.py +0 -0
  347. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/getJobs.py +0 -0
  348. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killJob.py +0 -0
  349. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killJobLowPrio.py +0 -0
  350. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killJobsInTask.py +0 -0
  351. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killTask.py +0 -0
  352. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killTaskJEDI.py +0 -0
  353. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/killUser.py +0 -0
  354. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/lsst/README.txt +0 -0
  355. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/lsst/lsstSubmit.py +0 -0
  356. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/lsst/lsstSubmitMERGEtest.py +0 -0
  357. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/lsst/lsstSubmitPhosim332.py +0 -0
  358. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +0 -0
  359. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/reassignJobs.py +0 -0
  360. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/reassignSite.py +0 -0
  361. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/reassignTask.py +0 -0
  362. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/reassignWaiting.py +0 -0
  363. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/recoverLostFiles.py +0 -0
  364. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/reloadInputDS.py +0 -0
  365. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/sendCommandToJob.py +0 -0
  366. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/setDebugMode.py +0 -0
  367. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/setPriority.py +0 -0
  368. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testEvgen.py +0 -0
  369. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testEvgen17.py +0 -0
  370. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testG4sim.py +0 -0
  371. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testG4sim17.py +0 -0
  372. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testGlobalShares.py +0 -0
  373. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testReco.py +0 -0
  374. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testSimulReco14.py +0 -0
  375. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testSiteMap.py +0 -0
  376. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/test/testUpdateWorkerPilotStatus.py +0 -0
  377. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/userinterface/__init__.py +0 -0
  378. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/__init__.py +0 -0
  379. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/data_handler_plugins/base_data_handler.py +0 -0
  380. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +0 -0
  381. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/pcwl_test.py +0 -0
  382. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/pcwl_utils.py +0 -0
  383. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/psnakemake_container.json +0 -0
  384. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/psnakemake_task.json +0 -0
  385. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/psnakemake_test.py +0 -0
  386. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/__init__.py +0 -0
  387. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/extensions.py +0 -0
  388. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/log.py +0 -0
  389. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/names.py +0 -0
  390. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/parser.py +0 -0
  391. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/snakeparser/utils.py +0 -0
  392. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/step_handler_plugins/base_step_handler.py +0 -0
  393. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/pandaserver/workflow/workflow_core_smoketest.py +0 -0
  394. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/bin/panda_jedi-reniceJEDI.exe.template +0 -0
  395. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/bin/panda_server-makeSlsXml.exe.template +0 -0
  396. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/bin/panda_server-vomsrenew.exe.template +0 -0
  397. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/init.d/panda_daemon.exe.template +0 -0
  398. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/init.d/panda_httpd.exe.template +0 -0
  399. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/init.d/panda_jedi.exe.template +0 -0
  400. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/init.d/panda_mcp.exe.template +0 -0
  401. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/init.d/panda_server.exe.template +0 -0
  402. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/logrotate.d/panda_jedi.template +0 -0
  403. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/logrotate.d/panda_server.logrotate.template +0 -0
  404. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/panda_jedi.cfg.rpmnew.template +0 -0
  405. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/panda_jedi.cron.template +0 -0
  406. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/panda_server-httpd.conf.rpmnew.template +0 -0
  407. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/panda_server.cfg.rpmnew.template +0 -0
  408. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_jedi.sysconfig_for_systemd.template +0 -0
  409. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_server.sysconfig.rpmnew.template +0 -0
  410. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_server.sysconfig_for_systemd.template +0 -0
  411. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/sysconfig/panda_server_env.systemd.rpmnew.template +0 -0
  412. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/systemd/panda.service.template +0 -0
  413. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/systemd/panda_daemon.service.template +0 -0
  414. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/systemd/panda_httpd.service.template +0 -0
  415. {panda_server_source-0.8.1 → panda_server_source-1.0.0}/templates/systemd/panda_jedi.service.template +0 -0
  416. {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.8.1
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 at the site
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
@@ -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
@@ -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:
@@ -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, clearError=True)
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 no master inputs are ready
631
- if not taskOnHold and not taskBroken and allUpdated and nFilesMasterReady == 0 and checkedMaster and taskSpec.is_workflow_holdup():
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 = "no master input files. input dataset is empty"
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
- allRet, newTaskStatus = self.taskBufferIF.updateTaskStatusByContFeeder_JEDI(
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
@@ -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()
@@ -197,7 +197,7 @@ class AtlasTaskSetupper(TaskSetupperBase):
197
197
  targetName,
198
198
  locForDouble,
199
199
  copies=1,
200
- owner=userName,
200
+ owner=None,
201
201
  lifetime=lifetime,
202
202
  activity=activity,
203
203
  grouping="NONE",
@@ -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"put_file_recovery_request < task_id={task_id} >")
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(self, job_ids: List[int]) -> Dict:
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")
@@ -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, production=True, request_method="GET")
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"updateWorkerPilotStatus worker_id={worker_id} harvester_id={harvester_id} status={status} node_id={node_id} PID={os.getpid()}",
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
  """
@@ -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.taskbuffer.Utils import create_shards
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