panda-server-source 0.8.1__tar.gz → 1.0.1__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 (426) hide show
  1. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/PKG-INFO +3 -1
  2. panda_server_source-1.0.1/PandaPkgInfo.py +1 -0
  3. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/AtlasAnalJobBroker.py +22 -8
  4. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/AtlasBrokerUtils.py +46 -36
  5. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/AtlasProdJobBroker.py +14 -6
  6. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/AtlasProdTaskBroker.py +3 -2
  7. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/GenJobBroker.py +2 -2
  8. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediTaskBuffer.py +18 -9
  9. panda_server_source-1.0.1/pandajedi/jedidog/AsyncRequestWatchDog.py +27 -0
  10. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasAnalWatchDog.py +28 -1
  11. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/ContentsFeeder.py +24 -5
  12. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JediMaster.py +0 -1
  13. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JobGenerator.py +11 -7
  14. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JobSplitter.py +2 -0
  15. panda_server_source-1.0.1/pandajedi/jediorder/PostProcessor.py +182 -0
  16. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/TaskRefiner.py +4 -1
  17. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/WatchDog.py +2 -0
  18. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/AtlasAnalPostProcessor.py +102 -69
  19. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/AtlasProdPostProcessor.py +54 -19
  20. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/PostProcessorBase.py +22 -3
  21. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/TaskRefinerBase.py +53 -40
  22. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedisetup/AtlasTaskSetupper.py +1 -1
  23. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedithrottle/JobThrottlerBase.py +6 -2
  24. panda_server_source-1.0.1/pandaserver/api/v1/async_process_api.py +341 -0
  25. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/common.py +31 -1
  26. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/credential_management_api.py +1 -1
  27. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/file_server_api.py +4 -4
  28. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/http_client.py +5 -6
  29. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/job_api.py +1 -2
  30. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/metaconfig_api.py +1 -1
  31. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/pilot_api.py +5 -1
  32. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/task_api.py +108 -6
  33. panda_server_source-1.0.1/pandaserver/api/v1/tests/async_process_api_tests.py +221 -0
  34. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/task_api_tests.py +72 -0
  35. {panda_server_source-0.8.1/pandaserver/brokerage → panda_server_source-1.0.1/pandaserver/asyncprocess}/__init__.py +0 -0
  36. panda_server_source-1.0.1/pandaserver/asyncprocess/processor.py +181 -0
  37. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/brokerage/SiteMapper.py +3 -2
  38. {panda_server_source-0.8.1/pandaserver/config → panda_server_source-1.0.1/pandaserver/brokerage}/__init__.py +0 -0
  39. {panda_server_source-0.8.1/pandaserver/dataservice → panda_server_source-1.0.1/pandaserver/daemons/scripts}/__init__.py +0 -0
  40. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/add_main.py +15 -2
  41. panda_server_source-1.0.1/pandaserver/daemons/scripts/async_request_daemon.py +37 -0
  42. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/recover_lost_files_daemon.py +0 -3
  43. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/worker_synchronization.py +2 -1
  44. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/RecoverLostFilesCore.py +8 -7
  45. {panda_server_source-0.8.1/pandaserver/pandamcp → panda_server_source-1.0.1/pandaserver/jobdispatcher}/__init__.py +0 -0
  46. panda_server_source-1.0.1/pandaserver/pandamcp/client_utils/get_panda_token.py +151 -0
  47. panda_server_source-1.0.1/pandaserver/pandamcp/client_utils/get_panda_token.sh +123 -0
  48. panda_server_source-1.0.1/pandaserver/pandamcp/client_utils/panda_mcp_proxy.py +390 -0
  49. panda_server_source-1.0.1/pandaserver/pandamcp/client_utils/panda_mcp_wrapper.sh +92 -0
  50. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/pandamcp/mcp_main.py +27 -1
  51. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/pandamcp/mcp_test_client.py +12 -3
  52. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/pandamcp/mcp_utils.py +18 -12
  53. panda_server_source-1.0.1/pandaserver/pandamcp/panda_mcp_endpoints.json +77 -0
  54. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/server/panda.py +15 -96
  55. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/srvcore/CoreUtils.py +27 -1
  56. {panda_server_source-0.8.1/pandaserver/taskbuffer → panda_server_source-1.0.1/pandaserver/srvcore}/__init__.py +0 -0
  57. panda_server_source-1.0.1/pandaserver/srvcore/allowed_methods.py +14 -0
  58. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/srvcore/srv_msg_utils.py +0 -1
  59. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/DdmSpec.py +3 -0
  60. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JediDatasetSpec.py +6 -0
  61. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JediFileSpec.py +1 -0
  62. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JediTaskSpec.py +22 -2
  63. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/OraDBProxy.py +2 -0
  64. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/PrioUtil.py +1 -0
  65. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/TaskBuffer.py +82 -11
  66. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/WrappedCursor.py +9 -4
  67. {panda_server_source-0.8.1/pandaserver/test → panda_server_source-1.0.1/pandaserver/taskbuffer}/__init__.py +0 -0
  68. panda_server_source-1.0.1/pandaserver/taskbuffer/db_proxy_mods/async_request_module.py +548 -0
  69. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/base_module.py +55 -3
  70. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/entity_module.py +1 -1
  71. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +0 -32
  72. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +123 -29
  73. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +121 -36
  74. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +155 -155
  75. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +84 -29
  76. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +45 -18
  77. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/worker_module.py +36 -0
  78. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/boostUser.py +1 -1
  79. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/daod_on_demand.py +1 -1
  80. panda_server_source-1.0.1/pandaserver/userinterface/Client.py +808 -0
  81. panda_server_source-1.0.1/pandaserver/userinterface/UserIF.py +540 -0
  82. panda_server_source-1.0.1/pandaserver/workflow/__init__.py +0 -0
  83. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +15 -4
  84. panda_server_source-1.0.1/pandaserver/workflow/examples/multistep_merge_wfd.yaml +45 -0
  85. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +3 -1
  86. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/workflow_base.py +9 -1
  87. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/workflow_core.py +112 -37
  88. panda_server_source-1.0.1/pandaserver/workflow/workflow_native_utils.py +893 -0
  89. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/workflow_parser.py +22 -14
  90. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/workflow_utils.py +8 -3
  91. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pyproject-source.toml +5 -1
  92. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pyproject.toml +5 -1
  93. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/panda_jedi.cfg.rpmnew.template +4 -4
  94. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/panda_server-httpd.conf.rpmnew.template +1 -1
  95. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/panda_server.cfg.rpmnew.template +3 -1
  96. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_jedi.template +5 -1
  97. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_jedi_env.template +5 -1
  98. panda_server_source-0.8.1/PandaPkgInfo.py +0 -1
  99. panda_server_source-0.8.1/pandajedi/jediorder/PostProcessor.py +0 -166
  100. panda_server_source-0.8.1/pandaserver/jobdispatcher/JobDispatcher.py +0 -1625
  101. panda_server_source-0.8.1/pandaserver/srvcore/allowed_methods.py +0 -100
  102. panda_server_source-0.8.1/pandaserver/taskbuffer/Utils.py +0 -848
  103. panda_server_source-0.8.1/pandaserver/taskbuffer/WrappedPickle.py +0 -88
  104. panda_server_source-0.8.1/pandaserver/userinterface/Client.py +0 -1686
  105. panda_server_source-0.8.1/pandaserver/userinterface/UserIF.py +0 -1799
  106. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/.gitignore +0 -0
  107. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/.pre-commit-config.yaml +0 -0
  108. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/Dockerfile +0 -0
  109. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/Dockerfile.base +0 -0
  110. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/LICENSE.txt +0 -0
  111. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/README.md +0 -0
  112. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/package/hatch_build.py +0 -0
  113. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/__init__.py +0 -0
  114. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/JobBrokerBase.py +0 -0
  115. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/TaskBrokerBase.py +0 -0
  116. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/__init__.py +0 -0
  117. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediconfig/__init__.py +0 -0
  118. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediconfig/jedi_config.py +0 -0
  119. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/FactoryBase.py +0 -0
  120. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/Interaction.py +0 -0
  121. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediDBProxy.py +0 -0
  122. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediDBProxyPool.py +0 -0
  123. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediDBSchemaInfo.py +0 -0
  124. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediException.py +0 -0
  125. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediTaskBufferInterface.py +0 -0
  126. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/MsgWrapper.py +0 -0
  127. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/ProcessUtils.py +0 -0
  128. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/SiteCandidate.py +0 -0
  129. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/ThreadUtils.py +0 -0
  130. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/__init__.py +0 -0
  131. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediddm/AtlasDDMClient.py +0 -0
  132. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediddm/DDMClientBase.py +0 -0
  133. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediddm/DDMInterface.py +0 -0
  134. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediddm/GenDDMClient.py +0 -0
  135. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediddm/__init__.py +0 -0
  136. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasDataCarouselWatchDog.py +0 -0
  137. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +0 -0
  138. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasProdWatchDog.py +0 -0
  139. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasQueueFillerWatchDog.py +0 -0
  140. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +0 -0
  141. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +0 -0
  142. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/GenWatchDog.py +0 -0
  143. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/JumboWatchDog.py +0 -0
  144. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/TypicalWatchDogBase.py +0 -0
  145. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/WatchDogBase.py +0 -0
  146. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/__init__.py +0 -0
  147. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediexec/reniceJEDI.py +0 -0
  148. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedigen/AtlasTaskGenerator.py +0 -0
  149. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedigen/TaskGeneratorBase.py +0 -0
  150. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedigen/__init__.py +0 -0
  151. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/__init__.py +0 -0
  152. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +0 -0
  153. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +0 -0
  154. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/base_msg_processor.py +0 -0
  155. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/forwarding_msg_processor.py +0 -0
  156. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/hpo_msg_processor.py +0 -0
  157. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +0 -0
  158. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +0 -0
  159. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +0 -0
  160. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/kafka_msg_processor.py +0 -0
  161. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +0 -0
  162. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +0 -0
  163. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/processing_msg_processor.py +0 -0
  164. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/status_report_msg_processor.py +0 -0
  165. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +0 -0
  166. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +0 -0
  167. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JediDaemon.py +0 -0
  168. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JediKnight.py +0 -0
  169. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JediMsgProcessor.py +0 -0
  170. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JobBroker.py +0 -0
  171. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JobThrottler.py +0 -0
  172. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/TaskBroker.py +0 -0
  173. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/TaskCommando.py +0 -0
  174. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/TaskGenerator.py +0 -0
  175. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/TaskSetupper.py +0 -0
  176. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/__init__.py +0 -0
  177. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/AtlasPostProcessorUtils.py +0 -0
  178. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/GenPostProcessor.py +0 -0
  179. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/MailTemplates.py +0 -0
  180. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/__init__.py +0 -0
  181. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/AtlasAnalTaskRefiner.py +0 -0
  182. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/AtlasProdTaskRefiner.py +0 -0
  183. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/GenTaskRefiner.py +0 -0
  184. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/RefinerUtils.py +0 -0
  185. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/__init__.py +0 -0
  186. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedisetup/GenTaskSetupper.py +0 -0
  187. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedisetup/SimpleTaskSetupper.py +0 -0
  188. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedisetup/TaskSetupperBase.py +0 -0
  189. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedisetup/__init__.py +0 -0
  190. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/SchemaChecker.py +0 -0
  191. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addContWoSoTask.py +0 -0
  192. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addDataCarouselRequest.py +0 -0
  193. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addEventServiceTask.py +0 -0
  194. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addHpoTask.py +0 -0
  195. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addIDDSStageInRequest.py +0 -0
  196. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addNonAtlasTask.py +0 -0
  197. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addNonAtlasTaskEnc.py +0 -0
  198. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addTestTask.py +0 -0
  199. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addTestTaskParamToDEFT.py +0 -0
  200. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addTestTaskWithMerger.py +0 -0
  201. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/brokerTest.py +0 -0
  202. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/cancelDataCarouselRequest.py +0 -0
  203. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/contentsFeederTest.py +0 -0
  204. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/contentsFeederTestWithTask.py +0 -0
  205. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/ddmTest.py +0 -0
  206. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/jobGenForOneTask.py +0 -0
  207. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/jobGeneratorTest.py +0 -0
  208. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/jobSplitterTest.py +0 -0
  209. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/jobThrottlerTest.py +0 -0
  210. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/msgProcessorTest.py +0 -0
  211. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/postProcessorTest.py +0 -0
  212. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/resubmitDataCarouselRequest.py +0 -0
  213. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/resubmitTaskParam.py +0 -0
  214. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/taskBrokerTest.py +0 -0
  215. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/taskBrokerTestWithTask.py +0 -0
  216. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/taskBufferTest.py +0 -0
  217. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/taskCommandoTest.py +0 -0
  218. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/taskRefinerTest.py +0 -0
  219. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/testOneTaskToRefine.py +0 -0
  220. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/testOneTaskToTaskBroker.py +0 -0
  221. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/testPandaDDMMap.py +0 -0
  222. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/updateDataCarouselRequestParams.py +0 -0
  223. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/watchDogTest.py +0 -0
  224. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/workQueueTest.py +0 -0
  225. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedithrottle/AtlasAnalJobThrottler.py +0 -0
  226. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedithrottle/AtlasProdJobThrottler.py +0 -0
  227. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedithrottle/GenJobThrottler.py +0 -0
  228. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedithrottle/__init__.py +0 -0
  229. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/__init__.py +0 -0
  230. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/__init__.py +0 -0
  231. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/__init__.py +0 -0
  232. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/data_carousel_api.py +0 -0
  233. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/event_api.py +0 -0
  234. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/harvester_api.py +0 -0
  235. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/idds_api.py +0 -0
  236. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/statistics_api.py +0 -0
  237. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/system_api.py +0 -0
  238. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/__init__.py +0 -0
  239. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/credential_management_api_tests.py +0 -0
  240. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/data_carousel_api_tests.py +0 -0
  241. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/harvester_api_tests.py +0 -0
  242. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/idds_api_tests.py +0 -0
  243. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/job_api_tests.py +0 -0
  244. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/pilot_api_tests.py +0 -0
  245. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/statistics_api_tests.py +0 -0
  246. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/system_api_tests.py +0 -0
  247. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/version.py +0 -0
  248. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/workflow_api.py +0 -0
  249. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/brokerage/broker.py +0 -0
  250. {panda_server_source-0.8.1/pandaserver/configurator → panda_server_source-1.0.1/pandaserver/config}/__init__.py +0 -0
  251. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/config/config_utils.py +0 -0
  252. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/config/daemon_config.py +0 -0
  253. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/config/mcp_config.py +0 -0
  254. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/config/panda_config.py +0 -0
  255. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/configurator/Carbon.py +0 -0
  256. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/configurator/Configurator.py +0 -0
  257. {panda_server_source-0.8.1/pandaserver/daemons → panda_server_source-1.0.1/pandaserver/configurator}/__init__.py +0 -0
  258. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/configurator/aux.py +0 -0
  259. {panda_server_source-0.8.1/pandaserver/daemons/scripts → panda_server_source-1.0.1/pandaserver/daemons}/__init__.py +0 -0
  260. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/master.py +0 -0
  261. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/master_systemd.py +0 -0
  262. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/add_sub.py +0 -0
  263. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/cache_pilots.py +0 -0
  264. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/cache_schedconfig.py +0 -0
  265. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/carbon.py +0 -0
  266. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/configurator.py +0 -0
  267. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/copyArchive.py +0 -0
  268. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/datasetManager.py +0 -0
  269. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/dummy_test.py +0 -0
  270. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/evpPD2P.py +0 -0
  271. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/hs_scrapers.py +0 -0
  272. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/metric_collector.py +0 -0
  273. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/panda_activeusers_query.py +0 -0
  274. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/pilotStreaming.py +0 -0
  275. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/process_workflow_files_daemon.py +0 -0
  276. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/task_evaluator.py +0 -0
  277. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/tmpwatch.py +0 -0
  278. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/utils.py +0 -0
  279. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/DataServiceUtils.py +0 -0
  280. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/ErrorCode.py +0 -0
  281. {panda_server_source-0.8.1/pandaserver/jobdispatcher → panda_server_source-1.0.1/pandaserver/dataservice}/__init__.py +0 -0
  282. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/activator.py +0 -0
  283. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_atlas_plugin.py +0 -0
  284. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_dummy_plugin.py +0 -0
  285. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_gen.py +0 -0
  286. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_plugin_base.py +0 -0
  287. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_result.py +0 -0
  288. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_simple_plugin.py +0 -0
  289. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/closer.py +0 -0
  290. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/closer_atlas_plugin.py +0 -0
  291. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/ddm.py +0 -0
  292. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/ddm_handler.py +0 -0
  293. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/dyn_data_distributer.py +0 -0
  294. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/event_lookup_client_ei.py +0 -0
  295. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/event_picker.py +0 -0
  296. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/finisher.py +0 -0
  297. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/setupper.py +0 -0
  298. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/setupper_atlas_plugin.py +0 -0
  299. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/setupper_dummy_plugin.py +0 -0
  300. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/setupper_plugin_base.py +0 -0
  301. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/jobdispatcher/DispatcherUtils.py +0 -0
  302. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/jobdispatcher/ErrorCode.py +0 -0
  303. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/jobdispatcher/Protocol.py +0 -0
  304. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/jobdispatcher/Watcher.py +0 -0
  305. {panda_server_source-0.8.1/pandaserver/proxycache → panda_server_source-1.0.1/pandaserver/pandamcp}/__init__.py +0 -0
  306. {panda_server_source-0.8.1/pandaserver/srvcore → panda_server_source-1.0.1/pandaserver/proxycache}/__init__.py +0 -0
  307. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/proxycache/panda_proxy_cache.py +0 -0
  308. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/proxycache/token_cache.py +0 -0
  309. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/server/.gacl +0 -0
  310. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/srvcore/MailUtils.py +0 -0
  311. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/srvcore/oidc_utils.py +0 -0
  312. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/srvcore/panda_request.py +0 -0
  313. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/ConBridge.py +0 -0
  314. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/DBProxyPool.py +0 -0
  315. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/DataCarousel.py +0 -0
  316. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/DatasetSpec.py +0 -0
  317. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/ErrorCode.py +0 -0
  318. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/EventServiceUtils.py +0 -0
  319. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/FileSpec.py +0 -0
  320. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/GlobalShares.py +0 -0
  321. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/HarvesterMetricsSpec.py +0 -0
  322. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/Initializer.py +0 -0
  323. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/InputChunk.py +0 -0
  324. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JediCacheSpec.py +0 -0
  325. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JobSpec.py +0 -0
  326. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JobUtils.py +0 -0
  327. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/NucleusSpec.py +0 -0
  328. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/PanDAMsgProcessor.py +0 -0
  329. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/PandaDBSchemaInfo.py +0 -0
  330. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/ParseJobXML.py +0 -0
  331. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/PickleFileSpec.py +0 -0
  332. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/PickleJobSpec.py +0 -0
  333. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/ProcessGroups.py +0 -0
  334. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/ResourceSpec.py +0 -0
  335. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/SQLDumper.py +0 -0
  336. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/SQLManager.py +0 -0
  337. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/SiteSpec.py +0 -0
  338. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/SupErrors.py +0 -0
  339. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/TaskBufferInterface.py +0 -0
  340. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/WorkQueue.py +0 -0
  341. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/WorkQueueMapper.py +0 -0
  342. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/WorkerSpec.py +0 -0
  343. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/WrappedPostgresConn.py +0 -0
  344. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
  345. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/__init__.py +0 -0
  346. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +0 -0
  347. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +0 -0
  348. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +0 -0
  349. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +0 -0
  350. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/retryModule.py +0 -0
  351. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/task_split_rules.py +0 -0
  352. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/workflow_processor.py +0 -0
  353. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/wrapped_oracle_conn.py +0 -0
  354. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/SchemaChecker.py +0 -0
  355. {panda_server_source-0.8.1/pandaserver/userinterface → panda_server_source-1.0.1/pandaserver/test}/__init__.py +0 -0
  356. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/banUser.py +0 -0
  357. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/boostPrio.py +0 -0
  358. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/callbackDDM.py +0 -0
  359. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/finishJob.py +0 -0
  360. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/finishTaskJEDI.py +0 -0
  361. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/getJobs.py +0 -0
  362. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killJob.py +0 -0
  363. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killJobLowPrio.py +0 -0
  364. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killJobsInTask.py +0 -0
  365. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killTask.py +0 -0
  366. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killTaskJEDI.py +0 -0
  367. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killUser.py +0 -0
  368. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/lsst/README.txt +0 -0
  369. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/lsst/lsstSubmit.py +0 -0
  370. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/lsst/lsstSubmitMERGEtest.py +0 -0
  371. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/lsst/lsstSubmitPhosim332.py +0 -0
  372. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +0 -0
  373. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/reassignJobs.py +0 -0
  374. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/reassignSite.py +0 -0
  375. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/reassignTask.py +0 -0
  376. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/reassignWaiting.py +0 -0
  377. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/recoverLostFiles.py +0 -0
  378. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/reloadInputDS.py +0 -0
  379. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/sendCommandToJob.py +0 -0
  380. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/setDebugMode.py +0 -0
  381. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/setPriority.py +0 -0
  382. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testEvgen.py +0 -0
  383. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testEvgen17.py +0 -0
  384. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testG4sim.py +0 -0
  385. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testG4sim17.py +0 -0
  386. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testGlobalShares.py +0 -0
  387. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testReco.py +0 -0
  388. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testSimulReco14.py +0 -0
  389. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testSiteMap.py +0 -0
  390. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testUpdateWorkerPilotStatus.py +0 -0
  391. {panda_server_source-0.8.1/pandaserver/workflow → panda_server_source-1.0.1/pandaserver/userinterface}/__init__.py +0 -0
  392. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/data_handler_plugins/base_data_handler.py +0 -0
  393. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +0 -0
  394. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/pcwl_test.py +0 -0
  395. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/pcwl_utils.py +0 -0
  396. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/psnakemake_container.json +0 -0
  397. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/psnakemake_task.json +0 -0
  398. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/psnakemake_test.py +0 -0
  399. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/__init__.py +0 -0
  400. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/extensions.py +0 -0
  401. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/log.py +0 -0
  402. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/names.py +0 -0
  403. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/parser.py +0 -0
  404. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/utils.py +0 -0
  405. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/step_handler_plugins/base_step_handler.py +0 -0
  406. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/workflow_core_smoketest.py +0 -0
  407. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/bin/panda_jedi-reniceJEDI.exe.template +0 -0
  408. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/bin/panda_server-makeSlsXml.exe.template +0 -0
  409. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/bin/panda_server-vomsrenew.exe.template +0 -0
  410. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/init.d/panda_daemon.exe.template +0 -0
  411. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/init.d/panda_httpd.exe.template +0 -0
  412. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/init.d/panda_jedi.exe.template +0 -0
  413. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/init.d/panda_mcp.exe.template +0 -0
  414. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/init.d/panda_server.exe.template +0 -0
  415. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/logrotate.d/panda_jedi.template +0 -0
  416. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/logrotate.d/panda_server.logrotate.template +0 -0
  417. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/panda_jedi.cron.template +0 -0
  418. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_jedi.sysconfig_for_systemd.template +0 -0
  419. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_server.sysconfig.rpmnew.template +0 -0
  420. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_server.sysconfig_for_systemd.template +0 -0
  421. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_server_env.systemd.rpmnew.template +0 -0
  422. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/systemd/panda.service.template +0 -0
  423. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/systemd/panda_daemon.service.template +0 -0
  424. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/systemd/panda_httpd.service.template +0 -0
  425. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/systemd/panda_jedi.service.template +0 -0
  426. {panda_server_source-0.8.1 → panda_server_source-1.0.1}/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.1
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.1"
@@ -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():
@@ -1117,7 +1124,14 @@ class AtlasAnalJobBroker(JobBrokerBase):
1117
1124
  msg_map = {}
