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,244 @@
1
+ # Definitions
2
+ EXECUTING = "executing"
3
+ QUEUED = "queued"
4
+ PLEDGED = "pledged"
5
+
6
+
7
+ class Node(object):
8
+ def __init__(self):
9
+ self.children = []
10
+
11
+ def add_child(self, node):
12
+ self.children.append(node)
13
+
14
+ def get_leaves(self, leaves=[]):
15
+ # If the node has no leaves, return the node in a list
16
+ if not self.children:
17
+ leaves.append(self)
18
+ return leaves
19
+
20
+ # Recursively get to the bottom
21
+ for child in self.children:
22
+ child.get_leaves(leaves)
23
+
24
+ return leaves
25
+
26
+
27
+ class Share(Node):
28
+ """
29
+ Implement the share node
30
+ """
31
+
32
+ _attributes = (
33
+ "name",
34
+ "value",
35
+ "parent",
36
+ "prodsourcelabel",
37
+ "workinggroup",
38
+ "campaign",
39
+ "processingtype",
40
+ "transpath",
41
+ "vo",
42
+ "rtype",
43
+ "queue_id",
44
+ "throttled",
45
+ )
46
+
47
+ def __str__(self, level=0):
48
+ """
49
+ Print the tree structure
50
+ """
51
+ ret = "{0} name: {1}, value: {2}\n".format("\t" * level, self.name, self.value)
52
+ for child in self.children:
53
+ ret += child.__str__(level + 1)
54
+ return ret
55
+
56
+ def __repr__(self):
57
+ return self.__str__()
58
+
59
+ def __mul__(self, other):
60
+ """
61
+ If I multiply a share object by a number, multiply the value field
62
+ """
63
+ self.value *= other
64
+ return self.value
65
+
66
+ def __rmul__(self, other):
67
+ return self.__mul__
68
+
69
+ def __imul__(self, other):
70
+ return self.__mul__
71
+
72
+ def __init__(
73
+ self,
74
+ name,
75
+ value,
76
+ parent,
77
+ prodsourcelabel,
78
+ workinggroup,
79
+ campaign,
80
+ processingtype,
81
+ transpath,
82
+ rtype,
83
+ vo,
84
+ queue_id,
85
+ throttled,
86
+ ):
87
+ # Create default attributes
88
+ for attr in self._attributes:
89
+ setattr(self, attr, None)
90
+
91
+ Node.__init__(self)
92
+ self.name = name
93
+ self.value = value
94
+ self.parent = parent
95
+ self.prodsourcelabel = prodsourcelabel
96
+ self.workinggroup = workinggroup
97
+ self.campaign = campaign
98
+ self.processingtype = processingtype
99
+ self.transpath = transpath
100
+ self.rtype = rtype
101
+ self.vo = vo
102
+ self.queue_id = queue_id
103
+ self.throttled = throttled
104
+
105
+ def pretty_print_hs_distribution(self, hs_distribution, level=0):
106
+ try:
107
+ executing = hs_distribution[self.name][EXECUTING] / 1000.0
108
+ except Exception:
109
+ executing = 0
110
+
111
+ try:
112
+ target = hs_distribution[self.name][PLEDGED] / 1000.0
113
+ except Exception:
114
+ target = 0
115
+
116
+ try:
117
+ queued = hs_distribution[self.name][QUEUED] / 1000.0
118
+ except Exception:
119
+ queued = 0
120
+
121
+ ret = "{0} name: {1}, values: {2:.1f}k|{3:.1f}k|{4:.1f}k\n".format("\t" * level, self.name, executing, target, queued)
122
+ for child in self.children:
123
+ ret += child.pretty_print_hs_distribution(hs_distribution, level + 1)
124
+ return ret
125
+
126
+ def normalize(self, multiplier=100, divider=100):
127
+ """
128
+ Will run down the branch and normalize values beneath
129
+ """
130
+ self.value *= multiplier * 1.0 / divider
131
+ if not self.children:
132
+ return
133
+
134
+ divider = 0
135
+ for child in self.children:
136
+ divider += child.value
137
+
138
+ multiplier = self.value
139
+
140
+ for child in self.children:
141
+ child.normalize(multiplier=multiplier, divider=divider)
142
+
143
+ return
144
+
145
+ def sort_branch_by_current_hs_distribution(self, hs_distribution):
146
+ """
147
+ Runs down the branch in order of under-pledging. It returns a list of sorted leave shares
148
+ """
149
+ sorted_shares = []
150
+
151
+ # If the node has no leaves, return the node in a list
152
+ if not self.children:
153
+ sorted_shares = [self]
154
+ return sorted_shares
155
+
156
+ # If the node has leaves, sort the children
157
+ children_sorted = []
158
+ for child1 in self.children:
159
+ loop_index = 0
160
+ insert_index = len(children_sorted) # insert at the end, if not deemed otherwise
161
+
162
+ # Calculate under-pledging
163
+ try:
164
+ child1_under_pledge = hs_distribution[child1.name][EXECUTING] * 1.0 / hs_distribution[child1.name][PLEDGED]
165
+ except ZeroDivisionError:
166
+ child1_under_pledge = 10**6 # Initialize to a large default number
167
+
168
+ for child2 in children_sorted:
169
+ try:
170
+ # Calculate under-pledging
171
+ child2_under_pledge = hs_distribution[child2.name][EXECUTING] * 1.0 / hs_distribution[child2.name][PLEDGED]
172
+ except ZeroDivisionError:
173
+ child2_under_pledge = 10**6 # Initialize to a large default number
174
+ except KeyError:
175
+ continue # Does not exist
176
+
177
+ if child1_under_pledge < child2_under_pledge:
178
+ insert_index = loop_index
179
+ break
180
+
181
+ loop_index += 1
182
+
183
+ # Insert the child into the list
184
+ children_sorted.insert(insert_index, child1)
185
+
186
+ # Go recursively and sort the grand* children
187
+ for child in children_sorted:
188
+ sorted_shares.extend(child.sort_branch_by_current_hs_distribution(hs_distribution))
189
+
190
+ return sorted_shares
191
+
192
+ def aggregate_hs_distribution(self, hs_distribution):
193
+ """
194
+ We have the current HS distribution values for the leaves, but want to propagate it updwards to the parents.
195
+ We will traverse the tree from top to bottom and bring up the aggregated values.
196
+ """
197
+ executing, queued, pledged = 0, 0, 0
198
+
199
+ # If the node has no children, it's a leave and should have an entry in the hs_distribution
200
+ if not self.children:
201
+ try:
202
+ executing = hs_distribution[self.name][EXECUTING]
203
+ queued = hs_distribution[self.name][QUEUED]
204
+ pledged = hs_distribution[self.name][PLEDGED]
205
+ except KeyError:
206
+ pass
207
+
208
+ return executing, queued, pledged
209
+
210
+ # If the node has children, sum up the values of the children
211
+ executing = 0
212
+ queued = 0
213
+ pledged = 0
214
+
215
+ for child in self.children:
216
+ (
217
+ executing_child,
218
+ queued_child,
219
+ pledged_child,
220
+ ) = child.aggregate_hs_distribution(hs_distribution)
221
+ executing += executing_child
222
+ queued += queued_child
223
+ pledged += pledged_child
224
+
225
+ # Add the aggregated value to the map
226
+ hs_distribution[self.name] = {
227
+ EXECUTING: executing,
228
+ QUEUED: queued,
229
+ PLEDGED: pledged,
230
+ }
231
+
232
+ # Return the aggregated values
233
+ return executing, queued, pledged
234
+
235
+ # return column names
236
+ def column_names(cls):
237
+ ret = ""
238
+ for attr in cls._attributes:
239
+ if ret != "":
240
+ ret += ","
241
+ ret += attr
242
+ return ret
243
+
244
+ column_names = classmethod(column_names)
@@ -0,0 +1,92 @@
1
+ """
2
+ worker specification
3
+
4
+ """
5
+
6
+ import datetime
7
+
8
+
9
+ class HarvesterMetricsSpec(object):
10
+ # attributes
11
+ _attributes = ("harvester_ID", "creation_time", "harvester_host", "metrics")
12
+ # slots
13
+ __slots__ = _attributes + ("_changedAttrs",)
14
+ # attributes which have 0 by default
15
+ _zeroAttrs = ()
16
+
17
+ # constructor
18
+ def __init__(self):
19
+ # install attributes
20
+ for attr in self._attributes:
21
+ object.__setattr__(self, attr, None)
22
+ # map of changed attributes
23
+ object.__setattr__(self, "_changedAttrs", {})
24
+
25
+ # override __setattr__ to collecte the changed attributes
26
+ def __setattr__(self, name, value):
27
+ oldVal = getattr(self, name)
28
+ # convert string to datetime
29
+ if isinstance(value, str) and value.startswith("datetime/"):
30
+ value = datetime.datetime.strptime(value.split("/")[-1], "%Y-%m-%d %H:%M:%S.%f")
31
+ object.__setattr__(self, name, value)
32
+ # collect changed attributes
33
+ if oldVal != value:
34
+ self._changedAttrs[name] = value
35
+
36
+ # reset changed attribute list
37
+ def resetChangedList(self):
38
+ self._oldPandaID = self.PandaID
39
+ object.__setattr__(self, "_changedAttrs", {})
40
+
41
+ # return map of values
42
+ def valuesMap(self, onlyChanged=False):
43
+ ret = {}
44
+ for attr in self._attributes:
45
+ if onlyChanged and attr not in self._changedAttrs:
46
+ continue
47
+ val = getattr(self, attr)
48
+ if val is None:
49
+ if attr in self._zeroAttrs:
50
+ val = 0
51
+ ret[f":{attr}"] = val
52
+ return ret
53
+
54
+ # pack tuple into FileSpec
55
+ def pack(self, values):
56
+ for i in range(len(self._attributes)):
57
+ attr = self._attributes[i]
58
+ val = values[i]
59
+ object.__setattr__(self, attr, val)
60
+
61
+ # return column names for INSERT
62
+ def columnNames(cls):
63
+ ret = ""
64
+ for attr in cls._attributes:
65
+ ret += f"{attr},"
66
+ ret = ret[:-1]
67
+ return ret
68
+
69
+ columnNames = classmethod(columnNames)
70
+
71
+ # return expression of bind variables for INSERT
72
+ def bindValuesExpression(cls):
73
+ from pandaserver.config import panda_config
74
+
75
+ ret = "VALUES("
76
+ for attr in cls._attributes:
77
+ ret += f":{attr},"
78
+ ret = ret[:-1]
79
+ ret += ")"
80
+ return ret
81
+
82
+ bindValuesExpression = classmethod(bindValuesExpression)
83
+
84
+ # return an expression of bind variables for UPDATE to update only changed attributes
85
+ def bindUpdateChangesExpression(self):
86
+ ret = ""
87
+ for attr in self._attributes:
88
+ if attr not in self._changedAttrs:
89
+ continue
90
+ ret += "{0}=:{0},".format(attr)
91
+ ret = ret[:-1]
92
+ return ret
@@ -0,0 +1,82 @@
1
+ import sys
2
+ from threading import Lock
3
+
4
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
5
+
6
+ from pandaserver.config import panda_config
7
+
8
+ _logger = PandaLogger().getLogger("Initializer")
9
+
10
+
11
+ class Initializer:
12
+ """
13
+ Initialize a dummy database connection.
14
+
15
+ Returns:
16
+ bool: True if the initialization is successful, False otherwise.
17
+ """
18
+
19
+ def __init__(self):
20
+ self.lock = Lock()
21
+ self.first = True
22
+
23
+ def init(self):
24
+ _logger.debug(f"init new={self.first}")
25
+ # do nothing when nDBConnection is 0
26
+ if panda_config.nDBConnection == 0:
27
+ return True
28
+ # lock
29
+ self.lock.acquire()
30
+ if self.first:
31
+ self.first = False
32
+ try:
33
+ _logger.debug("connect")
34
+ # connect
35
+ if panda_config.backend == "oracle":
36
+ import oracledb
37
+
38
+ oracledb.init_oracle_client()
39
+ conn = oracledb.connect(user=panda_config.dbuser, password=panda_config.dbpasswd, dsn=panda_config.dbhost)
40
+
41
+ elif panda_config.backend == "postgres":
42
+ import psycopg2
43
+
44
+ conn = psycopg2.connect(
45
+ host=panda_config.dbhost,
46
+ dbname=panda_config.dbname,
47
+ port=panda_config.dbport,
48
+ connect_timeout=panda_config.dbtimeout,
49
+ user=panda_config.dbuser,
50
+ password=panda_config.dbpasswd,
51
+ )
52
+
53
+ else:
54
+ import MySQLdb
55
+
56
+ conn = MySQLdb.connect(
57
+ host=panda_config.dbhost,
58
+ db=panda_config.dbname,
59
+ port=panda_config.dbport,
60
+ connect_timeout=panda_config.dbtimeout,
61
+ user=panda_config.dbuser,
62
+ passwd=panda_config.dbpasswd,
63
+ )
64
+
65
+ # close
66
+ conn.close()
67
+ _logger.debug("done")
68
+
69
+ except Exception:
70
+ self.lock.release()
71
+ exception_type, exception_value, traceback = sys.exc_info()
72
+ _logger.error(f"connect : {exception_type} {exception_value}")
73
+ return False
74
+
75
+ # release the lock
76
+ self.lock.release()
77
+ return True
78
+
79
+
80
+ # singleton
81
+ initializer = Initializer()
82
+ del Initializer