panda-server-source 1.0.4__tar.gz → 1.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. panda_server_source-1.1.0/.pre-commit-config.yaml +73 -0
  2. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/PKG-INFO +1 -1
  3. panda_server_source-1.1.0/PandaPkgInfo.py +1 -0
  4. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/package/hatch_build.py +2 -2
  5. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/AtlasAnalJobBroker.py +119 -93
  6. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/AtlasBrokerUtils.py +111 -64
  7. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/AtlasProdJobBroker.py +119 -54
  8. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/AtlasProdTaskBroker.py +49 -21
  9. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/GenJobBroker.py +21 -8
  10. panda_server_source-1.1.0/pandajedi/jedibrokerage/JobBrokerBase.py +162 -0
  11. panda_server_source-1.1.0/pandajedi/jedibrokerage/TaskBrokerBase.py +42 -0
  12. panda_server_source-1.1.0/pandajedi/jediconfig/jedi_config.py +202 -0
  13. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/FactoryBase.py +55 -27
  14. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/Interaction.py +102 -71
  15. panda_server_source-1.1.0/pandajedi/jedicore/JediDBProxy.py +78 -0
  16. panda_server_source-1.1.0/pandajedi/jedicore/JediDBProxyPool.py +14 -0
  17. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/JediDBSchemaInfo.py +5 -2
  18. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/JediException.py +5 -0
  19. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/JediTaskBuffer.py +375 -258
  20. panda_server_source-1.1.0/pandajedi/jedicore/JediTaskBufferInterface.py +76 -0
  21. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/MsgWrapper.py +28 -18
  22. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/ProcessUtils.py +7 -3
  23. panda_server_source-1.1.0/pandajedi/jedicore/SiteCandidate.py +104 -0
  24. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/ThreadUtils.py +47 -36
  25. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediddm/AtlasDDMClient.py +157 -87
  26. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediddm/DDMClientBase.py +6 -4
  27. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediddm/DDMInterface.py +26 -7
  28. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediddm/GenDDMClient.py +7 -2
  29. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AsyncRequestWatchDog.py +9 -2
  30. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasAnalWatchDog.py +36 -22
  31. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasDataCarouselWatchDog.py +20 -20
  32. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +32 -10
  33. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasProdWatchDog.py +37 -22
  34. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasQueueFillerWatchDog.py +56 -44
  35. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +19 -11
  36. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +9 -3
  37. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/GenWatchDog.py +9 -2
  38. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/JumboWatchDog.py +14 -7
  39. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/TypicalWatchDogBase.py +13 -3
  40. panda_server_source-1.1.0/pandajedi/jedidog/WatchDogBase.py +82 -0
  41. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedigen/AtlasTaskGenerator.py +8 -7
  42. panda_server_source-1.1.0/pandajedi/jedigen/TaskGeneratorBase.py +32 -0
  43. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +4 -3
  44. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/base_msg_processor.py +6 -3
  45. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/forwarding_msg_processor.py +3 -2
  46. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/hpo_msg_processor.py +3 -1
  47. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +4 -3
  48. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +28 -20
  49. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +10 -6
  50. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/kafka_msg_processor.py +5 -3
  51. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +20 -18
  52. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +25 -6
  53. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/processing_msg_processor.py +27 -16
  54. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/status_report_msg_processor.py +9 -5
  55. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +19 -13
  56. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +7 -6
  57. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/ContentsFeeder.py +110 -63
  58. panda_server_source-1.1.0/pandajedi/jediorder/JediKnight.py +82 -0
  59. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/JediMaster.py +12 -15
  60. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/JediMsgProcessor.py +3 -1
  61. panda_server_source-1.1.0/pandajedi/jediorder/JobBroker.py +42 -0
  62. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/JobGenerator.py +365 -234
  63. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/JobSplitter.py +45 -24
  64. panda_server_source-1.1.0/pandajedi/jediorder/JobThrottler.py +34 -0
  65. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/PostProcessor.py +54 -21
  66. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/TaskBroker.py +77 -37
  67. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/TaskCommando.py +31 -9
  68. panda_server_source-1.1.0/pandajedi/jediorder/TaskGenerator.py +22 -0
  69. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/TaskRefiner.py +85 -66
  70. panda_server_source-1.1.0/pandajedi/jediorder/TaskSetupper.py +22 -0
  71. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/WatchDog.py +30 -9
  72. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/AtlasAnalPostProcessor.py +60 -41
  73. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/AtlasPostProcessorUtils.py +14 -2
  74. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/AtlasProdPostProcessor.py +30 -23
  75. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/GenPostProcessor.py +8 -2
  76. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/PostProcessorBase.py +59 -37
  77. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/AtlasAnalTaskRefiner.py +29 -7
  78. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/AtlasProdTaskRefiner.py +19 -6
  79. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/GenTaskRefiner.py +14 -3
  80. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/RefinerUtils.py +42 -12
  81. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/TaskRefinerBase.py +76 -43
  82. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedisetup/AtlasTaskSetupper.py +44 -16
  83. panda_server_source-1.1.0/pandajedi/jedisetup/GenTaskSetupper.py +23 -0
  84. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedisetup/SimpleTaskSetupper.py +10 -2
  85. panda_server_source-1.1.0/pandajedi/jedisetup/TaskSetupperBase.py +34 -0
  86. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addContWoSoTask.py +3 -3
  87. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addDataCarouselRequest.py +2 -2
  88. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addEventServiceTask.py +3 -2
  89. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addHpoTask.py +5 -4
  90. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addIDDSStageInRequest.py +4 -5
  91. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addNonAtlasTask.py +3 -5
  92. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addNonAtlasTaskEnc.py +3 -3
  93. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addTestTask.py +1 -1
  94. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addTestTaskParamToDEFT.py +3 -1
  95. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addTestTaskWithMerger.py +6 -4
  96. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/brokerTest.py +9 -4
  97. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/cancelDataCarouselRequest.py +6 -2
  98. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/jobGenForOneTask.py +2 -1
  99. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/jobGeneratorTest.py +1 -0
  100. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/jobSplitterTest.py +8 -4
  101. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/resubmitDataCarouselRequest.py +6 -2
  102. panda_server_source-1.1.0/pandajedi/jeditest/resubmitTaskParam.py +30 -0
  103. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/taskBrokerTestWithTask.py +1 -1
  104. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/taskCommandoTest.py +1 -0
  105. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/testOneTaskToRefine.py +2 -0
  106. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/testOneTaskToTaskBroker.py +1 -1
  107. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/testPandaDDMMap.py +1 -7
  108. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/updateDataCarouselRequestParams.py +1 -2
  109. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/workQueueTest.py +1 -2
  110. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedithrottle/AtlasAnalJobThrottler.py +8 -2
  111. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedithrottle/AtlasProdJobThrottler.py +8 -2
  112. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedithrottle/GenJobThrottler.py +7 -2
  113. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedithrottle/JobThrottlerBase.py +50 -18
  114. panda_server_source-1.1.0/pandaserver/api/v1/async_process_api.py +695 -0
  115. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/common.py +135 -50
  116. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/credential_management_api.py +101 -24
  117. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/data_carousel_api.py +71 -27
  118. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/event_api.py +40 -21
  119. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/file_server_api.py +94 -54
  120. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/harvester_api.py +75 -21
  121. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/http_client.py +19 -14
  122. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/idds_api.py +29 -23
  123. panda_server_source-1.1.0/pandaserver/api/v1/job_api.py +715 -0
  124. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/metaconfig_api.py +24 -10
  125. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/pilot_api.py +234 -127
  126. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/statistics_api.py +57 -15
  127. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/system_api.py +28 -14
  128. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/task_api.py +260 -70
  129. panda_server_source-1.1.0/pandaserver/api/v1/tests/async_process_api_tests.py +682 -0
  130. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/credential_management_api_tests.py +7 -7
  131. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/data_carousel_api_tests.py +46 -42
  132. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/harvester_api_tests.py +13 -12
  133. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/idds_api_tests.py +6 -5
  134. panda_server_source-1.1.0/pandaserver/api/v1/tests/job_api_tests.py +335 -0
  135. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/pilot_api_tests.py +6 -8
  136. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/statistics_api_tests.py +11 -10
  137. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/system_api_tests.py +9 -8
  138. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/task_api_tests.py +46 -31
  139. panda_server_source-1.1.0/pandaserver/api/v1/workflow_api.py +521 -0
  140. panda_server_source-1.1.0/pandaserver/asyncprocess/__init__.py +8 -0
  141. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/asyncprocess/data_carousel_handlers.py +25 -9
  142. panda_server_source-1.1.0/pandaserver/asyncprocess/db_read/compose.py +148 -0
  143. panda_server_source-1.1.0/pandaserver/asyncprocess/db_read/request_shape.py +542 -0
  144. panda_server_source-1.1.0/pandaserver/asyncprocess/db_read/schema_info.py +299 -0
  145. panda_server_source-1.1.0/pandaserver/asyncprocess/db_read/tables.py +69 -0
  146. panda_server_source-1.1.0/pandaserver/asyncprocess/db_read_handlers.py +463 -0
  147. panda_server_source-1.1.0/pandaserver/asyncprocess/processor.py +656 -0
  148. {panda_server_source-1.0.4/pandaserver/brokerage → panda_server_source-1.1.0/pandaserver/asyncprocess/tests}/__init__.py +0 -0
  149. panda_server_source-1.1.0/pandaserver/asyncprocess/tests/db_read_handlers_tests.py +386 -0
  150. panda_server_source-1.1.0/pandaserver/asyncprocess/tests/db_read_tests.py +534 -0
  151. panda_server_source-1.1.0/pandaserver/asyncprocess/tests/grep_tests.py +409 -0
  152. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/brokerage/SiteMapper.py +58 -33
  153. {panda_server_source-1.0.4/pandaserver/config → panda_server_source-1.1.0/pandaserver/brokerage}/__init__.py +0 -0
  154. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/config/config_utils.py +2 -1
  155. panda_server_source-1.1.0/pandaserver/config/daemon_config.py +81 -0
  156. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/config/mcp_config.py +17 -1
  157. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/config/panda_config.py +132 -6
  158. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/configurator/Carbon.py +6 -3
  159. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/configurator/Configurator.py +66 -30
  160. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/configurator/aux.py +5 -2
  161. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/master.py +7 -5
  162. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/master_systemd.py +5 -4
  163. {panda_server_source-1.0.4/pandaserver/dataservice → panda_server_source-1.1.0/pandaserver/daemons/scripts}/__init__.py +0 -0
  164. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/add_main.py +9 -8
  165. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/add_sub.py +8 -9
  166. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/async_request_daemon.py +4 -2
  167. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/cache_pilots.py +4 -2
  168. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/cache_schedconfig.py +19 -16
  169. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/carbon.py +5 -2
  170. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/configurator.py +5 -2
  171. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/copyArchive.py +36 -35
  172. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/datasetManager.py +65 -52
  173. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/dummy_test.py +2 -2
  174. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/evpPD2P.py +12 -10
  175. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/hs_scrapers.py +13 -11
  176. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/metric_collector.py +63 -47
  177. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/panda_activeusers_query.py +6 -3
  178. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/pilotStreaming.py +5 -5
  179. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/process_workflow_files_daemon.py +10 -9
  180. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/recover_lost_files_daemon.py +10 -10
  181. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/task_evaluator.py +28 -20
  182. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/tmpwatch.py +5 -4
  183. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/worker_synchronization.py +6 -6
  184. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/utils.py +108 -55
  185. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/DataServiceUtils.py +23 -14
  186. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/RecoverLostFilesCore.py +21 -10
  187. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/activator.py +11 -4
  188. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/adder_atlas_plugin.py +125 -85
  189. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/adder_dummy_plugin.py +7 -2
  190. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/adder_gen.py +76 -51
  191. panda_server_source-1.1.0/pandaserver/dataservice/adder_plugin_base.py +48 -0
  192. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/adder_result.py +13 -9
  193. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/adder_simple_plugin.py +18 -13
  194. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/closer.py +22 -15
  195. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/closer_atlas_plugin.py +9 -4
  196. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/ddm.py +191 -123
  197. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/ddm_handler.py +11 -3
  198. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/dyn_data_distributer.py +60 -45
  199. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/event_lookup_client_ei.py +13 -8
  200. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/event_picker.py +24 -10
  201. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/finisher.py +37 -25
  202. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/setupper.py +21 -14
  203. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/setupper_atlas_plugin.py +393 -122
  204. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/setupper_dummy_plugin.py +14 -4
  205. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/setupper_plugin_base.py +23 -5
  206. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/jobdispatcher/DispatcherUtils.py +2 -2
  207. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/jobdispatcher/Protocol.py +33 -18
  208. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/jobdispatcher/Watcher.py +28 -10
  209. {panda_server_source-1.0.4/pandaserver/pandamcp → panda_server_source-1.1.0/pandaserver/jobdispatcher}/__init__.py +0 -0
  210. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/client_utils/get_panda_token.py +4 -3
  211. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/client_utils/panda_mcp_proxy.py +22 -18
  212. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/mcp_test_client.py +5 -5
  213. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/mcp_utils.py +12 -5
  214. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/proxycache/panda_proxy_cache.py +32 -28
  215. panda_server_source-1.1.0/pandaserver/proxycache/token_cache.py +274 -0
  216. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/server/panda.py +38 -22
  217. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/CoreUtils.py +121 -52
  218. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/MailUtils.py +10 -9
  219. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/exceptions.py +10 -0
  220. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/hardware_matching.py +11 -8
  221. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/oidc_utils.py +23 -13
  222. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/panda_request.py +20 -8
  223. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/srv_msg_utils.py +6 -5
  224. {panda_server_source-1.0.4/pandaserver/taskbuffer → panda_server_source-1.1.0/pandaserver/srvcore/tests}/__init__.py +0 -0
  225. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/tests/hardware_matching_tests.py +17 -20
  226. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/ConBridge.py +36 -25
  227. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/DBProxyPool.py +25 -15
  228. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/DataCarousel.py +438 -153
  229. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/DatasetSpec.py +44 -22
  230. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/DdmSpec.py +22 -18
  231. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/EventServiceUtils.py +48 -39
  232. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/FileSpec.py +73 -36
  233. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/GlobalShares.py +49 -33
  234. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/HarvesterMetricsSpec.py +27 -15
  235. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/Initializer.py +2 -2
  236. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/InputChunk.py +182 -118
  237. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JediCacheSpec.py +8 -6
  238. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JediDatasetSpec.py +141 -96
  239. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JediFileSpec.py +68 -23
  240. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JediTaskSpec.py +361 -249
  241. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JobSpec.py +263 -129
  242. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JobUtils.py +67 -26
  243. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/NucleusSpec.py +40 -25
  244. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/OraDBProxy.py +70 -23
  245. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/PanDAMsgProcessor.py +0 -2
  246. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/PandaDBSchemaInfo.py +1 -1
  247. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/PickleFileSpec.py +7 -3
  248. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/PickleJobSpec.py +6 -3
  249. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/PrioUtil.py +4 -3
  250. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/ProcessGroups.py +13 -11
  251. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/ResourceSpec.py +39 -18
  252. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/SQLDumper.py +12 -7
  253. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/SQLManager.py +18 -14
  254. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/SiteSpec.py +121 -35
  255. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/TaskBuffer.py +661 -562
  256. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/TaskBufferInterface.py +27 -15
  257. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/WorkQueue.py +40 -26
  258. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/WorkQueueMapper.py +30 -24
  259. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/WorkerSpec.py +56 -16
  260. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/WrappedCursor.py +50 -32
  261. panda_server_source-1.1.0/pandaserver/taskbuffer/WrappedPostgresConn.py +31 -0
  262. {panda_server_source-1.0.4/pandaserver/test → panda_server_source-1.1.0/pandaserver/taskbuffer}/__init__.py +0 -0
  263. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/data_carousel_ops.py +17 -12
  264. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/async_request_module.py +23 -25
  265. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/base_module.py +279 -73
  266. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +61 -70
  267. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/entity_module.py +234 -190
  268. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +361 -304
  269. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +260 -301
  270. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +98 -41
  271. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +325 -228
  272. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +465 -416
  273. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +302 -192
  274. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +301 -219
  275. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +211 -113
  276. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/worker_module.py +94 -99
  277. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +294 -82
  278. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/offline_run_script.py +4 -9
  279. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/retryModule.py +63 -45
  280. panda_server_source-1.1.0/pandaserver/taskbuffer/spec_column.py +43 -0
  281. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/task_split_rules.py +11 -7
  282. panda_server_source-1.1.0/pandaserver/taskbuffer/tests/container_image_dispatch_tests.py +54 -0
  283. panda_server_source-1.1.0/pandaserver/taskbuffer/tests/db_connection_tests.py +142 -0
  284. panda_server_source-1.1.0/pandaserver/taskbuffer/tests/key_reads_tests.py +148 -0
  285. panda_server_source-1.1.0/pandaserver/taskbuffer/tests/wrapped_conn_tests.py +55 -0
  286. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/workflow_processor.py +30 -21
  287. panda_server_source-1.1.0/pandaserver/taskbuffer/wrapped_oracle_conn.py +25 -0
  288. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/boostUser.py +3 -2
  289. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/callbackDDM.py +2 -0
  290. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/daod_on_demand.py +2 -1
  291. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/finishJob.py +36 -31
  292. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/getJobs.py +11 -9
  293. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killJob.py +1 -1
  294. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killJobLowPrio.py +3 -2
  295. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killJobsInTask.py +1 -1
  296. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killTask.py +1 -1
  297. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/lsst/lsstSubmitPhosim332.py +0 -1
  298. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/reassignJobs.py +1 -1
  299. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/reassignSite.py +4 -4
  300. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/reassignTask.py +4 -3
  301. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/reassignWaiting.py +1 -1
  302. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testEvgen.py +1 -0
  303. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testG4sim.py +1 -0
  304. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testG4sim17.py +1 -1
  305. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testGlobalShares.py +4 -2
  306. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testReco.py +1 -0
  307. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testSimulReco14.py +3 -1
  308. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testSiteMap.py +1 -3
  309. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/userinterface/Client.py +53 -48
  310. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/userinterface/UserIF.py +62 -48
  311. panda_server_source-1.1.0/pandaserver/userinterface/__init__.py +0 -0
  312. panda_server_source-1.1.0/pandaserver/workflow/__init__.py +0 -0
  313. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/data_handler_plugins/base_data_handler.py +15 -12
  314. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +9 -13
  315. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +35 -14
  316. panda_server_source-1.1.0/pandaserver/workflow/examples/production_chain_as_test_wfd.json +887 -0
  317. panda_server_source-1.1.0/pandaserver/workflow/examples/production_chain_as_user_wfd.json +887 -0
  318. panda_server_source-1.1.0/pandaserver/workflow/examples/production_chain_example.txt +1138 -0
  319. panda_server_source-1.1.0/pandaserver/workflow/examples/production_chain_wfd.json +932 -0
  320. panda_server_source-1.1.0/pandaserver/workflow/examples/toy_production_chain_wfd.json +896 -0
  321. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/pcwl_test.py +8 -6
  322. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/pcwl_utils.py +51 -23
  323. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/psnakemake_test.py +5 -5
  324. panda_server_source-1.1.0/pandaserver/workflow/snakeparser/__init__.py +8 -0
  325. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/snakeparser/extensions.py +18 -12
  326. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/snakeparser/log.py +6 -5
  327. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/snakeparser/parser.py +36 -23
  328. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/snakeparser/utils.py +7 -4
  329. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/step_handler_plugins/base_step_handler.py +11 -12
  330. panda_server_source-1.1.0/pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +666 -0
  331. panda_server_source-1.1.0/pandaserver/workflow/tests/README.md +20 -0
  332. panda_server_source-1.1.0/pandaserver/workflow/tests/data_handler_test.py +231 -0
  333. panda_server_source-1.1.0/pandaserver/workflow/tests/insert_step_task_test.py +265 -0
  334. panda_server_source-1.1.0/pandaserver/workflow/tests/no_legacy_dependency_test.py +161 -0
  335. panda_server_source-1.1.0/pandaserver/workflow/tests/parse_task_steps_test.py +275 -0
  336. panda_server_source-1.1.0/pandaserver/workflow/tests/placeholder_resolution_test.py +178 -0
  337. panda_server_source-1.1.0/pandaserver/workflow/tests/regression_diff_test.py +236 -0
  338. panda_server_source-1.1.0/pandaserver/workflow/tests/step_relations_test.py +585 -0
  339. panda_server_source-1.1.0/pandaserver/workflow/tests/step_submission_test.py +692 -0
  340. panda_server_source-1.1.0/pandaserver/workflow/tests/submit_endpoint_test.py +433 -0
  341. panda_server_source-1.1.0/pandaserver/workflow/tests/taskbuffer_interface_test.py +95 -0
  342. panda_server_source-1.1.0/pandaserver/workflow/tests/workflow_done_transition_test.py +682 -0
  343. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/workflow_base.py +198 -33
  344. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/workflow_core.py +840 -123
  345. panda_server_source-1.1.0/pandaserver/workflow/workflow_core_smoketest.py +286 -0
  346. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/workflow_native_utils.py +522 -105
  347. panda_server_source-1.1.0/pandaserver/workflow/workflow_parser.py +370 -0
  348. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/workflow_utils.py +95 -50
  349. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/panda_server.cfg.rpmnew.template +17 -1
  350. panda_server_source-1.0.4/.pre-commit-config.yaml +0 -19
  351. panda_server_source-1.0.4/PandaPkgInfo.py +0 -1
  352. panda_server_source-1.0.4/pandajedi/jedibrokerage/JobBrokerBase.py +0 -133
  353. panda_server_source-1.0.4/pandajedi/jedibrokerage/TaskBrokerBase.py +0 -15
  354. panda_server_source-1.0.4/pandajedi/jediconfig/jedi_config.py +0 -40
  355. panda_server_source-1.0.4/pandajedi/jedicore/JediDBProxy.py +0 -56
  356. panda_server_source-1.0.4/pandajedi/jedicore/JediDBProxyPool.py +0 -37
  357. panda_server_source-1.0.4/pandajedi/jedicore/JediTaskBufferInterface.py +0 -50
  358. panda_server_source-1.0.4/pandajedi/jedicore/SiteCandidate.py +0 -90
  359. panda_server_source-1.0.4/pandajedi/jedidog/WatchDogBase.py +0 -53
  360. panda_server_source-1.0.4/pandajedi/jedigen/TaskGeneratorBase.py +0 -15
  361. panda_server_source-1.0.4/pandajedi/jediorder/JediDaemon.py +0 -27
  362. panda_server_source-1.0.4/pandajedi/jediorder/JediKnight.py +0 -55
  363. panda_server_source-1.0.4/pandajedi/jediorder/JobBroker.py +0 -33
  364. panda_server_source-1.0.4/pandajedi/jediorder/JobThrottler.py +0 -28
  365. panda_server_source-1.0.4/pandajedi/jediorder/TaskGenerator.py +0 -17
  366. panda_server_source-1.0.4/pandajedi/jediorder/TaskSetupper.py +0 -17
  367. panda_server_source-1.0.4/pandajedi/jedisetup/GenTaskSetupper.py +0 -16
  368. panda_server_source-1.0.4/pandajedi/jedisetup/TaskSetupperBase.py +0 -15
  369. panda_server_source-1.0.4/pandajedi/jeditest/resubmitTaskParam.py +0 -20
  370. panda_server_source-1.0.4/pandaserver/api/v1/async_process_api.py +0 -401
  371. panda_server_source-1.0.4/pandaserver/api/v1/job_api.py +0 -464
  372. panda_server_source-1.0.4/pandaserver/api/v1/tests/async_process_api_tests.py +0 -369
  373. panda_server_source-1.0.4/pandaserver/api/v1/tests/job_api_tests.py +0 -112
  374. panda_server_source-1.0.4/pandaserver/api/v1/workflow_api.py +0 -136
  375. panda_server_source-1.0.4/pandaserver/asyncprocess/processor.py +0 -272
  376. panda_server_source-1.0.4/pandaserver/brokerage/broker.py +0 -272
  377. panda_server_source-1.0.4/pandaserver/config/daemon_config.py +0 -29
  378. panda_server_source-1.0.4/pandaserver/dataservice/adder_plugin_base.py +0 -27
  379. panda_server_source-1.0.4/pandaserver/proxycache/token_cache.py +0 -141
  380. panda_server_source-1.0.4/pandaserver/taskbuffer/ParseJobXML.py +0 -350
  381. panda_server_source-1.0.4/pandaserver/taskbuffer/WrappedPostgresConn.py +0 -24
  382. panda_server_source-1.0.4/pandaserver/taskbuffer/wrapped_oracle_conn.py +0 -18
  383. panda_server_source-1.0.4/pandaserver/workflow/snakeparser/__init__.py +0 -3
  384. panda_server_source-1.0.4/pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +0 -282
  385. panda_server_source-1.0.4/pandaserver/workflow/workflow_core_smoketest.py +0 -388
  386. panda_server_source-1.0.4/pandaserver/workflow/workflow_parser.py +0 -326
  387. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/.gitignore +0 -0
  388. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/Dockerfile +0 -0
  389. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/Dockerfile.base +0 -0
  390. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/LICENSE.txt +0 -0
  391. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/README.md +0 -0
  392. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/__init__.py +0 -0
  393. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/__init__.py +0 -0
  394. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediconfig/__init__.py +0 -0
  395. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/__init__.py +0 -0
  396. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediddm/__init__.py +0 -0
  397. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/__init__.py +0 -0
  398. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediexec/reniceJEDI.py +0 -0
  399. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedigen/__init__.py +0 -0
  400. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/__init__.py +0 -0
  401. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +0 -0
  402. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/__init__.py +0 -0
  403. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/MailTemplates.py +0 -0
  404. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/__init__.py +0 -0
  405. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/__init__.py +0 -0
  406. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedisetup/__init__.py +0 -0
  407. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/SchemaChecker.py +0 -0
  408. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/contentsFeederTest.py +0 -0
  409. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/contentsFeederTestWithTask.py +0 -0
  410. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/ddmTest.py +0 -0
  411. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/jobThrottlerTest.py +0 -0
  412. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/msgProcessorTest.py +0 -0
  413. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/postProcessorTest.py +0 -0
  414. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/taskBrokerTest.py +0 -0
  415. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/taskBufferTest.py +0 -0
  416. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/taskRefinerTest.py +0 -0
  417. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/watchDogTest.py +0 -0
  418. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedithrottle/__init__.py +0 -0
  419. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/__init__.py +0 -0
  420. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/__init__.py +0 -0
  421. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/__init__.py +0 -0
  422. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/__init__.py +0 -0
  423. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/version.py +0 -0
  424. {panda_server_source-1.0.4/pandaserver/asyncprocess → panda_server_source-1.1.0/pandaserver/asyncprocess/db_read}/__init__.py +0 -0
  425. {panda_server_source-1.0.4/pandaserver/configurator → panda_server_source-1.1.0/pandaserver/config}/__init__.py +0 -0
  426. {panda_server_source-1.0.4/pandaserver/daemons → panda_server_source-1.1.0/pandaserver/configurator}/__init__.py +0 -0
  427. {panda_server_source-1.0.4/pandaserver/daemons/scripts → panda_server_source-1.1.0/pandaserver/daemons}/__init__.py +0 -0
  428. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/ErrorCode.py +0 -0
  429. {panda_server_source-1.0.4/pandaserver/jobdispatcher → panda_server_source-1.1.0/pandaserver/dataservice}/__init__.py +0 -0
  430. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/jobdispatcher/ErrorCode.py +0 -0
  431. {panda_server_source-1.0.4/pandaserver/proxycache → panda_server_source-1.1.0/pandaserver/pandamcp}/__init__.py +0 -0
  432. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/client_utils/get_panda_token.sh +0 -0
  433. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/client_utils/panda_mcp_wrapper.sh +0 -0
  434. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/mcp_main.py +0 -0
  435. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/panda_mcp_endpoints.json +0 -0
  436. {panda_server_source-1.0.4/pandaserver/srvcore → panda_server_source-1.1.0/pandaserver/proxycache}/__init__.py +0 -0
  437. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/server/.gacl +0 -0
  438. {panda_server_source-1.0.4/pandaserver/srvcore/tests → panda_server_source-1.1.0/pandaserver/srvcore}/__init__.py +0 -0
  439. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/allowed_methods.py +0 -0
  440. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/ErrorCode.py +0 -0
  441. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/SupErrors.py +0 -0
  442. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
  443. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/__init__.py +0 -0
  444. {panda_server_source-1.0.4/pandaserver/userinterface → panda_server_source-1.1.0/pandaserver/taskbuffer/tests}/__init__.py +0 -0
  445. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/SchemaChecker.py +0 -0
  446. {panda_server_source-1.0.4/pandaserver/workflow → panda_server_source-1.1.0/pandaserver/test}/__init__.py +0 -0
  447. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/banUser.py +0 -0
  448. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/boostPrio.py +0 -0
  449. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/finishTaskJEDI.py +0 -0
  450. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killTaskJEDI.py +0 -0
  451. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killUser.py +0 -0
  452. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/lsst/README.txt +0 -0
  453. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/lsst/lsstSubmit.py +0 -0
  454. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/lsst/lsstSubmitMERGEtest.py +0 -0
  455. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +0 -0
  456. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/recoverLostFiles.py +0 -0
  457. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/reloadInputDS.py +0 -0
  458. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/sendCommandToJob.py +0 -0
  459. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/setDebugMode.py +0 -0
  460. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/setPriority.py +0 -0
  461. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testEvgen17.py +0 -0
  462. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testUpdateWorkerPilotStatus.py +0 -0
  463. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/examples/multistep_merge_wfd.yaml +0 -0
  464. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/examples/nested_workflow_inline_sig_bg_comb_wfd.yaml +6 -6
  465. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/examples/nested_workflow_sig_bg_comb_wfd.yaml +0 -0
  466. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/examples/scatter_sig_bg_comb_wfd.yaml +0 -0
  467. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/examples/signal_background_combine_wfd.yaml +6 -6
  468. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/psnakemake_container.json +0 -0
  469. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/psnakemake_task.json +0 -0
  470. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/snakeparser/names.py +0 -0
  471. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pyproject-source.toml +0 -0
  472. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pyproject.toml +0 -0
  473. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/bin/panda_jedi-reniceJEDI.exe.template +0 -0
  474. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/bin/panda_server-makeSlsXml.exe.template +0 -0
  475. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/bin/panda_server-vomsrenew.exe.template +0 -0
  476. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/init.d/panda_daemon.exe.template +0 -0
  477. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/init.d/panda_httpd.exe.template +0 -0
  478. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/init.d/panda_jedi.exe.template +0 -0
  479. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/init.d/panda_mcp.exe.template +0 -0
  480. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/init.d/panda_server.exe.template +0 -0
  481. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/logrotate.d/panda_jedi.template +0 -0
  482. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/logrotate.d/panda_server.logrotate.template +0 -0
  483. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/panda_jedi.cfg.rpmnew.template +0 -0
  484. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/panda_jedi.cron.template +0 -0
  485. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/panda_server-httpd.conf.rpmnew.template +0 -0
  486. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_jedi.sysconfig_for_systemd.template +0 -0
  487. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_jedi.template +0 -0
  488. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_jedi_env.template +0 -0
  489. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_server.sysconfig.rpmnew.template +0 -0
  490. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_server.sysconfig_for_systemd.template +0 -0
  491. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_server_env.systemd.rpmnew.template +0 -0
  492. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/systemd/panda.service.template +0 -0
  493. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/systemd/panda_daemon.service.template +0 -0
  494. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/systemd/panda_httpd.service.template +0 -0
  495. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/systemd/panda_jedi.service.template +0 -0
  496. {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/systemd/panda_mcp.service.template +0 -0
@@ -0,0 +1,73 @@
1
+ repos:
2
+
3
+ # What is checked, and at which version, is defined here rather than in the CI workflow,
4
+ # so that `pre-commit run --all-files` gives a contributor the same answer CI will.
5
+ # Do not add a check to CI without adding it here.
6
+
7
+ # ruff stands in for black, isort and flynt as well as being the linter: one pin instead
8
+ # of three, and one tool to reason about. Its formatter targets black's style but is not
9
+ # byte-identical to it, which is why the switch came with a one-time reformat of the tree.
10
+ #
11
+ # The rules and the line length live in [tool.ruff] in pyproject.toml, so --isolated is
12
+ # deliberately absent here and a developer running ruff by hand gets the same answer.
13
+ - repo: https://github.com/astral-sh/ruff-pre-commit
14
+ rev: v0.16.9
15
+ hooks:
16
+ # The whole tree, not just the staged files: the scan takes hundredths of a second,
17
+ # and a name can be broken by an edit somewhere else -- a renamed import, a deleted
18
+ # helper, a moved class.
19
+ - id: ruff-check
20
+ args: [--fix, .]
21
+ pass_filenames: false
22
+ - id: ruff-format
23
+
24
+ - repo: https://github.com/pre-commit/mirrors-mypy
25
+ rev: v2.3.1
26
+ hooks:
27
+ # The tree is clean under the flags in [tool.mypy], so the gate is mypy itself: any
28
+ # finding fails the hook. Do not swap it for a count -- annotating a function turns on
29
+ # checking of its whole body, so improving annotations can raise the number before it
30
+ # lowers it. With zero as the bar that goes away.
31
+ #
32
+ # args is emptied because this mirror otherwise passes --ignore-missing-imports and
33
+ # --scripts-are-modules, which would override pyproject.toml. pass_filenames is off
34
+ # for the same reason: handing mypy the staged files would both miss files that an
35
+ # edit elsewhere breaks and change which flags apply.
36
+ #
37
+ # mypy and the stubs are pinned together: the stubs are part of what the run sees, so
38
+ # an unpinned upgrade would produce findings without a code change. When upgrading
39
+ # either, fix what the new version reports in the same PR.
40
+ #
41
+ # panda-common is deliberately absent. It ships py.typed, so installing it changes
42
+ # what mypy resolves, and this hook is the gate.
43
+ - id: mypy
44
+ args: []
45
+ additional_dependencies:
46
+ - types-requests==2.33.0.20260906
47
+ - types-PyYAML==6.0.12.20260906
48
+ pass_filenames: false
49
+
50
+ - repo: local
51
+ hooks:
52
+ # None of the hooks above executes a class body, so a class that cannot be created
53
+ # passes all of them and fails at import time instead -- in a daemon, an outage rather
54
+ # than a failed check. The case this tree can actually reach is a class attribute that
55
+ # carries a value while its name is in __slots__, which raises ValueError when the
56
+ # class is built. Annotating the spec classes is exactly the work that invites it,
57
+ # since the obvious way to write one is `status: str = ""`.
58
+ #
59
+ # These four are the spec classes that assign __slots__ and import without a config
60
+ # file. The fifth, daemons/utils.py's DaemonWorker, is left out on purpose: it pulls in
61
+ # pandaserver.config.panda_config, which reads panda_server.cfg at import time and does
62
+ # not swallow the failure, so covering it would mean shipping a config.
63
+ #
64
+ # panda-common carries no version here: the hook only needs it to be importable, and
65
+ # the bound belongs in pyproject.toml alone. This hook gets its own environment, so
66
+ # installing panda-common here does not reach the mypy hook above.
67
+ - id: slots-import
68
+ name: import the classes that build __slots__
69
+ language: python
70
+ entry: python -c "import pandaserver.taskbuffer.JobSpec, pandaserver.taskbuffer.FileSpec, pandaserver.taskbuffer.WorkerSpec, pandaserver.taskbuffer.HarvesterMetricsSpec"
71
+ additional_dependencies: ['panda-common']
72
+ pass_filenames: false
73
+ always_run: true
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: panda-server-source
3
- Version: 1.0.4
3
+ Version: 1.1.0
4
4
  Summary: Unified PanDA Server and JEDI Package - Source Only
5
5
  Project-URL: Homepage, https://panda-wms.readthedocs.io/en/latest/
6
6
  Author-email: PanDA Team <panda-support@cern.ch>
@@ -0,0 +1 @@
1
+ release_version = "1.1.0"
@@ -105,8 +105,8 @@ def mm_notification():
105
105
  }