1118
1125
  for tmpSiteName in self.get_unified_sites(scanSiteList):
1119
1126
  tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
1120
- # check at the site
1127
+ # check direct access
1128
+ if taskSpec.allowInputLAN() == "only" and not tmpSiteSpec.isDirectIO() and not tmpSiteSpec.always_use_direct_io() and not inputChunk.isMerging:
1129
+ tmp_msg = f" skip site={tmpSiteName} since direct IO is disabled "
1130
+ tmp_msg += "criteria=-remoteio"
1131
+ msg_map[tmpSiteName] = tmp_msg
1132
+ continue
1133
+
1134
+ # check disk space
1121
1135
  if tmpSiteSpec.maxwdir:
1122
1136
  if CoreUtils.use_direct_io_for_job(taskSpec, tmpSiteSpec, inputChunk):
1123
1137
  minDiskCount = minDiskCountR
@@ -1282,7 +1296,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
1282
1296
  continue
1283
1297
 
1284
1298
  ######################################
1285
- # selection for zero walltime: scouts, merges, and walltime-undefined jobs
1299
+ # selection to skip short walltime: scouts, merges, and walltime-undefined jobs
1286
1300
  # must only go to sites with at least 24hr*10HS06s of available walltime
1287
1301
  if (
1288
1302
  (not sitePreAssigned and inputChunk.useScout())
@@ -1318,16 +1332,16 @@ class AtlasAnalJobBroker(JobBrokerBase):
1318
1332
  if siteMaxTime != 0 and siteMaxTime < minTimeForZeroWalltime:
1319
1333
  tmpMsg = f" skip site={tmpSiteName} due to site walltime {tmpSiteStr} (site upper limit) insufficient "
1320
1334
  if inputChunk.useScout():
1321
- tmpMsg += f"for scouts ({str_minTimeForZeroWalltime} at least) "
1322
- tmpMsg += "criteria=-scoutwalltime"
1335
+ tmpMsg += f"for scout jobs (requireing {str_minTimeForZeroWalltime} at least) "
1336
+ tmpMsg += "criteria=-scout_walltime"
1323
1337
  else:
1324
- tmpMsg += f"for zero walltime ({str_minTimeForZeroWalltime} at least) "
1325
- tmpMsg += "criteria=-zerowalltime"
1338
+ tmpMsg += f"for merge or walltime-undefined jobs (requiring {str_minTimeForZeroWalltime} at least) "
1339
+ tmpMsg += "criteria=-min_walltime"
1326
1340
  msg_map[tmpSiteSpec.get_unified_name()] = tmpMsg
1327
1341
  continue
1328
1342
  newScanSiteList.append(tmpSiteName)
1329
1343
  scanSiteList = newScanSiteList
1330
- 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)
1331
1345
  if not scanSiteList:
