panda-server-source 0.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. panda_server_source-0.8.0.dist-info/METADATA +55 -0
  2. panda_server_source-0.8.0.dist-info/RECORD +375 -0
  3. panda_server_source-0.8.0.dist-info/WHEEL +4 -0
  4. panda_server_source-0.8.0.dist-info/licenses/LICENSE.txt +202 -0
  5. pandajedi/__init__.py +0 -0
  6. pandajedi/jedibrokerage/AtlasAnalJobBroker.py +2343 -0
  7. pandajedi/jedibrokerage/AtlasBrokerUtils.py +1292 -0
  8. pandajedi/jedibrokerage/AtlasProdJobBroker.py +2064 -0
  9. pandajedi/jedibrokerage/AtlasProdTaskBroker.py +629 -0
  10. pandajedi/jedibrokerage/GenJobBroker.py +381 -0
  11. pandajedi/jedibrokerage/JobBrokerBase.py +133 -0
  12. pandajedi/jedibrokerage/TaskBrokerBase.py +15 -0
  13. pandajedi/jedibrokerage/__init__.py +0 -0
  14. pandajedi/jediconfig/__init__.py +0 -0
  15. pandajedi/jediconfig/jedi_config.py +40 -0
  16. pandajedi/jedicore/FactoryBase.py +182 -0
  17. pandajedi/jedicore/Interaction.py +433 -0
  18. pandajedi/jedicore/JediDBProxy.py +56 -0
  19. pandajedi/jedicore/JediDBProxyPool.py +37 -0
  20. pandajedi/jedicore/JediDBSchemaInfo.py +17 -0
  21. pandajedi/jedicore/JediException.py +13 -0
  22. pandajedi/jedicore/JediTaskBuffer.py +984 -0
  23. pandajedi/jedicore/JediTaskBufferInterface.py +50 -0
  24. pandajedi/jedicore/MsgWrapper.py +124 -0
  25. pandajedi/jedicore/ProcessUtils.py +34 -0
  26. pandajedi/jedicore/SiteCandidate.py +90 -0
  27. pandajedi/jedicore/ThreadUtils.py +205 -0
  28. pandajedi/jedicore/__init__.py +0 -0
  29. pandajedi/jediddm/AtlasDDMClient.py +1708 -0
  30. pandajedi/jediddm/DDMClientBase.py +16 -0
  31. pandajedi/jediddm/DDMInterface.py +83 -0
  32. pandajedi/jediddm/GenDDMClient.py +17 -0
  33. pandajedi/jediddm/__init__.py +0 -0
  34. pandajedi/jedidog/AtlasAnalWatchDog.py +648 -0
  35. pandajedi/jedidog/AtlasDataCarouselWatchDog.py +189 -0
  36. pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +215 -0
  37. pandajedi/jedidog/AtlasProdWatchDog.py +443 -0
  38. pandajedi/jedidog/AtlasQueueFillerWatchDog.py +800 -0
  39. pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +245 -0
  40. pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +63 -0
  41. pandajedi/jedidog/GenWatchDog.py +21 -0
  42. pandajedi/jedidog/JumboWatchDog.py +147 -0
  43. pandajedi/jedidog/TypicalWatchDogBase.py +122 -0
  44. pandajedi/jedidog/WatchDogBase.py +53 -0
  45. pandajedi/jedidog/__init__.py +0 -0
  46. pandajedi/jediexec/reniceJEDI.py +25 -0
  47. pandajedi/jedigen/AtlasTaskGenerator.py +110 -0
  48. pandajedi/jedigen/TaskGeneratorBase.py +15 -0
  49. pandajedi/jedigen/__init__.py +0 -0
  50. pandajedi/jedimsgprocessor/__init__.py +0 -0
  51. pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +71 -0
  52. pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +66 -0
  53. pandajedi/jedimsgprocessor/base_msg_processor.py +33 -0
  54. pandajedi/jedimsgprocessor/forwarding_msg_processor.py +29 -0
  55. pandajedi/jedimsgprocessor/hpo_msg_processor.py +93 -0
  56. pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +63 -0
  57. pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +185 -0
  58. pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +82 -0
  59. pandajedi/jedimsgprocessor/kafka_msg_processor.py +44 -0
  60. pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +182 -0
  61. pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +74 -0
  62. pandajedi/jedimsgprocessor/processing_msg_processor.py +134 -0
  63. pandajedi/jedimsgprocessor/status_report_msg_processor.py +129 -0
  64. pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +118 -0
  65. pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +89 -0
  66. pandajedi/jediorder/ContentsFeeder.py +785 -0
  67. pandajedi/jediorder/JediDaemon.py +27 -0
  68. pandajedi/jediorder/JediKnight.py +55 -0
  69. pandajedi/jediorder/JediMaster.py +238 -0
  70. pandajedi/jediorder/JediMsgProcessor.py +32 -0
  71. pandajedi/jediorder/JobBroker.py +33 -0
  72. pandajedi/jediorder/JobGenerator.py +2763 -0
  73. pandajedi/jediorder/JobSplitter.py +308 -0
  74. pandajedi/jediorder/JobThrottler.py +28 -0
  75. pandajedi/jediorder/PostProcessor.py +166 -0
  76. pandajedi/jediorder/TaskBroker.py +268 -0
  77. pandajedi/jediorder/TaskCommando.py +334 -0
  78. pandajedi/jediorder/TaskGenerator.py +17 -0
  79. pandajedi/jediorder/TaskRefiner.py +611 -0
  80. pandajedi/jediorder/TaskSetupper.py +17 -0
  81. pandajedi/jediorder/WatchDog.py +79 -0
  82. pandajedi/jediorder/__init__.py +0 -0
  83. pandajedi/jedipprocess/AtlasAnalPostProcessor.py +404 -0
  84. pandajedi/jedipprocess/AtlasPostProcessorUtils.py +50 -0
  85. pandajedi/jedipprocess/AtlasProdPostProcessor.py +178 -0
  86. pandajedi/jedipprocess/GenPostProcessor.py +35 -0
  87. pandajedi/jedipprocess/MailTemplates.py +185 -0
  88. pandajedi/jedipprocess/PostProcessorBase.py +269 -0
  89. pandajedi/jedipprocess/__init__.py +0 -0
  90. pandajedi/jedirefine/AtlasAnalTaskRefiner.py +259 -0
  91. pandajedi/jedirefine/AtlasProdTaskRefiner.py +162 -0
  92. pandajedi/jedirefine/GenTaskRefiner.py +61 -0
  93. pandajedi/jedirefine/RefinerUtils.py +154 -0
  94. pandajedi/jedirefine/TaskRefinerBase.py +996 -0
  95. pandajedi/jedirefine/__init__.py +0 -0
  96. pandajedi/jedisetup/AtlasTaskSetupper.py +309 -0
  97. pandajedi/jedisetup/GenTaskSetupper.py +16 -0
  98. pandajedi/jedisetup/SimpleTaskSetupper.py +152 -0
  99. pandajedi/jedisetup/TaskSetupperBase.py +15 -0
  100. pandajedi/jedisetup/__init__.py +0 -0
  101. pandajedi/jeditest/SchemaChecker.py +41 -0
  102. pandajedi/jeditest/addContWoSoTask.py +54 -0
  103. pandajedi/jeditest/addDataCarouselRequest.py +47 -0
  104. pandajedi/jeditest/addEventServiceTask.py +101 -0
  105. pandajedi/jeditest/addHpoTask.py +81 -0
  106. pandajedi/jeditest/addIDDSStageInRequest.py +56 -0
  107. pandajedi/jeditest/addNonAtlasTask.py +71 -0
  108. pandajedi/jeditest/addNonAtlasTaskEnc.py +64 -0
  109. pandajedi/jeditest/addTestTask.py +124 -0
  110. pandajedi/jeditest/addTestTaskParamToDEFT.py +70 -0
  111. pandajedi/jeditest/addTestTaskWithMerger.py +97 -0
  112. pandajedi/jeditest/brokerTest.py +78 -0
  113. pandajedi/jeditest/cancelDataCarouselRequest.py +35 -0
  114. pandajedi/jeditest/contentsFeederTest.py +28 -0
  115. pandajedi/jeditest/contentsFeederTestWithTask.py +18 -0
  116. pandajedi/jeditest/ddmTest.py +4 -0
  117. pandajedi/jeditest/jobGenForOneTask.py +38 -0
  118. pandajedi/jeditest/jobGeneratorTest.py +43 -0
  119. pandajedi/jeditest/jobSplitterTest.py +104 -0
  120. pandajedi/jeditest/jobThrottlerTest.py +22 -0
  121. pandajedi/jeditest/msgProcessorTest.py +9 -0
  122. pandajedi/jeditest/postProcessorTest.py +18 -0
  123. pandajedi/jeditest/resubmitDataCarouselRequest.py +35 -0
  124. pandajedi/jeditest/resubmitTaskParam.py +20 -0
  125. pandajedi/jeditest/taskBrokerTest.py +22 -0
  126. pandajedi/jeditest/taskBrokerTestWithTask.py +38 -0
  127. pandajedi/jeditest/taskBufferTest.py +5 -0
  128. pandajedi/jeditest/taskCommandoTest.py +28 -0
  129. pandajedi/jeditest/taskRefinerTest.py +30 -0
  130. pandajedi/jeditest/testOneTaskToRefine.py +49 -0
  131. pandajedi/jeditest/testOneTaskToTaskBroker.py +42 -0
  132. pandajedi/jeditest/testPandaDDMMap.py +62 -0
  133. pandajedi/jeditest/updateDataCarouselRequestParams.py +50 -0
  134. pandajedi/jeditest/watchDogTest.py +25 -0
  135. pandajedi/jeditest/workQueueTest.py +22 -0
  136. pandajedi/jedithrottle/AtlasAnalJobThrottler.py +19 -0
  137. pandajedi/jedithrottle/AtlasProdJobThrottler.py +18 -0
  138. pandajedi/jedithrottle/GenJobThrottler.py +26 -0
  139. pandajedi/jedithrottle/JobThrottlerBase.py +496 -0
  140. pandajedi/jedithrottle/__init__.py +0 -0
  141. pandaserver/__init__.py +0 -0
  142. pandaserver/api/__init__.py +0 -0
  143. pandaserver/api/v1/__init__.py +0 -0
  144. pandaserver/api/v1/common.py +339 -0
  145. pandaserver/api/v1/credential_management_api.py +372 -0
  146. pandaserver/api/v1/data_carousel_api.py +264 -0
  147. pandaserver/api/v1/event_api.py +269 -0
  148. pandaserver/api/v1/file_server_api.py +942 -0
  149. pandaserver/api/v1/harvester_api.py +445 -0
  150. pandaserver/api/v1/http_client.py +166 -0
  151. pandaserver/api/v1/idds_api.py +180 -0
  152. pandaserver/api/v1/job_api.py +463 -0
  153. pandaserver/api/v1/metaconfig_api.py +122 -0
  154. pandaserver/api/v1/pilot_api.py +895 -0
  155. pandaserver/api/v1/statistics_api.py +207 -0
  156. pandaserver/api/v1/system_api.py +186 -0
  157. pandaserver/api/v1/task_api.py +1520 -0
  158. pandaserver/api/v1/tests/__init__.py +0 -0
  159. pandaserver/api/v1/tests/credential_management_api_tests.py +116 -0
  160. pandaserver/api/v1/tests/data_carousel_api_tests.py +82 -0
  161. pandaserver/api/v1/tests/harvester_api_tests.py +188 -0
  162. pandaserver/api/v1/tests/idds_api_tests.py +45 -0
  163. pandaserver/api/v1/tests/job_api_tests.py +112 -0
  164. pandaserver/api/v1/tests/pilot_api_tests.py +154 -0
  165. pandaserver/api/v1/tests/statistics_api_tests.py +104 -0
  166. pandaserver/api/v1/tests/system_api_tests.py +58 -0
  167. pandaserver/api/v1/tests/task_api_tests.py +590 -0
  168. pandaserver/api/v1/version.py +2 -0
  169. pandaserver/api/v1/workflow_api.py +136 -0
  170. pandaserver/brokerage/SiteMapper.py +406 -0
  171. pandaserver/brokerage/__init__.py +0 -0
  172. pandaserver/brokerage/broker.py +272 -0
  173. pandaserver/config/__init__.py +0 -0
  174. pandaserver/config/config_utils.py +15 -0
  175. pandaserver/config/daemon_config.py +29 -0
  176. pandaserver/config/mcp_config.py +38 -0
  177. pandaserver/config/panda_config.py +233 -0
  178. pandaserver/configurator/Carbon.py +65 -0
  179. pandaserver/configurator/Configurator.py +908 -0
  180. pandaserver/configurator/__init__.py +0 -0
  181. pandaserver/configurator/aux.py +73 -0
  182. pandaserver/daemons/__init__.py +0 -0
  183. pandaserver/daemons/master.py +110 -0
  184. pandaserver/daemons/master_systemd.py +79 -0
  185. pandaserver/daemons/scripts/__init__.py +0 -0
  186. pandaserver/daemons/scripts/add_main.py +264 -0
  187. pandaserver/daemons/scripts/add_sub.py +221 -0
  188. pandaserver/daemons/scripts/cache_pilots.py +47 -0
  189. pandaserver/daemons/scripts/cache_schedconfig.py +286 -0
  190. pandaserver/daemons/scripts/carbon.py +50 -0
  191. pandaserver/daemons/scripts/configurator.py +94 -0
  192. pandaserver/daemons/scripts/copyArchive.py +1387 -0
  193. pandaserver/daemons/scripts/datasetManager.py +1154 -0
  194. pandaserver/daemons/scripts/dummy_test.py +25 -0
  195. pandaserver/daemons/scripts/evpPD2P.py +144 -0
  196. pandaserver/daemons/scripts/hs_scrapers.py +264 -0
  197. pandaserver/daemons/scripts/metric_collector.py +927 -0
  198. pandaserver/daemons/scripts/panda_activeusers_query.py +80 -0
  199. pandaserver/daemons/scripts/pilotStreaming.py +109 -0
  200. pandaserver/daemons/scripts/process_workflow_files_daemon.py +166 -0
  201. pandaserver/daemons/scripts/recover_lost_files_daemon.py +177 -0
  202. pandaserver/daemons/scripts/task_evaluator.py +405 -0
  203. pandaserver/daemons/scripts/tmpwatch.py +70 -0
  204. pandaserver/daemons/scripts/worker_synchronization.py +97 -0
  205. pandaserver/daemons/utils.py +753 -0
  206. pandaserver/dataservice/DataServiceUtils.py +323 -0
  207. pandaserver/dataservice/ErrorCode.py +25 -0
  208. pandaserver/dataservice/RecoverLostFilesCore.py +322 -0
  209. pandaserver/dataservice/__init__.py +0 -0
  210. pandaserver/dataservice/activator.py +79 -0
  211. pandaserver/dataservice/adder_atlas_plugin.py +1106 -0
  212. pandaserver/dataservice/adder_dummy_plugin.py +31 -0
  213. pandaserver/dataservice/adder_gen.py +954 -0
  214. pandaserver/dataservice/adder_plugin_base.py +27 -0
  215. pandaserver/dataservice/adder_result.py +75 -0
  216. pandaserver/dataservice/adder_simple_plugin.py +160 -0
  217. pandaserver/dataservice/closer.py +247 -0
  218. pandaserver/dataservice/closer_atlas_plugin.py +90 -0
  219. pandaserver/dataservice/ddm.py +1381 -0
  220. pandaserver/dataservice/ddm_handler.py +95 -0
  221. pandaserver/dataservice/dyn_data_distributer.py +824 -0
  222. pandaserver/dataservice/event_lookup_client_ei.py +77 -0
  223. pandaserver/dataservice/event_picker.py +268 -0
  224. pandaserver/dataservice/finisher.py +194 -0
  225. pandaserver/dataservice/setupper.py +225 -0
  226. pandaserver/dataservice/setupper_atlas_plugin.py +1851 -0
  227. pandaserver/dataservice/setupper_dummy_plugin.py +47 -0
  228. pandaserver/dataservice/setupper_plugin_base.py +67 -0
  229. pandaserver/jobdispatcher/DispatcherUtils.py +35 -0
  230. pandaserver/jobdispatcher/ErrorCode.py +19 -0
  231. pandaserver/jobdispatcher/JobDispatcher.py +1625 -0
  232. pandaserver/jobdispatcher/Protocol.py +443 -0
  233. pandaserver/jobdispatcher/Watcher.py +186 -0
  234. pandaserver/jobdispatcher/__init__.py +0 -0
  235. pandaserver/pandamcp/__init__.py +0 -0
  236. pandaserver/pandamcp/mcp_main.py +56 -0
  237. pandaserver/pandamcp/mcp_test_client.py +95 -0
  238. pandaserver/pandamcp/mcp_utils.py +74 -0
  239. pandaserver/proxycache/__init__.py +0 -0
  240. pandaserver/proxycache/panda_proxy_cache.py +240 -0
  241. pandaserver/proxycache/token_cache.py +141 -0
  242. pandaserver/server/.gacl +6 -0
  243. pandaserver/server/panda.py +539 -0
  244. pandaserver/srvcore/CoreUtils.py +572 -0
  245. pandaserver/srvcore/MailUtils.py +106 -0
  246. pandaserver/srvcore/__init__.py +0 -0
  247. pandaserver/srvcore/allowed_methods.py +100 -0
  248. pandaserver/srvcore/oidc_utils.py +152 -0
  249. pandaserver/srvcore/panda_request.py +196 -0
  250. pandaserver/srvcore/srv_msg_utils.py +42 -0
  251. pandaserver/taskbuffer/ConBridge.py +513 -0
  252. pandaserver/taskbuffer/DBProxyPool.py +95 -0
  253. pandaserver/taskbuffer/DataCarousel.py +3053 -0
  254. pandaserver/taskbuffer/DatasetSpec.py +137 -0
  255. pandaserver/taskbuffer/DdmSpec.py +201 -0
  256. pandaserver/taskbuffer/ErrorCode.py +87 -0
  257. pandaserver/taskbuffer/EventServiceUtils.py +396 -0
  258. pandaserver/taskbuffer/FileSpec.py +290 -0
  259. pandaserver/taskbuffer/GlobalShares.py +244 -0
  260. pandaserver/taskbuffer/HarvesterMetricsSpec.py +92 -0
  261. pandaserver/taskbuffer/Initializer.py +82 -0
  262. pandaserver/taskbuffer/InputChunk.py +1080 -0
  263. pandaserver/taskbuffer/JediCacheSpec.py +57 -0
  264. pandaserver/taskbuffer/JediDatasetSpec.py +588 -0
  265. pandaserver/taskbuffer/JediFileSpec.py +242 -0
  266. pandaserver/taskbuffer/JediTaskSpec.py +1687 -0
  267. pandaserver/taskbuffer/JobSpec.py +1006 -0
  268. pandaserver/taskbuffer/JobUtils.py +232 -0
  269. pandaserver/taskbuffer/NucleusSpec.py +116 -0
  270. pandaserver/taskbuffer/OraDBProxy.py +174 -0
  271. pandaserver/taskbuffer/PanDAMsgProcessor.py +8 -0
  272. pandaserver/taskbuffer/PandaDBSchemaInfo.py +18 -0
  273. pandaserver/taskbuffer/ParseJobXML.py +350 -0
  274. pandaserver/taskbuffer/PickleFileSpec.py +18 -0
  275. pandaserver/taskbuffer/PickleJobSpec.py +25 -0
  276. pandaserver/taskbuffer/PrioUtil.py +40 -0
  277. pandaserver/taskbuffer/ProcessGroups.py +111 -0
  278. pandaserver/taskbuffer/ResourceSpec.py +175 -0
  279. pandaserver/taskbuffer/SQLDumper.py +37 -0
  280. pandaserver/taskbuffer/SQLManager.py +60 -0
  281. pandaserver/taskbuffer/SiteSpec.py +304 -0
  282. pandaserver/taskbuffer/SupErrors.py +10 -0
  283. pandaserver/taskbuffer/TaskBuffer.py +2882 -0
  284. pandaserver/taskbuffer/TaskBufferInterface.py +163 -0
  285. pandaserver/taskbuffer/Utils.py +848 -0
  286. pandaserver/taskbuffer/WorkQueue.py +227 -0
  287. pandaserver/taskbuffer/WorkQueueMapper.py +203 -0
  288. pandaserver/taskbuffer/WorkerSpec.py +143 -0
  289. pandaserver/taskbuffer/WrappedCursor.py +487 -0
  290. pandaserver/taskbuffer/WrappedPickle.py +88 -0
  291. pandaserver/taskbuffer/WrappedPostgresConn.py +24 -0
  292. pandaserver/taskbuffer/__init__.py +0 -0
  293. pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
  294. pandaserver/taskbuffer/db_proxy_mods/__init__.py +7 -0
  295. pandaserver/taskbuffer/db_proxy_mods/base_module.py +841 -0
  296. pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +772 -0
  297. pandaserver/taskbuffer/db_proxy_mods/entity_module.py +3804 -0
  298. pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +5661 -0
  299. pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +2640 -0
  300. pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +874 -0
  301. pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +4272 -0
  302. pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +6172 -0
  303. pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +4953 -0
  304. pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +4999 -0
  305. pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +2063 -0
  306. pandaserver/taskbuffer/db_proxy_mods/worker_module.py +1944 -0
  307. pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +832 -0
  308. pandaserver/taskbuffer/retryModule.py +552 -0
  309. pandaserver/taskbuffer/task_split_rules.py +308 -0
  310. pandaserver/taskbuffer/workflow_processor.py +249 -0
  311. pandaserver/taskbuffer/wrapped_oracle_conn.py +18 -0
  312. pandaserver/test/SchemaChecker.py +40 -0
  313. pandaserver/test/__init__.py +0 -0
  314. pandaserver/test/banUser.py +43 -0
  315. pandaserver/test/boostPrio.py +19 -0
  316. pandaserver/test/boostUser.py +35 -0
  317. pandaserver/test/callbackDDM.py +11 -0
  318. pandaserver/test/daod_on_demand.py +95 -0
  319. pandaserver/test/finishJob.py +184 -0
  320. pandaserver/test/finishTaskJEDI.py +11 -0
  321. pandaserver/test/getJobs.py +53 -0
  322. pandaserver/test/killJob.py +79 -0
  323. pandaserver/test/killJobLowPrio.py +99 -0
  324. pandaserver/test/killJobsInTask.py +56 -0
  325. pandaserver/test/killTask.py +80 -0
  326. pandaserver/test/killTaskJEDI.py +11 -0
  327. pandaserver/test/killUser.py +83 -0
  328. pandaserver/test/lsst/README.txt +7 -0
  329. pandaserver/test/lsst/lsstSubmit.py +139 -0
  330. pandaserver/test/lsst/lsstSubmitMERGEtest.py +141 -0
  331. pandaserver/test/lsst/lsstSubmitPhosim332.py +53 -0
  332. pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +41 -0
  333. pandaserver/test/reassignJobs.py +17 -0
  334. pandaserver/test/reassignSite.py +82 -0
  335. pandaserver/test/reassignTask.py +117 -0
  336. pandaserver/test/reassignWaiting.py +39 -0
  337. pandaserver/test/recoverLostFiles.py +7 -0
  338. pandaserver/test/reloadInputDS.py +51 -0
  339. pandaserver/test/sendCommandToJob.py +26 -0
  340. pandaserver/test/setDebugMode.py +38 -0
  341. pandaserver/test/setPriority.py +28 -0
  342. pandaserver/test/testEvgen.py +60 -0
  343. pandaserver/test/testEvgen17.py +58 -0
  344. pandaserver/test/testG4sim.py +81 -0
  345. pandaserver/test/testG4sim17.py +90 -0
  346. pandaserver/test/testGlobalShares.py +131 -0
  347. pandaserver/test/testReco.py +103 -0
  348. pandaserver/test/testSimulReco14.py +98 -0
  349. pandaserver/test/testSiteMap.py +26 -0
  350. pandaserver/test/testUpdateWorkerPilotStatus.py +9 -0
  351. pandaserver/userinterface/Client.py +1686 -0
  352. pandaserver/userinterface/UserIF.py +1799 -0
  353. pandaserver/userinterface/__init__.py +0 -0
  354. pandaserver/workflow/__init__.py +0 -0
  355. pandaserver/workflow/data_handler_plugins/base_data_handler.py +48 -0
  356. pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +100 -0
  357. pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +140 -0
  358. pandaserver/workflow/pcwl_test.py +122 -0
  359. pandaserver/workflow/pcwl_utils.py +384 -0
  360. pandaserver/workflow/psnakemake_container.json +68 -0
  361. pandaserver/workflow/psnakemake_task.json +62 -0
  362. pandaserver/workflow/psnakemake_test.py +60 -0
  363. pandaserver/workflow/snakeparser/__init__.py +3 -0
  364. pandaserver/workflow/snakeparser/extensions.py +74 -0
  365. pandaserver/workflow/snakeparser/log.py +53 -0
  366. pandaserver/workflow/snakeparser/names.py +3 -0
  367. pandaserver/workflow/snakeparser/parser.py +332 -0
  368. pandaserver/workflow/snakeparser/utils.py +29 -0
  369. pandaserver/workflow/step_handler_plugins/base_step_handler.py +85 -0
  370. pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +280 -0
  371. pandaserver/workflow/workflow_base.py +531 -0
  372. pandaserver/workflow/workflow_core.py +1974 -0
  373. pandaserver/workflow/workflow_core_smoketest.py +388 -0
  374. pandaserver/workflow/workflow_parser.py +222 -0
  375. pandaserver/workflow/workflow_utils.py +1047 -0