106
106
  headers = {"Content-Type": "application/json"}
107
107
  try:
108
- response = requests.post(mm_webhook_url, data=json.dumps(mm_message), headers=headers)
109
- except requests.exceptions.RequestException as e:
108
+ requests.post(mm_webhook_url, data=json.dumps(mm_message), headers=headers)
109
+ except requests.exceptions.RequestException:
110
110
  pass
111
111
 
112
112
 
@@ -3,18 +3,21 @@ import datetime
3
3
  import math
4
4
  import random
5
5
  import re
6
- import sys
7
6
  import traceback
7
+ from typing import Any
8
8
 
9
9
  from pandacommon.pandalogger.PandaLogger import PandaLogger
10
10
  from pandacommon.pandautils.PandaUtils import naive_utcnow
11
11
 
12
12
  from pandajedi.jedicore import Interaction
13
+ from pandajedi.jedicore.JediTaskBufferInterface import JediTaskBufferInterface
13
14
  from pandajedi.jedicore.MsgWrapper import MsgWrapper
14
15
  from pandajedi.jedicore.SiteCandidate import SiteCandidate
15
16
  from pandaserver.dataservice.DataServiceUtils import select_scope
16
17
  from pandaserver.srvcore import CoreUtils
17
18
  from pandaserver.taskbuffer import JobUtils
