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
File without changes
File without changes
@@ -0,0 +1,48 @@
1
+ from pandaserver.workflow.workflow_base import (
2
+ WFDataSpec,
3
+ WFDataStatus,
4
+ WFDataTargetCheckResult,
5
+ WFDataType,
6
+ WFStepSpec,
7
+ WFStepStatus,
8
+ WFStepTargetCheckResult,
9
+ WFStepTargetSubmitResult,
10
+ WFStepType,
11
+ WorkflowSpec,
12
+ WorkflowStatus,
13
+ )
14
+
15
+
16
+ class BaseDataHandler:
17
+ """
18
+ Base class for data handlers in the workflow system.
19
+ This class provides a common interface and some utility methods for data handlers.
20
+ """
21
+
22
+ def __init__(self, task_buffer, ddm_if, *args, **kwargs):
23
+ """
24
+ Initialize the step handler with necessary parameters.
25
+
26
+ Args:
27
+ task_buffer: The task buffer interface to interact with the task database.
28
+ ddm_if: The DDM interface to interact with the DDM system.
29
+ *args: Additional positional arguments.
30
+ **kwargs: Additional keyword arguments.
31
+ """
32
+ self.tbif = task_buffer
33
+ self.ddm_if = ddm_if
34
+
35
+ def check_target(self, data_spec: WFDataSpec, **kwargs) -> WFDataTargetCheckResult:
36
+ """
37
+ Check the status of the data target.
38
+ This method should be implemented by subclasses to handle the specifics of data target status checking.
39
+ This method should NOT modify data_spec. Any update information should be stored in the WFStepTargetCheckResult returned instead.
40
+
41
+ Args:
42
+ data_spec (WFDataSpec): The data specification to check.
43
+ **kwargs: Additional keyword arguments.
44
+
45
+ Returns:
46
+ WFDataTargetCheckResult: The result of the target check.
47
+ """
48
+ raise NotImplementedError("Subclasses must implement this method.")
@@ -0,0 +1,100 @@
1
+ import json
2
+ import traceback
3
+ import uuid
4
+
5
+ from pandacommon.pandalogger.LogWrapper import LogWrapper
6
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
7
+
8
+ from pandaserver.workflow.data_handler_plugins.base_data_handler import BaseDataHandler
9
+ from pandaserver.workflow.workflow_base import (
10
+ WFDataSpec,
11
+ WFDataStatus,
12
+ WFDataTargetCheckResult,
13
+ WFDataTargetCheckStatus,
14
+ WFDataType,
15
+ WFStepSpec,
16
+ WFStepStatus,
17
+ WFStepType,
18
+ WorkflowSpec,
19
+ WorkflowStatus,
20
+ )
21
+
22
+ # main logger
23
+ logger = PandaLogger().getLogger(__name__.split(".")[-1])
24
+
25
+
26
+ class DDMCollectionDIDType:
27
+ """
28
+ Data Identifier Types for DDM Collections
29
+ """
30
+
31
+ DATASET = "DATASET"
32
+ CONTAINER = "CONTAINER"
33
+
34
+
35
+ class DDMCollectionState:
36
+ """
37
+ States for DDM Collections
38
+ """
39
+
40
+ open = "open"
41
+ closed = "closed"
42
+ missing = "missing"
43
+
44
+
45
+ class DDMCollectionDataHandler(BaseDataHandler):
46
+ """
47
+ Handler for DDM collection data in the workflow.
48
+ This class is responsible for managing the DDM collection data within a workflow.
49
+ """
50
+
51
+ def __init__(self, *args, **kwargs):
52
+ """
53
+ Initialize the data handler with necessary parameters.
54
+ """
55
+ # Initialize base class or any required modules here
56
+ super().__init__(*args, **kwargs)
57
+ self.plugin_flavor = "ddm_collection"
58
+
59
+ def check_target(self, data_spec: WFDataSpec, **kwargs) -> WFDataTargetCheckResult:
60
+ """
61
+ Check the status of the DDM collection data target.
62
+ This method should be implemented to handle the specifics of DDM collection data status checking.
63
+
64
+ Args:
65
+ data_spec (WFDataSpec): The data specification containing details about the data to be checked.
66
+ **kwargs: Additional keyword arguments that may be required for checking.
67
+
68
+ Returns:
69
+ WFDataTargetCheckResult: An object containing the result of the check, including success status, current data status, and message.
70
+ """
71
+ tmp_log = LogWrapper(logger, f"check_target workflow_id={data_spec.workflow_id} data_id={data_spec.data_id}")
72
+ # Initialize
73
+ check_result = WFDataTargetCheckResult()
74
+ # Check data flavor
75
+ if data_spec.flavor != self.plugin_flavor:
76
+ tmp_log.warning(f"flavor={data_spec.flavor} not {self.plugin_flavor}; skipped")
77
+ check_result.message = f"flavor not {self.plugin_flavor}; skipped"
78
+ return check_result
79
+ # Check DDM collection status
80
+ collection = data_spec.target_id
81
+ collection_meta = self.ddm_if.get_dataset_metadata(collection, ignore_missing=True)
82
+ if collection_meta is None:
83
+ check_result.success = False
84
+ check_result.message = f"Failed to get metadata for collection {collection}"
85
+ tmp_log.error(f"{check_result.message}")
86
+ return check_result
87
+ match collection_meta.get("state"):
88
+ case DDMCollectionState.missing:
89
+ check_result.check_status = WFDataTargetCheckStatus.nonexist
90
+ case DDMCollectionState.open:
91
+ if collection_meta.get("length", 0) == 0:
92
+ check_result.check_status = WFDataTargetCheckStatus.insuffi
93
+ else:
94
+ check_result.check_status = WFDataTargetCheckStatus.suffice
95
+ case DDMCollectionState.closed:
96
+ check_result.check_status = WFDataTargetCheckStatus.complete
97
+ check_result.metadata = collection_meta
98
+ check_result.success = True
99
+ tmp_log.info(f"Got collection {collection} check_status={check_result.check_status}")
100
+ return check_result
@@ -0,0 +1,140 @@
1
+ import json
2
+ import traceback
3
+ import uuid
4
+
5
+ from pandacommon.pandalogger.LogWrapper import LogWrapper
6
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
7
+
8
+ from pandaserver.workflow.data_handler_plugins.base_data_handler import BaseDataHandler
9
+ from pandaserver.workflow.workflow_base import (
10
+ WFDataSpec,
11
+ WFDataStatus,
12
+ WFDataTargetCheckResult,
13
+ WFDataTargetCheckStatus,
14
+ WFDataType,
15
+ WFStepSpec,
16
+ WFStepStatus,
17
+ WFStepType,
18
+ WorkflowSpec,
19
+ WorkflowStatus,
20
+ )
21
+
22
+ # Whether to consider partial data (e.g. some files in DDM collection) as sufficient for step input
23
+ PARTIAL_DATA_SUFFICE = False
24
+
25
+ # main logger
26
+ logger = PandaLogger().getLogger(__name__.split(".")[-1])
27
+
28
+
29
+ class DDMCollectionDIDType:
30
+ """
31
+ Data Identifier Types for DDM Collections
32
+ """
33
+
34
+ DATASET = "DATASET"
35
+ CONTAINER = "CONTAINER"
36
+
37
+
38
+ class DDMCollectionState:
39
+ """
40
+ States for DDM Collections
41
+ """
42
+
43
+ open = "open"
44
+ closed = "closed"
45
+ missing = "missing"
46
+
47
+
48
+ class PandaTaskDataHandler(BaseDataHandler):
49
+ """
50
+ Handler for PanDA task intermediate/output data in the workflow.
51
+ This class is responsible for managing the data generated by PanDA task within a workflow.
52
+ The output data from a PanDA task is usually a DDM container, which remains open even after the task completion.
53
+ Thus, the handler not only checks the status of the DDM collection to determine if there are files available, but also verifies the step status of source workflow steps to ensure that the data generation process has been completed successfully.
54
+ """
55
+
56
+ def __init__(self, *args, **kwargs):
57
+ """
58
+ Initialize the data handler with necessary parameters.
59
+ """
60
+ # Initialize base class or any required modules here
61
+ super().__init__(*args, **kwargs)
62
+ self.plugin_flavor = "panda_task"
63
+
64
+ def check_target(self, data_spec: WFDataSpec, **kwargs) -> WFDataTargetCheckResult:
65
+ """
66
+ Check the status of the PanDA task data target.
67
+ This method should be implemented to handle the specifics of PanDA task data status checking.
68
+
69
+ Args:
70
+ data_spec (WFDataSpec): The data specification containing details about the data to be checked.
71
+ **kwargs: Additional keyword arguments that may be required for checking.
72
+
73
+ Returns:
74
+ WFDataTargetCheckResult: An object containing the result of the check, including success status, current data status, and message.
75
+ """
76
+ tmp_log = LogWrapper(logger, f"check_target workflow_id={data_spec.workflow_id} data_id={data_spec.data_id}")
77
+ # Initialize
78
+ check_result = WFDataTargetCheckResult()
79
+ # Check data flavor
80
+ if data_spec.flavor != self.plugin_flavor:
81
+ tmp_log.warning(f"flavor={data_spec.flavor} not {self.plugin_flavor}; skipped")
82
+ check_result.message = f"flavor not {self.plugin_flavor}; skipped"
83
+ return check_result
84
+ # Check source step status
85
+ if data_spec.source_step_id is not None:
86
+ source_step_spec = self.tbif.get_workflow_step(data_spec.source_step_id)
87
+ if source_step_spec is None:
88
+ check_result.success = False
89
+ check_result.message = f"Failed to get source step step_id={data_spec.source_step_id}; skipped"
90
+ tmp_log.error(f"{check_result.message}")
91
+ return check_result
92
+ if source_step_spec.status == WFStepStatus.done:
93
+ # Source step done; consider data fully available
94
+ check_result.success = True
95
+ check_result.check_status = WFDataTargetCheckStatus.complete
96
+ tmp_log.info(f"Source step step_id={source_step_spec.step_id} done, data considered fully available; check_status={check_result.check_status}")
97
+ return check_result
98
+ elif source_step_spec.status in WFStepStatus.final_statuses:
99
+ # Source step in final status but not done; skip data availability
100
+ check_result.success = True
101
+ check_result.message = f"Source step step_id={source_step_spec.step_id} {source_step_spec.status}; skip data availability check"
102
+ tmp_log.warning(f"{check_result.message}")
103
+ return check_result
104
+ else:
105
+ tmp_log.info(f"Source step step_id={source_step_spec.step_id} status={source_step_spec.status}; checking data availability")
106
+ else:
107
+ tmp_log.info("No source step yet; checking data availability")
108
+ # Without source step or source step not terminated; check number of files in DDM collections
109
+ total_n_files = 0
110
+ none_exist = True
111
+ output_types = data_spec.get_parameter("output_types")
112
+ if output_types is None:
113
+ output_types = []
114
+ for output_type in output_types:
115
+ collection = f"{data_spec.target_id}_{output_type}"
116
+ tmp_stat, tmp_res = self.ddm_if.get_number_of_files(collection)
117
+ if tmp_stat is None:
118
+ tmp_log.debug(f"Collection {collection} does not exist")
119
+ elif not tmp_stat:
120
+ # Error in getting number of files
121
+ check_result.success = False
122
+ check_result.message = f"Failed to get number of files for collection {collection}: {tmp_res}"
123
+ tmp_log.error(f"{check_result.message}")
124
+ return check_result
125
+ else:
126
+ none_exist = False
127
+ n_files = tmp_res
128
+ total_n_files += n_files
129
+ tmp_log.debug(f"Got collection {collection} n_files={n_files}")
130
+ # Check number of files
131
+ if none_exist:
132
+ check_result.check_status = WFDataTargetCheckStatus.nonexist
133
+ elif PARTIAL_DATA_SUFFICE and total_n_files > 0:
134
+ # At least 1 file for step input
135
+ check_result.check_status = WFDataTargetCheckStatus.suffice
136
+ else:
137
+ check_result.check_status = WFDataTargetCheckStatus.insuffi
138
+ check_result.success = True
139
+ tmp_log.info(f"Got total_n_files={total_n_files}; check_status={check_result.check_status}")
140
+ return check_result
@@ -0,0 +1,122 @@
1
+ import logging
2
+ import sys
3
+
4
+ from pandaserver.workflow.pcwl_utils import parse_workflow_file, resolve_nodes
5
+ from pandaserver.workflow.workflow_utils import (
6
+ convert_nodes_to_workflow,
7
+ dump_nodes,
8
+ get_node_id_map,
9
+ set_workflow_outputs,
10
+ )
11
+ from ruamel import yaml
12
+
13
+ logging.basicConfig(format="%(asctime)s - %(levelname)s - %(message)s", level=logging.DEBUG)
14
+ with open(sys.argv[2]) as f:
15
+ data = yaml.safe_load(f) or dict()
16
+ nodes, root_in = parse_workflow_file(sys.argv[1], logging)
17
+ s_id, t_nodes, nodes = resolve_nodes(nodes, root_in, data, 0, set(), sys.argv[3], logging)
18
+ set_workflow_outputs(nodes)
19
+ id_map = get_node_id_map(nodes)
20
+ # task template
21
+ template = {
22
+ "buildSpec": {
23
+ "jobParameters": "-i ${IN} -o ${OUT} --sourceURL ${SURL} " "-r ./ --useAthenaPackages --useCMake --cmtConfig x86_64-slc6-gcc49-opt ",
24
+ "archiveName": "sources.5bca61db-3b0d-4e65-b102-7d56d82f4567.tar.gz",
25
+ "prodSourceLabel": "panda",
26
+ },
27
+ "sourceURL": "https://aipanda047.cern.ch:25443",
28
+ "cliParams": "prun --exec ls --useAthenaPackages --outDS user.tmaeno.4586bbc2-e891-441b-a9f4-4a9ceb9a9f8d",
29
+ "site": None,
30
+ "vo": "atlas",
31
+ "respectSplitRule": True,
32
+ "osInfo": "Linux-3.10.0-1160.36.2.el7.x86_64-x86_64-with-centos-7.9.2009-Core",
33
+ "log": {
34
+ "type": "template",
35
+ "param_type": "log",
36
+ "container": "user.tmaeno.4586bbc2-e891-441b-a9f4-4a9ceb9a9f8d.log/",
37
+ "value": "user.tmaeno.4586bbc2-e891-441b-a9f4-4a9ceb9a9f8d.log.$JEDITASKID.${SN}.log.tgz",
38
+ "dataset": "user.tmaeno.4586bbc2-e891-441b-a9f4-4a9ceb9a9f8d.log/",
39
+ },
40
+ "transUses": "Atlas-21.0.6",
41
+ "excludedSite": [],
42
+ "nMaxFilesPerJob": 200,
43
+ "uniqueTaskName": True,
44
+ "taskName": "user.tmaeno.4586bbc2-e891-441b-a9f4-4a9ceb9a9f8d/",
45
+ "transHome": "AnalysisTransforms",
46
+ "includedSite": None,
47
+ "jobParameters": [
48
+ {"type": "constant", "value": '-j "" --sourceURL ${SURL}'},
49
+ {"type": "constant", "value": "-r ./"},
50
+ {"padding": False, "type": "constant", "value": '-p "'},
51
+ {"padding": False, "type": "constant", "value": "ls"},
52
+ {"type": "constant", "value": '"'},
53
+ {"type": "constant", "value": "-l ${LIB}"},
54
+ {
55
+ "type": "constant",
56
+ "value": "--useAthenaPackages " "--useCMake --cmtConfig x86_64-slc6-gcc49-opt ",
57
+ },
58
+ ],
59
+ "prodSourceLabel": "user",
60
+ "processingType": "panda-client-1.4.81-jedi-run",
61
+ "architecture": "x86_64-slc6-gcc49-opt@centos7",
62
+ }
63
+
64
+
65
+ c_template = {
66
+ "sourceURL": "https://aipanda048.cern.ch:25443",
67
+ "cliParams": "prun --cwl test.cwl --yaml a.yaml " "--relayHost aipanda059.cern.ch --outDS " "user.tmaeno.1f2860f0-30d6-4352-9f87-9b9dde82fd80",
68
+ "site": None,
69
+ "vo": "atlas",
70
+ "respectSplitRule": True,
71
+ "osInfo": "Linux-3.10.0-1160.36.2.el7.x86_64-x86_64-with-centos-7.9.2009-Core",
72
+ "log": {
73
+ "type": "template",
74
+ "param_type": "log",
75
+ "container": "user.tmaeno.1f2860f0-30d6-4352-9f87-9b9dde82fd80.log/",
76
+ "value": "user.tmaeno.1f2860f0-30d6-4352-9f87-9b9dde82fd80.log.$JEDITASKID.${SN}.log.tgz",
77
+ "dataset": "user.tmaeno.1f2860f0-30d6-4352-9f87-9b9dde82fd80.log/",
78
+ },
79
+ "transUses": "",
80
+ "excludedSite": [],
81
+ "nMaxFilesPerJob": 200,
82
+ "uniqueTaskName": True,
83
+ "taskName": "user.tmaeno.1f2860f0-30d6-4352-9f87-9b9dde82fd80/",
84
+ "transHome": None,
85
+ "includedSite": None,
86
+ "container_name": "__dummy_container__",
87
+ "multiStepExec": {
88
+ "preprocess": {"args": "--preprocess ${TRF_ARGS}", "command": "${TRF}"},
89
+ "containerOptions": {
90
+ "containerImage": "__dummy_container__",
91
+ "containerExec": 'echo "=== cat exec script ==="; ' "cat __run_main_exec.sh; echo; " 'echo "=== exec script ==="; ' "/bin/sh __run_main_exec.sh",
92
+ },
93
+ "postprocess": {"args": "--postprocess ${TRF_ARGS}", "command": "${TRF}"},
94
+ },
95
+ "jobParameters": [
96
+ {"type": "constant", "value": '-j "" --sourceURL ${SURL}'},
97
+ {"type": "constant", "value": "-r ."},
98
+ {"padding": False, "type": "constant", "value": '-p "'},
99
+ {"padding": False, "type": "constant", "value": "__dummy_exec_str__"},
100
+ {"type": "constant", "value": '"'},
101
+ {
102
+ "type": "constant",
103
+ "value": "-a jobO.b6bdf294-8a46-4b02-b399-46619db4088b.tar.gz",
104
+ },
105
+ ],
106
+ "prodSourceLabel": "user",
107
+ "processingType": "panda-client-1.4.81-jedi-run",
108
+ "architecture": "",
109
+ }
110
+
111
+ task_template = {"athena": template, "container": c_template}
112
+
113
+ [node.resolve_params(task_template, id_map) for node in nodes]
114
+ print(dump_nodes(nodes))
115
+
116
+ workflow, dump_str_list = convert_nodes_to_workflow(nodes)
117
+ print("".join(dump_str_list))
118
+
119
+ for node in nodes:
120
+ s, o = node.verify()
121
+ if not s:
122
+ print(f"Verification error in ID:{node.id} {o}")