File without changes
@@ -0,0 +1,73 @@
1
+ import json
2
+ import os
3
+ import time
4
+ from urllib.parse import urlparse
5
+
6
+ import requests
7
+
8
+ from pandaserver.config import panda_config
9
+
10
+ GB = 1024**3
11
+ PROD_INPUT = "Production Input"
12
+ PROD_OUTPUT = "Production Output"
13
+ EXPRESS = "Express"
14
+ FILES = "files"
15
+ MBPS = "mbps"
16
+ LATENCY = "latency"
17
+ PACKETLOSS = "packetloss"
18
+ DONE = "done"
19
+ QUEUED = "queued"
20
+ LATEST = "latest"
21
+ H1 = "1h"
22
+ H6 = "6h"
23
+ D1 = "1d"
24
+ W1 = "1w"
25
+ TIMESTAMP = "timestamp"
26
+
27
+ REQUESTS_TIMEOUT = 30
28
+
29
+
30
+ def get_dump(url):
31
+ """
32
+ Retrieves a json file from the given URL and loads it into memory
33
+ """
34
+ # check if local file
35
+ p = urlparse(url)
36
+ if not p.scheme or p.scheme == "file":
37
+ try:
38
+ with open(p.path) as f:
39
+ return json.load(f)
40
+ except Exception:
41
+ return None
42
+ if panda_config.configurator_use_cert:
43
+ key_file = os.environ["X509_USER_PROXY"]
44
+ cert_file = os.environ["X509_USER_PROXY"]
45
+ ca_certs = os.environ["X509_CERT_DIR"]
46
+ cert = (cert_file, key_file)
47
+ else:
48
+ cert = None
49
+ ca_certs = False
50
+ for _ in range(1, 4): # 3 retries
51
+ try:
52
+ r = requests.get(url, cert=cert, verify=ca_certs, timeout=REQUESTS_TIMEOUT)
53
+ if r.status_code == requests.codes.ok:
54
+ return r.json()
55
+ except Exception:
56
+ time.sleep(1)
57
+ return None
58
+
59
+
60
+ def query_grafana_proxy(query, bearer_token):
61
+ headers = {
62
+ "Content-Type": "application/x-ndjson",
63
+ "Authorization": f"Bearer {bearer_token}",
64
+ }
65
+ grafana_proxy_url = "https://monit-grafana.cern.ch/api/datasources/proxy/10349/_msearch"
66
+ for _ in range(1, 4): # 3 retries
67
+ try:
68
+ r = requests.post(grafana_proxy_url, data=query, headers=headers)
69
+ if r.status_code == requests.codes.ok:
70
+ return r.json()
71
+ except Exception:
72
+ time.sleep(1)
73
+ return None
File without changes
@@ -0,0 +1,110 @@
1
+ import argparse
2
+ import grp
3
+ import logging
4
+ import os
5
+ import pwd
6
+ import signal
7
+ import sys
8
+
9
+ import daemon
10
+ import lockfile
11
+ from pandaserver.config import daemon_config, panda_config
12
+ from pandaserver.daemons.utils import END_SIGNALS, DaemonMaster
13
+
14
+
15
+ # get the logger
16
+ def get_logger():
17
+ my_logger = logging.getLogger("PanDA-Daemon-Master")
18
+ # remove existing handlers
19
+ while my_logger.hasHandlers():
20
+ my_logger.removeHandler(my_logger.handlers[0])
21
+ # make new handler
22
+ _log_handler = logging.StreamHandler(sys.stdout)
23
+ _log_formatter = logging.Formatter("%(asctime)s %(name)-12s: %(levelname)-8s %(message)s")
24
+ _log_handler.setFormatter(_log_formatter)
25
+ # add new handler
26
+ my_logger.addHandler(_log_handler)
27
+ # debug log level
28
+ my_logger.setLevel(logging.DEBUG)
29
+ # return logger
30
+ return my_logger
31
+
32
+
33
+ # kill the whole process group
34
+ def kill_whole():
35
+ os.killpg(os.getpgrp(), signal.SIGKILL)
36
+
37
+
38
+ # main function
39
+ def main():
40
+ # whether to run daemons
41
+ if not getattr(daemon_config, "enable", False):
42
+ return
43
+ # get logger
44
+ main_log = get_logger()
45
+ # parse option
46
+ parser = argparse.ArgumentParser()
47
+ parser.add_argument(
48
+ "-P",
49
+ "--pidfile",
50
+ action="store",
51
+ dest="pidfile",
52
+ default=None,
53
+ help="pid filename",
54
+ )
55
+ options = parser.parse_args()
56
+ if "PANDA_NO_ROOT" in os.environ:
57
+ uid = None
58
+ gid = None
59
+ else:
60
+ uname = getattr(daemon_config, "uname", "nobody")
61
+ gname = getattr(daemon_config, "gname", "nobody")
62
+ uid = pwd.getpwnam(uname).pw_uid
63
+ gid = grp.getgrnam(gname).gr_gid
64
+ n_workers = getattr(daemon_config, "n_proc", 1)
65
+ n_dbconn = getattr(daemon_config, "n_dbconn", 1)
66
+ worker_lifetime = getattr(daemon_config, "proc_lifetime", 28800)
67
+ use_tbif = getattr(daemon_config, "use_tbif", False)
68
+ main_log.info("main start")
69
+ # daemon context
70
+ dc = daemon.DaemonContext(
71
+ stdout=sys.stdout,
72
+ stderr=sys.stderr,
73
+ uid=uid,
74
+ gid=gid,
75
+ pidfile=lockfile.FileLock(options.pidfile),
76
+ )
77
+ with dc:
78
+ # get logger inside daemon context
79
+ tmp_log = get_logger()
80
+ # record in PID file
81
+ with open(options.pidfile, "w") as pid_file:
82
+ pid_file.write(f"{os.getpid()}")
83
+ # master object
84
+ master = DaemonMaster(
85
+ logger=tmp_log,
86
+ n_workers=n_workers,
87
+ n_dbconn=n_dbconn,
88
+ worker_lifetime=worker_lifetime,
89
+ use_tbif=use_tbif,
90
+ )
91
+
92
+ # function to end master when end signal caught
93
+ def end_master(sig, frame):
94
+ tmp_log.info(f"got end signal: {sig}")
95
+ master.stop()
96
+ kill_whole()
97
+
98
+ # set signal handler
99
+ for sig in END_SIGNALS:
100
+ signal.signal(sig, end_master)
101
+ # start master
102
+ master.run()
103
+ # get logger again
104
+ main_log = get_logger()
105
+ main_log.info("main end")
106
+
107
+
108
+ # run
109
+ if __name__ == "__main__":
110
+ main()
@@ -0,0 +1,79 @@
1
+ import logging
2
+ import os
3
+ import signal
4
+ import sys
5
+
6
+ from pandaserver.config import daemon_config
7
+ from pandaserver.daemons.utils import END_SIGNALS, DaemonMaster
8
+
9
+
10
+ # get the logger
11
+ def get_logger():
12
+ my_logger = logging.getLogger("PanDA-Daemon-Master")
13
+ # remove existing handlers
14
+ while my_logger.hasHandlers():
15
+ my_logger.removeHandler(my_logger.handlers[0])
16
+ # make new handler
17
+ _log_handler = logging.StreamHandler(sys.stdout)
18
+ _log_formatter = logging.Formatter("%(asctime)s %(name)-12s: %(levelname)-8s %(message)s")
19
+ _log_handler.setFormatter(_log_formatter)
20
+ # add new handler
21
+ my_logger.addHandler(_log_handler)
22
+ # debug log level
23
+ my_logger.setLevel(logging.DEBUG)
24
+ # return logger
25
+ return my_logger
26
+
27
+
28
+ # kill the whole process group
29
+ def kill_whole():
30
+ os.killpg(os.getpgrp(), signal.SIGKILL)
31
+
32
+
33
+ # main function
34
+ def main():
35
+ # whether to run daemons
36
+ if not getattr(daemon_config, "enable", False):
37
+ return
38
+
39
+ # get logger
40
+ main_log = get_logger()
41
+
42
+ n_workers = getattr(daemon_config, "n_proc", 1)
43
+ n_dbconn = getattr(daemon_config, "n_dbconn", 1)
44
+ worker_lifetime = getattr(daemon_config, "proc_lifetime", 28800)
45
+ use_tbif = getattr(daemon_config, "use_tbif", False)
46
+
47
+ main_log.info("main start")
48
+
49
+ # get logger inside daemon context
50
+ tmp_log = get_logger()
51
+
52
+ # master object
53
+ master = DaemonMaster(
54
+ logger=tmp_log,
55
+ n_workers=n_workers,
56
+ n_dbconn=n_dbconn,
57
+ worker_lifetime=worker_lifetime,
58
+ use_tbif=use_tbif,
59
+ )
60
+
61
+ # function to end master when end signal caught
62
+ def end_master(sig, frame):
63
+ tmp_log.info(f"got end signal: {sig}")
64
+ master.stop()
65
+ kill_whole()
66
+
67
+ # set signal handler
68
+ for sig in END_SIGNALS:
69
+ signal.signal(sig, end_master)
70
+
71
+ # start master
72
+ master.run()
73
+
74
+ main_log.info("main end")
75
+
76
+
77
+ # run
78
+ if __name__ == "__main__":
79
+ main()
File without changes
@@ -0,0 +1,264 @@
1
+ import datetime
2
+ import multiprocessing
3
+ import random
4
+ import sys
5
+ import time
6
+ import traceback
7
+
8
+ from pandacommon.pandalogger.LogWrapper import LogWrapper
9
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
10
+ from pandacommon.pandautils.PandaUtils import naive_utcnow
11
+ from pandacommon.pandautils.thread_utils import GenericThread, WeightedLists
12
+
13
+ from pandaserver.brokerage.SiteMapper import SiteMapper
14
+ from pandaserver.config import panda_config
15
+ from pandaserver.dataservice.adder_gen import AdderGen
16
+ from pandaserver.taskbuffer.TaskBuffer import TaskBuffer
17
+ from pandaserver.taskbuffer.TaskBufferInterface import TaskBufferInterface
18
+
19
+ # logger
20
+ _logger = PandaLogger().getLogger("add_main")
21
+
22
+
23
+ # main
24
+ def main(argv=tuple(), tbuf=None, lock_pool=None, **kwargs):
25
+ requester_id = GenericThread().get_full_id(__name__, sys.modules[__name__].__file__)
26
+
27
+ prelock_pid = GenericThread().get_pid()
28
+ tmpLog = LogWrapper(_logger, f"<pid={prelock_pid}>")
29
+
30
+ tmpLog.debug("===================== start =====================")
31
+
32
+ # return value, true to run main again in next daemon loop
33
+ ret_val = True
34
+
35
+ # grace period
36
+ try:
37
+ gracePeriod = int(argv[1])
38
+ except Exception:
39
+ gracePeriod = 1
40
+
41
+ # lock interval in minutes
42
+ lock_interval = 10
43
+
44
+ # retry interval in minutes
45
+ retry_interval = 1
46
+
47
+ # last recovery time
48
+ last_recovery = naive_utcnow() + datetime.timedelta(seconds=random.randint(0, 30))
49
+
50
+ # instantiate TB
51
+ if tbuf is None:
52
+ from pandaserver.taskbuffer.TaskBuffer import taskBuffer
53
+
54
+ taskBuffer.init(
55
+ panda_config.dbhost,
56
+ panda_config.dbpasswd,
57
+ nDBConnection=1,
58
+ useTimeout=True,
59
+ requester=requester_id,
60
+ )
61
+ else:
62
+ taskBuffer = tbuf
63
+
64
+ # instantiate sitemapper
65
+ aSiteMapper = SiteMapper(taskBuffer)
66
+
67
+ # thread for adder
68
+ class AdderThread(GenericThread):
69
+ def __init__(self, taskBuffer, aSiteMapper, job_output_reports, lock_pool):
70
+ GenericThread.__init__(self)
71
+ self.taskBuffer = taskBuffer
72
+ self.aSiteMapper = aSiteMapper
73
+ self.job_output_reports = job_output_reports
74
+ self.lock_pool = lock_pool
75
+
76
+ # main loop
77
+ def run(self):
78
+ # initialize
79
+ taskBuffer = self.taskBuffer
80
+ aSiteMapper = self.aSiteMapper
81
+ # get file list
82
+ timeNow = naive_utcnow()
83
+ timeInt = naive_utcnow()
84
+ # unique pid
85
+ GenericThread.__init__(self)
86
+ uniq_pid = self.get_pid()
87
+ # log pid
88
+ tmpLog.debug(f"pid={uniq_pid} : run")
89
+ # stats
90
+ n_processed = 0
91
+ # loop
92
+ while True:
93
+ # get report
94
+ one_jor = self.job_output_reports.pop()
95
+ if not one_jor:
96
+ break
97
+ # lock
98
+ panda_id, job_status, attempt_nr, time_stamp = one_jor
99
+ token_str = f"pid={uniq_pid} : job={panda_id}.{attempt_nr}"
100
+ tmpLog.debug(f"{token_str} to lock timestamp={time_stamp}")
101
+ got_lock = taskBuffer.lockJobOutputReport(
102
+ panda_id=panda_id,
103
+ attempt_nr=attempt_nr,
104
+ pid=uniq_pid,
105
+ time_limit=lock_interval,
106
+ )
107
+ if not got_lock:
108
+ tmpLog.debug(f"{token_str} skipped")
109
+ continue
110
+ # add
111
+ try:
112
+ modTime = time_stamp
113
+ if (timeNow - modTime) > datetime.timedelta(hours=24):
114
+ # last add
115
+ tmpLog.debug(f"{token_str} last add st={job_status}")
116
+ ignoreTmpError = False
117
+ else:
118
+ # usual add
119
+ tmpLog.debug(f"{token_str} add st={job_status}")
120
+ ignoreTmpError = True
121
+ # get adder
122
+ adder_gen = AdderGen(
123
+ taskBuffer,
124
+ panda_id,
125
+ job_status,
126
+ attempt_nr,
127
+ ignore_tmp_error=ignoreTmpError,
128
+ siteMapper=aSiteMapper,
129
+ pid=uniq_pid,
130
+ prelock_pid=uniq_pid,
131
+ lock_offset=lock_interval - retry_interval,
132
+ lock_pool=lock_pool,
133
+ )
134
+ n_processed += 1
135
+ # execute
136
+ adder_gen.run()
137
+ tmpLog.debug(f"{token_str} done")
138
+ del adder_gen
139
+ except Exception as e:
140
+ tmpLog.error(f"pid={uniq_pid} : failed to run with {str(e)} {traceback.format_exc()}")
141
+ # stats
142
+ tmpLog.debug(f"pid={uniq_pid} : processed {n_processed}")
143
+
144
+ # launcher, run with multiprocessing
145
+ def proc_launch(self):
146
+ # run
147
+ self.process = multiprocessing.Process(target=self.run)
148
+ self.process.start()
149
+
150
+ # join of multiprocessing
151
+ def proc_join(self):
152
+ self.process.join()
153
+
154
+ # TaskBuffer with more connections behind TaskBufferInterface
155
+ tmpLog.debug("setup taskBufferIF")
156
+ n_connections = 4
157
+ _tbuf = TaskBuffer()
158
+ _tbuf.init(
159
+ panda_config.dbhost,
160
+ panda_config.dbpasswd,
161
+ nDBConnection=n_connections,
162
+ useTimeout=True,
163
+ requester=requester_id,
164
+ )
165
+ taskBufferIF = TaskBufferInterface()
166
+ taskBufferIF.launch(_tbuf)
167
+
168
+ # add files
169
+ tmpLog.debug("run Adder")
170
+
171
+ interval = 10
172
+ nLoop = 50
173
+ recover_dataset_update = False
174
+ for iLoop in range(nLoop):
175
+ tmpLog.debug(f"start iLoop={iLoop}/{nLoop}")
176
+ start_time = naive_utcnow()
177
+ adderThrList = []
178
+ nThr = 10
179
+
180
+ n_jors_per_batch = 200
181
+
182
+ jor_lists = WeightedLists(multiprocessing.Lock())
183
+
184
+ # get some job output reports
185
+ jor_list_others = taskBuffer.listJobOutputReport(
186
+ only_unlocked=True,
187
+ time_limit=lock_interval,
188
+ limit=random.randint(int(n_jors_per_batch * 0.5), int(n_jors_per_batch * 1.5)) * nThr,
189
+ grace_period=gracePeriod,
190
+ anti_labels=["user"],
191
+ )
192
+ jor_lists.add(3, jor_list_others)
193
+ jor_list_user = taskBuffer.listJobOutputReport(
194
+ only_unlocked=True,
195
+ time_limit=lock_interval,
196
+ limit=random.randint(int(n_jors_per_batch * 0.5), int(n_jors_per_batch * 1.5)) * nThr,
197
+ grace_period=gracePeriod,
198
+ labels=["user"],
199
+ )
200
+ jor_lists.add(7, jor_list_user)
201
+
202
+ # adder consumer processes
203
+ _n_thr_with_tbuf = 0
204
+ tbuf_list = []
205
+ tmpLog.debug(f"got {len(jor_lists)} job reports")
206
+ for i in range(nThr):
207
+ if i < _n_thr_with_tbuf:
208
+ tbuf = TaskBuffer()
209
+ tbuf_list.append(tbuf)
210
+ tbuf.init(
211
+ panda_config.dbhost,
212
+ panda_config.dbpasswd,
213
+ nDBConnection=1,
214
+ useTimeout=True,
215
+ requester=requester_id,
216
+ )
217
+ thr = AdderThread(tbuf, aSiteMapper, jor_lists, lock_pool)
218
+ else:
219
+ thr = AdderThread(taskBufferIF.getInterface(), aSiteMapper, jor_lists, lock_pool)
220
+ adderThrList.append(thr)
221
+ # start all threads
222
+ for thr in adderThrList:
223
+ # thr.start()
224
+ thr.proc_launch()
225
+ time.sleep(0.25)
226
+
227
+ # join all threads
228
+ for thr in adderThrList:
229
+ # thr.join()
230
+ thr.proc_join()
231
+ [tbuf.cleanup(requester=requester_id) for tbuf in tbuf_list]
232
+ end_time = naive_utcnow()
233
+ sleep_time = interval - (end_time - start_time).seconds
234
+ if sleep_time > 0 and iLoop + 1 < nLoop:
235
+ sleep_time = random.randint(1, sleep_time)
236
+ tmpLog.debug(f"sleep {sleep_time} sec")
237
+ time.sleep(sleep_time)
238
+
239
+ # recovery
240
+ if naive_utcnow() - last_recovery > datetime.timedelta(minutes=2):
241
+ taskBuffer.async_update_datasets(None)
242
+ last_recovery = naive_utcnow()
243
+ recover_dataset_update = True
244
+
245
+ # recovery
246
+ if not recover_dataset_update:
247
+ taskBuffer.async_update_datasets(None)
248
+
249
+ # stop TaskBuffer IF
250
+ taskBufferIF.stop(requester=requester_id)
251
+
252
+ # stop taskBuffer if created inside this script
253
+ if tbuf is None:
254
+ taskBuffer.cleanup(requester=requester_id)
255
+
256
+ tmpLog.debug("===================== end =====================")
257
+
258
+ # return
259
+ return ret_val
260
+
261
+
262
+ # run
263
+ if __name__ == "__main__":
264
+ main(argv=sys.argv)