19
+ from pandaserver.taskbuffer.InputChunk import InputChunk
20
+ from pandaserver.taskbuffer.JediTaskSpec import JediTaskSpec
18
21
 
19
22
  from . import AtlasBrokerUtils
20
23
  from .JobBrokerBase import JobBrokerBase
@@ -30,9 +33,9 @@ VO = "atlas"
30
33
  # brokerage for ATLAS analysis
31
34
  class AtlasAnalJobBroker(JobBrokerBase):
32
35
  # constructor
33
- def __init__(self, ddmIF, taskBufferIF):
36
+ def __init__(self, ddmIF: Interaction.CommandSendInterface, taskBufferIF: JediTaskBufferInterface) -> None:
34
37
  JobBrokerBase.__init__(self, ddmIF, taskBufferIF)
35
- self.dataSiteMap = {}
38
+ self.dataSiteMap: dict[str, Any] = {}
36
39
 
37
40
  # load the SW availability map
38
41
  try:
@@ -56,7 +59,9 @@ class AtlasAnalJobBroker(JobBrokerBase):
56
59
  self.wn_gpu_map = {}
57
60
 
58
61
  # main
59
- def doBrokerage(self, taskSpec, cloudName, inputChunk, taskParamMap):
62
+ def doBrokerage(
63
+ self, taskSpec: JediTaskSpec, cloudName: str | None, inputChunk: InputChunk, taskParamMap: dict[str, Any] | None
64
+ ) -> tuple[Interaction.StatusCode, InputChunk]:
60
65
  # make logger