1332
1346
  self.dump_summary(tmpLog)
1333
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
  )
@@ -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
@@ -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
@@ -198,11 +200,6 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
198
200
  with self.proxyPool.get() as proxy:
199
201
  return proxy.getTaskDatasetsWithID_JEDI(jediTaskID, pid, lockTask)
200
202
 
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
203
  # get JEDI tasks to be finished
207
204
  def getTasksToBeFinished_JEDI(self, vo, prodSourceLabel, pid, nTasks=50, target_tasks=None):
208
205
  with self.proxyPool.get() as proxy:
@@ -255,9 +252,9 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
255
252
  )
256
253
 
257
254
  # get tasks to be processed
258
- 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):
259
256
  with self.proxyPool.get() as proxy:
260
- 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)
261
258
 
262
259
  # get job statistics with work queue
263
260
  def getJobStatisticsWithWorkQueue_JEDI(self, vo, prodSourceLabel, minPriority=None):
@@ -414,6 +411,7 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
414
411
  unmergeDatasetSpecMap,
415
412
  uniqueTaskName,
416
413
  oldTaskStatus,
414
+ in_content_dataset_spec_list,
417
415
  ):
418
416
  with self.proxyPool.get() as proxy:
419
417
  return proxy.registerTaskInOneShot_JEDI(
@@ -429,6 +427,7 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
429
427
  unmergeDatasetSpecMap,
430
428
  uniqueTaskName,
431
429
  oldTaskStatus,
430
+ in_content_dataset_spec_list,
432
431
  )
