panda-server-source 1.0.0__tar.gz → 1.0.2__tar.gz

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