61
66
  if inputChunk.masterDataset:
62
67
  msg_tag = f"<jediTaskID={taskSpec.jediTaskID} datasetID={inputChunk.masterDataset.datasetID}>"
@@ -70,6 +75,20 @@ class AtlasAnalJobBroker(JobBrokerBase):
70
75
  # return when the task is only waiting for something it cannot control, so that
71
76
  # it is not penalized with the pending timeout while it waits
72
77
  retWaiting = self.SC_WAITING, inputChunk
78
+ # doBrokerage returns either one of the error tuples above or None. Declared
79
+ # without a value, which binds nothing at runtime, so that the first assignment
80
+ # further down does not fix retVal to the tuple type alone.
81
+ retVal: tuple[Interaction.StatusCode, Any] | None
82
+ # the brokerage arithmetic below cannot run on a NULL column; a task read from the DB
83
+ # always carries these, so one that does not is reported rather than crashing mid-scan
84
+ if taskSpec.currentPriority is None or taskSpec.cpuEfficiency is None or taskSpec.prodSourceLabel is None or taskSpec.taskPriority is None:
85
+ tmpLog.error(
86
+ f"cannot broker with currentPriority={taskSpec.currentPriority} cpuEfficiency={taskSpec.cpuEfficiency} "
87
+ f"prodSourceLabel={taskSpec.prodSourceLabel} taskPriority={taskSpec.taskPriority}"
88
+ )
89
+ return retTmpError
90
+ # a NULL baseWalltime is no offset, as everywhere else it is read
91
+ baseWalltime = taskSpec.baseWalltime if taskSpec.baseWalltime is not None else 0
73
92
  # new maxwdir
