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,280 @@
1
+ import traceback
2
+
3
+ from pandacommon.pandalogger.LogWrapper import LogWrapper
4
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
5
+
6
+ from pandaserver.workflow.step_handler_plugins.base_step_handler import BaseStepHandler
7
+ from pandaserver.workflow.workflow_base import (
8
+ WFStepSpec,
9
+ WFStepStatus,
10
+ WFStepTargetCancelResult,
11
+ WFStepTargetCheckResult,
12
+ WFStepTargetSubmitResult,
13
+ WFStepType,
14
+ )
15
+
16
+ # main logger
17
+ logger = PandaLogger().getLogger(__name__.split(".")[-1])
18
+
19
+
20
+ class PandaTaskStepHandler(BaseStepHandler):
21
+ """
22
+ Handler for PanDA task steps in the workflow.
23
+ This class is responsible for managing the execution of PanDA tasks within a workflow.
24
+ """
25
+
26
+ def __init__(self, *args, **kwargs):
27
+ """
28
+ Initialize the step handler with necessary parameters.
29
+ """
30
+ # Initialize base class or any required modules here
31
+ super().__init__(*args, **kwargs)
32
+ # plugin flavor
33
+ self.plugin_flavor = "panda_task"
34
+
35
+ def submit_target(self, step_spec: WFStepSpec, **kwargs) -> WFStepTargetSubmitResult:
36
+ """
37
+ Submit a target for processing the PanDA task step.
38
+ This method should be implemented to handle the specifics of PanDA task submission.
39
+
40
+ Args:
41
+ step_spec (WFStepSpec): The workflow step specification containing details about the step to be processed.
42
+ **kwargs: Additional keyword arguments that may be required for submission.
43
+
44
+ Returns:
45
+ WFStepTargetSubmitResult: An object containing the result of the submission, including success status, target ID (task ID), and message.
46
+ """
47
+ tmp_log = LogWrapper(logger, f"submit_target workflow_id={step_spec.workflow_id} step_id={step_spec.step_id}")
48
+ # Initialize
49
+ submit_result = WFStepTargetSubmitResult()
50
+ # Check step flavor
51
+ if step_spec.flavor != self.plugin_flavor:
52
+ tmp_log.warning(f"flavor={step_spec.flavor} not {self.plugin_flavor}; skipped")
53
+ submit_result.message = f"flavor not {self.plugin_flavor}; skipped"
54
+ return submit_result
55
+ ...
56
+ # task_param_map = {}
57
+ # task_param_map["taskName"] = step_spec.name
58
+ # task_param_map["userName"] = workflow_spec.username
59
+ # task_param_map["vo"] = "atlas"
60
+ # task_param_map["taskPriority"] = 1000
61
+ # # task_param_map["architecture"] = "i686-slc5-gcc43-opt"
62
+ # # task_param_map["transUses"] = "Atlas-17.2.7"
63
+ # task_param_map["transUses"] = None
64
+ # # task_param_map["transHome"] = "AtlasProduction-17.2.8.10"
65
+ # task_param_map["transHome"] = None
66
+ # task_param_map["transPath"] = "runGen-00-00-02"
67
+ # task_param_map["processingType"] = "reco"
68
+ # task_param_map["prodSourceLabel"] = "user"
69
+ # # task_param_map["prodSourceLabel"] = "managed"
70
+ # task_param_map["taskType"] = "anal"
71
+ # # task_param_map["taskType"] = "prod"
72
+ # task_param_map["inputPreStaging"] = True
73
+ # # task_param_map["panda_data_carousel"] = True
74
+ # task_param_map["remove_rule_when_done"] = True
75
+ # # task_param_map["workingGroup"] = "AP_Higgs"
76
+ # task_param_map["coreCount"] = 1
77
+ # task_param_map["nFiles"] = 1
78
+ # # task_param_map["cloud"] = "US"
79
+ # logDatasetName = f"panda.jeditest.log.{uuid.uuid4()}"
80
+ # task_param_map["log"] = {
81
+ # "dataset": logDatasetName,
82
+ # "type": "template",
83
+ # "param_type": "log",
84
+ # "token": "ATLASDATADISK",
85
+ # "value": f"{logDatasetName}.${{SN}}.log.tgz",
86
+ # }
87
+ # outDatasetName = f"panda.jeditest.NTUP_EMBLLDN.{uuid.uuid4()}"
88
+ # task_param_map["jobParameters"] = [
89
+ # {
90
+ # "type": "template",
91
+ # "param_type": "input",
92
+ # "value": "inputAODFile=${IN}",
93
+ # "dataset": "mc23_13p6TeV:mc23_13p6TeV.602027.PhH7EG_NLO_LQ_S43_ResProd_lam22_5000_3p5.merge.AOD.e8531_e8528_s4162_s4114_r14622_r14663_tid34033945_00",
94
+ # "expand": True,
95
+ # },
96
+ # {"type": "template", "param_type": "pseudo_input", "value": "dummy_value", "dataset": "pseudo_dataset"},
97
+ # {"type": "constant", "value": "AMITag=p1462"},
98
+ # {
99
+ # "type": "template",
100
+ # "param_type": "output",
101
+ # "token": "ATLASDATADISK",
102
+ # "value": f"outputNTUP_EMBLLDNFile={outDatasetName}.${{SN}}.pool.root",
103
+ # "dataset": outDatasetName,
104
+ # },
105
+ # ]
106
+ try:
107
+ # Get step definition
108
+ step_definition = step_spec.definition_json_map
109
+ user_name = step_definition.get("user_name")
110
+ user_dn = step_definition.get("user_dn")
111
+ task_param_map = step_definition.get("task_params", {})
112
+ # task_param_map["userName"] = user_name
113
+ if not step_spec.get_parameter("all_inputs_complete"):
114
+ # Some inputs are not complete, set workflowHoldup to True to hold up the workflow until released by workflow processor
115
+ task_param_map["workflowHoldup"] = True
116
+ # Submit task
117
+ tmp_ret_flag, temp_ret_val = self.tbif.insertTaskParamsPanda(task_param_map, user_dn, False, decode=False)
118
+ if tmp_ret_flag:
119
+ submit_result.success = True
120
+ submit_result.target_id = str(temp_ret_val)
121
+ tmp_log.info(f"Submitted task target_id={submit_result.target_id}")
122
+ else:
123
+ submit_result.message = temp_ret_val
124
+ tmp_log.error(f"Failed to submit task: {submit_result.message}")
125
+ except Exception as e:
126
+ submit_result.message = f"exception {str(e)}"
127
+ tmp_log.error(f"Failed to submit task: {traceback.format_exc()}")
128
+ return submit_result
129
+
130
+ def check_target(self, step_spec: WFStepSpec, **kwargs) -> WFStepTargetCheckResult:
131
+ """
132
+ Check the status of a submitted target for the given step.
133
+ This method should be implemented to handle the specifics of status checking.
134
+
135
+ Args:
136
+ step_spec (WFStepSpec): The workflow step specification containing details about the step to be processed.
137
+ **kwargs: Additional keyword arguments that may be required for status checking.
138
+
139
+ Returns:
140
+ WFStepTargetCheckResult: An object containing the result of the status check, including success status, step status, native status, and message.
141
+ """
142
+ tmp_log = LogWrapper(logger, f"check_target workflow_id={step_spec.workflow_id} step_id={step_spec.step_id}")
143
+ allowed_step_statuses = [WFStepStatus.starting, WFStepStatus.running]
144
+ try:
145
+ # Initialize
146
+ check_result = WFStepTargetCheckResult()
147
+ # Check preconditions
148
+ if step_spec.status not in allowed_step_statuses:
149
+ check_result.message = f"not in status to check; skipped"
150
+ tmp_log.warning(f"status={step_spec.status} not in status to check; skipped")
151
+ return check_result
152
+ if step_spec.flavor != self.plugin_flavor:
153
+ check_result.message = f"flavor not {self.plugin_flavor}; skipped"
154
+ tmp_log.warning(f"flavor={step_spec.flavor} not {self.plugin_flavor}; skipped")
155
+ return check_result
156
+ if step_spec.target_id is None:
157
+ check_result.message = f"target_id is None; skipped"
158
+ tmp_log.warning(f"target_id is None; skipped")
159
+ return check_result
160
+ # Get task ID and status
161
+ task_id = int(step_spec.target_id)
162
+ res = self.tbif.getTaskStatusSuperstatus(task_id)
163
+ if not res:
164
+ check_result.message = f"task_id={task_id} not found"
165
+ tmp_log.error(f"{check_result.message}")
166
+ return check_result
167
+ # Interpret status
168
+ task_status = res[0]
169
+ task_superstatus = res[1]
170
+ check_result.success = True
171
+ check_result.native_status = task_status
172
+ if task_status in ["running", "scouting", "scouted", "throttled", "prepared", "finishing", "passed"]:
173
+ check_result.step_status = WFStepStatus.running
174
+ elif task_status in ["defined", "assigned", "activated", "starting", "ready"]:
175
+ check_result.step_status = WFStepStatus.starting
176
+ elif task_status in ["pending"]:
177
+ # Check superstatus for repetitive status (e.g. pending) to distinguish between starting and running
178
+ if task_superstatus in ["running"]:
179
+ check_result.step_status = WFStepStatus.running
180
+ else:
181
+ check_result.step_status = WFStepStatus.starting
182
+ elif task_status in ["done", "finished"]:
183
+ check_result.step_status = WFStepStatus.done
184
+ elif task_status in ["failed", "exhausted", "aborted", "toabort", "aborting", "broken", "tobroken"]:
185
+ check_result.step_status = WFStepStatus.failed
186
+ else:
187
+ check_result.success = False
188
+ check_result.message = f"unknown task_status {task_status}"
189
+ tmp_log.error(f"{check_result.message}")
190
+ return check_result
191
+ tmp_log.info(f"Got task_id={task_id} task_status={task_status}")
192
+ except Exception as e:
193
+ check_result.success = False
194
+ check_result.message = f"exception {str(e)}"
195
+ tmp_log.error(f"Failed to check status: {traceback.format_exc()}")
196
+ return check_result
197
+
198
+ def on_all_inputs_done(self, step_spec: WFStepSpec, **kwargs) -> None:
199
+ """
200
+ Hook method called when all inputs for the step are done.
201
+ For PanDA task steps, unset workflowHoldup of the target task to allow it to proceed.
202
+
203
+ Args:
204
+ step_spec (WFStepSpec): The workflow step specification containing details about the step.
205
+ **kwargs: Additional keyword arguments.
206
+ """
207
+ tmp_log = LogWrapper(logger, f"on_all_inputs_done workflow_id={step_spec.workflow_id} step_id={step_spec.step_id}")
208
+ try:
209
+ # Check step flavor
210
+ if step_spec.flavor != self.plugin_flavor:
211
+ tmp_log.warning(f"flavor={step_spec.flavor} not {self.plugin_flavor}; skipped")
212
+ return
213
+ if step_spec.target_id is None:
214
+ tmp_log.warning(f"target_id is None; skipped")
215
+ return
216
+ # Get task ID
217
+ task_id = int(step_spec.target_id)
218
+ # Get task spec
219
+ _, task_spec = self.tbif.getTaskWithID_JEDI(task_id)
220
+ if task_spec is None:
221
+ tmp_log.error(f"task_id={task_id} not found; skipped")
222
+ return
223
+ # Unset workflowHoldup and release the task
224
+ if task_spec.is_workflow_holdup():
225
+ task_spec.set_workflow_holdup(False)
226
+ self.tbif.updateTask_JEDI(task_spec, {"jediTaskID": task_spec.jediTaskID})
227
+ tmp_log.info(f"task_id={task_id} unset workflowHoldup")
228
+ if task_spec.status == "pending":
229
+ tmp_ret = self.tbif.release_task_on_hold(task_id)
230
+ if not tmp_ret:
231
+ tmp_log.error(f"task_id={task_id} failed to release from pending")
232
+ else:
233
+ tmp_log.info(f"task_id={task_id} released from pending")
234
+ # Done
235
+ tmp_log.debug(f"Done")
236
+ except Exception as e:
237
+ tmp_log.error(f"Failed with: {traceback.format_exc()}")
238
+
239
+ def cancel_target(self, step_spec, **kwargs) -> WFStepTargetCancelResult:
240
+ """
241
+ Cancel the target task for the given step.
242
+ This method should be implemented to handle the specifics of task cancellation.
243
+
244
+ Args:
245
+ step_spec (WFStepSpec): The workflow step specification containing details about the step to be processed.
246
+ **kwargs: Additional keyword arguments that may be required for cancellation.
247
+
248
+ Returns:
249
+ WFStepTargetCancelResult: An object containing the result of the cancellation, including success status and message.
250
+ """
251
+ tmp_log = LogWrapper(logger, f"cancel_target workflow_id={step_spec.workflow_id} step_id={step_spec.step_id}")
252
+ cancel_result = WFStepTargetCancelResult()
253
+ try:
254
+ # Check step flavor
255
+ if step_spec.flavor != self.plugin_flavor:
256
+ cancel_result.message = f"flavor not {self.plugin_flavor}; skipped"
257
+ tmp_log.warning(f"flavor={step_spec.flavor} not {self.plugin_flavor}; skipped")
258
+ return cancel_result
259
+ if step_spec.target_id is None:
260
+ # If target_id is None, consider it as already cancelled since there is no task to cancel
261
+ cancel_result.success = True
262
+ cancel_result.message = f"target_id is None so considered already cancelled; skipped"
263
+ tmp_log.debug(f"{cancel_result.message}")
264
+ return cancel_result
265
+ # Get task ID
266
+ task_id = int(step_spec.target_id)
267
+ # Cancel task
268
+ ret_val, ret_str = self.tbif.sendCommandTaskPanda(task_id, "PanDA Task Step Handler cancel_target", True, "kill", properErrorCode=True)
269
+ # check if ok
270
+ if ret_val == 0:
271
+ cancel_result.success = True
272
+ tmp_log.info(f"target_id={step_spec.target_id} cancelled")
273
+ else:
274
+ cancel_result.success = False
275
+ cancel_result.message = f"failed to cancel the task: error_code={ret_val} {ret_str}"
276
+ tmp_log.warning(f"{cancel_result.message}")
277
+ except Exception as e:
278
+ cancel_result.message = f"exception {str(e)}"
279
+ tmp_log.error(f"Failed to cancel task: {traceback.format_exc()}")
280
+ return cancel_result