433
432
 
434
433
  # set tasks to be assigned
@@ -595,9 +594,9 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
595
594
  )
596
595
 
597
596
  # append input datasets for incremental execution
598
- def appendDatasets_JEDI(self, jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList):
597
+ def appendDatasets_JEDI(self, jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList, in_content_dataset_specs):
599
598
  with self.proxyPool.get() as proxy:
600
- return proxy.appendDatasets_JEDI(jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList)
599
+ return proxy.appendDatasets_JEDI(jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList, in_content_dataset_specs)
601
600
 
602
601
  # record retry history
603
602
  def recordRetryHistory_JEDI(self, jediTaskID, oldNewPandaIDs, relationType):
@@ -927,6 +926,11 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
927
926
  with self.proxyPool.get() as proxy:
928
927
  return proxy.get_tasks_inputdatasets_JEDI(vo)
929
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
+
930
934
  # update dataset locality
931
935
  def updateDatasetLocality_JEDI(self, jedi_taskid, datasetid, rse):
932
936
  with self.proxyPool.get() as proxy:
@@ -991,3 +995,8 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
991
995
  def get_task_failure_metrics(self, jedi_task_id):
992
996
  with self.proxyPool.get() as proxy:
993
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
 
@@ -125,10 +126,16 @@ class ContentsFeederThread(WorkerThread):
125
126
  datasetsIdxConsistency = []