74
93
  newMaxwdir = {}
75
94
  # get primary site candidates
@@ -79,7 +98,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
79
98
  includeList = None
80
99
  scanSiteList = []
81
100
  # problematic sites
82
- problematic_sites_dict = {}
101
+ problematic_sites_dict: dict[str, Any] = {}
83
102
  # not to use VP replicas for merging, scouts, and forceStaged
84
103
  if inputChunk.isMerging or taskSpec.avoid_vp() or taskSpec.useScout() or taskSpec.useLocalIO():
85
104
  useVP = False
@@ -92,8 +111,10 @@ class AtlasAnalJobBroker(JobBrokerBase):
92
111
  # get workQueue
93
112
  workQueue = self.taskBufferIF.getWorkQueueMap().getQueueWithIDGshare(taskSpec.workQueue_ID, taskSpec.gshare)
94
113
 
95
- # site limitation
96
- if taskSpec.useLimitedSites():
114
+ # site limitation. JobGenerator fills taskParamMap in exactly when the task uses
115
+ # limited sites and leaves it None otherwise, so this branch is the only place
116
+ # here that may read it
117
+ if taskSpec.useLimitedSites() and taskParamMap is not None:
97
118
  if "excludedSite" in taskParamMap:
98
119
  excludeList = taskParamMap["excludedSite"]
99
120
  # str to list for task retry
@@ -106,13 +127,16 @@ class AtlasAnalJobBroker(JobBrokerBase):
106
127
  includeList = taskParamMap["includedSite"]
107
128
  # str to list for task retry
108
129
  if includeList == "":
130
+ # nothing was pre-assigned. The split below cannot run on None, and
131
+ # the AttributeError it raised into the handler was doing this check
109
132
  includeList = None
110
- try:
111
- if not isinstance(includeList, list):
112
- includeList = includeList.split(",")
113
- siteListPreAssigned = True
114
- except Exception:
115
- pass
133
+ else:
134
+ try:
135
+ if not isinstance(includeList, list):
136
+ includeList = includeList.split(",")
137
+ siteListPreAssigned = True
138
+ except Exception:
139
+ pass
116
140
  # loop over all sites
