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 subprocess
2
+
3
+ from pandajedi.jediconfig import jedi_config
4
+
5
+ proc = subprocess.Popen(
6
+ f"ps -l x -U {jedi_config.master.uname}",
7
+ shell=True,
8
+ stdout=subprocess.PIPE,
9
+ )
10
+ stdoutList = str(proc.communicate()[0]).split("\n")
11
+ for line in stdoutList:
12
+ try:
13
+ items = line.split()
14
+ if len(items) < 6:
15
+ continue
16
+ pid = items[3]
17
+ nice = int(items[7])
18
+ if "JediMaster.py" in line and nice > 0:
19
+ reniceProc = subprocess.Popen(
20
+ f"renice 0 {pid}",
21
+ shell=True,
22
+ stdout=subprocess.PIPE,
23
+ )
24
+ except Exception:
25
+ pass
@@ -0,0 +1,110 @@
1
+ import json
2
+ import re
3
+ import sys
4
+ import uuid
5
+
6
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
7
+
8
+ from pandajedi.jedicore import Interaction
9
+ from pandajedi.jedicore.MsgWrapper import MsgWrapper
10
+
11
+ from .TaskGeneratorBase import TaskGeneratorBase
12
+
13
+ logger = PandaLogger().getLogger(__name__.split(".")[-1])
14
+
15
+
16
+ # task generator for ATLAS
17
+ class AtlasTaskGenerator(TaskGeneratorBase):
18
+ # constructor
19
+ def __init__(self, taskBufferIF, ddmIF):
20
+ TaskGeneratorBase.__init__(self, taskBufferIF, ddmIF)
21
+
22
+ # main to generate task
23
+ def doGenerate(self, taskSpec, taskParamMap, **varMap):
24
+ # make logger
25
+ tmpLog = MsgWrapper(logger, f"<jediTaskID={taskSpec.jediTaskID}>")
26
+ tmpLog.info(f"start taskType={taskSpec.taskType}")
27
+ tmpLog.info(str(varMap))
28
+ # returns
29
+ retFatal = self.SC_FATAL
30
+ retTmpError = self.SC_FAILED
31
+ retOK = self.SC_SUCCEEDED
32
+ try:
33
+ # check prodSourceLabel
34
+ if taskSpec.prodSourceLabel in ["managed", "test"]:
35
+ # check taskType
36
+ if taskSpec.taskType == "recov":
37
+ # generate parent tasks for lost file recovery if it is not yet generated
38
+ if "parentGenerated" in taskParamMap:
39
+ tmpLog.info("skip since already generated parent tasks")
40
+ else:
41
+ tmpLog.info("generating parent tasks for lost file recovery")
42
+ # missing files are undefined
43
+ if "missingFilesMap" not in varMap:
44
+ tmpLog.error("missing files are undefined")
45
+ return retFatal
46
+ missingFilesMap = varMap["missingFilesMap"]
47
+ # check datasets
48
+ for datasetName, datasetValMap in missingFilesMap.items():
49
+ # dataset needs specify container
50
+ datasetSpec = datasetValMap["datasetSpec"]
51
+ if datasetSpec.containerName in ["", None]:
52
+ errStr = f"cannot make parent tasks due to undefined container for datasetID={datasetSpec.datasetID}:{datasetName}"
53
+ taskSpec.setErrDiag(errStr)
54
+ tmpLog.error(errStr)
55
+ return retFatal
56
+ # make parameters for new task
57
+ newJsonStrList = []
58
+ for datasetName, datasetValMap in missingFilesMap.items():
59
+ datasetSpec = datasetValMap["datasetSpec"]
60
+ newTaskParamMap = {}
61
+ newTaskParamMap["oldDatasetName"] = datasetName
62
+ newTaskParamMap["lostFiles"] = datasetValMap["missingFiles"]
63
+ newTaskParamMap["vo"] = taskSpec.vo
64
+ newTaskParamMap["cloud"] = taskSpec.cloud
65
+ newTaskParamMap["taskPriority"] = taskSpec.taskPriority
66
+ newTaskParamMap["taskType"] = taskSpec.taskType
67
+ newTaskParamMap["prodSourceLabel"] = taskSpec.prodSourceLabel
68
+ logDatasetName = f"panda.jedi{taskSpec.taskType}.log.{uuid.uuid4()}"
69
+ newTaskParamMap["log"] = {
70
+ "dataset": logDatasetName,
71
+ "type": "template",
72
+ "param_type": "log",
73
+ "token": "ATLASDATADISK",
74
+ "value": f"{logDatasetName}.${{SN}}.log.tgz",
75
+ }
76
+ # make new datasetname
77
+ outDatasetName = datasetName
78
+ # remove /
79
+ outDatasetName = re.sub("/$", "", outDatasetName)
80
+ # remove extension
81
+ outDatasetName = re.sub(f"\\.{taskSpec.taskType}\\d+$", "", outDatasetName)
82
+ # add extension
83
+ outDatasetName = outDatasetName + f".{taskSpec.taskType}{taskSpec.jediTaskID}"
84
+ newTaskParamMap["output"] = {"dataset": outDatasetName}
85
+ if datasetSpec.containerName not in ["", None]:
86
+ newTaskParamMap["output"]["container"] = datasetSpec.containerName
87
+ # make json
88
+ jsonStr = json.dumps(newTaskParamMap)
89
+ newJsonStrList.append(jsonStr)
90
+ # change original task parameters to not repeat the same procedure and to use newly produced files
91
+ taskParamMap["parentGenerated"] = True
92
+ taskParamMap["useInFilesInContainer"] = True
93
+ taskParamMap["useInFilesWithNewAttemptNr"] = True
94
+ jsonStr = json.dumps(taskParamMap)
95
+ # insert and update task parameters
96
+ sTmp, newJediTaskIDs = self.taskBufferIF.insertUpdateTaskParams_JEDI(
97
+ taskSpec.jediTaskID, taskSpec.vo, taskSpec.prodSourceLabel, jsonStr, newJsonStrList
98
+ )
99
+ if sTmp:
100
+ tmpLog.info(f"inserted/updated tasks in DB : new jediTaskIDs={str(newJediTaskIDs)}")
101
+ else:
102
+ tmpLog.error("failed to insert/update tasks in DB")
103
+ return retFatal
104
+ # return
105
+ tmpLog.info("done")
106
+ return retOK
107
+ except Exception:
108
+ errtype, errvalue = sys.exc_info()[:2]
109
+ tmpLog.error(f"doGenerate failed with {errtype.__name__}:{errvalue}")
110
+ return retFatal
@@ -0,0 +1,15 @@
1
+ from pandajedi.jedicore import Interaction
2
+
3
+
4
+ # base class for task generator
5
+ class TaskGeneratorBase(object):
6
+ def __init__(self, taskBufferIF, ddmIF):
7
+ self.ddmIF = ddmIF
8
+ self.taskBufferIF = taskBufferIF
9
+ self.refresh()
10
+
11
+ def refresh(self):
12
+ self.siteMapper = self.taskBufferIF.get_site_mapper()
13
+
14
+
15
+ Interaction.installSC(TaskGeneratorBase)
File without changes
File without changes
@@ -0,0 +1,71 @@
1
+ import json
2
+
3
+ from pandacommon.pandalogger import logger_utils
4
+
5
+ from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin
6
+
7
+ base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
8
+
9
+
10
+ # AI parameter adjuster plugin
11
+ class AIParameterAdjuster(BaseMsgProcPlugin):
12
+ """
13
+ Parameter adjuster message processor whose source messages generated by external AI
14
+ Used for scout prediction, etc.
15
+ """
16
+ def process(self, msg_obj, decoded_data=None):
17
+ tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
18
+ # start
19
+ tmp_log.info("start")
20
+ tmp_log.debug(f"sub_id={msg_obj.sub_id} ; msg_id={msg_obj.msg_id}")
21
+ # parse
22
+ if decoded_data is None:
23
+ # json decode
24
+ try:
25
+ msg_dict = json.loads(msg_obj.data)
26
+ except Exception as e:
27
+ err_str = f"failed to parse message json {msg_obj.data} , skipped. {e.__class__.__name__} : {e}"
28
+ tmp_log.error(err_str)
29
+ raise
30
+ else:
31
+ msg_dict = decoded_data
32
+ # sanity check
33
+ try:
34
+ task_id = int(msg_dict["task_id"])
35
+ # message type
36
+ msg_type = msg_dict["msg_type"]
37
+ if msg_type == "scout_prediction":
38
+ pass
39
+ elif msg_type == "test":
40
+ pass
41
+ else:
42
+ raise ValueError(f"invalid msg_type value: {msg_type}")
43
+ except Exception as e:
44
+ err_str = f"failed to parse message object dict {msg_dict} , skipped. {e.__class__.__name__} : {e}"
45
+ tmp_log.error(err_str)
46
+ raise
47
+ # run
48
+ try:
49
+ # initialize to_proceed
50
+ to_proceed = False
51
+ # type filters
52
+ if msg_type in ["scout_prediction", "test"]:
53
+ to_proceed = True
54
+ # whether to proceed the targets
55
+ if to_proceed:
56
+ # initialize
57
+ pass
58
+ # loop over targets
59
+ if msg_type == "scout_prediction":
60
+ #TODO: to complete once the format of scout prediction messages is decided
61
+ pass
62
+ pass
63
+ else:
64
+ # do nothing
65
+ tmp_log.debug(f"task_id={task_id}, msg_type={msg_type}, nothing done")
66
+ except Exception as e:
67
+ err_str = f"failed to process the message, skipped. {e.__class__.__name__} : {e}"
68
+ tmp_log.error(err_str)
69
+ raise
70
+ # done
71
+ tmp_log.info("done")
@@ -0,0 +1,66 @@
1
+ import json
2
+
3
+ from pandacommon.pandalogger import logger_utils
4
+
5
+ from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin
6
+ from pandajedi.jedimsgprocessor.hpo_msg_processor import HPOMsgProcPlugin
7
+ from pandajedi.jedimsgprocessor.processing_msg_processor import ProcessingMsgProcPlugin
8
+ from pandajedi.jedimsgprocessor.tape_carousel_msg_processor import (
9
+ TapeCarouselMsgProcPlugin,
10
+ )
11
+
12
+ base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
13
+
14
+
15
+ # Atlas iDDS message processing plugin, a bridge connect to other idds related message processing plugins
16
+ class AtlasIddsMsgProcPlugin(BaseMsgProcPlugin):
17
+ def initialize(self):
18
+ BaseMsgProcPlugin.initialize(self)
19
+ self.plugin_TapeCarousel = TapeCarouselMsgProcPlugin()
20
+ self.plugin_HPO = HPOMsgProcPlugin()
21
+ self.plugin_Processing = ProcessingMsgProcPlugin()
22
+ # for each plugin
23
+ for _plugin in [self.plugin_TapeCarousel, self.plugin_HPO, self.plugin_Processing]:
24
+ # initialize each
25
+ _plugin.initialize(in_collective=True)
26
+ # use the same taskBuffer interface
27
+ _plugin.tbIF = self.tbIF
28
+
29
+ def process(self, msg_obj):
30
+ tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
31
+ # start
32
+ tmp_log.info("start")
33
+ tmp_log.debug(f"sub_id={msg_obj.sub_id} ; msg_id={msg_obj.msg_id}")
34
+ # parse json
35
+ try:
36
+ msg_dict = json.loads(msg_obj.data)
37
+ except Exception as e:
38
+ err_str = f"failed to parse message json {msg_obj.data} , skipped. {e.__class__.__name__} : {e}"
39
+ tmp_log.error(err_str)
40
+ raise
41
+ # sanity check
42
+ try:
43
+ msg_type = msg_dict.get("msg_type")
44
+ except Exception as e:
45
+ err_str = f"failed to parse message object dict {msg_dict} , skipped. {e.__class__.__name__} : {e}"
46
+ tmp_log.error(err_str)
47
+ raise
48
+ # run different plugins according to message type
49
+ try:
50
+ if msg_type in ("file_stagein", "collection_stagein", "work_stagein"):
51
+ tmp_log.debug("to tape_carousel")
52
+ self.plugin_TapeCarousel.process(msg_obj, decoded_data=msg_dict)
53
+ elif msg_type in ("file_hyperparameteropt", "collection_hyperparameteropt", "work_hyperparameteropt"):
54
+ tmp_log.debug("to hpo")
55
+ self.plugin_HPO.process(msg_obj, decoded_data=msg_dict)
56
+ elif msg_type in ("file_processing", "collection_processing", "work_processing"):
57
+ tmp_log.debug("to processing")
58
+ self.plugin_Processing.process(msg_obj, decoded_data=msg_dict)
59
+ else:
60
+ # Asked by iDDS and message broker guys, JEDI needs to consume unknown types of messages and do nothing...
61
+ warn_str = f"unknown msg_type: {msg_type} msg_dict: {str(msg_dict)}"
62
+ tmp_log.warning(warn_str)
63
+ except Exception:
64
+ raise
65
+ # done
66
+ tmp_log.info("done")
@@ -0,0 +1,33 @@
1
+ from pandacommon.pandamsgbkr.msg_processor import SimpleMsgProcPluginBase
2
+
3
+ from pandajedi.jedicore.JediTaskBuffer import JediTaskBuffer
4
+
5
+
6
+ # Base simple message processing plugin
7
+ class BaseMsgProcPlugin(SimpleMsgProcPluginBase):
8
+ def initialize(self, in_collective=False):
9
+ """
10
+ initialize plugin instance, run once before loop in thread
11
+ """
12
+ if in_collective:
13
+ # run in collective msg_proc plugin
14
+ pass
15
+ else:
16
+ # run as individual msg_proc plugin
17
+ self.set_tbIF()
18
+
19
+ def set_tbIF(self):
20
+ """
21
+ set up JEDI TaskBuffer interface
22
+ """
23
+ # set nDBConnection = n_threads to avoid DBProxy blocking amongs threads
24
+ n_db_conns = getattr(self, "n_threads", 1)
25
+ self.tbIF = JediTaskBuffer(None, nDBConnection=n_db_conns)
26
+
27
+ def process(self, msg_obj):
28
+ """
29
+ process the message
30
+ Get msg_obj from the incoming MQ (if any; otherwise msg_obj is None)
31
+ Returned value will be sent to the outgoing MQ (if any)
32
+ """
33
+ pass
@@ -0,0 +1,29 @@
1
+ from pandacommon.pandalogger import logger_utils
2
+
3
+ from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin
4
+
5
+ base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
6
+
7
+
8
+ # forwarding message processing plugin
9
+ class ForwardingMsgProcPlugin(BaseMsgProcPlugin):
10
+ """
11
+ Simply forward the message from one queue to another
12
+ """
13
+
14
+ def process(self, msg_obj):
15
+ tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
16
+ # start
17
+ # tmp_log.info('start')
18
+ # tmp_log.debug('sub_id={0} ; msg_id={1}'.format(msg_obj.sub_id, msg_obj.msg_id))
19
+ # run
20
+ try:
21
+ msg = msg_obj.data
22
+ tmp_log.debug(f"forward message {msg}")
23
+ except Exception as e:
24
+ err_str = f"failed to run, skipped. {e.__class__.__name__} : {e}"
25
+ tmp_log.error(err_str)
26
+ raise
27
+ # done
28
+ # tmp_log.info('done')
29
+ return msg
@@ -0,0 +1,93 @@
1
+ import json
2
+
3
+ from pandacommon.pandalogger import logger_utils
4
+
5
+ from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin
6
+
7
+ base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
8
+
9
+
10
+ # Hyper-Parameter-Optimization message processing plugin
11
+ class HPOMsgProcPlugin(BaseMsgProcPlugin):
12
+ def process(self, msg_obj, decoded_data=None):
13
+ tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
14
+ # start
15
+ tmp_log.info("start")
16
+ tmp_log.debug(f"sub_id={msg_obj.sub_id} ; msg_id={msg_obj.msg_id}")
17
+ # parse
18
+ if decoded_data is None:
19
+ # json decode
20
+ try:
21
+ msg_dict = json.loads(msg_obj.data)
22
+ except Exception as e:
23
+ err_str = f"failed to parse message json {msg_obj.data} , skipped. {e.__class__.__name__} : {e}"
24
+ tmp_log.error(err_str)
25
+ raise
26
+ else:
27
+ msg_dict = decoded_data
28
+ # sanity check
29
+ try:
30
+ msg_type = msg_dict["msg_type"]
31
+ jeditaskid = int(msg_dict["workload_id"])
32
+ if msg_type == "file_hyperparameteropt":
33
+ target_list = msg_dict["files"]
34
+ elif msg_type == "collection_hyperparameteropt":
35
+ # to finish the task
36
+ pass
37
+ elif msg_type == "work_hyperparameteropt":
38
+ pass
39
+ else:
40
+ raise ValueError(f"invalid msg_type value: {msg_type}")
41
+ except Exception as e:
42
+ err_str = f"failed to parse message object dict {msg_dict} , skipped. {e.__class__.__name__} : {e}"
43
+ tmp_log.error(err_str)
44
+ raise
45
+ # run
46
+ if msg_type == "file_hyperparameteropt":
47
+ # insert HPO events
48
+ try:
49
+ # event ids from the targets
50
+ event_id_list = []
51
+ for target in target_list:
52
+ if target["status"] != "New":
53
+ continue
54
+ model_id = None
55
+ try:
56
+ path = json.loads(target["path"])
57
+ if isinstance(path[0], (list, tuple)):
58
+ model_id = path[0][0]
59
+ except Exception:
60
+ pass
61
+ event_id_list.append((target["name"], model_id))
62
+ if event_id_list:
63
+ n_events = len(event_id_list)
64
+ # insert events
65
+ res = self.tbIF.insertHpoEventAboutIdds_JEDI(jedi_task_id=jeditaskid, event_id_list=event_id_list)
66
+ # check if ok
67
+ if res:
68
+ tmp_log.debug(f"jeditaskid={jeditaskid}, inserted {n_events} events: {event_id_list}")
69
+ else:
70
+ tmp_log.warning(f"jeditaskid={jeditaskid}, failed to insert events: {event_id_list}")
71
+ except Exception as e:
72
+ err_str = f"failed to parse message object, skipped. {e.__class__.__name__} : {e}"
73
+ tmp_log.error(err_str)
74
+ raise
75
+ elif msg_type == "collection_hyperparameteropt":
76
+ # finish the task
77
+ try:
78
+ # send finish command
79
+ retVal, retStr = self.tbIF.sendCommandTaskPanda(jeditaskid, "iDDS. HPO task finished", True, "finish", comQualifier="soft")
80
+ # check if ok
81
+ if retVal:
82
+ tmp_log.debug(f"jeditaskid={jeditaskid}, finished the task")
83
+ else:
84
+ tmp_log.warning(f"jeditaskid={jeditaskid}, failed finish the task: {retStr}")
85
+ except Exception as e:
86
+ err_str = f"failed to parse message object, skipped. {e.__class__.__name__} : {e}"
87
+ tmp_log.error(err_str)
88
+ raise
89
+ else:
90
+ # do nothing
91
+ tmp_log.debug(f"jeditaskid={jeditaskid}, msg_type={msg_type}, did nothing")
92
+ # done
93
+ tmp_log.info("done")
@@ -0,0 +1,63 @@
1
+ import json
2
+
3
+ from pandacommon.pandalogger import logger_utils
4
+
5
+ from pandajedi.jediddm.DDMInterface import DDMInterface
6
+ from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin
7
+ from pandajedi.jediorder.ContentsFeeder import ContentsFeederThread
8
+
9
+ base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
10
+
11
+
12
+ # Jedi Contents Feeder message processor plugin
13
+ class JediContentsFeederMsgProcPlugin(BaseMsgProcPlugin):
14
+ """
15
+ Message-driven Contents Feeder
16
+ """
17
+
18
+ def initialize(self):
19
+ BaseMsgProcPlugin.initialize(self)
20
+ ddmIF = DDMInterface()
21
+ ddmIF.setupInterface()
22
+ the_pid = self.get_pid()
23
+ self.contents_feeder_thread_obj = ContentsFeederThread(taskDsList=None, threadPool=None, taskbufferIF=self.tbIF, ddmIF=ddmIF, pid=the_pid)
24
+
25
+ def process(self, msg_obj):
26
+ tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
27
+ # start
28
+ tmp_log.info("start")
29
+ tmp_log.debug(f"sub_id={msg_obj.sub_id} ; msg_id={msg_obj.msg_id}")
30
+ # parse json
31
+ try:
32
+ msg_dict = json.loads(msg_obj.data)
33
+ except Exception as e:
34
+ err_str = f"failed to parse message json {msg_obj.data} , skipped. {e.__class__.__name__} : {e}"
35
+ tmp_log.error(err_str)
36
+ raise
37
+ # sanity check
38
+ try:
39
+ msg_type = msg_dict["msg_type"]
40
+ except Exception as e:
41
+ err_str = f"failed to parse message object dict {msg_dict} , skipped. {e.__class__.__name__} : {e}"
42
+ tmp_log.error(err_str)
43
+ raise
44
+ if msg_type != "jedi_contents_feeder":
45
+ # FIXME
46
+ err_str = f"got unknown msg_type {msg_type} , skipped "
47
+ tmp_log.error(err_str)
48
+ raise
49
+ # run
50
+ try:
51
+ task_id = msg_dict["taskid"]
52
+ task_ds_list = self.tbIF.getDatasetsToFeedContents_JEDI(vo=None, prodSourceLabel=None, task_id=task_id)
53
+ if task_ds_list:
54
+ self.contents_feeder_thread_obj.feed_contents_to_tasks(task_ds_list)
55
+ tmp_log.info(f"fed datasets to task {task_id}")
56
+ else:
57
+ tmp_log.debug(f"got empty list of datasets to feed to task {task_id}; skipped ")
58
+ except Exception as e:
59
+ err_str = f"failed to run, skipped. {e.__class__.__name__} : {e}"
60
+ tmp_log.error(err_str)
61
+ raise
62
+ # done
63
+ tmp_log.info("done")