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,531 @@
1
+ import json
2
+ from collections import namedtuple
3
+ from dataclasses import MISSING, InitVar, asdict, dataclass, field
4
+ from datetime import datetime, timedelta
5
+ from typing import Any, Dict, List
6
+
7
+ # from pandacommon.pandalogger.PandaLogger import PandaLogger
8
+ from pandacommon.pandautils.base import SpecBase
9
+
10
+ from pandaserver.config import panda_config
11
+
12
+ # main logger
13
+ # logger = PandaLogger().getLogger(__name__.split(".")[-1])
14
+
15
+ # named tuple for attribute with type
16
+ AttributeWithType = namedtuple("AttributeWithType", ["attribute", "type"])
17
+
18
+
19
+ # ==== Status of Entities ======================================
20
+
21
+
22
+ class WorkflowStatus(object):
23
+ """
24
+ Class to define the status of workflows
25
+ """
26
+
27
+ registered = "registered"
28
+ parsed = "parsed"
29
+ checking = "checking"
30
+ checked = "checked"
31
+ starting = "starting"
32
+ running = "running"
33
+ done = "done"
34
+ failed = "failed"
35
+ cancelled = "cancelled"
36
+
37
+ active_statuses = (registered, parsed, checking, checked, starting, running)
38
+ final_statuses = (done, failed, cancelled)
39
+ transient_statuses = (parsed, checking, checked, starting)
40
+
41
+
42
+ class WFStepStatus(object):
43
+ """
44
+ Class to define the status of workflow steps
45
+ """
46
+
47
+ registered = "registered"
48
+ checking = "checking"
49
+ checked_true = "checked_true"
50
+ checked_false = "checked_false"
51
+ pending = "pending"
52
+ ready = "ready"
53
+ starting = "starting"
54
+ running = "running"
55
+ done = "done"
56
+ failed = "failed"
57
+ closed = "closed"
58
+ cancelled = "cancelled"
59
+
60
+ checked_statuses = (checked_true, checked_false)
61
+ to_advance_step_statuses = (registered, checking, checked_true, checked_false, pending, ready, starting)
62
+ after_starting_statuses = (running, done, failed, cancelled)
63
+ after_starting_uninterrupted_statuses = (running, done, failed)
64
+ after_running_statuses = (done, failed, cancelled)
65
+ final_statuses = (done, failed, closed, cancelled)
66
+ transient_statuses = (checked_true, checked_false, ready)
67
+
68
+
69
+ class WFDataStatus(object):
70
+ """
71
+ Class to define the status of workflow data
72
+ """
73
+
74
+ registered = "registered"
75
+ checking = "checking"
76
+ checked_nonexist = "checked_nonexist" # data does not exist
77
+ checked_insuffi = "checked_insuffi" # data available but insufficient to be step input
78
+ checked_suffice = "checked_suffice" # data partially available and sufficient to be step input
79
+ checked_complete = "checked_complete" # data completely available
80
+ binding = "binding" # data being bound to a step to generate
81
+ generating_bound = "generating_bound"
82
+ generating_insuffi = "generating_insuffi"
83
+ generating_suffice = "generating_suffice"
84
+ waiting_insuffi = "waiting_insuffi"
85
+ waiting_suffice = "waiting_suffice"
86
+ done_generated = "done_generated"
87
+ done_waited = "done_waited"
88
+ done_skipped = "done_skipped"
89
+ cancelled = "cancelled"
90
+ retired = "retired"
91
+
92
+ checked_statuses = (checked_nonexist, checked_insuffi, checked_suffice, checked_complete)
93
+ generating_statuses = (generating_bound, generating_insuffi, generating_suffice)
94
+ waiting_statuses = (waiting_insuffi, waiting_suffice)
95
+ done_statuses = (done_generated, done_waited, done_skipped)
96
+ good_input_statuses = (generating_suffice, waiting_suffice, done_generated, done_waited, done_skipped)
97
+ good_output_statuses = (done_generated, done_waited, done_skipped)
98
+ after_generating_bound_statuses = (generating_suffice, done_generated, cancelled)
99
+ after_generating_suffice_statuses = (done_generated, cancelled)
100
+ after_waiting_suffice_statuses = (done_waited, cancelled)
101
+ terminated_statuses = (done_generated, done_waited, done_skipped, cancelled, retired)
102
+ nonreusable_statuses = (cancelled, retired)
103
+ transient_statuses = (checked_nonexist, checked_insuffi, checked_suffice, checked_complete)
104
+
105
+
106
+ # ==== Types ===================================================
107
+
108
+
109
+ class WFStepType(object):
110
+ """
111
+ Class to define the types of workflow steps
112
+ """
113
+
114
+ ...
115
+ ordinary = "ordinary"
116
+
117
+
118
+ class WFDataType(object):
119
+ """
120
+ Class to define the types of workflow data
121
+ """
122
+
123
+ input = "input"
124
+ output = "output"
125
+ mid = "mid"
126
+
127
+
128
+ # ==== Specifications ==========================================
129
+
130
+
131
+ class WorkflowBaseSpec(SpecBase):
132
+ """
133
+ Base class for workflow related specifications
134
+ """
135
+
136
+ @property
137
+ def parameter_map(self) -> dict:
138
+ """
139
+ Get the dictionary parsed by the parameters attribute in JSON
140
+ Possible parameters:
141
+ ...
142
+
143
+ Returns:
144
+ dict : dict of parameters if it is JSON or empty dict if null
145
+ """
146
+ if self.parameters is None:
147
+ return {}
148
+ else:
149
+ return json.loads(self.parameters)
150
+
151
+ @parameter_map.setter
152
+ def parameter_map(self, value_map: dict):
153
+ """
154
+ Set the dictionary and store in parameters attribute in JSON
155
+
156
+ Args:
157
+ value_map (dict): dict to set the parameter map
158
+ """
159
+ self.parameters = json.dumps(value_map)
160
+
161
+ def get_parameter(self, param: str) -> Any:
162
+ """
163
+ Get the value of one parameter. None as default
164
+
165
+ Args:
166
+ param (str): parameter name
167
+
168
+ Returns:
169
+ Any : value of the parameter; None if parameter not set
170
+ """
171
+ tmp_dict = self.parameter_map
172
+ return tmp_dict.get(param)
173
+
174
+ def set_parameter(self, param: str, value):
175
+ """
176
+ Set the value of one parameter and store in parameters attribute in JSON
177
+
178
+ Args:
179
+ param (str): parameter name
180
+ value (Any): value of the parameter to set; must be JSON-serializable
181
+ """
182
+ tmp_dict = self.parameter_map
183
+ tmp_dict[param] = value
184
+ self.parameter_map = tmp_dict
185
+
186
+ def update_parameters(self, params: dict):
187
+ """
188
+ Update values of parameters with a dict and store in parameters attribute in JSON
189
+
190
+ Args:
191
+ params (dict): dict of parameter names and values to set
192
+ """
193
+ tmp_dict = self.parameter_map
194
+ tmp_dict.update(params)
195
+ self.parameter_map = tmp_dict
196
+
197
+
198
+ class WorkflowSpec(WorkflowBaseSpec):
199
+ """
200
+ Workflow specification
201
+ """
202
+
203
+ # attributes with types
204
+ attributes_with_types = (
205
+ AttributeWithType("workflow_id", int),
206
+ AttributeWithType("name", str),
207
+ AttributeWithType("parent_id", int),
208
+ AttributeWithType("loop_count", int),
209
+ AttributeWithType("status", str),
210
+ AttributeWithType("prodsourcelabel", str),
211
+ AttributeWithType("username", str),
212
+ AttributeWithType("creation_time", datetime),
213
+ AttributeWithType("start_time", datetime),
214
+ AttributeWithType("end_time", datetime),
215
+ AttributeWithType("modification_time", datetime),
216
+ AttributeWithType("check_time", datetime),
217
+ AttributeWithType("locked_by", str),
218
+ AttributeWithType("lock_time", datetime),
219
+ AttributeWithType("raw_request_json", str),
220
+ AttributeWithType("definition_json", str),
221
+ AttributeWithType("parameters", str),
222
+ )
223
+ # attributes
224
+ attributes = tuple([attr.attribute for attr in attributes_with_types])
225
+ # attributes which have 0 by default
226
+ _zeroAttrs = ()
227
+ # attributes to force update
228
+ _forceUpdateAttrs = ()
229
+ # mapping between sequence and attr
230
+ _seqAttrMap = {"workflow_id": f"{panda_config.schemaJEDI}.WORKFLOW_ID_SEQ.nextval"}
231
+
232
+ @property
233
+ def raw_request_json_map(self) -> dict:
234
+ """
235
+ Get the dictionary parsed by raw_request_json attribute in JSON
236
+
237
+ Returns:
238
+ dict : dict of raw_request_json if it is JSON or empty dict if null
239
+ """
240
+ if self.raw_request_json is None:
241
+ return {}
242
+ else:
243
+ return json.loads(self.raw_request_json)
244
+
245
+ @raw_request_json_map.setter
246
+ def raw_request_json_map(self, value_map: dict):
247
+ """
248
+ Set the dictionary and store in raw_request_json attribute in JSON
249
+
250
+ Args:
251
+ value_map (dict): dict to set the raw_request_json map
252
+ """
253
+ self.raw_request_json = json.dumps(value_map)
254
+
255
+ @property
256
+ def definition_json_map(self) -> dict:
257
+ """
258
+ Get the dictionary parsed by definition_json attribute in JSON
259
+
260
+ Returns:
261
+ dict : dict of definition_json if it is JSON or empty dict if null
262
+ """
263
+ if self.definition_json is None:
264
+ return {}
265
+ else:
266
+ return json.loads(self.definition_json)
267
+
268
+ @definition_json_map.setter
269
+ def definition_json_map(self, value_map: dict):
270
+ """
271
+ Set the dictionary and store in definition_json attribute in JSON
272
+
273
+ Args:
274
+ value_map (dict): dict to set the definition_json map
275
+ """
276
+ self.definition_json = json.dumps(value_map)
277
+
278
+
279
+ class WFStepSpec(WorkflowBaseSpec):
280
+ """
281
+ Workflow Step specification
282
+ """
283
+
284
+ # attributes with types
285
+ attributes_with_types = (
286
+ AttributeWithType("step_id", int),
287
+ AttributeWithType("name", str),
288
+ AttributeWithType("workflow_id", int),
289
+ AttributeWithType("member_id", int),
290
+ AttributeWithType("type", str),
291
+ AttributeWithType("status", str),
292
+ AttributeWithType("flavor", str),
293
+ AttributeWithType("target_id", str),
294
+ AttributeWithType("creation_time", datetime),
295
+ AttributeWithType("start_time", datetime),
296
+ AttributeWithType("end_time", datetime),
297
+ AttributeWithType("modification_time", datetime),
298
+ AttributeWithType("check_time", datetime),
299
+ AttributeWithType("locked_by", str),
300
+ AttributeWithType("lock_time", datetime),
301
+ AttributeWithType("definition_json", str),
302
+ AttributeWithType("parameters", str),
303
+ )
304
+ # attributes
305
+ attributes = tuple([attr.attribute for attr in attributes_with_types])
306
+ # attributes which have 0 by default
307
+ _zeroAttrs = ()
308
+ # attributes to force update
309
+ _forceUpdateAttrs = ()
310
+ # mapping between sequence and attr
311
+ _seqAttrMap = {"step_id": f"{panda_config.schemaJEDI}.WORKFLOW_STEP_ID_SEQ.nextval"}
312
+
313
+ @property
314
+ def definition_json_map(self) -> dict:
315
+ """
316
+ Get the dictionary parsed by definition_json attribute in JSON
317
+
318
+ Returns:
319
+ dict : dict of definition_json if it is JSON or empty dict if null
320
+ """
321
+ if self.definition_json is None:
322
+ return {}
323
+ else:
324
+ return json.loads(self.definition_json)
325
+
326
+ @definition_json_map.setter
327
+ def definition_json_map(self, value_map: dict):
328
+ """
329
+ Set the dictionary and store in definition_json attribute in JSON
330
+
331
+ Args:
332
+ value_map (dict): dict to set the definition_json map
333
+ """
334
+ self.definition_json = json.dumps(value_map)
335
+
336
+
337
+ class WFDataSpec(WorkflowBaseSpec):
338
+ """
339
+ Workflow Data specification
340
+ """
341
+
342
+ # attributes with types
343
+ attributes_with_types = (
344
+ AttributeWithType("data_id", int),
345
+ AttributeWithType("name", str),
346
+ AttributeWithType("workflow_id", int),
347
+ AttributeWithType("source_step_id", int),
348
+ AttributeWithType("type", str),
349
+ AttributeWithType("status", str),
350
+ AttributeWithType("flavor", str),
351
+ AttributeWithType("target_id", str),
352
+ AttributeWithType("creation_time", datetime),
353
+ AttributeWithType("start_time", datetime),
354
+ AttributeWithType("end_time", datetime),
355
+ AttributeWithType("modification_time", datetime),
356
+ AttributeWithType("check_time", datetime),
357
+ AttributeWithType("locked_by", str),
358
+ AttributeWithType("lock_time", datetime),
359
+ AttributeWithType("metadata", str),
360
+ AttributeWithType("parameters", str),
361
+ )
362
+ # attributes
363
+ attributes = tuple([attr.attribute for attr in attributes_with_types])
364
+ # attributes which have 0 by default
365
+ _zeroAttrs = ()
366
+ # attributes to force update
367
+ _forceUpdateAttrs = ()
368
+ # mapping between sequence and attr
369
+ _seqAttrMap = {"data_id": f"{panda_config.schemaJEDI}.WORKFLOW_DATA_ID_SEQ.nextval"}
370
+
371
+ @property
372
+ def metadata_map(self) -> dict:
373
+ """
374
+ Get the dictionary parsed by metadata attribute in JSON
375
+
376
+ Returns:
377
+ dict : dict of metadata if it is JSON or empty dict if null
378
+ """
379
+ if self.metadata is None:
380
+ return {}
381
+ else:
382
+ return json.loads(self.metadata)
383
+
384
+ @metadata_map.setter
385
+ def metadata_map(self, value_map: dict):
386
+ """
387
+ Set the dictionary and store in metadata attribute in JSON
388
+
389
+ Args:
390
+ value_map (dict): dict to set the metadata map
391
+ """
392
+ self.metadata = json.dumps(value_map)
393
+
394
+
395
+ # === Return objects of core methods which process status ======
396
+
397
+
398
+ @dataclass(slots=True)
399
+ class WFDataProcessResult:
400
+ """
401
+ Result of processing data.
402
+
403
+ Fields:
404
+ success (bool | None): Indicates if the processing was successful.
405
+ new_status (WFDataStatus | None): The new status of the data after processing, None if no change.
406
+ message (str): A message providing additional information about the processing result.
407
+ """
408
+
409
+ success: bool | None = None
410
+ new_status: WFDataStatus | None = None
411
+ message: str = ""
412
+
413
+
414
+ @dataclass(slots=True)
415
+ class WFStepProcessResult:
416
+ """
417
+ Result of processing a step.
418
+
419
+ Fields:
420
+ success (bool | None): Indicates if the processing was successful.
421
+ new_status (WFStepStatus | None): The new status of the step after processing, None if no change.
422
+ message (str): A message providing additional information about the processing result.
423
+ """
424
+
425
+ success: bool | None = None
426
+ new_status: WFStepStatus | None = None
427
+ message: str = ""
428
+
429
+
430
+ @dataclass(slots=True)
431
+ class WorkflowProcessResult:
432
+ """
433
+ Result of processing a workflow.
434
+
435
+ Fields:
436
+ success (bool | None): Indicates if the processing was successful.
437
+ new_status (WorkflowStatus | None): The new status of the workflow after processing, None if no change.
438
+ message (str): A message providing additional information about the processing result.
439
+ """
440
+
441
+ success: bool | None = None
442
+ new_status: WorkflowStatus | None = None
443
+ message: str = ""
444
+
445
+
446
+ # === Return objects of step handler methods ===================
447
+
448
+
449
+ @dataclass(slots=True)
450
+ class WFStepTargetSubmitResult:
451
+ """
452
+ Result of submitting a target of a step.
453
+
454
+ Fields:
455
+ success (bool | None): Indicates if the submission was successful.
456
+ target_id (str | None): The ID of the submitted target (e.g., task ID).
457
+ message (str): A message providing additional information about the submission result.
458
+ """
459
+
460
+ success: bool | None = None
461
+ target_id: str | None = None
462
+ message: str = ""
463
+
464
+
465
+ @dataclass(slots=True)
466
+ class WFStepTargetCheckResult:
467
+ """
468
+ Result of checking the status of a submitted target.
469
+
470
+ Fields:
471
+ success (bool | None): Indicates if the status check was successful.
472
+ status (WFStepStatus | None): The status of the step to move to.
473
+ native_status (str | None): The native status string from the target system.
474
+ message (str): A message providing additional information about the status check result.
475
+ """
476
+
477
+ success: bool | None = None
478
+ step_status: WFStepStatus | None = None
479
+ native_status: str | None = None
480
+ message: str = ""
481
+
482
+
483
+ @dataclass(slots=True)
484
+ class WFStepTargetCancelResult:
485
+ """
486
+ Result of cancelling a target of a step.
487
+
488
+ Fields:
489
+ success (bool | None): Indicates if the cancellation was successful.
490
+ target_id (str | None): The ID of the cancelled target (e.g., task ID).
491
+ message (str): A message providing additional information about the cancellation result.
492
+ """
493
+
494
+ success: bool | None = None
495
+ target_id: str | None = None
496
+ message: str = ""
497
+
498
+
499
+ # ==== Return objects of data handler methods ==================
500
+
501
+
502
+ class WFDataTargetCheckStatus:
503
+ """
504
+ Possible statuses returned by data target check
505
+ """
506
+
507
+ complete = "complete" # data completely exists
508
+ suffice = "suffice" # data partially exists and suffices to be step input
509
+ insuffi = "insuffi" # data partially exists but is insufficient to be step input
510
+ nonexist = "nonexist" # data does not exist
511
+
512
+
513
+ @dataclass(slots=True)
514
+ class WFDataTargetCheckResult:
515
+ """
516
+ Result of checking the status of a data target.
517
+
518
+ Fields:
519
+ success (bool | None): Indicates if the status check was successful.
520
+ check_status (WFDataTargetCheckStatus | None): The status of the data target.
521
+ metadata (dict | None): The native metadata from the target system.
522
+ message (str): A message providing additional information about the status check result.
523
+ """
524
+
525
+ success: bool | None = None
526
+ check_status: WFDataTargetCheckStatus | None = None
527
+ metadata: dict | None = None
528
+ message: str = ""
529
+
530
+
531
+ # ==============================================================