117
141
  for siteName, tmpSiteSpec in self.siteMapper.siteSpecList.items():
118
142
  if tmpSiteSpec.type == "analysis" or tmpSiteSpec.is_grandly_unified():
@@ -356,7 +380,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
356
380
 
357
381
  # cannot get local quota
358
382
  if not local_quota_ok:
359
- tmpLog.error(f"failed to check local quota")
383
+ tmpLog.error("failed to check local quota")
360
384
  taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
361
385
  return retTmpError
362
386
 
@@ -375,7 +399,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
375
399
  loc_check_timeout_val = self.taskBufferIF.getConfigValue(ANALYSIS_COMPONENT, loc_check_timeout_key, "jedi", taskSpec.vo)
376
400
 
377
401
  # check input datasets
378
- element_map = dict()
402
+ element_map: dict[str, Any] = dict()
379
403
  ddsList = set()
380
404
  complete_disk_ok = {}
381
405
  complete_tape_ok = {}
@@ -417,6 +441,11 @@ class AtlasAnalJobBroker(JobBrokerBase):
417
441
  tmpLog.error(f"fatal error when getting the list of sites where data is available, since {tmpRet}")
418
442
  taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
419
443
  return retFatal
444
+ if not isinstance(tmpRet, dict):
445
+ # only the error paths handled above return a message in its place
446
+ tmpLog.error(f"failed to get the list of sites where data is available, since {tmpRet}")
447
+ taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
448
+ return retTmpError
420
449
  # append
421
450
  self.dataSiteMap[datasetName] = tmpRet
422
451
  complete_disk_ok[datasetName] = tmp_complete_disk_ok
@@ -520,10 +549,10 @@ class AtlasAnalJobBroker(JobBrokerBase):
520
549
 
521
550
  retVal = None
522
551
  checkDataLocality = False
523
- scanSiteWoVP = []
524
- summaryList = []
525
- site_list_with_data = None
526
- overall_site_list = set()
552
+ scanSiteWoVP: list[Any] = []
553
+ # the sites that had the data in the first loop pass, kept for the ranking below
554
+ site_list_with_data: set[str] = set()
555
+ overall_site_list: set[str] = set()
527
556
  for i_loop, (scanSiteList, checkDataLocality) in enumerate(scan_site_list_loops):
528
557
  useUnionLocality = False
529
558
  self.init_summary_list("Job brokerage summary", f"data locality check: {checkDataLocality}", self.get_unified_sites(scanSiteList))
@@ -534,8 +563,8 @@ class AtlasAnalJobBroker(JobBrokerBase):
534
563
  ######################################
535
564
  # selection for data availability
536
565
  hasDDS = False
537
- dataWeight = {}
538
- remoteSourceList = {}
566
+ dataWeight: dict[str, Any] = {}
567
+ remoteSourceList: dict[str, Any] = {}
539
568
  sites_in_nucleus = []
540
569
  for datasetSpec in inputChunk.getDatasets():
541
570
  datasetSpec.reset_distributed()
@@ -552,12 +581,15 @@ class AtlasAnalJobBroker(JobBrokerBase):
552
581
  if datasetName in ddsList:
553
582
  datasetSpec.setDistributed()
554
583
 
555
- # get the list of sites where data is available
556
- scanSiteList = None
557
- scanSiteListOnDisk = None
558
- scanSiteListUnion = None
559
- scanSiteListOnDiskUnion = None
560
- scanSiteWoVpUnion = None
584
+ # get the list of sites where data is available. The first dataset seeds
585
+ # the lists and the rest intersect with them, which is what the flag marks;
586
+ # with no dataset at all they stay empty and the checks below find nothing
587
+ scanSiteList = []
588
+ scanSiteListOnDisk: set[str] = set()
589
+ scanSiteListUnion: set[str] = set()
590
+ scanSiteListOnDiskUnion: set[str] = set()
591
+ scanSiteWoVpUnion: set[str] = set()
592
+ is_first_dataset = True
561
593
 
562
594
  for datasetName, tmpDataSite in self.dataSiteMap.items():
563
595
  # check if incomplete replica is allowed
@@ -582,7 +614,8 @@ class AtlasAnalJobBroker(JobBrokerBase):
582
614
  dataWeight[tmpSiteName] += 0.001
583
615
 
584
616
  # first list
585
- if scanSiteList is None:
617
+ if is_first_dataset:
618
+ is_first_dataset = False
586
619
  scanSiteList = []
587
620
  for tmpSiteName in tmpSiteList:
588
621
  if tmpSiteName not in oldScanUnifiedSiteList:
@@ -736,7 +769,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
736
769
  diskio_limit_tmp = max_diskio_per_core_default
737
770
 
738
771
  # normalize task diskIO by site corecount
739
- diskio_task_tmp = taskSpec.diskIO
772
+ diskio_task_tmp: float | None = taskSpec.diskIO
740
773
  if taskSpec.diskIO is not None and taskSpec.coreCount not in [None, 0, 1] and tmp_site_spec.coreCount not in [None, 0]:
741
774
  diskio_task_tmp = taskSpec.diskIO / tmp_site_spec.coreCount
742
775
 
@@ -771,20 +804,28 @@ class AtlasAnalJobBroker(JobBrokerBase):
771
804
 
772
805
  ######################################
773
806
  # selection with IO intensity
774
- if taskSpec.ioIntensity and not inputChunk.isMerging:
807
+ if not inputChunk.isMerging:
775
808
  newScanSiteList = []
776
809
  oldScanSiteList = copy.copy(scanSiteList)
777
810
  msg_map = {}
778
811
  for tmpSiteName in scanSiteList:
779
812
  tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
780
813
  max_io_intensity = tmpSiteSpec.get_max_io_intensity()
781
- if max_io_intensity is None or taskSpec.ioIntensity <= max_io_intensity:
782
- newScanSiteList.append(tmpSiteName)
814
+ if taskSpec.ioIntensity is None:
815
+ if max_io_intensity is None:
816
+ newScanSiteList.append(tmpSiteName)
817
+ else:
818
+ msg_map[tmpSiteSpec.get_unified_name()] = (
819
+ f" skip site={tmpSiteSpec.get_unified_name()} since task ioIntensity is None and site max_io_intensity={max_io_intensity} criteria=-max_io_intensity"
820
+ )
783
821
  else:
784
- msg_map[tmpSiteSpec.get_unified_name()] = (
785
- f" skip site={tmpSiteSpec.get_unified_name()} since ioIntensity={taskSpec.ioIntensity} "
786
- f"is larger than site max_io_intensity={max_io_intensity} criteria=-max_io_intensity"
787
- )
822
+ if max_io_intensity is None or taskSpec.ioIntensity <= max_io_intensity:
823
+ newScanSiteList.append(tmpSiteName)
824
+ else:
825
+ msg_map[tmpSiteSpec.get_unified_name()] = (
826
+ f" skip site={tmpSiteSpec.get_unified_name()} since ioIntensity={taskSpec.ioIntensity} "
827
+ f"is larger than site max_io_intensity={max_io_intensity} criteria=-max_io_intensity"
828
+ )
788
829
  scanSiteList = newScanSiteList
789
830
  self.add_summary_message(oldScanSiteList, scanSiteList, "max IO intensity check", tmpLog, msg_map)
790
831
  if not scanSiteList:
@@ -874,26 +915,6 @@ class AtlasAnalJobBroker(JobBrokerBase):
874
915
  retVal = retTmpError
875
916
  continue
876
917
  ######################################
877
- # selection for closed
878
- if not sitePreAssigned and not inputChunk.isMerging:
879
- oldScanSiteList = copy.copy(scanSiteList)
880
- newScanSiteList = []
881
- msg_map = {}
882
- for tmpSiteName in self.get_unified_sites(scanSiteList):
883
- if tmpSiteName in failureCounts and "closed" in failureCounts[tmpSiteName]:
884
- nClosed = failureCounts[tmpSiteName]["closed"]
885
- if nClosed > 0:
886
- msg_map[tmpSiteName] = f" skip site={tmpSiteName} due to n_closed={nClosed} criteria=-closed"
887
- continue
888
- newScanSiteList.append(tmpSiteName)
889
- scanSiteList = self.get_pseudo_sites(newScanSiteList, scanSiteList)
890
- self.add_summary_message(oldScanSiteList, scanSiteList, "too many closed check", tmpLog, msg_map)
891
- if not scanSiteList:
892
- self.dump_summary(tmpLog)
893
- tmpLog.error("no candidates")
894
- retVal = retTmpError
895
- continue
896
- ######################################
897
918
  # selection for release
898
919
  cmt_config = taskSpec.get_sw_platform()
899
920
  is_regexp_cmt_config = False
