panda-server-source 0.8.0__py3-none-any.whl

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 (375) hide show
  1. panda_server_source-0.8.0.dist-info/METADATA +55 -0
  2. panda_server_source-0.8.0.dist-info/RECORD +375 -0
  3. panda_server_source-0.8.0.dist-info/WHEEL +4 -0
  4. panda_server_source-0.8.0.dist-info/licenses/LICENSE.txt +202 -0
  5. pandajedi/__init__.py +0 -0
  6. pandajedi/jedibrokerage/AtlasAnalJobBroker.py +2343 -0
  7. pandajedi/jedibrokerage/AtlasBrokerUtils.py +1292 -0
  8. pandajedi/jedibrokerage/AtlasProdJobBroker.py +2064 -0
  9. pandajedi/jedibrokerage/AtlasProdTaskBroker.py +629 -0
  10. pandajedi/jedibrokerage/GenJobBroker.py +381 -0
  11. pandajedi/jedibrokerage/JobBrokerBase.py +133 -0
  12. pandajedi/jedibrokerage/TaskBrokerBase.py +15 -0
  13. pandajedi/jedibrokerage/__init__.py +0 -0
  14. pandajedi/jediconfig/__init__.py +0 -0
  15. pandajedi/jediconfig/jedi_config.py +40 -0
  16. pandajedi/jedicore/FactoryBase.py +182 -0
  17. pandajedi/jedicore/Interaction.py +433 -0
  18. pandajedi/jedicore/JediDBProxy.py +56 -0
  19. pandajedi/jedicore/JediDBProxyPool.py +37 -0
  20. pandajedi/jedicore/JediDBSchemaInfo.py +17 -0
  21. pandajedi/jedicore/JediException.py +13 -0
  22. pandajedi/jedicore/JediTaskBuffer.py +984 -0
  23. pandajedi/jedicore/JediTaskBufferInterface.py +50 -0
  24. pandajedi/jedicore/MsgWrapper.py +124 -0
  25. pandajedi/jedicore/ProcessUtils.py +34 -0
  26. pandajedi/jedicore/SiteCandidate.py +90 -0
  27. pandajedi/jedicore/ThreadUtils.py +205 -0
  28. pandajedi/jedicore/__init__.py +0 -0
  29. pandajedi/jediddm/AtlasDDMClient.py +1708 -0
  30. pandajedi/jediddm/DDMClientBase.py +16 -0
  31. pandajedi/jediddm/DDMInterface.py +83 -0
  32. pandajedi/jediddm/GenDDMClient.py +17 -0
  33. pandajedi/jediddm/__init__.py +0 -0
  34. pandajedi/jedidog/AtlasAnalWatchDog.py +648 -0
  35. pandajedi/jedidog/AtlasDataCarouselWatchDog.py +189 -0
  36. pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +215 -0
  37. pandajedi/jedidog/AtlasProdWatchDog.py +443 -0
  38. pandajedi/jedidog/AtlasQueueFillerWatchDog.py +800 -0
  39. pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +245 -0
  40. pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +63 -0
  41. pandajedi/jedidog/GenWatchDog.py +21 -0
  42. pandajedi/jedidog/JumboWatchDog.py +147 -0
  43. pandajedi/jedidog/TypicalWatchDogBase.py +122 -0
  44. pandajedi/jedidog/WatchDogBase.py +53 -0
  45. pandajedi/jedidog/__init__.py +0 -0
  46. pandajedi/jediexec/reniceJEDI.py +25 -0
  47. pandajedi/jedigen/AtlasTaskGenerator.py +110 -0
  48. pandajedi/jedigen/TaskGeneratorBase.py +15 -0
  49. pandajedi/jedigen/__init__.py +0 -0
  50. pandajedi/jedimsgprocessor/__init__.py +0 -0
  51. pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +71 -0
  52. pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +66 -0
  53. pandajedi/jedimsgprocessor/base_msg_processor.py +33 -0
  54. pandajedi/jedimsgprocessor/forwarding_msg_processor.py +29 -0
  55. pandajedi/jedimsgprocessor/hpo_msg_processor.py +93 -0
  56. pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +63 -0
  57. pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +185 -0
  58. pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +82 -0
  59. pandajedi/jedimsgprocessor/kafka_msg_processor.py +44 -0
  60. pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +182 -0
  61. pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +74 -0
  62. pandajedi/jedimsgprocessor/processing_msg_processor.py +134 -0
  63. pandajedi/jedimsgprocessor/status_report_msg_processor.py +129 -0
  64. pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +118 -0
  65. pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +89 -0
  66. pandajedi/jediorder/ContentsFeeder.py +785 -0
  67. pandajedi/jediorder/JediDaemon.py +27 -0
  68. pandajedi/jediorder/JediKnight.py +55 -0
  69. pandajedi/jediorder/JediMaster.py +238 -0
  70. pandajedi/jediorder/JediMsgProcessor.py +32 -0
  71. pandajedi/jediorder/JobBroker.py +33 -0
  72. pandajedi/jediorder/JobGenerator.py +2763 -0
  73. pandajedi/jediorder/JobSplitter.py +308 -0
  74. pandajedi/jediorder/JobThrottler.py +28 -0
  75. pandajedi/jediorder/PostProcessor.py +166 -0
  76. pandajedi/jediorder/TaskBroker.py +268 -0
  77. pandajedi/jediorder/TaskCommando.py +334 -0
  78. pandajedi/jediorder/TaskGenerator.py +17 -0
  79. pandajedi/jediorder/TaskRefiner.py +611 -0
  80. pandajedi/jediorder/TaskSetupper.py +17 -0
  81. pandajedi/jediorder/WatchDog.py +79 -0
  82. pandajedi/jediorder/__init__.py +0 -0
  83. pandajedi/jedipprocess/AtlasAnalPostProcessor.py +404 -0
  84. pandajedi/jedipprocess/AtlasPostProcessorUtils.py +50 -0
  85. pandajedi/jedipprocess/AtlasProdPostProcessor.py +178 -0
  86. pandajedi/jedipprocess/GenPostProcessor.py +35 -0
  87. pandajedi/jedipprocess/MailTemplates.py +185 -0
  88. pandajedi/jedipprocess/PostProcessorBase.py +269 -0
  89. pandajedi/jedipprocess/__init__.py +0 -0
  90. pandajedi/jedirefine/AtlasAnalTaskRefiner.py +259 -0
  91. pandajedi/jedirefine/AtlasProdTaskRefiner.py +162 -0
  92. pandajedi/jedirefine/GenTaskRefiner.py +61 -0
  93. pandajedi/jedirefine/RefinerUtils.py +154 -0
  94. pandajedi/jedirefine/TaskRefinerBase.py +996 -0
  95. pandajedi/jedirefine/__init__.py +0 -0
  96. pandajedi/jedisetup/AtlasTaskSetupper.py +309 -0
  97. pandajedi/jedisetup/GenTaskSetupper.py +16 -0
  98. pandajedi/jedisetup/SimpleTaskSetupper.py +152 -0
  99. pandajedi/jedisetup/TaskSetupperBase.py +15 -0
  100. pandajedi/jedisetup/__init__.py +0 -0
  101. pandajedi/jeditest/SchemaChecker.py +41 -0
  102. pandajedi/jeditest/addContWoSoTask.py +54 -0
  103. pandajedi/jeditest/addDataCarouselRequest.py +47 -0
  104. pandajedi/jeditest/addEventServiceTask.py +101 -0
  105. pandajedi/jeditest/addHpoTask.py +81 -0
  106. pandajedi/jeditest/addIDDSStageInRequest.py +56 -0
  107. pandajedi/jeditest/addNonAtlasTask.py +71 -0
  108. pandajedi/jeditest/addNonAtlasTaskEnc.py +64 -0
  109. pandajedi/jeditest/addTestTask.py +124 -0
  110. pandajedi/jeditest/addTestTaskParamToDEFT.py +70 -0
  111. pandajedi/jeditest/addTestTaskWithMerger.py +97 -0
  112. pandajedi/jeditest/brokerTest.py +78 -0
  113. pandajedi/jeditest/cancelDataCarouselRequest.py +35 -0
  114. pandajedi/jeditest/contentsFeederTest.py +28 -0
  115. pandajedi/jeditest/contentsFeederTestWithTask.py +18 -0
  116. pandajedi/jeditest/ddmTest.py +4 -0
  117. pandajedi/jeditest/jobGenForOneTask.py +38 -0
  118. pandajedi/jeditest/jobGeneratorTest.py +43 -0
  119. pandajedi/jeditest/jobSplitterTest.py +104 -0
  120. pandajedi/jeditest/jobThrottlerTest.py +22 -0
  121. pandajedi/jeditest/msgProcessorTest.py +9 -0
  122. pandajedi/jeditest/postProcessorTest.py +18 -0
  123. pandajedi/jeditest/resubmitDataCarouselRequest.py +35 -0
  124. pandajedi/jeditest/resubmitTaskParam.py +20 -0
  125. pandajedi/jeditest/taskBrokerTest.py +22 -0
  126. pandajedi/jeditest/taskBrokerTestWithTask.py +38 -0
  127. pandajedi/jeditest/taskBufferTest.py +5 -0
  128. pandajedi/jeditest/taskCommandoTest.py +28 -0
  129. pandajedi/jeditest/taskRefinerTest.py +30 -0
  130. pandajedi/jeditest/testOneTaskToRefine.py +49 -0
  131. pandajedi/jeditest/testOneTaskToTaskBroker.py +42 -0
  132. pandajedi/jeditest/testPandaDDMMap.py +62 -0
  133. pandajedi/jeditest/updateDataCarouselRequestParams.py +50 -0
  134. pandajedi/jeditest/watchDogTest.py +25 -0
  135. pandajedi/jeditest/workQueueTest.py +22 -0
  136. pandajedi/jedithrottle/AtlasAnalJobThrottler.py +19 -0
  137. pandajedi/jedithrottle/AtlasProdJobThrottler.py +18 -0
  138. pandajedi/jedithrottle/GenJobThrottler.py +26 -0
  139. pandajedi/jedithrottle/JobThrottlerBase.py +496 -0
  140. pandajedi/jedithrottle/__init__.py +0 -0
  141. pandaserver/__init__.py +0 -0
  142. pandaserver/api/__init__.py +0 -0
  143. pandaserver/api/v1/__init__.py +0 -0
  144. pandaserver/api/v1/common.py +339 -0
  145. pandaserver/api/v1/credential_management_api.py +372 -0
  146. pandaserver/api/v1/data_carousel_api.py +264 -0
  147. pandaserver/api/v1/event_api.py +269 -0
  148. pandaserver/api/v1/file_server_api.py +942 -0
  149. pandaserver/api/v1/harvester_api.py +445 -0
  150. pandaserver/api/v1/http_client.py +166 -0
  151. pandaserver/api/v1/idds_api.py +180 -0
  152. pandaserver/api/v1/job_api.py +463 -0
  153. pandaserver/api/v1/metaconfig_api.py +122 -0
  154. pandaserver/api/v1/pilot_api.py +895 -0
  155. pandaserver/api/v1/statistics_api.py +207 -0
  156. pandaserver/api/v1/system_api.py +186 -0
  157. pandaserver/api/v1/task_api.py +1520 -0
  158. pandaserver/api/v1/tests/__init__.py +0 -0
  159. pandaserver/api/v1/tests/credential_management_api_tests.py +116 -0
  160. pandaserver/api/v1/tests/data_carousel_api_tests.py +82 -0
  161. pandaserver/api/v1/tests/harvester_api_tests.py +188 -0
  162. pandaserver/api/v1/tests/idds_api_tests.py +45 -0
  163. pandaserver/api/v1/tests/job_api_tests.py +112 -0
  164. pandaserver/api/v1/tests/pilot_api_tests.py +154 -0
  165. pandaserver/api/v1/tests/statistics_api_tests.py +104 -0
  166. pandaserver/api/v1/tests/system_api_tests.py +58 -0
  167. pandaserver/api/v1/tests/task_api_tests.py +590 -0
  168. pandaserver/api/v1/version.py +2 -0
  169. pandaserver/api/v1/workflow_api.py +136 -0
  170. pandaserver/brokerage/SiteMapper.py +406 -0
  171. pandaserver/brokerage/__init__.py +0 -0
  172. pandaserver/brokerage/broker.py +272 -0
  173. pandaserver/config/__init__.py +0 -0
  174. pandaserver/config/config_utils.py +15 -0
  175. pandaserver/config/daemon_config.py +29 -0
  176. pandaserver/config/mcp_config.py +38 -0
  177. pandaserver/config/panda_config.py +233 -0
  178. pandaserver/configurator/Carbon.py +65 -0
  179. pandaserver/configurator/Configurator.py +908 -0
  180. pandaserver/configurator/__init__.py +0 -0
  181. pandaserver/configurator/aux.py +73 -0
  182. pandaserver/daemons/__init__.py +0 -0
  183. pandaserver/daemons/master.py +110 -0
  184. pandaserver/daemons/master_systemd.py +79 -0
  185. pandaserver/daemons/scripts/__init__.py +0 -0
  186. pandaserver/daemons/scripts/add_main.py +264 -0
  187. pandaserver/daemons/scripts/add_sub.py +221 -0
  188. pandaserver/daemons/scripts/cache_pilots.py +47 -0
  189. pandaserver/daemons/scripts/cache_schedconfig.py +286 -0
  190. pandaserver/daemons/scripts/carbon.py +50 -0
  191. pandaserver/daemons/scripts/configurator.py +94 -0
  192. pandaserver/daemons/scripts/copyArchive.py +1387 -0
  193. pandaserver/daemons/scripts/datasetManager.py +1154 -0
  194. pandaserver/daemons/scripts/dummy_test.py +25 -0
  195. pandaserver/daemons/scripts/evpPD2P.py +144 -0
  196. pandaserver/daemons/scripts/hs_scrapers.py +264 -0
  197. pandaserver/daemons/scripts/metric_collector.py +927 -0
  198. pandaserver/daemons/scripts/panda_activeusers_query.py +80 -0
  199. pandaserver/daemons/scripts/pilotStreaming.py +109 -0
  200. pandaserver/daemons/scripts/process_workflow_files_daemon.py +166 -0
  201. pandaserver/daemons/scripts/recover_lost_files_daemon.py +177 -0
  202. pandaserver/daemons/scripts/task_evaluator.py +405 -0
  203. pandaserver/daemons/scripts/tmpwatch.py +70 -0
  204. pandaserver/daemons/scripts/worker_synchronization.py +97 -0
  205. pandaserver/daemons/utils.py +753 -0
  206. pandaserver/dataservice/DataServiceUtils.py +323 -0
  207. pandaserver/dataservice/ErrorCode.py +25 -0
  208. pandaserver/dataservice/RecoverLostFilesCore.py +322 -0
  209. pandaserver/dataservice/__init__.py +0 -0
  210. pandaserver/dataservice/activator.py +79 -0
  211. pandaserver/dataservice/adder_atlas_plugin.py +1106 -0
  212. pandaserver/dataservice/adder_dummy_plugin.py +31 -0
  213. pandaserver/dataservice/adder_gen.py +954 -0
  214. pandaserver/dataservice/adder_plugin_base.py +27 -0
  215. pandaserver/dataservice/adder_result.py +75 -0
  216. pandaserver/dataservice/adder_simple_plugin.py +160 -0
  217. pandaserver/dataservice/closer.py +247 -0
  218. pandaserver/dataservice/closer_atlas_plugin.py +90 -0
  219. pandaserver/dataservice/ddm.py +1381 -0
  220. pandaserver/dataservice/ddm_handler.py +95 -0
  221. pandaserver/dataservice/dyn_data_distributer.py +824 -0
  222. pandaserver/dataservice/event_lookup_client_ei.py +77 -0
  223. pandaserver/dataservice/event_picker.py +268 -0
  224. pandaserver/dataservice/finisher.py +194 -0
  225. pandaserver/dataservice/setupper.py +225 -0
  226. pandaserver/dataservice/setupper_atlas_plugin.py +1851 -0
  227. pandaserver/dataservice/setupper_dummy_plugin.py +47 -0
  228. pandaserver/dataservice/setupper_plugin_base.py +67 -0
  229. pandaserver/jobdispatcher/DispatcherUtils.py +35 -0
  230. pandaserver/jobdispatcher/ErrorCode.py +19 -0
  231. pandaserver/jobdispatcher/JobDispatcher.py +1625 -0
  232. pandaserver/jobdispatcher/Protocol.py +443 -0
  233. pandaserver/jobdispatcher/Watcher.py +186 -0
  234. pandaserver/jobdispatcher/__init__.py +0 -0
  235. pandaserver/pandamcp/__init__.py +0 -0
  236. pandaserver/pandamcp/mcp_main.py +56 -0
  237. pandaserver/pandamcp/mcp_test_client.py +95 -0
  238. pandaserver/pandamcp/mcp_utils.py +74 -0
  239. pandaserver/proxycache/__init__.py +0 -0
  240. pandaserver/proxycache/panda_proxy_cache.py +240 -0
  241. pandaserver/proxycache/token_cache.py +141 -0
  242. pandaserver/server/.gacl +6 -0
  243. pandaserver/server/panda.py +539 -0
  244. pandaserver/srvcore/CoreUtils.py +572 -0
  245. pandaserver/srvcore/MailUtils.py +106 -0
  246. pandaserver/srvcore/__init__.py +0 -0
  247. pandaserver/srvcore/allowed_methods.py +100 -0
  248. pandaserver/srvcore/oidc_utils.py +152 -0
  249. pandaserver/srvcore/panda_request.py +196 -0
  250. pandaserver/srvcore/srv_msg_utils.py +42 -0
  251. pandaserver/taskbuffer/ConBridge.py +513 -0
  252. pandaserver/taskbuffer/DBProxyPool.py +95 -0
  253. pandaserver/taskbuffer/DataCarousel.py +3053 -0
  254. pandaserver/taskbuffer/DatasetSpec.py +137 -0
  255. pandaserver/taskbuffer/DdmSpec.py +201 -0
  256. pandaserver/taskbuffer/ErrorCode.py +87 -0
  257. pandaserver/taskbuffer/EventServiceUtils.py +396 -0
  258. pandaserver/taskbuffer/FileSpec.py +290 -0
  259. pandaserver/taskbuffer/GlobalShares.py +244 -0
  260. pandaserver/taskbuffer/HarvesterMetricsSpec.py +92 -0
  261. pandaserver/taskbuffer/Initializer.py +82 -0
  262. pandaserver/taskbuffer/InputChunk.py +1080 -0
  263. pandaserver/taskbuffer/JediCacheSpec.py +57 -0
  264. pandaserver/taskbuffer/JediDatasetSpec.py +588 -0
  265. pandaserver/taskbuffer/JediFileSpec.py +242 -0
  266. pandaserver/taskbuffer/JediTaskSpec.py +1687 -0
  267. pandaserver/taskbuffer/JobSpec.py +1006 -0
  268. pandaserver/taskbuffer/JobUtils.py +232 -0
  269. pandaserver/taskbuffer/NucleusSpec.py +116 -0
  270. pandaserver/taskbuffer/OraDBProxy.py +174 -0
  271. pandaserver/taskbuffer/PanDAMsgProcessor.py +8 -0
  272. pandaserver/taskbuffer/PandaDBSchemaInfo.py +18 -0
  273. pandaserver/taskbuffer/ParseJobXML.py +350 -0
  274. pandaserver/taskbuffer/PickleFileSpec.py +18 -0
  275. pandaserver/taskbuffer/PickleJobSpec.py +25 -0
  276. pandaserver/taskbuffer/PrioUtil.py +40 -0
  277. pandaserver/taskbuffer/ProcessGroups.py +111 -0
  278. pandaserver/taskbuffer/ResourceSpec.py +175 -0
  279. pandaserver/taskbuffer/SQLDumper.py +37 -0
  280. pandaserver/taskbuffer/SQLManager.py +60 -0
  281. pandaserver/taskbuffer/SiteSpec.py +304 -0
  282. pandaserver/taskbuffer/SupErrors.py +10 -0
  283. pandaserver/taskbuffer/TaskBuffer.py +2882 -0
  284. pandaserver/taskbuffer/TaskBufferInterface.py +163 -0
  285. pandaserver/taskbuffer/Utils.py +848 -0
  286. pandaserver/taskbuffer/WorkQueue.py +227 -0
  287. pandaserver/taskbuffer/WorkQueueMapper.py +203 -0
  288. pandaserver/taskbuffer/WorkerSpec.py +143 -0
  289. pandaserver/taskbuffer/WrappedCursor.py +487 -0
  290. pandaserver/taskbuffer/WrappedPickle.py +88 -0
  291. pandaserver/taskbuffer/WrappedPostgresConn.py +24 -0
  292. pandaserver/taskbuffer/__init__.py +0 -0
  293. pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
  294. pandaserver/taskbuffer/db_proxy_mods/__init__.py +7 -0
  295. pandaserver/taskbuffer/db_proxy_mods/base_module.py +841 -0
  296. pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +772 -0
  297. pandaserver/taskbuffer/db_proxy_mods/entity_module.py +3804 -0
  298. pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +5661 -0
  299. pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +2640 -0
  300. pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +874 -0
  301. pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +4272 -0
  302. pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +6172 -0
  303. pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +4953 -0
  304. pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +4999 -0
  305. pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +2063 -0
  306. pandaserver/taskbuffer/db_proxy_mods/worker_module.py +1944 -0
  307. pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +832 -0
  308. pandaserver/taskbuffer/retryModule.py +552 -0
  309. pandaserver/taskbuffer/task_split_rules.py +308 -0
  310. pandaserver/taskbuffer/workflow_processor.py +249 -0
  311. pandaserver/taskbuffer/wrapped_oracle_conn.py +18 -0
  312. pandaserver/test/SchemaChecker.py +40 -0
  313. pandaserver/test/__init__.py +0 -0
  314. pandaserver/test/banUser.py +43 -0
  315. pandaserver/test/boostPrio.py +19 -0
  316. pandaserver/test/boostUser.py +35 -0
  317. pandaserver/test/callbackDDM.py +11 -0
  318. pandaserver/test/daod_on_demand.py +95 -0
  319. pandaserver/test/finishJob.py +184 -0
  320. pandaserver/test/finishTaskJEDI.py +11 -0
  321. pandaserver/test/getJobs.py +53 -0
  322. pandaserver/test/killJob.py +79 -0
  323. pandaserver/test/killJobLowPrio.py +99 -0
  324. pandaserver/test/killJobsInTask.py +56 -0
  325. pandaserver/test/killTask.py +80 -0
  326. pandaserver/test/killTaskJEDI.py +11 -0
  327. pandaserver/test/killUser.py +83 -0
  328. pandaserver/test/lsst/README.txt +7 -0
  329. pandaserver/test/lsst/lsstSubmit.py +139 -0
  330. pandaserver/test/lsst/lsstSubmitMERGEtest.py +141 -0
  331. pandaserver/test/lsst/lsstSubmitPhosim332.py +53 -0
  332. pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +41 -0
  333. pandaserver/test/reassignJobs.py +17 -0
  334. pandaserver/test/reassignSite.py +82 -0
  335. pandaserver/test/reassignTask.py +117 -0
  336. pandaserver/test/reassignWaiting.py +39 -0
  337. pandaserver/test/recoverLostFiles.py +7 -0
  338. pandaserver/test/reloadInputDS.py +51 -0
  339. pandaserver/test/sendCommandToJob.py +26 -0
  340. pandaserver/test/setDebugMode.py +38 -0
  341. pandaserver/test/setPriority.py +28 -0
  342. pandaserver/test/testEvgen.py +60 -0
  343. pandaserver/test/testEvgen17.py +58 -0
  344. pandaserver/test/testG4sim.py +81 -0
  345. pandaserver/test/testG4sim17.py +90 -0
  346. pandaserver/test/testGlobalShares.py +131 -0
  347. pandaserver/test/testReco.py +103 -0
  348. pandaserver/test/testSimulReco14.py +98 -0
  349. pandaserver/test/testSiteMap.py +26 -0
  350. pandaserver/test/testUpdateWorkerPilotStatus.py +9 -0
  351. pandaserver/userinterface/Client.py +1686 -0
  352. pandaserver/userinterface/UserIF.py +1799 -0
  353. pandaserver/userinterface/__init__.py +0 -0
  354. pandaserver/workflow/__init__.py +0 -0
  355. pandaserver/workflow/data_handler_plugins/base_data_handler.py +48 -0
  356. pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +100 -0
  357. pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +140 -0
  358. pandaserver/workflow/pcwl_test.py +122 -0
  359. pandaserver/workflow/pcwl_utils.py +384 -0
  360. pandaserver/workflow/psnakemake_container.json +68 -0
  361. pandaserver/workflow/psnakemake_task.json +62 -0
  362. pandaserver/workflow/psnakemake_test.py +60 -0
  363. pandaserver/workflow/snakeparser/__init__.py +3 -0
  364. pandaserver/workflow/snakeparser/extensions.py +74 -0
  365. pandaserver/workflow/snakeparser/log.py +53 -0
  366. pandaserver/workflow/snakeparser/names.py +3 -0
  367. pandaserver/workflow/snakeparser/parser.py +332 -0
  368. pandaserver/workflow/snakeparser/utils.py +29 -0
  369. pandaserver/workflow/step_handler_plugins/base_step_handler.py +85 -0
  370. pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +280 -0
  371. pandaserver/workflow/workflow_base.py +531 -0
  372. pandaserver/workflow/workflow_core.py +1974 -0
  373. pandaserver/workflow/workflow_core_smoketest.py +388 -0
  374. pandaserver/workflow/workflow_parser.py +222 -0
  375. pandaserver/workflow/workflow_utils.py +1047 -0
