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,25 @@
1
+ import math
2
+ import os
3
+ import sys
4
+
5
+
6
+ # run
7
+ def main(tbuf=None, **kwargs):
8
+ print("Dummy test of PanDA daemon ---- START")
9
+
10
+ res = math.cos(math.pi / 3)
11
+ print(f"cos(pi/3) = {res}")
12
+
13
+ print(f"uid={os.getuid()} , pid={os.getpid()}")
14
+
15
+ if tbuf is not None:
16
+ print("I got panda taskBuffer from daemon!!")
17
+ else:
18
+ print("I did not get panda taskBuffer from daemon...")
19
+
20
+ print("Dummy test of PanDA daemon ---- END")
21
+
22
+
23
+ # run
24
+ if __name__ == "__main__":
25
+ main()
@@ -0,0 +1,144 @@
1
+ import datetime
2
+ import glob
3
+ import os.path
4
+ import sys
5
+ import threading
6
+ import time
7
+ import traceback
8
+
9
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
10
+ from pandacommon.pandautils.PandaUtils import naive_utcnow
11
+ from pandacommon.pandautils.thread_utils import GenericThread
12
+
13
+ from pandaserver.brokerage import SiteMapper
14
+ from pandaserver.config import panda_config
15
+ from pandaserver.dataservice.event_picker import EventPicker
16
+
17
+ # logger
18
+ _logger = PandaLogger().getLogger("evpPD2P")
19
+
20
+
21
+ # main
22
+ def main(tbuf=None, **kwargs):
23
+ _logger.debug("===================== start =====================")
24
+
25
+ # overall timeout value
26
+ overallTimeout = 300
27
+ # prefix of evp files
28
+ prefixEVP = "evp."
29
+ # file pattern of evp files
30
+ evpFilePatt = panda_config.cache_dir + "/" + prefixEVP + "*"
31
+
32
+ # instantiate PD2P
33
+
34
+ requester_id = GenericThread().get_full_id(__name__, sys.modules[__name__].__file__)
35
+
36
+ from pandaserver.taskbuffer.TaskBuffer import taskBuffer
37
+
38
+ taskBuffer.init(
39
+ panda_config.dbhost,
40
+ panda_config.dbpasswd,
41
+ nDBConnection=1,
42
+ useTimeout=True,
43
+ requester=requester_id,
44
+ )
45
+ siteMapper = SiteMapper.SiteMapper(taskBuffer)
46
+
47
+ # thread pool
48
+ class ThreadPool:
49
+ def __init__(self):
50
+ self.lock = threading.Lock()
51
+ self.list = []
52
+
53
+ def add(self, obj):
54
+ self.lock.acquire()
55
+ self.list.append(obj)
56
+ self.lock.release()
57
+
58
+ def remove(self, obj):
59
+ self.lock.acquire()
60
+ self.list.remove(obj)
61
+ self.lock.release()
62
+
63
+ def join(self):
64
+ self.lock.acquire()
65
+ thrlist = tuple(self.list)
66
+ self.lock.release()
67
+ for thr in thrlist:
68
+ thr.join()
69
+
70
+ # thread to ev-pd2p
71
+ class EvpThr(threading.Thread):
72
+ def __init__(self, lock, pool, aTaskBuffer, aSiteMapper, fileName, ignoreError):
73
+ threading.Thread.__init__(self)
74
+ self.lock = lock
75
+ self.pool = pool
76
+ self.fileName = fileName
77
+ self.evp = EventPicker(aTaskBuffer, aSiteMapper, fileName, ignoreError)
78
+ self.pool.add(self)
79
+
80
+ def run(self):
81
+ self.lock.acquire()
82
+ retRun = self.evp.run()
83
+ _logger.debug(f"{retRun} : {self.fileName}")
84
+ self.pool.remove(self)
85
+ self.lock.release()
86
+
87
+ # get files
88
+ _logger.debug("EVP session")
89
+ timeNow = naive_utcnow()
90
+ timeInt = naive_utcnow()
91
+ fileList = sorted(glob.glob(evpFilePatt))
92
+
93
+ # create thread pool and semaphore
94
+ adderLock = threading.Semaphore(1)
95
+ adderThreadPool = ThreadPool()
96
+
97
+ # add
98
+ while len(fileList) != 0:
99
+ # time limit to aviod too many copyArchve running at the sametime
100
+ if (naive_utcnow() - timeNow) > datetime.timedelta(minutes=overallTimeout):
101
+ _logger.debug("time over in EVP session")
102
+ break
103
+ # try to get Semaphore
104
+ adderLock.acquire()
105
+ # get fileList
106
+ if (naive_utcnow() - timeInt) > datetime.timedelta(minutes=15):
107
+ timeInt = naive_utcnow()
108
+ # get file
109
+ fileList = sorted(glob.glob(evpFilePatt))
110
+ # choose a file
111
+ fileName = fileList.pop(0)
112
+ # release lock
113
+ adderLock.release()
114
+ if not os.path.exists(fileName):
115
+ continue
116
+ try:
117
+ modTime = datetime.datetime(*(time.gmtime(os.path.getmtime(fileName))[:7]))
118
+ if (timeNow - modTime) > datetime.timedelta(hours=24):
119
+ # last chance
120
+ _logger.debug(f"Last event picking : {fileName}")
121
+ thr = EvpThr(adderLock, adderThreadPool, taskBuffer, siteMapper, fileName, False)
122
+ thr.start()
123
+ elif (timeInt - modTime) > datetime.timedelta(minutes=1):
124
+ # try
125
+ _logger.debug(f"event picking : {fileName}")
126
+ thr = EvpThr(adderLock, adderThreadPool, taskBuffer, siteMapper, fileName, True)
127
+ thr.start()
128
+ else:
129
+ _logger.debug(f"{timeInt - modTime} : {fileName}")
130
+ except Exception as e:
131
+ _logger.error(f"{str(e)} {traceback.format_exc()}")
132
+
133
+ # join all threads
134
+ adderThreadPool.join()
135
+
136
+ # stop taskBuffer if created inside this script
137
+ taskBuffer.cleanup(requester=requester_id)
138
+
139
+ _logger.debug("===================== end =====================")
140
+
141
+
142
+ # run
143
+ if __name__ == "__main__":
144
+ main()
@@ -0,0 +1,264 @@
1
+ import sys
2
+
3
+ import polars as pl
4
+ import requests
5
+ from bs4 import BeautifulSoup
6
+ from pandacommon.pandalogger import logger_utils
7
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
8
+ from pandacommon.pandautils.thread_utils import GenericThread
9
+
10
+ from pandaserver.config import panda_config
11
+ from pandaserver.srvcore.CoreUtils import normalize_cpu_model
12
+
13
+ main_logger = PandaLogger().getLogger("hs_scrapers")
14
+
15
+ DEFAULT_URL_SL6 = "https://w3.hepix.org/benchmarking/sl6-x86_64-gcc44.html"
16
+ DEFAULT_URL_SL7 = "https://w3.hepix.org/benchmarking/sl7-x86_64-gcc48.html"
17
+ DEFAULT_URL_HS23 = "https://raw.githubusercontent.com/HEPiX-Forum/hepix-forum.github.io/master/_data/HS23scores.csv"
18
+
19
+
20
+ def _parse_cores(val: str) -> tuple[int | None, int]:
21
+ smt = 1 if ("HT on" in val or "SMT on" in val) else 0
22
+ tokens = val.replace("(", " ").split()
23
+ ncores = next((int(t) for t in tokens if t.isdigit()), None)
24
+ return ncores, smt
25
+
26
+
27
+ # ---------------------- HTML scrapers (SL6/SL7) ----------------------
28
+ class BaseHS06Scraper:
29
+ HEADERS = [
30
+ "CPU",
31
+ "HS06",
32
+ "Clock speed (MHz)",
33
+ "L2+L3 cache size (grand total, KB)",
34
+ "Cores (runs)",
35
+ "Memory (GB)",
36
+ "Mainboard type",
37
+ "Site",
38
+ ]
39
+
40
+ def __init__(self, task_buffer, url: str):
41
+ self.url = url
42
+ self.session = requests.Session()
43
+ self.task_buffer = task_buffer
44
+
45
+ def run(self) -> None:
46
+ html = self._fetch_html(self.url)
47
+ df = self._parse_html_to_polars(html)
48
+ self._insert(df)
49
+
50
+ def _insert_cpu_perf_rows(self, rows: list[dict], source_url: str) -> None:
51
+ sql = (
52
+ "INSERT INTO atlas_panda.cpu_benchmarks "
53
+ "(cpu_type, cpu_type_normalized, smt_enabled, ncores, site, score_per_core, source) "
54
+ "VALUES (:cpu_type, :cpu_type_normalized, :smt_enabled, :ncores, :site, :score_per_core, :source)"
55
+ )
56
+ for r in rows:
57
+ r["source"] = source_url
58
+ r["cpu_type_normalized"] = normalize_cpu_model(r["cpu_type"])
59
+ status, res = self.task_buffer.querySQLS(sql, r)
60
+
61
+ def _fetch_html(self, url: str) -> str:
62
+ resp = self.session.get(url, timeout=30)
63
+ resp.raise_for_status()
64
+ return resp.text
65
+
66
+ def _parse_html_to_polars(self, html: str) -> pl.DataFrame:
67
+ soup = BeautifulSoup(html, "html.parser")
68
+ h2 = soup.find("h2", {"id": "benchmark-results"})
69
+ if not h2:
70
+ raise RuntimeError("Benchmark results heading not found.")
71
+ tables = h2.find_all_next("table", class_="striped")
72
+ if not tables:
73
+ raise RuntimeError("No benchmark results table found after the heading.")
74
+ table = tables[0]
75
+
76
+ # Build rows -> Polars
77
+ rows = []
78
+ for tr in table.find_all("tr")[1:]:
79
+ cols = [td.get_text(strip=True) for td in tr.find_all("td")]
80
+ if not any(cols):
81
+ continue
82
+ rows.append(cols)
83
+
84
+ # Use fixed headers for SL6; SL7 will override to read <th>
85
+ df = pl.DataFrame(rows, schema=self.HEADERS)
86
+ df = (
87
+ df.select(
88
+ pl.col("CPU").alias("cpu_type"),
89
+ pl.col("HS06").cast(pl.Float64, strict=False).alias("score"),
90
+ pl.col("Cores (runs)").alias("cores"),
91
+ pl.col("Site").alias("site"),
92
+ )
93
+ .with_columns(
94
+ pl.col("cores").map_elements(lambda s: _parse_cores(s)[0], return_dtype=pl.Int64).alias("ncores"),
95
+ pl.col("cores").map_elements(lambda s: _parse_cores(s)[1], return_dtype=pl.Int64).alias("smt_enabled"),
96
+ )
97
+ .with_columns((pl.col("score") / pl.col("ncores")).alias("score_per_core"))
98
+ .drop(["cores", "score"])
99
+ .drop_nulls(["ncores", "score_per_core"])
100
+ )
101
+ return df
102
+
103
+ def _insert(self, df: pl.DataFrame) -> None:
104
+ self._insert_cpu_perf_rows(df.to_dicts(), self.url)
105
+
106
+
107
+ class HS06ScraperSL6(BaseHS06Scraper):
108
+ def __init__(self, task_buffer, url: str = DEFAULT_URL_SL6):
109
+ super().__init__(task_buffer, url)
110
+
111
+
112
+ class HS06ScraperSL7(BaseHS06Scraper):
113
+ def __init__(self, task_buffer, url: str = DEFAULT_URL_SL7):
114
+ super().__init__(task_buffer, url)
115
+
116
+ # SL7 table provides <th> headers; reuse logic but rebuild schema from them.
117
+ def _parse_html_to_polars(self, html: str) -> pl.DataFrame:
118
+ soup = BeautifulSoup(html, "html.parser")
119
+ h2 = soup.find("h2", {"id": "benchmark-results"})
120
+ if not h2:
121
+ raise RuntimeError("Benchmark results heading not found.")
122
+ tables = h2.find_all_next("table", class_="striped")
123
+ if not tables:
124
+ raise RuntimeError("No benchmark results table found after the heading.")
125
+ table = tables[0]
126
+
127
+ headers = [th.get_text(strip=True) for th in table.find_all("th")]
128
+ rows = []
129
+ for tr in table.find_all("tr")[1:]:
130
+ cols = [td.get_text(strip=True) for td in tr.find_all("td")]
131
+ if not any(cols):
132
+ continue
133
+ rows.append(cols)
134
+
135
+ df = pl.DataFrame(rows, schema=headers)
136
+ df = (
137
+ df.select(
138
+ pl.col("CPU").alias("cpu_type"),
139
+ pl.col("HS06").cast(pl.Float64, strict=False).alias("score"),
140
+ pl.col("Cores (runs)").alias("cores"),
141
+ pl.col("Site").alias("site"),
142
+ )
143
+ .with_columns(
144
+ pl.col("cores").map_elements(lambda s: _parse_cores(s)[0], return_dtype=pl.Int64).alias("ncores"),
145
+ pl.col("cores").map_elements(lambda s: _parse_cores(s)[1], return_dtype=pl.Int64).alias("smt_enabled"),
146
+ )
147
+ .with_columns((pl.col("score") / pl.col("ncores")).alias("score_per_core"))
148
+ .drop(["cores", "score"])
149
+ .drop_nulls(["ncores", "score_per_core"])
150
+ )
151
+ return df
152
+
153
+
154
+ # ---------------------- HS23 CSV ingestor (Polars) ----------------------
155
+ class HS23Ingestor:
156
+ def __init__(self, task_buffer, url: str = DEFAULT_URL_HS23):
157
+ self.url = url
158
+ self.logger = logger_utils.make_logger(main_logger, "HS23Ingestor")
159
+ self.task_buffer = task_buffer
160
+
161
+ def run(self) -> None:
162
+ max_timestamp = self._select_max_timestamp(None)
163
+ df = self._fetch()
164
+ df = self._transform(df, max_timestamp)
165
+ self._insert(df)
166
+
167
+ def _fetch(self) -> pl.DataFrame:
168
+ df = pl.read_csv(self.url, ignore_errors=True)
169
+ return df
170
+
171
+ def _transform(self, df: pl.DataFrame, max_timestamp) -> pl.DataFrame:
172
+ out = (
173
+ df.select(
174
+ pl.col("CPU").alias("cpu_type"),
175
+ pl.col("SMT enabled").alias("smt_enabled"),
176
+ pl.col("# Sockets").alias("sockets"),
177
+ pl.col("Cores/Socket").alias("cores_per_socket"),
178
+ pl.col("Ncores").alias("ncores"),
179
+ pl.col("Site").alias("site"),
180
+ pl.col("Score/Ncores").alias("score_per_core"),
181
+ pl.col("last_date").alias("timestamp"),
182
+ )
183
+ .with_columns(
184
+ pl.col("timestamp").str.strptime(pl.Datetime, "%Y-%m-%d %H:%M:%S", strict=False),
185
+ # normalize SMT to 0/1
186
+ pl.when(pl.col("smt_enabled").cast(pl.Utf8, strict=False).str.to_lowercase().is_in(["1", "true", "yes", "on"]))
187
+ .then(pl.lit(1))
188
+ .otherwise(
189
+ pl.when(pl.col("smt_enabled").cast(pl.Utf8, strict=False).str.to_lowercase().is_in(["0", "false", "no", "off"]))
190
+ .then(pl.lit(0))
191
+ .otherwise(pl.col("smt_enabled").cast(pl.Int64, strict=False).fill_null(0))
192
+ )
193
+ .alias("smt_enabled"),
194
+ pl.col("sockets").cast(pl.Int64, strict=False),
195
+ pl.col("cores_per_socket").cast(pl.Int64, strict=False),
196
+ pl.col("ncores").cast(pl.Int64, strict=False),
197
+ pl.col("score_per_core").cast(pl.Float64, strict=False),
198
+ )
199
+ .filter(pl.col("timestamp") > max_timestamp)
200
+ )
201
+ return out
202
+
203
+ def _select_max_timestamp(self, df: pl.DataFrame) -> None:
204
+ sql = "SELECT max(timestamp) FROM atlas_panda.cpu_benchmarks"
205
+ status, res = self.task_buffer.querySQLS(sql, {})
206
+ max_timestamp = res[0][0]
207
+ if not max_timestamp:
208
+ max_timestamp = pl.datetime(1970, 1, 1)
209
+ return max_timestamp
210
+
211
+ def _insert(self, df: pl.DataFrame) -> None:
212
+ sql = (
213
+ "INSERT INTO atlas_panda.cpu_benchmarks "
214
+ "(cpu_type, cpu_type_normalized, smt_enabled, sockets, cores_per_socket, ncores, site, "
215
+ "score_per_core, timestamp, source) "
216
+ "VALUES (:cpu_type, :cpu_type_normalized, :smt_enabled, :sockets, :cores_per_socket, :ncores, "
217
+ ":site, :score_per_core, :timestamp, :source)"
218
+ )
219
+ for row in df.to_dicts():
220
+ row["source"] = self.url
221
+ row["cpu_type_normalized"] = normalize_cpu_model(row["cpu_type"])
222
+ _, _ = self.task_buffer.querySQLS(sql, row)
223
+
224
+
225
+ def main(tbuf=None, **kwargs):
226
+ requester_id = GenericThread().get_full_id(__name__, sys.modules[__name__].__file__)
227
+
228
+ # instantiate TB
229
+ if tbuf is None:
230
+ from pandaserver.taskbuffer.TaskBuffer import taskBuffer
231
+
232
+ taskBuffer.init(
233
+ panda_config.dbhost,
234
+ panda_config.dbpasswd,
235
+ nDBConnection=1,
236
+ useTimeout=True,
237
+ requester=requester_id,
238
+ )
239
+ else:
240
+ taskBuffer = tbuf
241
+
242
+ try:
243
+ main_logger.debug("Start")
244
+ # We assume the SL6 and SL7 pages don't change and do not need to be updated.
245
+ # In case you re-run the scripts, be aware that it will cause duplicate entries.
246
+ # main_logger.debug("Starting HS06 SL6 scraper...")
247
+ # HS06ScraperSL6(taskBuffer).run()
248
+ # main_logger.debug("Starting HS06 SL7 scraper...")
249
+ # HS06ScraperSL7(taskBuffer).run()
250
+
251
+ main_logger.debug("Starting HS23 ingestor...")
252
+ HS23Ingestor(taskBuffer).run()
253
+ main_logger.debug("Done.")
254
+ except Exception as e:
255
+ main_logger.error(f"Error: {e}")
256
+ finally:
257
+ # stop the taskBuffer if it was created inside this script
258
+ if tbuf is None:
259
+ taskBuffer.cleanup(requester=requester_id)
260
+
261
+
262
+ # ---------------------- main ----------------------
263
+ if __name__ == "__main__":
264
+ main()