@@ -1072,21 +1093,22 @@ class AtlasAnalJobBroker(JobBrokerBase):
1072
1093
  if taskSpec.ramPerCore() and not inputChunk.isMerging:
1073
1094
  if tmpSiteSpec.coreCount not in [None, 0]:
1074
1095
  minRamCount = origMinRamCount * tmpSiteSpec.coreCount
1075
- minRamCount = JobUtils.compensate_ram_count(minRamCount)
1096
+ compensated_min_ram_count = JobUtils.compensate_ram_count(minRamCount)
1097
+ minRamCount = compensated_min_ram_count if compensated_min_ram_count is not None else 0
1076
1098
  # site max memory requirement
1077
- site_maxmemory = 0
1099
+ site_maxmemory: float = 0
1078
1100
  if tmpSiteSpec.maxrss not in [0, None]:
1079
1101
  site_maxmemory = tmpSiteSpec.maxrss
1080
- if site_maxmemory not in [0, None] and minRamCount != 0 and minRamCount > site_maxmemory:
1102
+ if site_maxmemory not in [0, None] and minRamCount and minRamCount > site_maxmemory:
1081
1103
  msg_map[tmpSiteSpec.get_unified_name()] = (
1082
1104
  f" skip site={tmpSiteSpec.get_unified_name()} due to insufficient RAM less than job's core-scaled requirement {minRamCount} MB criteria=-lowmemory"
1083
1105
  )
1084
1106
  continue
1085
1107
  # site min memory requirement
1086
- site_minmemory = 0
1108
+ site_minmemory: float = 0
1087
1109
  if tmpSiteSpec.minrss not in [0, None]:
1088
1110
  site_minmemory = tmpSiteSpec.minrss
1089
- if site_minmemory not in [0, None] and minRamCount != 0 and minRamCount < site_minmemory:
1111
+ if site_minmemory not in [0, None] and minRamCount and minRamCount < site_minmemory:
1090
1112
  msg_map[tmpSiteSpec.get_unified_name()] = (
1091
1113
  f" skip site={tmpSiteSpec.get_unified_name()} due to RAM lower limit greater than job's core-scaled requirement {minRamCount} MB criteria=-highmemory"
1092
1114
  )
@@ -1117,7 +1139,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
1117
1139
  else:
1118
1140
  maxSizePerJob //= 1024 * 1024
1119
1141
  # size for direct IO sites
1120
- minDiskCountR = tmpOutDiskSize * tmpEffAtomSize + tmpWorkDiskSize
1142
+ minDiskCountR: Any = tmpOutDiskSize * tmpEffAtomSize + tmpWorkDiskSize
1121
1143
  minDiskCountR = minDiskCountR // 1024 // 1024
1122
1144
  tmpLog.info(f"maxAtomSize={tmpMaxAtomSize} effectiveAtomSize={tmpEffAtomSize} outDiskCount={tmpOutDiskSize} workDiskSize={tmpWorkDiskSize}")
1123
1145
  else:
@@ -1140,9 +1162,9 @@ class AtlasAnalJobBroker(JobBrokerBase):
1140
1162
  # check disk space
1141
1163
  if tmpSiteSpec.maxwdir:
1142
1164
  if CoreUtils.use_direct_io_for_job(taskSpec, tmpSiteSpec, inputChunk):
1143
- minDiskCount = minDiskCountR
1165
+ minDiskCount: Any = minDiskCountR
1144
1166
  if maxSizePerJob is not None and not taskSpec.useLocalIO():
1145
- tmpMinDiskCountR = tmpOutDiskSize * maxSizePerJob + tmpWorkDiskSize
1167
+ tmpMinDiskCountR: float = tmpOutDiskSize * maxSizePerJob + tmpWorkDiskSize
1146
1168
  tmpMinDiskCountR /= 1024 * 1024
1147
1169
  if tmpMinDiskCountR > minDiskCount:
1148
1170
  minDiskCount = tmpMinDiskCountR
@@ -1221,8 +1243,10 @@ class AtlasAnalJobBroker(JobBrokerBase):
1221
1243
  )
1222
1244
  continue
1223
1245
  # check if blacklisted
1224
- tmp_msg = AtlasBrokerUtils.check_endpoints_with_blacklist(tmpSiteSpec, scope_input, scope_output, sites_in_nucleus, remote_source_available)
1225
- if tmp_msg is not None:
1246
+ blacklist_msg = AtlasBrokerUtils.check_endpoints_with_blacklist(
1247
+ tmpSiteSpec, scope_input, scope_output, sites_in_nucleus, remote_source_available
1248
+ )
1249
+ if blacklist_msg is not None:
1226
1250
  msg_map[tmpSiteName] = f" skip site={tmpSiteName} since {tmpSiteSpec.ddm_output[scope_output]} is blacklisted in DDM criteria=-blacklist"
1227
1251
  continue
1228
1252
  # local quota
@@ -1248,8 +1272,9 @@ class AtlasAnalJobBroker(JobBrokerBase):
1248
1272
  strMinWalltime = f"walltime*inputSize={taskSpec.walltime}*{tmpMaxAtomSize}"
1249
1273
  else:
1250
1274
  tmpMaxAtomSize = inputChunk.getMaxAtomSize(getNumEvents=True)
1251
- if taskSpec.getCpuTime() is not None:
1252
- minWalltime = taskSpec.getCpuTime() * tmpMaxAtomSize
1275
+ cpu_time = taskSpec.getCpuTime()
1276
+ if cpu_time is not None:
1277
+ minWalltime = cpu_time * tmpMaxAtomSize
1253
1278
  else:
1254
1279
  minWalltime = None
1255
1280
  strMinWalltime = f"cpuTime*nEventsPerJob={taskSpec.getCpuTime()}*{tmpMaxAtomSize}"
@@ -1259,14 +1284,15 @@ class AtlasAnalJobBroker(JobBrokerBase):
1259
1284
  msg_map = {}
1260
1285
  for tmpSiteName in scanSiteList:
1261
1286
  tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
1262
- siteMaxTime = tmpSiteSpec.maxtime
1287
+ # a site with no maxtime imposes no ceiling, the same as 0 below and as in JobSplitter
1288
+ siteMaxTime: float = tmpSiteSpec.maxtime if tmpSiteSpec.maxtime is not None else 0
1263
1289
  origSiteMaxTime = siteMaxTime
1264
1290
  # check max walltime at the site
1265
1291
  tmpSiteStr = f"{siteMaxTime}"
1266
1292
  if taskSpec.useHS06():
1267
1293
  oldSiteMaxTime = siteMaxTime
1268
- siteMaxTime -= taskSpec.baseWalltime
1269
- tmpSiteStr = f"({oldSiteMaxTime}-{taskSpec.baseWalltime})"
1294
+ siteMaxTime -= baseWalltime
1295
+ tmpSiteStr = f"({oldSiteMaxTime}-{baseWalltime})"
1270
1296
  if siteMaxTime not in [None, 0] and tmpSiteSpec.coreCount not in [None, 0]:
1271
1297
  siteMaxTime *= tmpSiteSpec.coreCount
1272
1298
  tmpSiteStr += f"*{tmpSiteSpec.coreCount}"
@@ -1283,13 +1309,13 @@ class AtlasAnalJobBroker(JobBrokerBase):
1283
1309
  msg_map[tmpSiteSpec.get_unified_name()] = tmpMsg
1284
1310
  continue
1285
1311
  # check min walltime at the site
1286
- siteMinTime = tmpSiteSpec.mintime
1312
+ siteMinTime: float = tmpSiteSpec.mintime
1287
1313
  origSiteMinTime = siteMinTime
1288
1314
  tmpSiteStr = f"{siteMinTime}"
1289
1315
  if taskSpec.useHS06():
1290
1316
  oldSiteMinTime = siteMinTime
1291
- siteMinTime -= taskSpec.baseWalltime
1292
- tmpSiteStr = f"({oldSiteMinTime}-{taskSpec.baseWalltime})"
1317
+ siteMinTime -= baseWalltime
1318
+ tmpSiteStr = f"({oldSiteMinTime}-{baseWalltime})"
1293
1319
  if siteMinTime not in [None, 0] and tmpSiteSpec.coreCount not in [None, 0]:
1294
1320
  siteMinTime *= tmpSiteSpec.coreCount
1295
1321
  tmpSiteStr += f"*{tmpSiteSpec.coreCount}"
@@ -1332,12 +1358,13 @@ class AtlasAnalJobBroker(JobBrokerBase):
1332
1358
  msg_map = {}
1333
1359
  for tmpSiteName in scanSiteList:
1334
1360
  tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
