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,175 @@
1
+ """
2
+ Resource type specification for JEDI
3
+
4
+ """
5
+
6
+ from . import JobUtils
7
+
8
+ HIMEM_THRESHOLD = 2000 # MB per core
9
+ BASIC_RESOURCE_TYPE = "SCORE"
10
+
11
+
12
+ class ResourceSpecMapper(object):
13
+ def __init__(self, resource_types):
14
+ """
15
+ :param resource_types: list of ResourceSpec objects
16
+ """
17
+ self.resource_types = resource_types
18
+
19
+ def is_single_core(self, resource_name):
20
+ for resource_type in self.resource_types:
21
+ if resource_type.resource_name == resource_name:
22
+ return resource_type.is_single_core()
23
+ return False
24
+
25
+ def is_multi_core(self, resource_name):
26
+ for resource_type in self.resource_types:
27
+ if resource_type.resource_name == resource_name:
28
+ return resource_type.is_multi_core()
29
+ return False
30
+
31
+ def is_high_memory(self, resource_name, memory_threshold=HIMEM_THRESHOLD):
32
+ for resource_type in self.resource_types:
33
+ if resource_type.resource_name == resource_name:
34
+ if resource_type.maxrampercore is None or resource_type.maxrampercore > memory_threshold:
35
+ return True
36
+ return False
37
+
38
+ def translate_resourcetype_to_cores(self, resource_name, cores_queue):
39
+ # if the resource type is multi-core, return the number of cores in the queue
40
+ if self.is_multi_core(resource_name):
41
+ return cores_queue
42
+
43
+ return 1
44
+
45
+ def filter_out_high_memory_resourcetypes(self, memory_threshold=HIMEM_THRESHOLD):
46
+ resource_names = list(
47
+ map(
48
+ lambda resource_type: resource_type.resource_name,
49
+ filter(lambda resource_type: not self.is_high_memory(resource_type.resource_name, memory_threshold=memory_threshold), self.resource_types),
50
+ )
51
+ )
52
+ return resource_names
53
+
54
+
55
+ class ResourceSpec(object):
56
+ # attributes
57
+ attributes = (
58
+ "resource_name",
59
+ "mincore",
60
+ "maxcore",
61
+ "minrampercore",
62
+ "maxrampercore",
63
+ )
64
+
65
+ def __init__(self, resource_name, mincore, maxcore, minrampercore, maxrampercore):
66
+ object.__setattr__(self, "resource_name", resource_name)
67
+ object.__setattr__(self, "mincore", mincore)
68
+ object.__setattr__(self, "maxcore", maxcore)
69
+ object.__setattr__(self, "minrampercore", minrampercore)
70
+ object.__setattr__(self, "maxrampercore", maxrampercore)
71
+
72
+ def match_task(self, task_spec):
73
+ return self.match_task_basic(
74
+ task_spec.coreCount,
75
+ task_spec.ramCount,
76
+ task_spec.baseRamCount,
77
+ task_spec.ramUnit,
78
+ )
79
+
80
+ def match_task_basic(self, corecount, ramcount, base_ramcount, ram_unit):
81
+ # Default parameters
82
+ if corecount is None: # corecount None is also used for 1
83
+ corecount = 1
84
+ elif corecount == 0: # corecount 0 means it can be anything. We will use 8 as a standard MCORE default
85
+ corecount = 8
86
+
87
+ if ramcount is None:
88
+ ramcount = 0
89
+
90
+ if base_ramcount is None:
91
+ base_ramcount = 0
92
+
93
+ # check min cores
94
+ if self.mincore is not None and corecount < self.mincore:
95
+ return False
96
+
97
+ # check max cores
98
+ if self.maxcore is not None and corecount > self.maxcore:
99
+ return False
100
+
101
+ if ram_unit in ("MBPerCore", "MBPerCoreFixed"):
102
+ ram_per_core = (ramcount * corecount + base_ramcount) / corecount
103
+ else:
104
+ ram_per_core = (ramcount + base_ramcount) / corecount
105
+ ram_per_core = JobUtils.compensate_ram_count(ram_per_core)
106
+
107
+ # check min ram
108
+ if self.minrampercore is not None and ram_per_core < self.minrampercore:
109
+ return False
110
+
111
+ # check max ram
112
+ if self.maxrampercore is not None and ram_per_core > self.maxrampercore:
113
+ return False
114
+
115
+ return True
116
+
117
+ def match_job(self, job_spec):
118
+ # Default parameters
119
+ if job_spec.coreCount in (None, "NULL"): # corecount None is also used for 1
120
+ corecount = 1
121
+ elif job_spec.coreCount == 0: # corecount 0 means it can be anything. We will use 8 as a standard MCORE default
122
+ corecount = 8
123
+ else:
124
+ corecount = job_spec.coreCount
125
+
126
+ if job_spec.minRamCount in (
127
+ None,
128
+ "NULL",
129
+ ): # jobs come with ram already pre-calculated and in MB
130
+ ramcount = 0
131
+ else:
132
+ ramcount = job_spec.minRamCount
133
+
134
+ # check min cores
135
+ if self.mincore is not None and corecount < self.mincore:
136
+ return False
137
+
138
+ # check max cores
139
+ if self.maxcore is not None and corecount > self.maxcore:
140
+ return False
141
+
142
+ # We assume ram unit is always MB
143
+ ram_per_core = round(ramcount / corecount)
144
+ # check min ram
145
+ if self.minrampercore is not None and ram_per_core < self.minrampercore:
146
+ return False
147
+
148
+ # check max ram
149
+ if self.maxrampercore is not None and ram_per_core > self.maxrampercore:
150
+ return False
151
+
152
+ return True
153
+
154
+ def is_single_core(self):
155
+ if self.mincore is not None and self.mincore == 1 and self.maxcore is not None and self.maxcore == 1:
156
+ return True
157
+ return False
158
+
159
+ def is_multi_core(self):
160
+ if self.mincore is not None and self.mincore > 1:
161
+ return True
162
+
163
+ def column_names(cls, prefix=None):
164
+ """
165
+ return column names for DB interactions
166
+ """
167
+ ret = ""
168
+ for attr in cls.attributes:
169
+ if prefix is not None:
170
+ ret += f"{prefix}."
171
+ ret += f"{attr},"
172
+ ret = ret[:-1]
173
+ return ret
174
+
175
+ column_names = classmethod(column_names)
@@ -0,0 +1,37 @@
1
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
2
+
3
+ # logger
4
+ _logger = PandaLogger().getLogger("SQLDumper")
5
+
6
+
7
+ class SQLDumper(object):
8
+ def __init__(self, cur):
9
+ self.cursor = cur
10
+
11
+ def __iter__(self):
12
+ return self.cursor.__iter__()
13
+
14
+ def next(self):
15
+ return self.cursor.next()
16
+
17
+ def my_execute(self, sql, var=None):
18
+ if var is None:
19
+ var = {}
20
+ _logger.debug(f"SQL={sql} var={str(var)}")
21
+ return self.cursor.execute(sql, var)
22
+
23
+ def my_executemany(self, sql, vars=None):
24
+ if vars is None:
25
+ vars = []
26
+ _logger.debug(f"SQL_many={sql} var_many={str(vars)}")
27
+ return self.cursor.executemany(sql, vars)
28
+
29
+ def __getattribute__(self, name):
30
+ if name == "execute":
31
+ return object.__getattribute__(self, "my_execute")
32
+ elif name == "executemany":
33
+ return object.__getattribute__(self, "my_executemany")
34
+ elif name in ["cursor", "__iter__", "next"]:
35
+ return object.__getattribute__(self, name)
36
+ else:
37
+ return getattr(self.cursor, name)
@@ -0,0 +1,60 @@
1
+ class SQLQueryManager:
2
+ def __init__(self, sql_query):
3
+ self.sql_query = sql_query
4
+
5
+ def format_query(self):
6
+ """Format the SQL query by removing line breaks and redundant spaces."""
7
+ # Replace newline characters with a single space
8
+ formatted_query = self.sql_query.replace('\n', ' ')
9
+ # Remove redundant spaces (more than one space in a row)
10
+ formatted_query = ' '.join(formatted_query.split())
11
+ return formatted_query
12
+
13
+ def set_query(self, sql_query):
14
+ """Set a new SQL query."""
15
+ self.sql_query = sql_query
16
+
17
+ def get_query(self):
18
+ """Get the current SQL query."""
19
+ return self.sql_query
20
+
21
+ def log_query(self):
22
+ """Log the formatted SQL query."""
23
+ formatted_query = self.format_query()
24
+ print(f"SQL Query: {formatted_query}")
25
+
26
+ def append(self, sql_text):
27
+ """Append more text to the existing SQL query."""
28
+ self.sql_query += ' ' + sql_text
29
+
30
+ def __str__(self):
31
+ """Custom string representation of the SQLQueryManager instance."""
32
+ return self.format_query()
33
+
34
+
35
+ # Example usage:
36
+ if __name__ == "__main__":
37
+ # Initialize the SQLQueryManager with an SQL query
38
+ sql_manager = SQLQueryManager("""
39
+ SELECT *
40
+ FROM your_table
41
+ WHERE condition = 'something'
42
+ ORDER BY column_name
43
+ """)
44
+
45
+ # Log the SQL query
46
+ print(sql_manager) # This will print the formatted SQL query
47
+
48
+ # Change the SQL query
49
+ new_query = """
50
+ SELECT id, name
51
+ FROM another_table
52
+ WHERE condition = 'another condition'
53
+ """
54
+ sql_manager.set_query(new_query)
55
+ sql_manager.append("""
56
+ AND condition2 = 'more conditions'
57
+ """)
58
+
59
+ # Log the updated SQL query
60
+ print(sql_manager) # This will print the updated formatted SQL query
@@ -0,0 +1,304 @@
1
+ """
2
+ site specification
3
+
4
+ """
5
+
6
+ import re
7
+
8
+ catchall_keys = {
9
+ k: k
10
+ for k in [
11
+ "useJumboJobs",
12
+ "gpu",
13
+ "grandly_unified",
14
+ "nSimEvents",
15
+ "minEventsForJumbo",
16
+ "maxDiskPerCore",
17
+ "use_only_local_data",
18
+ "disableReassign",
19
+ "jobChunkSize",
20
+ "bareNucleus",
21
+ "secondaryNucleus",
22
+ "allowed_processing",
23
+ "excluded_processing",
24
+ "per_core_attr",
25
+ "allow_no_pilot",
26
+ ]
27
+ }
28
+
29
+
30
+ class SiteSpec(object):
31
+ # attributes
32
+ _attributes = (
33
+ "sitename",
34
+ "nickname",
35
+ "dq2url",
36
+ "cloud",
37
+ "ddm",
38
+ "ddm_input",
39
+ "ddm_output",
40
+ "type",
41
+ "releases",
42
+ "memory",
43
+ "maxtime",
44
+ "status",
45
+ "setokens_input",
46
+ "setokens_output",
47
+ "defaulttoken",
48
+ "validatedreleases",
49
+ "maxinputsize",
50
+ "comment",
51
+ "statusmodtime",
52
+ "pledgedCPU",
53
+ "coreCount",
54
+ "reliabilityLevel",
55
+ "iscvmfs",
56
+ "transferringlimit",
57
+ "maxwdir",
58
+ "fairsharePolicy",
59
+ "mintime",
60
+ "allowfax",
61
+ "pandasite",
62
+ "corepower",
63
+ "wnconnectivity",
64
+ "catchall",
65
+ "role",
66
+ "pandasite_state",
67
+ "ddm_endpoints_input",
68
+ "ddm_endpoints_output",
69
+ "maxrss",
70
+ "minrss",
71
+ "direct_access_lan",
72
+ "direct_access_wan",
73
+ "tier",
74
+ "objectstores",
75
+ "is_unified",
76
+ "unified_name",
77
+ "jobseed",
78
+ "capability",
79
+ "num_slots_map",
80
+ "workflow",
81
+ "maxDiskio",
82
+ )
83
+
84
+ # constructor
85
+ def __init__(self):
86
+ # install attributes
87
+ for attr in self._attributes:
88
+ setattr(self, attr, None)
89
+
90
+ # serialize
91
+ def __str__(self):
92
+ str = ""
93
+ for attr in self._attributes:
94
+ str += f"{attr}:{getattr(self, attr)} "
95
+ return str
96
+
97
+ # check if direct IO is used when tasks allow it
98
+ def isDirectIO(self):
99
+ if self.direct_access_lan is True:
100
+ return True
101
+ return False
102
+
103
+ # check what type of jobs are allowed
104
+ def getJobSeed(self):
105
+ tmpVal = self.jobseed
106
+ if tmpVal is None:
107
+ return "std"
108
+ return tmpVal
109
+
110
+ # get value from catchall
111
+ def getValueFromCatchall(self, key):
112
+ if self.catchall is None:
113
+ return None
114
+ if key not in catchall_keys:
115
+ return None
116
+ key = catchall_keys[key]
117
+ for tmpItem in self.catchall.split(","):
118
+ tmpMatch = re.search(f"^{key}=(.+)", tmpItem)
119
+ if tmpMatch is not None:
120
+ return tmpMatch.group(1)
121
+ return None
122
+
123
+ # has value in catchall
124
+ def hasValueInCatchall(self, key):
125
+ if self.catchall is None:
126
+ return False
127
+ if key not in catchall_keys:
128
+ return False
129
+ key = catchall_keys[key]
130
+ for tmpItem in self.catchall.split(","):
131
+ tmpMatch = re.search(f"^{key}(=|)*", tmpItem)
132
+ if tmpMatch is not None:
133
+ return True
134
+ return False
135
+
136
+ # allow WAN input access
137
+ def allowWanInputAccess(self):
138
+ return self.direct_access_lan is True and self.direct_access_wan is True
139
+
140
+ # use jumbo jobs
141
+ def useJumboJobs(self):
142
+ return self.hasValueInCatchall("useJumboJobs")
143
+
144
+ # GPU
145
+ def isGPU(self):
146
+ return self.hasValueInCatchall("gpu")
147
+
148
+ def is_grandly_unified(self):
149
+ if self.hasValueInCatchall("grandly_unified") or self.type == "unified":
150
+ return True
151
+ return False
152
+
153
+ def runs_production(self):
154
+ if self.type == "production" or self.is_grandly_unified():
155
+ return True
156
+ return False
157
+
158
+ def runs_analysis(self):
159
+ if self.type == "analysis" or self.is_grandly_unified():
160
+ return True
161
+ return False
162
+
163
+ # get unified name
164
+ def get_unified_name(self):
165
+ if self.unified_name is None:
166
+ return self.sitename
167
+ return self.unified_name
168
+
169
+ # get number of simulated events for dynamic number of events
170
+ def get_n_sim_events(self):
171
+ tmpVal = self.getValueFromCatchall("nSimEvents")
172
+ if tmpVal is None:
173
+ return None
174
+ return int(tmpVal)
175
+
176
+ # get minimum of remaining events for jumbo jobs
177
+ def getMinEventsForJumbo(self):
178
+ tmpVal = self.getValueFromCatchall("minEventsForJumbo")
179
+ if tmpVal is None:
180
+ return None
181
+ return int(tmpVal)
182
+
183
+ # check if opportunistic
184
+ def is_opportunistic(self):
185
+ return self.pledgedCPU == -1
186
+
187
+ # get number of jobs for standby
188
+ def getNumStandby(self, sw_id, resource_type):
189
+ numMap = self.num_slots_map
190
+ # neither gshare or workqueue is definied
191
+ if sw_id not in numMap:
192
+ if None in numMap:
193
+ sw_id = None
194
+ else:
195
+ return None
196
+ # give the total if resource type is undefined
197
+ if resource_type is None:
198
+ return sum(numMap[sw_id].values())
199
+ # give the number for the resource type
200
+ if resource_type in numMap[sw_id]:
201
+ return numMap[sw_id][resource_type]
202
+ elif None in numMap[sw_id]:
203
+ return numMap[sw_id][None]
204
+ return None
205
+
206
+ # get max disk per core
207
+ def get_max_disk_per_core(self):
208
+ tmpVal = self.getValueFromCatchall("maxDiskPerCore")
209
+ try:
210
+ return int(tmpVal)
211
+ except Exception:
212
+ pass
213
+ return None
214
+
215
+ # use local data only
216
+ def use_only_local_data(self):
217
+ return self.hasValueInCatchall("use_only_local_data")
218
+
219
+ # check if use VP
220
+ def use_vp(self, scope):
221
+ # use default scope if missing
222
+ if scope not in self.ddm_endpoints_input:
223
+ scope = "default"
224
+ # check if VP_DISK is associated
225
+ if scope in self.ddm_endpoints_input and [i for i in self.ddm_endpoints_input[scope].getAllEndPoints() if i.endswith("_VP_DISK")]:
226
+ return True
227
+ return False
228
+
229
+ # check if always uses direct IO
230
+ def always_use_direct_io(self):
231
+ return self.maxinputsize == -1
232
+
233
+ # disable reassign
234
+ def disable_reassign(self):
235
+ if self.hasValueInCatchall("disableReassign"):
236
+ return True
237
+ self.status == "paused"
238
+
239
+ # get job chunk size
240
+ def get_job_chunk_size(self):
241
+ try:
242
+ return int(self.getValueFromCatchall("jobChunkSize"))
243
+ except Exception:
244
+ return None
245
+
246
+ # get WN connectivity
247
+ def get_wn_connectivity(self):
248
+ if self.wnconnectivity is None:
249
+ return None
250
+ items = self.wnconnectivity.split("#")
251
+ if not items or not items[0]:
252
+ return None
253
+ else:
254
+ return items[0]
255
+
256
+ # get IP stack
257
+ def get_ipstack(self):
258
+ if self.wnconnectivity is None:
259
+ return None
260
+ items = self.wnconnectivity.split("#")
261
+ if len(items) == 2 and items[-1]:
262
+ return items[-1]
263
+ else:
264
+ return None
265
+
266
+ # get bare nucleus mode
267
+ def bare_nucleus_mode(self):
268
+ mode = self.getValueFromCatchall("bareNucleus")
269
+ if mode in ["only", "allow"]:
270
+ return mode
271
+ return None
272
+
273
+ # get secondary nucleus
274
+ def secondary_nucleus(self):
275
+ n = self.getValueFromCatchall("secondaryNucleus")
276
+ if n:
277
+ return n
278
+ return None
279
+
280
+ # get allowed processing types
281
+ def get_allowed_processing_types(self):
282
+ """
283
+ Get allowed processing types for processing type-based job brokerage to access only tasks with specific processing types.
284
+ They are defined in the catchall field as a pipe-separated list with the key "allowed_processing".
285
+ """
286
+ n = self.getValueFromCatchall("allowed_processing")
287
+ if n:
288
+ return n.split("|")
289
+ return None
290
+
291
+ # get excluded process types
292
+ def get_excluded_processing_types(self):
293
+ """
294
+ Get excluded processing types for processing type-based job brokerage to exclude tasks with specific processing types.
295
+ They are defined in the catchall field as a pipe-separated list with the key "excluded_processing".
296
+ """
297
+ n = self.getValueFromCatchall("excluded_processing")
298
+ if n:
299
+ return n.split("|")
300
+ return None
301
+
302
+ # use per-core attributes
303
+ def use_per_core_attr(self):
304
+ return self.hasValueInCatchall("per_core_attr")
@@ -0,0 +1,10 @@
1
+ # Supplemental error codes
2
+ # Error values must be less than 1000
3
+
4
+
5
+ class SupErrors(object):
6
+ error_codes = {
7
+ "SUCCEEDE": 0,
8
+ "INVALID_BATCH_ID": 1,
9
+ "WORKER_ALREADY_DONE": 2,
10
+ }