@@ -0,0 +1,984 @@
1
+ # DB API for JEDI
2
+
3
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
4
+
5
+ from pandajedi.jediconfig import jedi_config
6
+ from pandaserver.taskbuffer import TaskBuffer
7
+
8
+ from . import JediDBProxyPool
9
+ from .Interaction import CommandReceiveInterface
10
+
11
+ logger = PandaLogger().getLogger(__name__.split(".")[-1])
12
+
13
+ # use customized proxy pool
14
+ TaskBuffer.DBProxyPool = JediDBProxyPool.DBProxyPool
15
+
16
+
17
+ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
18
+ # constructor
19
+ def __init__(self, conn, nDBConnection=1):
20
+ CommandReceiveInterface.__init__(self, conn)
21
+ TaskBuffer.TaskBuffer.__init__(self)
22
+ TaskBuffer.TaskBuffer.init(self, jedi_config.db.dbhost, jedi_config.db.dbpasswd, nDBConnection=nDBConnection)
23
+ logger.debug("__init__")
24
+
25
+ # query an SQL
26
+ def querySQL(self, sql, varMap, arraySize=1000):
27
+ with self.proxyPool.get() as proxy:
28
+ return proxy.querySQLS(sql, varMap, arraySize)[1]
29
+
30
+ # get work queue map
31
+ def getWorkQueueMap(self):
32
+ with self.proxyPool.get() as proxy:
33
+ return proxy.getWorkQueueMap()
34
+
35
+ # get the list of datasets to feed contents to DB
36
+ def getDatasetsToFeedContents_JEDI(self, vo=None, prodSourceLabel=None, task_id=None, force_read=False):
37
+ with self.proxyPool.get() as proxy:
38
+ return proxy.getDatasetsToFeedContents_JEDI(vo, prodSourceLabel, task_id, force_read)
39
+
40
+ # feed files to the JEDI contents table
41
+ def insertFilesForDataset_JEDI(
42
+ self,
43
+ datasetSpec,
44
+ fileMap,
45
+ datasetState,
46
+ stateUpdateTime,
47
+ nEventsPerFile,
48
+ nEventsPerJob,
49
+ maxAttempt,
50
+ firstEventNumber,
51
+ nMaxFiles,
52
+ nMaxEvents,
53
+ useScout,
54
+ fileList,
55
+ useFilesWithNewAttemptNr,
56
+ nFilesPerJob,
57
+ nEventsPerRange,
58
+ nChunksForScout,
59
+ includePatt,
60
+ excludePatt,
61
+ xmlConfig,
62
+ noWaitParent,
63
+ parent_tid,
64
+ pid,
65
+ maxFailure,
66
+ useRealNumEvents,
67
+ respectLB,
68
+ tgtNumEventsPerJob,
69
+ skipFilesUsedBy,
70
+ ramCount,
71
+ taskSpec,
72
+ skipShortInput,
73
+ inputPreStaging,
74
+ order_by,
75
+ maxFileRecords,
76
+ skip_short_output,
77
+ ):
78
+ with self.proxyPool.get() as proxy:
79
+ return proxy.insertFilesForDataset_JEDI(
80
+ datasetSpec,
81
+ fileMap,
82
+ datasetState,
83
+ stateUpdateTime,
84
+ nEventsPerFile,
85
+ nEventsPerJob,
86
+ maxAttempt,
87
+ firstEventNumber,
88
+ nMaxFiles,
89
+ nMaxEvents,
90
+ useScout,
91
+ fileList,
92
+ useFilesWithNewAttemptNr,
93
+ nFilesPerJob,
94
+ nEventsPerRange,
95
+ nChunksForScout,
96
+ includePatt,
97
+ excludePatt,
98
+ xmlConfig,
99
+ noWaitParent,
100
+ parent_tid,
101
+ pid,
102
+ maxFailure,
103
+ useRealNumEvents,
104
+ respectLB,
105
+ tgtNumEventsPerJob,
106
+ skipFilesUsedBy,
107
+ ramCount,
108
+ taskSpec,
109
+ skipShortInput,
110
+ inputPreStaging,
111
+ order_by,
112
+ maxFileRecords,
113
+ skip_short_output,
114
+ )
115
+
116
+ # get files from the JEDI contents table with jediTaskID and/or datasetID
117
+ def getFilesInDatasetWithID_JEDI(self, jediTaskID=None, datasetID=None, nFiles=None, status=None):
118
+ with self.proxyPool.get() as proxy:
119
+ return proxy.getFilesInDatasetWithID_JEDI(jediTaskID, datasetID, nFiles, status)
120
+
121
+ # insert dataset to the JEDI datasets table
122
+ def insertDataset_JEDI(self, datasetSpec):
123
+ with self.proxyPool.get() as proxy:
124
+ return proxy.insertDataset_JEDI(datasetSpec)
125
+
126
+ # update JEDI dataset
127
+ def updateDataset_JEDI(self, datasetSpec, criteria, lockTask=False):
128
+ with self.proxyPool.get() as proxy:
129
+ return proxy.updateDataset_JEDI(datasetSpec, criteria, lockTask)
130
+
131
+ # update JEDI dataset attributes
132
+ def updateDatasetAttributes_JEDI(self, jediTaskID, datasetID, attributes):
133
+ with self.proxyPool.get() as proxy:
134
+ return proxy.updateDatasetAttributes_JEDI(jediTaskID, datasetID, attributes)
135
+
136
+ # get JEDI dataset attributes
137
+ def getDatasetAttributes_JEDI(self, jediTaskID, datasetID, attributes):
138
+ with self.proxyPool.get() as proxy:
139
+ return proxy.getDatasetAttributes_JEDI(jediTaskID, datasetID, attributes)
140
+
141
+ # get JEDI dataset attributes with map
142
+ def getDatasetAttributesWithMap_JEDI(self, jediTaskID, criteria, attributes):
143
+ with self.proxyPool.get() as proxy:
144
+ return proxy.getDatasetAttributesWithMap_JEDI(jediTaskID, criteria, attributes)
145
+
146
+ # get JEDI dataset with jediTaskID and datasetID
147
+ def getDatasetWithID_JEDI(self, jediTaskID, datasetID):
148
+ with self.proxyPool.get() as proxy:
149
+ return proxy.getDatasetWithID_JEDI(jediTaskID, datasetID)
150
+
151
+ # get JEDI datasets with jediTaskID
152
+ def getDatasetsWithJediTaskID_JEDI(self, jediTaskID, datasetTypes=None, getFiles=False):
153
+ with self.proxyPool.get() as proxy:
154
+ retStat, datasetSpecList = proxy.getDatasetsWithJediTaskID_JEDI(jediTaskID, datasetTypes=datasetTypes)
155
+ if retStat is True and getFiles is True:
156
+ for datasetSpec in datasetSpecList:
157
+ # read files
158
+ retStat, fileSpecList = proxy.getFilesInDatasetWithID_JEDI(jediTaskID, datasetSpec.datasetID, None, None)
159
+ if retStat is False:
160
+ break
161
+ for fileSpec in fileSpecList:
162
+ datasetSpec.addFile(fileSpec)
163
+ # return
164
+ return retStat, datasetSpecList
165
+
166
+ # get jediTaskIDs with dataset attributes
167
+ def get_task_ids_with_dataset_attributes(self, dataset_attributes, only_active_tasks=True):
168
+ with self.proxyPool.get() as proxy:
169
+ return proxy.get_task_ids_with_dataset_attributes(dataset_attributes, only_active_tasks)
170
+
171
+ # insert task to the JEDI tasks table
172
+ def insertTask_JEDI(self, taskSpec):
173
+ with self.proxyPool.get() as proxy:
174
+ return proxy.insertTask_JEDI(taskSpec)
175
+
176
+ # update JEDI task
177
+ def updateTask_JEDI(self, taskSpec, criteria, oldStatus=None, updateDEFT=False, insertUnknown=None, setFrozenTime=True, setOldModTime=False):
178
+ with self.proxyPool.get() as proxy:
179
+ return proxy.updateTask_JEDI(taskSpec, criteria, oldStatus, updateDEFT, insertUnknown, setFrozenTime, setOldModTime)
180
+
181
+ # update JEDI task lock
182
+ def updateTaskLock_JEDI(self, jediTaskID):
183
+ with self.proxyPool.get() as proxy:
184
+ return proxy.updateTaskLock_JEDI(jediTaskID)
185
+
186
+ # update JEDI task status by ContentsFeeder
187
+ def updateTaskStatusByContFeeder_JEDI(self, jediTaskID, taskSpec=None, getTaskStatus=False, pid=None, setFrozenTime=True, useWorldCloud=False):
188
+ with self.proxyPool.get() as proxy:
189
+ return proxy.updateTaskStatusByContFeeder_JEDI(jediTaskID, taskSpec, getTaskStatus, pid, setFrozenTime, useWorldCloud)
190
+
191
+ # get JEDI task with jediTaskID
192
+ def getTaskWithID_JEDI(self, jediTaskID, fullFlag=False, lockTask=False, pid=None, lockInterval=None, clearError=False):
193
+ with self.proxyPool.get() as proxy:
194
+ return proxy.getTaskWithID_JEDI(jediTaskID, fullFlag, lockTask, pid, lockInterval, clearError)
195
+
196
+ # get JEDI task and tasks with ID and lock it
197
+ def getTaskDatasetsWithID_JEDI(self, jediTaskID, pid, lockTask=True):
198
+ with self.proxyPool.get() as proxy:
199
+ return proxy.getTaskDatasetsWithID_JEDI(jediTaskID, pid, lockTask)
200
+
201
+ # get JEDI tasks with selection criteria
202
+ def getTaskIDsWithCriteria_JEDI(self, criteria, nTasks=50):
203
+ with self.proxyPool.get() as proxy:
204
+ return proxy.getTaskIDsWithCriteria_JEDI(criteria, nTasks)
205
+
206
+ # get JEDI tasks to be finished
207
+ def getTasksToBeFinished_JEDI(self, vo, prodSourceLabel, pid, nTasks=50, target_tasks=None):
208
+ with self.proxyPool.get() as proxy:
209
+ return proxy.getTasksToBeFinished_JEDI(vo, prodSourceLabel, pid, nTasks, target_tasks)
210
+
211
+ # get tasks to be processed
212
+ def getTasksToBeProcessed_JEDI(
213
+ self,
214
+ pid,
215
+ vo,
216
+ workQueue,
217
+ prodSourceLabel,
218
+ cloudName,
219
+ nTasks=50,
220
+ nFiles=100,
221
+ simTasks=None,
222
+ minPriority=None,
223
+ maxNumJobs=None,
224
+ typicalNumFilesMap=None,
225
+ fullSimulation=False,
226
+ simDatasets=None,
227
+ mergeUnThrottled=None,
228
+ readMinFiles=False,
229
+ numNewTaskWithJumbo=0,
230
+ resource_name=None,
231
+ ignore_lock=False,
232
+ target_tasks=None,
233
+ ):
234
+ with self.proxyPool.get() as proxy:
235
+ return proxy.getTasksToBeProcessed_JEDI(
236
+ pid,
237
+ vo,
238
+ workQueue,
239
+ prodSourceLabel,
240
+ cloudName,
241
+ nTasks,
242
+ nFiles,
243
+ simTasks=simTasks,
244
+ minPriority=minPriority,
245
+ maxNumJobs=maxNumJobs,
246
+ typicalNumFilesMap=typicalNumFilesMap,
247
+ fullSimulation=fullSimulation,
248
+ simDatasets=simDatasets,
249
+ mergeUnThrottled=mergeUnThrottled,
250
+ readMinFiles=readMinFiles,
251
+ numNewTaskWithJumbo=numNewTaskWithJumbo,
252
+ resource_name=resource_name,
253
+ ignore_lock=ignore_lock,
254
+ target_tasks=target_tasks,
255
+ )
256
+
257
+ # get tasks to be processed
258
+ def checkWaitingTaskPrio_JEDI(self, vo, workQueue, prodSourceLabel, cloudName, resource_name=None):
259
+ with self.proxyPool.get() as proxy:
260
+ return proxy.getTasksToBeProcessed_JEDI(None, vo, workQueue, prodSourceLabel, cloudName, isPeeking=True, resource_name=resource_name)
261
+
262
+ # get job statistics with work queue
263
+ def getJobStatisticsWithWorkQueue_JEDI(self, vo, prodSourceLabel, minPriority=None):
264
+ with self.proxyPool.get() as proxy:
265
+ return proxy.getJobStatisticsWithWorkQueue_JEDI(vo, prodSourceLabel, minPriority)
266
+
267
+ # get core statistics with VO and prodSourceLabel
268
+ def get_core_statistics(self, vo, prod_source_label):
269
+ with self.proxyPool.get() as proxy:
270
+ return proxy.get_core_statistics(vo, prod_source_label)
271
+
272
+ # get job statistics by global share
273
+ def getJobStatisticsByGlobalShare(self, vo, exclude_rwq=False):
274
+ with self.proxyPool.get() as proxy:
275
+ return proxy.getJobStatisticsByGlobalShare(vo, exclude_rwq)
276
+
277
+ # get whether a gshare rtype combination is active
278
+ def get_active_gshare_rtypes(self, vo):
279
+ with self.proxyPool.get() as proxy:
280
+ return proxy.get_active_gshare_rtypes(vo)
281
+
282
+ # get job statistics by resource type
283
+ def getJobStatisticsByResourceType(self, workqueue):
284
+ with self.proxyPool.get() as proxy:
285
+ return proxy.getJobStatisticsByResourceType(workqueue)
286
+
287
+ # get job statistics by site and resource type
288
+ def getJobStatisticsByResourceTypeSite(self, workqueue):
289
+ with self.proxyPool.get() as proxy:
290
+ return proxy.getJobStatisticsByResourceTypeSite(workqueue)
291
+
292
+ # generate output files for task
293
+ def getOutputFiles_JEDI(
294
+ self,
295
+ jediTaskID,
296
+ provenanceID,
297
+ simul,
298
+ instantiateTmpl=False,
299
+ instantiatedSite=None,
300
+ isUnMerging=False,
301
+ isPrePro=False,
302
+ xmlConfigJob=None,
303
+ siteDsMap=None,
304
+ middleName="",
305
+ registerDatasets=False,
306
+ parallelOutMap=None,
307
+ fileIDPool=[],
308
+ n_files_per_chunk=1,
309
+ bulk_fetch_for_multiple_jobs=False,
310
+ master_dataset_id=None,
311
+ ):
312
+ with self.proxyPool.get() as proxy:
313
+ return proxy.getOutputFiles_JEDI(
314
+ jediTaskID,
315
+ provenanceID,
316
+ simul,
317
+ instantiateTmpl,
318
+ instantiatedSite,
319
+ isUnMerging,
320
+ isPrePro,
321
+ xmlConfigJob,
322
+ siteDsMap,
323
+ middleName,
324
+ registerDatasets,
325
+ parallelOutMap,
326
+ fileIDPool,
327
+ n_files_per_chunk,
328
+ bulk_fetch_for_multiple_jobs,
329
+ master_dataset_id,
330
+ )
331
+
332
+ # insert output file templates
333
+ def insertOutputTemplate_JEDI(self, templates):
334
+ with self.proxyPool.get() as proxy:
335
+ return proxy.insertOutputTemplate_JEDI(templates)
336
+
337
+ # insert JobParamsTemplate
338
+ def insertJobParamsTemplate_JEDI(self, jediTaskID, templ):
339
+ with self.proxyPool.get() as proxy:
340
+ return proxy.insertJobParamsTemplate_JEDI(jediTaskID, templ)
341
+
342
+ # insert TaskParams
343
+ def insertTaskParams_JEDI(self, vo, prodSourceLabel, userName, taskName, taskParams, parent_tid=None):
344
+ with self.proxyPool.get() as proxy:
345
+ return proxy.insertTaskParams_JEDI(vo, prodSourceLabel, userName, taskName, taskParams, parent_tid)
346
+
347
+ # reset unused files
348
+ def resetUnusedFiles_JEDI(self, jediTaskID, inputChunk):
349
+ with self.proxyPool.get() as proxy:
350
+ return proxy.resetUnusedFiles_JEDI(jediTaskID, inputChunk)
351
+
352
+ # insert TaskParams
353
+ def insertUpdateTaskParams_JEDI(self, jediTaskID, vo, prodSourceLabel, updateTaskParams, insertTaskParamsList):
354
+ with self.proxyPool.get() as proxy:
355
+ return proxy.insertUpdateTaskParams_JEDI(jediTaskID, vo, prodSourceLabel, updateTaskParams, insertTaskParamsList)
356
+
357
+ # set missing files
358
+ def setMissingFiles_JEDI(self, jediTaskID, datasetID, fileIDs):
359
+ with self.proxyPool.get() as proxy:
360
+ return proxy.setMissingFiles_JEDI(jediTaskID, datasetID, fileIDs)
361
+
362
+ # rescue picked files
363
+ def rescuePickedFiles_JEDI(self, vo, prodSourceLabel, waitTime):
364
+ with self.proxyPool.get() as proxy:
365
+ return proxy.rescuePickedFiles_JEDI(vo, prodSourceLabel, waitTime)
366
+
367
+ # rescue unlocked tasks with picked files
368
+ def rescueUnLockedTasksWithPicked_JEDI(self, vo, prodSourceLabel, waitTime, pid):
369
+ with self.proxyPool.get() as proxy:
370
+ return proxy.rescueUnLockedTasksWithPicked_JEDI(vo, prodSourceLabel, waitTime, pid)
371
+
372
+ # unlock tasks
373
+ def unlockTasks_JEDI(self, vo, prodSourceLabel, waitTime, hostName=None, pgid=None):
374
+ with self.proxyPool.get() as proxy:
375
+ return proxy.unlockTasks_JEDI(vo, prodSourceLabel, waitTime, hostName, pgid)
376
+
377
+ # get the size of input files which will be copied to the site
378
+ def getMovingInputSize_JEDI(self, siteName):
379
+ with self.proxyPool.get() as proxy:
380
+ return proxy.getMovingInputSize_JEDI(siteName)
381
+
382
+ # get typical number of input files for each workQueue+processingType
383
+ def getTypicalNumInput_JEDI(self, vo, prodSourceLabel, workQueue):
384
+ with self.proxyPool.get() as proxy:
385
+ return proxy.getTypicalNumInput_JEDI(vo, prodSourceLabel, workQueue)
386
+
387
+ # get highest prio jobs with workQueueID
388
+ def getHighestPrioJobStat_JEDI(self, prodSourceLabel, cloudName, workQueue, resource_name=None):
389
+ with self.proxyPool.get() as proxy:
390
+ return proxy.getHighestPrioJobStat_JEDI(prodSourceLabel, cloudName, workQueue, resource_name)
391
+
392
+ # get the list of tasks to refine
393
+ def getTasksToRefine_JEDI(self, vo=None, prodSourceLabel=None):
394
+ with self.proxyPool.get() as proxy:
395
+ return proxy.getTasksToRefine_JEDI(vo, prodSourceLabel)
396
+
397
+ # get task parameters with jediTaskID
398
+ def getTaskParamsWithID_JEDI(self, jediTaskID):
399
+ with self.proxyPool.get() as proxy:
400
+ return proxy.getTaskParamsWithID_JEDI(jediTaskID)
401
+
402
+ # register task/dataset/templ/param in a single transaction
403
+ def registerTaskInOneShot_JEDI(
404
+ self,
405
+ jediTaskID,
406
+ taskSpec,
407
+ inMasterDatasetSpec,
408
+ inSecDatasetSpecList,
409
+ outDatasetSpecList,
410
+ outputTemplateMap,
411
+ jobParamsTemplate,
412
+ taskParams,
413
+ unmergeMasterDatasetSpec,
414
+ unmergeDatasetSpecMap,
415
+ uniqueTaskName,
416
+ oldTaskStatus,
417
+ ):
418
+ with self.proxyPool.get() as proxy:
419
+ return proxy.registerTaskInOneShot_JEDI(
420
+ jediTaskID,
421
+ taskSpec,
422
+ inMasterDatasetSpec,
423
+ inSecDatasetSpecList,
424
+ outDatasetSpecList,
425
+ outputTemplateMap,
426
+ jobParamsTemplate,
427
+ taskParams,
428
+ unmergeMasterDatasetSpec,
429
+ unmergeDatasetSpecMap,
430
+ uniqueTaskName,
431
+ oldTaskStatus,
432
+ )
433
+
434
+ # set tasks to be assigned
435
+ def setScoutJobDataToTasks_JEDI(self, vo, prodSourceLabel):
436
+ with self.proxyPool.get() as proxy:
437
+ tmp_site_mapper = self.get_site_mapper()
438
+ return proxy.setScoutJobDataToTasks_JEDI(vo, prodSourceLabel, tmp_site_mapper)
439
+
440
+ # prepare tasks to be finished
441
+ def prepareTasksToBeFinished_JEDI(self, vo, prodSourceLabel, nTasks=50, simTasks=None, pid="lock", noBroken=False):
442
+ with self.proxyPool.get() as proxy:
443
+ tmp_site_mapper = self.get_site_mapper()
444
+ return proxy.prepareTasksToBeFinished_JEDI(vo, prodSourceLabel, nTasks, simTasks, pid, noBroken, tmp_site_mapper)
445
+
446
+ # get tasks to be assigned
447
+ def getTasksToAssign_JEDI(self, vo, prodSourceLabel, workQueue, resource_name):
448
+ with self.proxyPool.get() as proxy:
449
+ return proxy.getTasksToAssign_JEDI(vo, prodSourceLabel, workQueue, resource_name)
450
+
451
+ # get tasks to check task assignment
452
+ def getTasksToCheckAssignment_JEDI(self, vo, prodSourceLabel, workQueue, resource_name):
453
+ with self.proxyPool.get() as proxy:
454
+ return proxy.getTasksToCheckAssignment_JEDI(vo, prodSourceLabel, workQueue, resource_name)
455
+
456
+ # calculate RW with a priority
457
+ def calculateRWwithPrio_JEDI(self, vo, prodSourceLabel, workQueue, priority):
458
+ with self.proxyPool.get() as proxy:
459
+ return proxy.calculateRWwithPrio_JEDI(vo, prodSourceLabel, workQueue, priority)
460
+
461
+ # calculate RW for tasks
462
+ def calculateTaskRW_JEDI(self, jediTaskID):
463
+ with self.proxyPool.get() as proxy:
464
+ return proxy.calculateTaskRW_JEDI(jediTaskID)
465
+
466
+ # calculate WORLD RW with a priority
467
+ def calculateWorldRWwithPrio_JEDI(self, vo, prodSourceLabel, workQueue, priority):
468
+ with self.proxyPool.get() as proxy:
469
+ return proxy.calculateWorldRWwithPrio_JEDI(vo, prodSourceLabel, workQueue, priority)
470
+
471
+ # calculate WORLD RW for tasks
472
+ def calculateTaskWorldRW_JEDI(self, jediTaskID):
473
+ with self.proxyPool.get() as proxy:
474
+ return proxy.calculateTaskWorldRW_JEDI(jediTaskID)
475
+
476
+ # set cloud to tasks
477
+ def setCloudToTasks_JEDI(self, taskCloudMap):
478
+ with self.proxyPool.get() as proxy:
479
+ return proxy.setCloudToTasks_JEDI(taskCloudMap)
480
+
481
+ # get the list of tasks to exec command
482
+ def getTasksToExecCommand_JEDI(self, vo, prodSourceLabel):
483
+ with self.proxyPool.get() as proxy:
484
+ return proxy.getTasksToExecCommand_JEDI(vo, prodSourceLabel)
485
+
486
+ # get the list of PandaIDs for a task
487
+ def getPandaIDsWithTask_JEDI(self, jediTaskID, onlyActive):
488
+ with self.proxyPool.get() as proxy:
489
+ return proxy.getPandaIDsWithTask_JEDI(jediTaskID, onlyActive)
490
+
491
+ # get the list of queued PandaIDs for a task
492
+ def getQueuedPandaIDsWithTask_JEDI(self, jediTaskID):
493
+ with self.proxyPool.get() as proxy:
494
+ return proxy.getQueuedPandaIDsWithTask_JEDI(jediTaskID)
495
+
496
+ # get jediTaskID/datasetID/FileID with dataset and file names
497
+ def getIDsWithFileDataset_JEDI(self, datasetName, fileName, fileType):
498
+ with self.proxyPool.get() as proxy:
499
+ return proxy.getIDsWithFileDataset_JEDI(datasetName, fileName, fileType)
500
+
501
+ # get PandaID for a file
502
+ def getPandaIDWithFileID_JEDI(self, jediTaskID, datasetID, fileID):
503
+ with self.proxyPool.get() as proxy:
504
+ return proxy.getPandaIDWithFileID_JEDI(jediTaskID, datasetID, fileID)
505
+
506
+ # get JEDI files for a job
507
+ def getFilesWithPandaID_JEDI(self, pandaID):
508
+ with self.proxyPool.get() as proxy:
509
+ return proxy.getFilesWithPandaID_JEDI(pandaID)
510
+
511
+ # update task parameters
512
+ def updateTaskParams_JEDI(self, jediTaskID, taskParams):
513
+ with self.proxyPool.get() as proxy:
514
+ return proxy.updateTaskParams_JEDI(jediTaskID, taskParams)
515
+
516
+ # reactivate pending tasks
517
+ def reactivatePendingTasks_JEDI(self, vo, prodSourceLabel, timeLimit, timeoutLimit=None, minPriority=None):
518
+ with self.proxyPool.get() as proxy:
519
+ return proxy.reactivatePendingTasks_JEDI(vo, prodSourceLabel, timeLimit, timeoutLimit, minPriority)
520
+
521
+ # restart contents update
522
+ def restartTasksForContentsUpdate_JEDI(self, vo, prodSourceLabel, timeLimit=30):
523
+ with self.proxyPool.get() as proxy:
524
+ return proxy.restartTasksForContentsUpdate_JEDI(vo, prodSourceLabel, timeLimit=timeLimit)
525
+
526
+ # kick exhausted tasks
527
+ def kickExhaustedTasks_JEDI(self, vo, prodSourceLabel, timeLimit):
528
+ with self.proxyPool.get() as proxy:
529
+ return proxy.kickExhaustedTasks_JEDI(vo, prodSourceLabel, timeLimit)
530
+
531
+ # get file spec of lib.tgz
532
+ def get_previous_build_file_spec(self, jediTaskID, siteName, associatedSites):
533
+ with self.proxyPool.get() as proxy:
534
+ return proxy.get_previous_build_file_spec(jediTaskID, siteName, associatedSites)
535
+
536
+ # get file spec of old lib.tgz
537
+ def getOldBuildFileSpec_JEDI(self, jediTaskID, datasetID, fileID):
538
+ with self.proxyPool.get() as proxy:
539
+ return proxy.getOldBuildFileSpec_JEDI(jediTaskID, datasetID, fileID)
540
+
541
+ # insert lib dataset and files
542
+ def insertBuildFileSpec_JEDI(self, jobSpec, reusedDatasetID, simul):
543
+ with self.proxyPool.get() as proxy:
544
+ return proxy.insertBuildFileSpec_JEDI(jobSpec, reusedDatasetID, simul)
545
+
546
+ # get sites used by a task
547
+ def getSitesUsedByTask_JEDI(self, jediTaskID):
548
+ with self.proxyPool.get() as proxy:
549
+ return proxy.getSitesUsedByTask_JEDI(jediTaskID)
550
+
551
+ # get random seed
552
+ def getRandomSeed_JEDI(self, jediTaskID, simul, n_files=1):
553
+ with self.proxyPool.get() as proxy:
554
+ return proxy.getRandomSeed_JEDI(jediTaskID, simul, n_files)
555
+
556
+ # get preprocess metadata
557
+ def getPreprocessMetadata_JEDI(self, jediTaskID):
558
+ with self.proxyPool.get() as proxy:
559
+ return proxy.getPreprocessMetadata_JEDI(jediTaskID)
560
+
561
+ # get log dataset for preprocessing
562
+ def getPreproLog_JEDI(self, jediTaskID, simul):
563
+ with self.proxyPool.get() as proxy:
564
+ return proxy.getPreproLog_JEDI(jediTaskID, simul)
565
+
566
+ # get jobsetID
567
+ def getUserJobsetID_JEDI(self, userName):
568
+ with self.proxyPool.get() as proxy:
569
+ tmpJobID, tmpDummy, tmpStat = proxy.getUserParameter(userName, 1, None)
570
+ # return
571
+ return tmpStat, tmpJobID
572
+
573
+ # retry or incrementally execute a task
574
+ def retryTask_JEDI(
575
+ self,
576
+ jediTaskID,
577
+ commStr,
578
+ maxAttempt=5,
579
+ retryChildTasks=True,
580
+ discardEvents=False,
581
+ release_unstaged=False,
582
+ keep_share_priority=False,
583
+ ignore_hard_exhausted=False,
584
+ ):
585
+ with self.proxyPool.get() as proxy:
586
+ return proxy.retryTask_JEDI(
587
+ jediTaskID,
588
+ commStr,
589
+ maxAttempt,
590
+ retryChildTasks=retryChildTasks,
591
+ discardEvents=discardEvents,
592
+ release_unstaged=release_unstaged,
593
+ keep_share_priority=keep_share_priority,
594
+ ignore_hard_exhausted=ignore_hard_exhausted,
595
+ )
596
+
597
+ # append input datasets for incremental execution
598
+ def appendDatasets_JEDI(self, jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList):
599
+ with self.proxyPool.get() as proxy:
600
+ return proxy.appendDatasets_JEDI(jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList)
601
+
602
+ # record retry history
603
+ def recordRetryHistory_JEDI(self, jediTaskID, oldNewPandaIDs, relationType):
604
+ with self.proxyPool.get() as proxy:
605
+ return proxy.recordRetryHistory_JEDI(jediTaskID, oldNewPandaIDs, relationType)
606
+
607
+ # get JEDI tasks with a selection criteria
608
+ def getTasksWithCriteria_JEDI(
609
+ self,
610
+ vo,
611
+ prodSourceLabel,
612
+ taskStatusList,
613
+ taskCriteria={},
614
+ datasetCriteria={},
615
+ taskParamList=[],
616
+ datasetParamList=[],
617
+ taskLockColumn=None,
618
+ taskLockInterval=60,
619
+ ):
620
+ with self.proxyPool.get() as proxy:
621
+ return proxy.getTasksWithCriteria_JEDI(
622
+ vo, prodSourceLabel, taskStatusList, taskCriteria, datasetCriteria, taskParamList, datasetParamList, taskLockColumn, taskLockInterval
623
+ )
624
+
625
+ # check parent task status
626
+ def checkParentTask_JEDI(self, parent_task_id, jedi_task_id=None):
627
+ with self.proxyPool.get() as proxy:
628
+ return proxy.checkParentTask_JEDI(parent_task_id, jedi_task_id)
629
+
630
+ # get task status
631
+ def getTaskStatus_JEDI(self, jediTaskID):
632
+ with self.proxyPool.get() as proxy:
633
+ return proxy.getTaskStatus_JEDI(jediTaskID)
634
+
635
+ # get lib.tgz for waiting jobs
636
+ def getLibForWaitingRunJob_JEDI(self, vo, prodSourceLabel, checkInterval):
637
+ with self.proxyPool.get() as proxy:
638
+ return proxy.getLibForWaitingRunJob_JEDI(vo, prodSourceLabel, checkInterval)
639
+
640
+ # get tasks to get reassigned
641
+ def getTasksToReassign_JEDI(self, vo=None, prodSourceLabel=None):
642
+ with self.proxyPool.get() as proxy:
643
+ return proxy.getTasksToReassign_JEDI(vo, prodSourceLabel)
644
+
645
+ # kill child tasks
646
+ def killChildTasks_JEDI(self, jediTaskID, taskStatus):
647
+ with self.proxyPool.get() as proxy:
648
+ return proxy.killChildTasks_JEDI(jediTaskID, taskStatus)
649
+
650
+ # kick child tasks
651
+ def kickChildTasks_JEDI(self, jediTaskID):
652
+ with self.proxyPool.get() as proxy:
653
+ return proxy.kickChildTasks_JEDI(jediTaskID)
654
+
655
+ # lock task
656
+ def lockTask_JEDI(self, jediTaskID, pid):
657
+ with self.proxyPool.get() as proxy:
658
+ return proxy.lockTask_JEDI(jediTaskID, pid)
659
+
660
+ # get successful files
661
+ def getSuccessfulFiles_JEDI(self, jediTaskID, datasetID):
662
+ with self.proxyPool.get() as proxy:
663
+ return proxy.getSuccessfulFiles_JEDI(jediTaskID, datasetID)
664
+
665
+ # unlock a single task
666
+ def unlockSingleTask_JEDI(self, jediTaskID, pid):
667
+ with self.proxyPool.get() as proxy:
668
+ return proxy.unlockSingleTask_JEDI(jediTaskID, pid)
669
+
670
+ # throttle JEDI tasks
671
+ def throttleTasks_JEDI(self, vo, prodSourceLabel, waitTime):
672
+ with self.proxyPool.get() as proxy:
673
+ return proxy.throttleTasks_JEDI(vo, prodSourceLabel, waitTime)
674
+
675
+ # throttle a JEDI task
676
+ def throttleTask_JEDI(self, jediTaskID, waitTime, errorDialog):
677
+ with self.proxyPool.get() as proxy:
678
+ return proxy.throttleTask_JEDI(jediTaskID, waitTime, errorDialog)
679
+
680
+ # release throttled tasks
681
+ def releaseThrottledTasks_JEDI(self, vo, prodSourceLabel):
682
+ with self.proxyPool.get() as proxy:
683
+ return proxy.releaseThrottledTasks_JEDI(vo, prodSourceLabel)
684
+
685
+ # release a task with on-hold status
686
+ def release_task_on_hold(self, jedi_task_id, target_status=None):
687
+ with self.proxyPool.get() as proxy:
688
+ return proxy.release_task_on_hold(jedi_task_id, target_status)
689
+
690
+ # get throttled users
691
+ def getThrottledUsersTasks_JEDI(self, vo, prodSourceLabel):
692
+ with self.proxyPool.get() as proxy:
693
+ return proxy.getThrottledUsersTasks_JEDI(vo, prodSourceLabel)
694
+
695
+ # lock process
696
+ def lockProcess_JEDI(self, vo, prodSourceLabel, cloud, workqueue_id, resource_name, component, pid, forceOption=False, timeLimit=5):
697
+ with self.proxyPool.get() as proxy:
698
+ return proxy.lockProcess_JEDI(vo, prodSourceLabel, cloud, workqueue_id, resource_name, component, pid, forceOption, timeLimit)
699
+
700
+ # unlock process
701
+ def unlockProcess_JEDI(self, vo, prodSourceLabel, cloud, workqueue_id, resource_name, component, pid):
702
+ with self.proxyPool.get() as proxy:
703
+ return proxy.unlockProcess_JEDI(vo, prodSourceLabel, cloud, workqueue_id, resource_name, component, pid)
704
+
705
+ # unlock process with PID
706
+ def unlockProcessWithPID_JEDI(self, vo, prodSourceLabel, workqueue_id, resource_name, pid, useBase):
707
+ with self.proxyPool.get() as proxy:
708
+ return proxy.unlockProcessWithPID_JEDI(vo, prodSourceLabel, workqueue_id, resource_name, pid, useBase)
709
+
710
+ # check process lock
711
+ def checkProcessLock_JEDI(self, vo, prodSourceLabel, cloud, workqueue_id, resource_name, component, pid, checkBase):
712
+ with self.proxyPool.get() as proxy:
713
+ return proxy.checkProcessLock_JEDI(vo, prodSourceLabel, cloud, workqueue_id, resource_name, component, pid, checkBase)
714
+
715
+ # get JEDI tasks to be assessed
716
+ def getAchievedTasks_JEDI(self, vo, prodSourceLabel, timeLimit=60, nTasks=50):
717
+ with self.proxyPool.get() as proxy:
718
+ return proxy.getAchievedTasks_JEDI(vo, prodSourceLabel, timeLimit, nTasks)
719
+
720
+ # get tasks to take periodic action
721
+ def get_tasks_for_periodic_action(self, vo, prod_source_label, time_limit=12, n_tasks=100):
722
+ with self.proxyPool.get() as proxy:
723
+ return proxy.get_tasks_for_periodic_action(vo, prod_source_label, time_limit, n_tasks)
724
+
725
+ # get inactive sites
726
+ def getInactiveSites_JEDI(self, flag, timeLimit):
727
+ with self.proxyPool.get() as proxy:
728
+ return proxy.getInactiveSites_JEDI(flag, timeLimit)
729
+
730
+ # get total walltime
731
+ def getTotalWallTime_JEDI(self, vo, prodSourceLabel, workQueue, resource_name):
732
+ with self.proxyPool.get() as proxy:
733
+ return proxy.getTotalWallTime_JEDI(vo, prodSourceLabel, workQueue, resource_name)
734
+
735
+ # check duplication with internal merge
736
+ def checkDuplication_JEDI(self, jediTaskID):
737
+ with self.proxyPool.get() as proxy:
738
+ return proxy.checkDuplication_JEDI(jediTaskID)
739
+
740
+ # get network metrics for brokerage
741
+ def getNetworkMetrics(self, dst, keyList):
742
+ with self.proxyPool.get() as proxy:
743
+ return proxy.getNetworkMetrics(dst, keyList)
744
+
745
+ # get nuclei that have built up a long backlog
746
+ def getBackloggedNuclei(self):
747
+ with self.proxyPool.get() as proxy:
748
+ return proxy.getBackloggedNuclei()
749
+
750
+ # get network metrics for brokerage
751
+ def getPandaSiteToOutputStorageSiteMapping(self):
752
+ with self.proxyPool.get() as proxy:
753
+ return proxy.getPandaSiteToOutputStorageSiteMapping()
754
+
755
+ # get failure counts for a task
756
+ def getFailureCountsForTask_JEDI(self, jediTaskID, timeWindow):
757
+ with self.proxyPool.get() as proxy:
758
+ return proxy.getFailureCountsForTask_JEDI(jediTaskID, timeWindow)
759
+
760
+ # count the number of queued jobs per user or working group
761
+
762
+ def countJobsPerTarget_JEDI(self, target, is_user):
763
+ with self.proxyPool.get() as proxy:
764
+ return proxy.countJobsPerTarget_JEDI(target, is_user)
765
+
766
+ # get old merge job PandaIDs
767
+ def getOldMergeJobPandaIDs_JEDI(self, jediTaskID, pandaID):
768
+ with self.proxyPool.get() as proxy:
769
+ return proxy.getOldMergeJobPandaIDs_JEDI(jediTaskID, pandaID)
770
+
771
+ # get active jumbo jobs for a task
772
+ def getActiveJumboJobs_JEDI(self, jediTaskID):
773
+ with self.proxyPool.get() as proxy:
774
+ return proxy.getActiveJumboJobs_JEDI(jediTaskID)
775
+
776
+ # get jobParams of the first job
777
+ def getJobParamsOfFirstJob_JEDI(self, jediTaskID):
778
+ with self.proxyPool.get() as proxy:
779
+ return proxy.getJobParamsOfFirstJob_JEDI(jediTaskID)
780
+
781
+ # bulk fetch fileIDs
782
+ def bulkFetchFileIDs_JEDI(self, jediTaskID, nIDs):
783
+ with self.proxyPool.get() as proxy:
784
+ return proxy.bulkFetchFileIDs_JEDI(jediTaskID, nIDs)
785
+
786
+ # set del flag to events
787
+ def setDelFlagToEvents_JEDI(self, jediTaskID):
788
+ with self.proxyPool.get() as proxy:
789
+ return proxy.setDelFlagToEvents_JEDI(jediTaskID)
790
+
791
+ # set del flag to events
792
+ def removeFilesIndexInconsistent_JEDI(self, jediTaskID, datasetIDs):
793
+ with self.proxyPool.get() as proxy:
794
+ return proxy.removeFilesIndexInconsistent_JEDI(jediTaskID, datasetIDs)
795
+
796
+ # throttle jobs in pauses tasks
797
+ def throttleJobsInPausedTasks_JEDI(self, vo, prodSourceLabel):
798
+ with self.proxyPool.get() as proxy:
799
+ return proxy.throttleJobsInPausedTasks_JEDI(vo, prodSourceLabel)
800
+
801
+ # set useJumbo flag
802
+ def setUseJumboFlag_JEDI(self, jediTaskID, statusStr):
803
+ with self.proxyPool.get() as proxy:
804
+ return proxy.setUseJumboFlag_JEDI(jediTaskID, statusStr)
805
+
806
+ # get number of tasks with running jumbo jobs
807
+ def getNumTasksWithRunningJumbo_JEDI(self, vo, prodSourceLabel, cloudName, workqueue):
808
+ with self.proxyPool.get() as proxy:
809
+ return proxy.getNumTasksWithRunningJumbo_JEDI(vo, prodSourceLabel, cloudName, workqueue)
810
+
811
+ # get number of unprocessed events
812
+ def getNumUnprocessedEvents_JEDI(self, vo, prodSourceLabel, criteria, neg_criteria):
813
+ with self.proxyPool.get() as proxy:
814
+ return proxy.getNumUnprocessedEvents_JEDI(vo, prodSourceLabel, criteria, neg_criteria)
815
+
816
+ # get number of jobs for a task
817
+ def getNumJobsForTask_JEDI(self, jediTaskID):
818
+ with self.proxyPool.get() as proxy:
819
+ return proxy.getNumJobsForTask_JEDI(jediTaskID)
820
+
821
+ # get number map for standby jobs
822
+ def getNumMapForStandbyJobs_JEDI(self, workqueue):
823
+ with self.proxyPool.get() as proxy:
824
+ return proxy.getNumMapForStandbyJobs_JEDI(workqueue)
825
+
826
+ # update datasets to finish a task
827
+ def updateDatasetsToFinishTask_JEDI(self, jediTaskID, lockedBy):
828
+ with self.proxyPool.get() as proxy:
829
+ return proxy.updateDatasetsToFinishTask_JEDI(jediTaskID, lockedBy)
830
+
831
+ # get tasks with jumbo jobs
832
+ def getTaskWithJumbo_JEDI(self, vo, prodSourceLabel):
833
+ with self.proxyPool.get() as proxy:
834
+ return proxy.getTaskWithJumbo_JEDI(vo, prodSourceLabel)
835
+
836
+ # kick pending tasks with jumbo jobs
837
+ def kickPendingTasksWithJumbo_JEDI(self, jediTaskID):
838
+ with self.proxyPool.get() as proxy:
839
+ return proxy.kickPendingTasksWithJumbo_JEDI(jediTaskID)
840
+
841
+ # reset input to re-generate co-jumbo jobs
842
+ def resetInputToReGenCoJumbo_JEDI(self, jediTaskID):
843
+ with self.proxyPool.get() as proxy:
844
+ return proxy.resetInputToReGenCoJumbo_JEDI(jediTaskID)
845
+
846
+ # get averaged disk IO
847
+ def getAvgDiskIO_JEDI(self):
848
+ with self.proxyPool.get() as proxy:
849
+ return proxy.getAvgDiskIO_JEDI()
850
+
851
+ # update input files stage-in done (according to message from iDDS, called by other methods, etc.)
852
+ def updateInputFilesStaged_JEDI(self, jeditaskid, scope, filenames_dict, chunk_size=500, by=None, check_scope=True):
853
+ with self.proxyPool.get() as proxy:
854
+ return proxy.updateInputFilesStaged_JEDI(jeditaskid, scope, filenames_dict, chunk_size, by, check_scope)
855
+
856
+ # update input datasets stage-in done (according to message from iDDS, called by other methods, etc.)
857
+ def updateInputDatasetsStaged_JEDI(self, jeditaskid, scope, dsnames_dict, use_commit=True, by=None):
858
+ with self.proxyPool.get() as proxy:
859
+ return proxy.updateInputDatasetsStaged_JEDI(jeditaskid, scope, dsnames_dict, use_commit, by)
860
+
861
+ # get number of staging files
862
+ def getNumStagingFiles_JEDI(self, jeditaskid):
863
+ with self.proxyPool.get() as proxy:
864
+ return proxy.getNumStagingFiles_JEDI(jeditaskid)
865
+
866
+ # get usage breakdown by users and sites
867
+ def getUsageBreakdown_JEDI(self, prod_source_label="user"):
868
+ with self.proxyPool.get() as proxy:
869
+ return proxy.getUsageBreakdown_JEDI(prod_source_label)
870
+
871
+ # get jobs stat of each user
872
+ def getUsersJobsStats_JEDI(self, prod_source_label="user"):
873
+ with self.proxyPool.get() as proxy:
874
+ return proxy.getUsersJobsStats_JEDI(prod_source_label)
875
+
876
+ # insert HPO pseudo event according to message from idds
877
+ def insertHpoEventAboutIdds_JEDI(self, jedi_task_id, event_id_list):
878
+ with self.proxyPool.get() as proxy:
879
+ return proxy.insertHpoEventAboutIdds_JEDI(jedi_task_id, event_id_list)
880
+
881
+ # get event statistics
882
+ def get_event_statistics(self, jedi_task_id):
883
+ with self.proxyPool.get() as proxy:
884
+ return proxy.get_event_statistics(jedi_task_id)
885
+
886
+ # get site to-running rate statistics by global share
887
+ def getSiteToRunRateStats(self, vo, exclude_rwq, starttime_min, starttime_max):
888
+ with self.proxyPool.get() as proxy:
889
+ return proxy.getSiteToRunRateStats(vo, exclude_rwq, starttime_min, starttime_max)
890
+
891
+ # update cache
892
+ def updateCache_JEDI(self, main_key, sub_key, data):
893
+ with self.proxyPool.get() as proxy:
894
+ return proxy.updateCache_JEDI(main_key, sub_key, data)
895
+
896
+ # get cache
897
+ def getCache_JEDI(self, main_key, sub_key):
898
+ with self.proxyPool.get() as proxy:
899
+ return proxy.getCache_JEDI(main_key, sub_key)
900
+
901
+ # get cache
902
+ def extendSandboxLifetime_JEDI(self, jedi_taskid, file_name):
903
+ with self.proxyPool.get() as proxy:
904
+ return proxy.extendSandboxLifetime_JEDI(jedi_taskid, file_name)
905
+
906
+ # turn a task into pending status for some reason
907
+ def makeTaskPending_JEDI(self, jedi_taskid, reason="unknown"):
908
+ with self.proxyPool.get() as proxy:
909
+ return proxy.makeTaskPending_JEDI(jedi_taskid, reason)
910
+
911
+ # query tasks and turn them into pending status for some reason, sql_query should query jeditaskid
912
+ def queryTasksToBePending_JEDI(self, sql_query, params_map, reason):
913
+ with self.proxyPool.get() as proxy:
914
+ return proxy.queryTasksToBePending_JEDI(sql_query, params_map, reason)
915
+
916
+ # get IDs of all datasets of input and lib, to update data locality records
917
+ def get_tasks_inputdatasets_JEDI(self, vo):
918
+ with self.proxyPool.get() as proxy:
919
+ return proxy.get_tasks_inputdatasets_JEDI(vo)
920
+
921
+ # update dataset locality
922
+ def updateDatasetLocality_JEDI(self, jedi_taskid, datasetid, rse):
923
+ with self.proxyPool.get() as proxy:
924
+ return proxy.updateDatasetLocality_JEDI(jedi_taskid, datasetid, rse)
925
+
926
+ # delete outdated dataset locality records
927
+ def deleteOutdatedDatasetLocality_JEDI(self, before_timestamp):
928
+ with self.proxyPool.get() as proxy:
929
+ return proxy.deleteOutdatedDatasetLocality_JEDI(before_timestamp)
930
+
931
+ # query tasks and preassign them to dedicate workqueue, sql_query should query jeditaskid
932
+ def queryTasksToPreassign_JEDI(self, sql_query, params_map, site, blacklist=set(), limit=1):
933
+ with self.proxyPool.get() as proxy:
934
+ return proxy.queryTasksToPreassign_JEDI(sql_query, params_map, site, blacklist, limit)
935
+
936
+ # close and reassign N jobs of a preassigned task
937
+ def reassignJobsInPreassignedTask_JEDI(self, jedi_taskid, site, n_jobs_to_close):
938
+ with self.proxyPool.get() as proxy:
939
+ return proxy.reassignJobsInPreassignedTask_JEDI(jedi_taskid, site, n_jobs_to_close)
940
+
941
+ # undo preassigned tasks
942
+ def undoPreassignedTasks_JEDI(self, jedi_taskids, task_orig_attr_map, params_map, force=False):
943
+ with self.proxyPool.get() as proxy:
944
+ return proxy.undoPreassignedTasks_JEDI(jedi_taskids, task_orig_attr_map, params_map, force)
945
+
946
+ # set missing files according to iDDS messages
947
+ def setMissingFilesAboutIdds_JEDI(self, jeditaskid, filenames_dict):
948
+ with self.proxyPool.get() as proxy:
949
+ return proxy.setMissingFilesAboutIdds_JEDI(jeditaskid, filenames_dict)
950
+
951
+ # set missing files according to iDDS messages
952
+ def load_sw_map(self):
953
+ with self.proxyPool.get() as proxy:
954
+ return proxy.load_sw_map()
955
+
956
+ # get origin datasets
957
+ def get_origin_datasets(self, jedi_task_id, dataset_name, lfns):
958
+ with self.proxyPool.get() as proxy:
959
+ return proxy.get_origin_datasets(jedi_task_id, dataset_name, lfns)
960
+
961
+ # push message to message processors which triggers functions of agents
962
+ def push_task_trigger_message(self, msg_type, jedi_task_id, data_dict=None, priority=None, task_spec=None):
963
+ with self.proxyPool.get() as proxy:
964
+ return proxy.push_task_trigger_message(msg_type, jedi_task_id, data_dict, priority, task_spec)
965
+
966
+ # aggregate carbon footprint of a task
967
+ def get_task_carbon_footprint(self, jedi_task_id, level="global"):
968
+ with self.proxyPool.get() as proxy:
969
+ return proxy.get_task_carbon_footprint(jedi_task_id, level)
970
+
971
+ # get pending data carousel tasks and their input datasets
972
+ def get_pending_dc_tasks_JEDI(self, task_type="prod", time_limit_minutes=60):
973
+ with self.proxyPool.get() as proxy:
974
+ return proxy.get_pending_dc_tasks_JEDI(task_type=task_type, time_limit_minutes=time_limit_minutes)
975
+
976
+ # get max number of events in a file of the dataset
977
+ def get_max_events_in_dataset(self, jedi_task_id, dataset_id):
978
+ with self.proxyPool.get() as proxy:
979
+ return proxy.get_max_events_in_dataset(jedi_task_id, dataset_id)
980
+
981
+ # get task failure metrics
982
+ def get_task_failure_metrics(self, jedi_task_id):
983
+ with self.proxyPool.get() as proxy:
984
+ return proxy.get_task_failure_metrics(jedi_task_id)