1335
- siteMaxTime = tmpSiteSpec.maxtime
1361
+ # a site with no maxtime imposes no ceiling, the same as 0 below and as in JobSplitter
1362
+ siteMaxTime = tmpSiteSpec.maxtime if tmpSiteSpec.maxtime is not None else 0
1336
1363
  tmpSiteStr = f"{siteMaxTime}"
1337
1364
  if taskSpec.useHS06():
1338
1365
  oldSiteMaxTime = siteMaxTime
1339
- siteMaxTime -= taskSpec.baseWalltime
1340
- tmpSiteStr = f"({oldSiteMaxTime}-{taskSpec.baseWalltime})"
1366
+ siteMaxTime -= baseWalltime
1367
+ tmpSiteStr = f"({oldSiteMaxTime}-{baseWalltime})"
1341
1368
  if siteMaxTime not in [None, 0] and tmpSiteSpec.coreCount not in [None, 0]:
1342
1369
  siteMaxTime *= tmpSiteSpec.coreCount
1343
1370
  tmpSiteStr += f"*{tmpSiteSpec.coreCount}"
@@ -1567,7 +1594,9 @@ class AtlasAnalJobBroker(JobBrokerBase):
1567
1594
  for jobStatus in ["defined", "assigned", "activated", "starting"]:
1568
1595
  nQueue += AtlasBrokerUtils.getNumJobs(jobStatPrioMap, tmpSiteName, jobStatus, workQueue_tag=taskSpec.gshare)
1569
1596
  # skip if overloaded
1570
- if nQueue > minQueue and (nRunning == 0 or float(nQueue) / float(nRunning) > grandRatio * ratioOffset):
1597
+ # grandRatio is None only when nothing is running in the share at all, in
1598
+ # which case every site takes the nRunning == 0 branch before the ratio is used
1599
+ if nQueue > minQueue and (nRunning == 0 or (grandRatio is not None and float(nQueue) / float(nRunning) > grandRatio * ratioOffset)):
1571
1600
  tmpMsg = f" skip site={tmpSiteName} "
1572
1601
  tmpMsg += f"nQueue>minQueue({minQueue}) and "
1573
1602
  if nRunning == 0:
@@ -1746,7 +1775,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
1746
1775
  for tmpPseudoSiteName, error_diag in candidates_with_problems:
1747
1776
  tmpSiteSpec = self.siteMapper.getSite(tmpPseudoSiteName)
1748
1777
  msg_map[tmpSiteSpec.get_unified_name()] = (
1749
- f" skip site={tmpSiteSpec.get_unified_name()} due to a temporary user-specific problem: {error_diag} " "criteria=-tmp_user_problem"
1778
+ f" skip site={tmpSiteSpec.get_unified_name()} due to a temporary user-specific problem: {error_diag} criteria=-tmp_user_problem"
1750
1779
  )
1751
1780
  self.add_summary_message(scanSiteList, [], "temp user problem check", tmpLog, msg_map)
1752
1781
  self.dump_summary(tmpLog)
@@ -1757,7 +1786,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
1757
1786
  ############
1758
1787
  # loop end
1759
1788
  overall_site_list.update(scanSiteList)
1760
- if site_list_with_data is None:
1789
+ if not site_list_with_data:
1761
1790
  # preserve site list with data
1762
1791
  site_list_with_data = set(scanSiteList)
1763
1792
  if len(overall_site_list) >= taskSpec.getNumSitesPerJob():
@@ -1810,16 +1839,15 @@ class AtlasAnalJobBroker(JobBrokerBase):
1810
1839
  if tmpAvFileMap is None:
1811
1840
  raise Interaction.JEDITemporaryError("ddmIF.getAvailableFiles failed")
1812
1841
  availableFileMap[datasetSpec.datasetName] = tmpAvFileMap
1813
- except Exception:
1814
- errtype, errvalue = sys.exc_info()[:2]
1815
- tmpLog.error(f"failed to get available files with {errtype.__name__} {errvalue}")
1842
+ except Exception as e:
1843
+ tmpLog.error(f"failed to get available files with {type(e).__name__} {e}")
1816
1844
  taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
1817
1845
  return retTmpError
1818
1846
  # make data weight
1819
1847
  totalSize = 0
1820
1848
  totalNumFiles = 0
1821
- totalDiskSizeMap = dict()
1822
- totalTapeSizeMap = dict()
1849
+ totalDiskSizeMap: dict[str, Any] = dict()
1850
+ totalTapeSizeMap: dict[str, Any] = dict()
1823
1851
  for datasetSpec in inputChunk.getDatasets():
1824
1852
  totalNumFiles += len(datasetSpec.Files)
1825
1853
  for fileSpec in datasetSpec.Files:
@@ -1841,11 +1869,11 @@ class AtlasAnalJobBroker(JobBrokerBase):
1841
1869
  ######################################
1842
1870
  # final procedure
1843
1871
  tmpLog.info(f"{len(scanSiteList)} candidates for final check")
1844
- weightMap = {}
1872
+ weightMap: dict[str, Any] = {}
1845
1873
  weightStr = {}
1846
1874
  candidateSpecList = []
1847
1875
  preSiteCandidateSpec = None
1848
- basic_weight_compar_map = {}
1876
+ basic_weight_compar_map: dict[str, Any] = {}
1849
1877
  workerStat = self.taskBufferIF.ups_load_worker_stats()
1850
1878
  for tmpPseudoSiteName in scanSiteList:
1851
1879
  tmpSiteSpec = self.siteMapper.getSite(tmpPseudoSiteName)
@@ -1899,12 +1927,10 @@ class AtlasAnalJobBroker(JobBrokerBase):
1899
1927
  if isinstance(site_to_running_rate, dict):
1900
1928
  site_to_running_rate = sum(site_to_running_rate.values())
1901
1929
  except KeyError:
1902
- to_running_rate_str = "0(unknown)"
1903
1930
  to_running_rate = 0
1904
1931
  else:
1905
1932
  site_n_running = AtlasBrokerUtils.getNumJobs(jobStatPrioMap, tmpSiteName, "running")
1906
1933
  to_running_rate = nRunning * site_to_running_rate / site_n_running if site_n_running > 0 else 0
1907
- to_running_rate_str = f"{to_running_rate:.3f}"
1908
1934
  # site class value; by default mid-class (= 0) if unclassified
1909
1935
  site_class_value = analy_sites_class_dict.get(tmpSiteName, 0)
1910
1936
  site_class_value = 0 if site_class_value is None else site_class_value
@@ -2049,7 +2075,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
2049
2075
  # main weight, for User Analysis, determined by number of jobs to submit to each site class
2050
2076
  main_weight_site_class_dict = {1: weight_epsilon_init, 0: weight_epsilon_init, -1: weight_epsilon_init}
2051
2077
  if taskSpec.gshare in ["User Analysis", "Express Analysis"]:
2052
- n_jobs_to_submit_rem = min(n_jobs_to_submit, total_rem_q_len)
2078
+ n_jobs_to_submit_rem: float = min(n_jobs_to_submit, total_rem_q_len)
2053
2079
  if task_class_value == -1:
2054
2080
  # C-task
2055
2081
  main_weight_site_class_dict[-1] = n_jobs_to_submit_rem
@@ -2076,11 +2102,11 @@ class AtlasAnalJobBroker(JobBrokerBase):
2076
2102
  for site in weight_comparison_avail_sites:
2077
2103
  bw_map = basic_weight_compar_map[site]
2078
2104
  # main weight by site & task class for User Analysis, and constant for group shares
2079
- nbw_main = n_jobs_to_submit
2105
+ nbw_main: float = n_jobs_to_submit
2080
2106
  if taskSpec.gshare in ["User Analysis", "Express Analysis"]:
2081
2107
  nbw_main = main_weight_site_class_dict[bw_map["class"]]
2082
2108
  # secondary weight proportional to remaining queue length
2083
- nbw_sec = 1
2109
+ nbw_sec: float = 1
2084
2110
  if taskSpec.gshare in ["User Analysis", "Express Analysis"]:
2085
2111
  _nbw_numer = max(bw_map["rem_q_len"] - nbw_main / site_class_n_site_dict[bw_map["class"]], nbw_main * 0.001)
2086
2112
  reduced_site_class_rem_q_len = site_class_rem_q_len_dict[bw_map["class"]] - nbw_main
@@ -2180,7 +2206,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
2180
2206
  taskSpec.gshare, (" merging," if inputChunk.isMerging else ""), task_class_value, n_jobs_to_submit, "\n".join(prt_str_list)
2181
2207
  )
2182
2208
  )
2183
- except Exception as e:
2209
+ except Exception:
2184
2210
  tmpLog.error(f"{traceback.format_exc()}")
2185
2211
  # choose basic weight
2186
2212
  _basic_weight_version = "new"