126
127
 
127
128
  # get task
128
- tmpStat, taskSpec = self.taskBufferIF.getTaskWithID_JEDI(jediTaskID, False, real_run, self.pid, 10, clearError=True)
129
+ tmpStat, taskSpec = self.taskBufferIF.getTaskWithID_JEDI(jediTaskID, False, real_run, self.pid, 10)
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"]
@@ -627,14 +645,15 @@ class ContentsFeederThread(WorkerThread):
627
645
  setFrozenTime = False
628
646
  skip_secondaries = True
629
647
  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():
648
+ # task holdup by workflow if not enough master inputs are ready and parent steps are not all done
649
+ insufficient_ready_files = nFilesMasterReady == 0 or (nFilesPerJob and nFilesMasterReady < nFilesPerJob)
650
+ if not taskOnHold and not taskBroken and allUpdated and insufficient_ready_files and checkedMaster and taskSpec.is_workflow_holdup():
632
651
  # hold up by the workflow
633
652
  taskOnHold = True
634
653
  tmpLog.debug("task to hold up by workflow")
635
654
  # no master input
636
655
  if not taskOnHold and not taskBroken and allUpdated and nFilesMaster == 0 and checkedMaster:
637
- tmpErrStr = "no master input files. input dataset is empty"
656
+ tmpErrStr = "primary input dataset is empty or all files are excluded "
638
657
  if master_offset:
639
658
  tmpErrStr += f" with offset={master_offset}"
640
659
  tmpLog.error(tmpErrStr)
@@ -688,7 +707,7 @@ class ContentsFeederThread(WorkerThread):
688
707
  allRet = self.taskBufferIF.updateTaskStatusByContFeeder_JEDI(jediTaskID, taskSpec, pid=self.pid, setFrozenTime=setFrozenTime)
689
708
  elif allUpdated:
690
709
  # all OK
691
- allRet, newTaskStatus = self.taskBufferIF.updateTaskStatusByContFeeder_JEDI(
710
+ _, newTaskStatus = self.taskBufferIF.updateTaskStatusByContFeeder_JEDI(
692
711
  jediTaskID, getTaskStatus=True, pid=self.pid, useWorldCloud=taskSpec.useWorldCloud()
693
712
  )
694
713
  tmpMsg = f"set task_status={newTaskStatus}"
@@ -1,4 +1,3 @@
1
- import datetime
2
1
  import grp
3
2
  import multiprocessing
4
3
  import optparse