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,35 @@
1
+ import sys
2
+
3
+ from pandacommon.pandalogger.PandaLogger import PandaLogger
4
+ from pandacommon.pandautils.thread_utils import GenericThread
5
+
6
+ from pandaserver.config import panda_config
7
+ from pandaserver.taskbuffer.Initializer import initializer
8
+ from pandaserver.taskbuffer.TaskBuffer import taskBuffer
9
+
10
+ # initialize DB using dummy connection
11
+ initializer.init()
12
+
13
+ # logger
14
+ _logger = PandaLogger().getLogger("boostUser")
15
+ _logger.debug("================= start ==================")
16
+
17
+ # instantiate TB
18
+ requester_id = GenericThread().get_full_id(__name__, sys.modules[__name__].__file__)
19
+ taskBuffer.init(panda_config.dbhost, panda_config.dbpasswd, nDBConnection=1, requester=requester_id)
20
+
21
+ user = sys.stdin.read()
22
+ user = user[:-1]
23
+
24
+ sql = "UPDATE atlas_panda.%s set currentPriority=:prio where prodUserName=:uname and prodSourceLabel IN (:label1,:label2) and currentPriority<:prio"
25
+ varMap = {}
26
+ varMap[":prio"] = 4000
27
+ varMap[":uname"] = user
28
+ varMap[":label1"] = "user"
29
+ varMap[":label2"] = "panda"
30
+ for table in ("jobsactive4", "jobsdefined4"):
31
+ _logger.debug((sql % table) + str(varMap))
32
+ ret = taskBuffer.querySQLS(sql % table, varMap)
33
+ _logger.debug(f"ret -> {str(ret)}")
34
+
35
+ _logger.debug("================= end ==================")
@@ -0,0 +1,11 @@
1
+ import sys
2
+
3
+ from pandaserver.config import panda_config
4
+ from pandaserver.dataservice.activator import Activator
5
+ from pandaserver.taskbuffer.TaskBuffer import taskBuffer
6
+
7
+ taskBuffer.init(panda_config.dbhost, panda_config.dbpasswd, nDBConnection=1)
8
+
9
+ d = taskBuffer.queryDatasetWithMap({"name": sys.argv[1]})
10
+
11
+ Activator(taskBuffer, d, enforce=True).run()
@@ -0,0 +1,95 @@
1
+ import json
2
+ import math
3
+ import re
4
+ import sys
5
+ import uuid
6
+
7
+ from pandajedi.jedicore import JediTaskBuffer
8
+ from pandaserver.taskbuffer.Initializer import initializer
9
+
10
+ jediTaskID = sys.argv[1]
11
+
12
+ initializer.init()
13
+ taskBuffer = JediTaskBuffer.JediTaskBuffer(None)
14
+ proxy = taskBuffer.proxyPool.getProxy()
15
+
16
+ s, o = proxy.getClobObj(
17
+ "select JEDI_TASK_PARAMETERS from atlas_deft.t_task where taskid=:task_id",
18
+ {":task_id": jediTaskID},
19
+ )
20
+
21
+ taskParamStr = o[0][0]
22
+
23
+ t = json.loads(taskParamStr)
24
+
25
+ s, o = proxy.querySQLS(
26
+ "select cpuTime,cpuTimeUnit,ioIntensity,ioIntensityUnit,ramCount,ramUnit,outDiskCount,outDiskUnit,workDiskCount,workDiskUnit "
27
+ "FROM atlas_panda.jedi_tasks where jeditaskid=:task_id",
28
+ {":task_id": jediTaskID},
29
+ )
30
+ (
31
+ cpuTime,
32
+ cpuTimeUnit,
33
+ ioIntensity,
34
+ ioIntensityUnit,
35
+ ramCount,
36
+ ramUnit,
37
+ outDiskCount,
38
+ outDiskUnit,
39
+ workDiskCount,
40
+ workDiskUnit,
41
+ ) = o[0]
42
+
43
+ tname = f"{str(uuid.uuid4())}.{jediTaskID}"
44
+
45
+ t.update(
46
+ {
47
+ "taskName": tname,
48
+ "userName": "pandasrv1",
49
+ "prodSourceLabel": "test",
50
+ "taskPriority": 100000,
51
+ "skipScout": True,
52
+ "cpuTime": cpuTime,
53
+ "cpuTimeUnit": cpuTimeUnit,
54
+ "ioIntensity": ioIntensity,
55
+ "ioIntensityUnit": ioIntensityUnit,
56
+ "ramCount": ramCount,
57
+ "ramUnit": ramUnit,
58
+ "outDiskCount": outDiskCount,
59
+ "outDiskUnit": outDiskUnit,
60
+ "workDiskCount": workDiskCount,
61
+ "workDiskUnit": workDiskUnit,
62
+ "t1Weight": -1,
63
+ }
64
+ )
65
+
66
+ i = t["log"]
67
+ i["dataset"] = f"panda.{tname}.log"
68
+ i["value"] = re.sub(r".{}.".format(jediTaskID), r".{}.".format(tname), i["value"])
69
+
70
+ if "toStaging" in t:
71
+ del t["toStaging"]
72
+
73
+ if "inputPreStaging" in t:
74
+ del t["inputPreStaging"]
75
+
76
+ if "nGBPerJob" in t:
77
+ t["nGBPerJob"] = math.ceil(t["nGBPerJob"] / 2)
78
+
79
+ newJ = []
80
+ for i in t["jobParameters"]:
81
+ if "dataset" in i:
82
+ if i["param_type"] == "output":
83
+ i["dataset"] = f"panda.{tname}.{i['dataset'].split('.')[4]}"
84
+ i["value"] = re.sub(r".{}.".format(jediTaskID), r".{}.".format(tname), i["value"])
85
+ elif i["type"] == "template":
86
+ i["value"] = re.sub(r" {}.".format(jediTaskID), r" {}.".format(tname), i["value"])
87
+
88
+ k = sorted(t.keys())
89
+
90
+ for kk in k:
91
+ print(kk, t[kk])
92
+
93
+ jonStr = json.dumps(t)
94
+
95
+ print(proxy.insertTaskParams_JEDI(t["vo"], t["prodSourceLabel"], t["userName"], t["taskName"], jonStr))
@@ -0,0 +1,184 @@
1
+ import hashlib
2
+ import json
3
+ import os
4
+ import re
5
+ import sys
6
+ import uuid
7
+ from http.client import HTTPSConnection
8
+ from urllib.parse import urlencode
9
+
10
+ from pandacommon.pandautils.thread_utils import GenericThread
11
+ from pandaserver.brokerage.SiteMapper import SiteMapper
12
+ from pandaserver.config import panda_config
13
+ from pandaserver.dataservice import DataServiceUtils
14
+ from pandaserver.dataservice.DataServiceUtils import select_scope
15
+ from pandaserver.taskbuffer.TaskBuffer import taskBuffer
16
+ from pandaserver.userinterface.Client import baseURLSSL
17
+
18
+ # instantiate TB
19
+ requester_id = GenericThread().get_full_id(__name__, sys.modules[__name__].__file__)
20
+ taskBuffer.init(panda_config.dbhost, panda_config.dbpasswd, nDBConnection=1, requester=requester_id)
21
+ # instantiate sitemapper
22
+ siteMapper = SiteMapper(taskBuffer)
23
+
24
+ id = sys.argv[1]
25
+ job = taskBuffer.peekJobs([id])[0]
26
+
27
+ if job is None:
28
+ print("got None")
29
+ sys.exit(0)
30
+
31
+ xml = """<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
32
+ <!-- ATLAS file meta-data catalog -->
33
+ <!DOCTYPE POOLFILECATALOG SYSTEM "InMemory">
34
+ <POOLFILECATALOG>
35
+ """
36
+ try:
37
+ att = sys.argv[2]
38
+ except Exception:
39
+ att = job.attemptNr
40
+
41
+ if job.computingSite in ["", None, "NULL"]:
42
+ print("computingSite is not yet defined")
43
+ sys.exit(0)
44
+
45
+ siteSpec = siteMapper.getSite(job.computingSite)
46
+ scope_input, scope_output = select_scope(siteSpec, job.prodSourceLabel, job.job_label)
47
+
48
+ with open("/cvmfs/atlas.cern.ch/repo/sw/local/etc/cric_ddmendpoints.json") as f:
49
+ rseDict = json.load(f)
50
+
51
+ hash = hashlib.md5()
52
+
53
+ iOut = 0
54
+ outFileName = []
55
+ fileDict = {}
56
+ for tmpFile in job.Files:
57
+ if tmpFile.type in ["output"]:
58
+ if False: # outFileName is None:
59
+ outFileName.append(tmpFile.lfn)
60
+ if tmpFile.type in ["output", "log"]:
61
+ fileList = []
62
+ if False: # tmpFile.type == 'output':# and iOut > 0:
63
+ for i in range(8):
64
+ newFile = copy.copy(tmpFile)
65
+ newFile.lfn += f"._00{i}"
66
+ fileList.append(newFile)
67
+ # continue
68
+ else:
69
+ fileList.append(tmpFile)
70
+ iOut += 1
71
+ for file in fileList:
72
+ file.GUID = str(uuid.uuid4())
73
+ if DataServiceUtils.getDistributedDestination(file.destinationDBlockToken) is not None:
74
+ tmpSrcDDM = DataServiceUtils.getDistributedDestination(file.destinationDBlockToken)
75
+ elif job.computingSite == file.destinationSE and file.destinationDBlockToken in siteSpec.setokens_output[scope_output]:
76
+ tmpSrcDDM = siteSpec.setokens_output[scope_output][file.destinationDBlockToken]
77
+ elif file.lfn in outFileName:
78
+ tmpSrcDDM = DataServiceUtils.getDestinationSE(file.destinationDBlockToken)
79
+ if tmpSrcDDM is None:
80
+ tmpSrcSite = siteMapper.getSite(file.destinationSE)
81
+ tmp_scope_input, tmp_scope_output = select_scope(siteSpec, job.prodSourceLabel, job.job_label)
82
+ tmpSrcDDM = tmpSrcSite.ddm_output[tmp_scope_output]
83
+ else:
84
+ tmpSrcSite = siteMapper.getSite(job.computingSite)
85
+ tmp_scope_input, tmp_scope_output = select_scope(siteSpec, job.prodSourceLabel, job.job_label)
86
+ tmpSrcDDM = tmpSrcSite.ddm_output[tmp_scope_output]
87
+ srm, dummy, root = rseDict[tmpSrcDDM]["aprotocols"]["w"][0]
88
+ srm = re.sub("^token:[^:]+:", "", srm)
89
+ srm += root
90
+ srm = re.sub("/$", "", srm)
91
+ hash = hashlib.md5()
92
+ sl = f"{file.scope}:{file.lfn}"
93
+ hash.update(sl.encode())
94
+ hash_hex = hash.hexdigest()
95
+ correctedscope = "/".join(file.scope.split("."))
96
+ path = f"{correctedscope}/{hash_hex[0:2]}/{hash_hex[2:4]}/{file.lfn}"
97
+
98
+ strDDM = ""
99
+ if tmpFile.type == "log":
100
+ strDDM += f"<endpoint>{tmpSrcDDM}</endpoint>"
101
+ strDDM += "<endpoint>CERN-PROD_LOGS</endpoint>"
102
+ xml += f"""
103
+ <File ID="{file.GUID}">
104
+ <logical>
105
+ <lfn name="{file.lfn}"/>
106
+ </logical>
107
+ {strDDM}
108
+ <metadata att_name="surl" att_value="{srm}/{path}"/>
109
+ <metadata att_name="fsize" att_value="1273400000"/>
110
+ <metadata att_name="adler32" att_value="0d2a9dc9"/>
111
+ </File>"""
112
+ fileDict[file.lfn] = {
113
+ "guid": file.GUID,
114
+ "fsize": 1234,
115
+ "adler32": "0d2a9dc9",
116
+ "surl": f"{srm}/{path}",
117
+ }
118
+
119
+ xml += """
120
+ </POOLFILECATALOG>
121
+ """
122
+
123
+ xml = json.dumps(fileDict)
124
+
125
+ meta = """<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <!-- ATLAS file meta-data catalog --> <!DOCTYPE POOLFILECATALOG SYSTEM "InMemory"> <POOLFILECATALOG> <META type="string" name="size" value="82484969"/> <META type="string" name="conditionsTag" value="COMCOND-BLKPA-006-11"/> <META type="string" name="beamType" value="collisions"/> <META type="string" name="fileType" value="aod"/> <META type="string" name="autoConfiguration" value="['everything']"/> <META type="string" name="dataset" value=""/> <META type="string" name="maxEvents" value="200"/> <META type="string" name="AMITag" value="r5475"/> <META type="string" name="postInclude" value="['EventOverlayJobTransforms/Rt_override_BLKPA-006-11.py', 'EventOverlayJobTransforms/muAlign_reco.py']"/> <META type="string" name="preExec" value="['from CaloRec.CaloCellFlags import jobproperties;jobproperties.CaloCellFlags.doLArHVCorr.set_Value_and_Lock(False);muonRecFlags.writeSDOs=True', 'TriggerFlags.AODEDMSet=AODSLIM;rec.Commissioning.set_Value_and_Lock(True);jobproperties.Beam.numberOfCollisions.set_Value_and_Lock(20.0)']"/> <META type="string" name="triggerConfig" value="MCRECO:DBF:TRIGGERDBMC:325,142,266"/> <META type="string" name="preInclude" value="['EventOverlayJobTransforms/UseOracle.py', 'EventOverlayJobTransforms/custom.py', 'EventOverlayJobTransforms/recotrfpre.py']"/> <META type="string" name="geometryVersion" value="ATLAS-GEO-20-00-01"/> <META type="string" name="events"/> <META type="string" name="postExec" value="['from IOVDbSvc.CondDB import conddb"/> """
126
+
127
+ meta = """{ "argValues": { "AMITag": "p1815", "athenaopts": [ "--preloadlib=/cvmfs/atlas.cern.ch/repo/sw/software/x86_64-slc6-gcc47-opt/19.1.4/sw/IntelSoftware/linux/x86_64/xe2013/composer_xe_2013.3.163/compiler/lib/intel64/libintlc.so.5:/cvmfs/atlas.cern.ch/repo/sw/software/x86_64-slc6-gcc47-opt/19.1.4/sw/IntelSoftware/linux/x86_64/xe2013/composer_xe_2013.3.163/compiler/lib/intel64/libimf.so" ], "digiSeedOffset1": 8, "digiSeedOffset2": 8, "inputAODFile": [ "AOD.01598144._000008.pool.root.3" ], "jobNumber": 108, "reductionConf": [ "SUSY2" ], "runNumber": 167775 }, "cmdLine": "'/cvmfs/atlas.cern.ch/repo/sw/software/x86_64-slc6-gcc47-opt/19.1.4/AtlasDerivation/19.1.4.4/InstallArea/share/bin/Reco_tf.py' '--inputAODFile=AOD.01598144._000008.pool.root.3' '--AMITag' 'p1815' '--digiSeedOffset1' '8' '--digiSeedOffset2' '8' '--jobNumber' '108' '--outputDAODFile' '04553369._000108.pool.root.1.panda.um' '--reductionConf' 'SUSY2' '--runNumber' '167775'", "created": "2015-01-10T02:51:03", "executor": [ { "asetup": null, "errMsg": "", "exeConfig": { "inputs": [ "AOD" ], "outputs": [ "DAOD_SUSY2" ], "script": "athena.py", "substep": "a2da" }, "logfileReport": { "countSummary": { "CRITICAL": 0, "DEBUG": 1, "ERROR": 0, "FATAL": 0, "IGNORED": 0, "INFO": 6166, "UNKNOWN": 2114, "VERBOSE": 1, "WARNING": 95 }, "details": {} }, "metaData": {}, "name": "AODtoDAOD", "rc": 0, "resource": { "cpuTime": 2478, "wallTime": 2649 }, "statusOK": true, "validation": true } ], "exitAcronym": "OK", "exitCode": 0, "exitMsg": "OK", "exitMsgExtra": "", "files": { "input": [ { "dataset": null, "nentries": 5000, "subFiles": [ { "file_guid": "727E5251-EE36-1F44-8EFB-C8FBA7D9BE52", "name": "AOD.01598144._000008.pool.root.3" } ], "type": "AOD" } ], "output": [ { "argName": "SUSY2", "dataset": null, "subFiles": [ """
128
+
129
+ for file in job.Files:
130
+ if file.type in ["output"]:
131
+ # meta += """{ "AODFixVersion": "", "beam_energy": [ 6500000.0 ], "beam_type": [ "collisions" ], "conditions_tag": "OFLCOND-RUN12-SDR-14", "file_guid": "%s", "file_size": 643794695, "file_type": "pool", "geometry": "ATLAS-R2-2015-01-01-00", "integrity": true, "lumi_block": [ 15 ], "name": "%s", "nentries": 2563, "run_number": [ 222222 ] } ,""" % (file.GUID,file.lfn)
132
+ meta += (
133
+ """{ "AODFixVersion": "", "beam_energy": [ 6500000.0 ], "beam_type": [ "collisions" ], "conditions_tag": "OFLCOND-RUN12-SDR-14", "file_guid": "%s", "file_size": 643794695, "file_type": "pool", "geometry": "ATLAS-R2-2015-01-01-00", "integrity": true, "lumi_block": [ 15 ], "name": "%s", "run_number": [ 222222 ] } ,"""
134
+ % (file.GUID, file.lfn)
135
+ )
136
+ meta = meta[:-1]
137
+ meta += """], "type": "aod" } ] }, "name": "Reco_tf", "reportVersion": "1.0.0", "resource": { "cpuUnit": "seconds", "externalsCpuTime": 24, "memUnit": "kB", "transformCpuTime": 50, "wallTime": 2782 } }"""
138
+
139
+ node = {}
140
+ node["jobId"] = id
141
+ node["state"] = "finished"
142
+ # node['state']='failed'
143
+ # node['batchID']='aaax'
144
+ node["pilotErrorCode"] = 2
145
+ node["pilotErrorCode"] = 1099
146
+ # node['pilotErrorDiag']='aaaaaaaaaaaaaaaaaaaaaaa'
147
+ # node['metaData']=meta
148
+ node["corruptedFiles"] = "4003029-1800232404-8696089-2-2.zip"
149
+ node["siteName"] = "BNL_ATLAS_test"
150
+ node["attemptNr"] = att
151
+ node["jobMetrics"] = f"aaaaa=2 bbbb=3 alt:{','.join(outFileName)}"
152
+ # node['jobSubStatus']='pilot_killed'
153
+ # node['coreCount']=10
154
+ node["cpuConsumptionTime"] = 12340
155
+ node["maxRSS"] = 1
156
+ node["maxVMEM"] = 2
157
+ node["maxSWAP"] = 3
158
+ node["maxPSS"] = 5 * 1024 * 1024
159
+ node["avgRSS"] = 11
160
+ node["avgVMEM"] = 12
161
+ node["avgSWAP"] = 13
162
+ node["avgPSS"] = 14
163
+ node["rateWCHAR"] = 1400
164
+
165
+ node["xml"] = xml
166
+ url = f"{baseURLSSL}/updateJob"
167
+
168
+ match = re.search("[^:/]+://([^/]+)(/.+)", url)
169
+ host = match.group(1)
170
+ path = match.group(2)
171
+
172
+ if "X509_USER_PROXY" in os.environ:
173
+ certKey = os.environ["X509_USER_PROXY"]
174
+ else:
175
+ certKey = f"/tmp/x509up_u{os.getuid()}"
176
+
177
+ rdata = urlencode(node)
178
+
179
+ conn = HTTPSConnection(host, key_file=certKey, cert_file=certKey)
180
+ conn.request("POST", path, rdata)
181
+ resp = conn.getresponse()
182
+ data = resp.read()
183
+
184
+ print(data)
@@ -0,0 +1,11 @@
1
+ import optparse
2
+
3
+ from pandaserver.userinterface import Client
4
+
5
+ option_parser = optparse.OptionParser(conflict_handler="resolve")
6
+ options, args = option_parser.parse_args()
7
+
8
+ task_id = int(args[0])
9
+
10
+ s, o = Client.finish_task(task_id)
11
+ print(o)
@@ -0,0 +1,53 @@
1
+ import datetime
2
+ import os
3
+ import re
4
+ import socket
5
+ import sys
6
+ import threading
7
+ from http.client import HTTPSConnection
8
+ from urllib.parse import parse_qs, urlencode
9
+
10
+ from pandacommon.pandautils.PandaUtils import naive_utcnow
11
+
12
+ from pandaserver.userinterface.Client import baseURLSSL
13
+
14
+ node = {}
15
+ node["siteName"] = sys.argv[1]
16
+ node["mem"] = 1000
17
+ node["node"] = socket.getfqdn()
18
+ # node['prodSourceLabel']='user'
19
+ url = f"{baseURLSSL}/getJob"
20
+
21
+ match = re.search("[^:/]+://([^/]+)(/.+)", url)
22
+ host = match.group(1)
23
+ path = match.group(2)
24
+
25
+ if "X509_USER_PROXY" in os.environ:
26
+ certKey = os.environ["X509_USER_PROXY"]
27
+ else:
28
+ certKey = f"/tmp/x509up_u{os.getuid()}"
29
+
30
+ rdata = urlencode(node)
31
+
32
+
33
+ class Thr(threading.Thread):
34
+ def __init__(self):
35
+ threading.Thread.__init__(self)
36
+
37
+ def run(self):
38
+ print(naive_utcnow().isoformat(" "))
39
+ conn = HTTPSConnection(host, key_file=certKey, cert_file=certKey)
40
+ conn.request("POST", path, rdata)
41
+ resp = conn.getresponse()
42
+ data = resp.read()
43
+ print(naive_utcnow().isoformat(" "))
44
+ print(parse_qs(data))
45
+
46
+
47
+ nThr = 1
48
+ thrs = []
49
+ for i in range(nThr):
50
+ thrs.append(Thr())
51
+
52
+ for thr in thrs:
53
+ thr.start()
@@ -0,0 +1,79 @@
1
+ import optparse
2
+ import sys
3
+
4
+ from pandaserver.userinterface import Client
5
+
6
+ option_parser = optparse.OptionParser(conflict_handler="resolve")
7
+ option_parser.add_option(
8
+ "-9",
9
+ action="store_const",
10
+ const=True,
11
+ dest="forceKill",
12
+ default=False,
13
+ help="kill jobs before next heartbeat is coming",
14
+ )
15
+ option_parser.add_option("--codeV", action="store", dest="codeV", default=None, help="kill code")
16
+ option_parser.add_option(
17
+ "--jobSubStatus",
18
+ action="store",
19
+ dest="jobSubStatus",
20
+ default=None,
21
+ help="set job sub status if any",
22
+ )
23
+ option_parser.add_option(
24
+ "--killOwnProdJobs",
25
+ action="store_const",
26
+ const=True,
27
+ dest="killOwnProdJobs",
28
+ default=False,
29
+ help="kill own production jobs without a production role",
30
+ )
31
+ option_parser.add_option(
32
+ "--killUserJobs",
33
+ action="store_const",
34
+ const=True,
35
+ dest="killUserJobs",
36
+ default=False,
37
+ help="kill user jobs using a production role",
38
+ )
39
+ option_parser.add_option(
40
+ "--keepUnmerged",
41
+ action="store_const",
42
+ const=True,
43
+ dest="keepUnmerged",
44
+ default=False,
45
+ help="generate a new job after kiliing, to keep unmerged events",
46
+ )
47
+ options, args = option_parser.parse_args()
48
+
49
+ codeV = None
50
+ useMailAsIDV = False
51
+
52
+ if options.forceKill:
53
+ if options.killUserJobs:
54
+ codeV = 99
55
+ else:
56
+ codeV = 9
57
+ elif options.killUserJobs:
58
+ codeV = 91
59
+ else:
60
+ try:
61
+ codeV = int(options.codeV)
62
+ except Exception:
63
+ pass
64
+ if options.killOwnProdJobs:
65
+ useMailAsIDV = True
66
+
67
+ if len(args) == 1:
68
+ job_id = int(args[0])
69
+ ret = Client.kill_jobs([job_id], code=codeV, keep_unmerged=options.keepUnmerged, job_sub_status=options.jobSubStatus)
70
+ else:
71
+ job_id_start = int(args[0])
72
+ job_id_end = int(args[1])
73
+ if job_id_start > job_id_end:
74
+ print(f"{job_id_end} is less than {job_id_start}")
75
+ sys.exit(1)
76
+
77
+ ret = Client.kill_jobs(range(job_id_start, job_id_end + 1), code=codeV, keep_unmerged=options.keepUnmerged, job_sub_status=options.jobSubStatus)
78
+
79
+ print(ret)
@@ -0,0 +1,99 @@
1
+ import optparse
2
+ import time
3
+
4
+ # password
5
+ from pandaserver.config import panda_config
6
+ from pandaserver.taskbuffer.OraDBProxy import DBProxy
7
+ from pandaserver.userinterface import Client
8
+
9
+ usageStr = """%prog [options] <priority>
10
+
11
+ Description: kill jobs with low priorities below a given value"""
12
+ option_parser = optparse.OptionParser(conflict_handler="resolve", usage=usageStr)
13
+ option_parser.add_option(
14
+ "-9",
15
+ action="store_const",
16
+ const=True,
17
+ dest="forceKill",
18
+ default=False,
19
+ help="kill jobs before next heartbeat is coming",
20
+ )
21
+ option_parser.add_option(
22
+ "--running",
23
+ action="store_const",
24
+ const=True,
25
+ dest="killRunning",
26
+ default=False,
27
+ help="kill running jobs to free up CPU slots. jobs will be killed regardless of job status if omitted",
28
+ )
29
+ option_parser.add_option("--site", action="store", dest="site", default=None, help="computingSite")
30
+ option_parser.add_option("--cloud", action="store", dest="cloud", default=None, help="cloud")
31
+ option_parser.add_option(
32
+ "--maxJobs",
33
+ action="store",
34
+ dest="maxJobs",
35
+ default=None,
36
+ help="max number of jobs to be killed",
37
+ )
38
+ options, args = option_parser.parse_args()
39
+
40
+ if options.cloud is None and options.site is None:
41
+ option_parser.error("--site=<computingSite> and/or --cloud=<cloud> is required")
42
+
43
+ proxyS = DBProxy()
44
+ proxyS.connect(panda_config.dbhost, panda_config.dbpasswd, panda_config.dbuser, panda_config.dbname)
45
+
46
+ jobsMap = {}
47
+
48
+ if len(args) == 0:
49
+ option_parser.error("priority is required")
50
+
51
+ varMap = {}
52
+ varMap[":prodSourceLabel"] = "managed"
53
+ varMap[":currentPriority"] = args[0]
54
+ sql = "SELECT PandaID,currentPriority FROM %s WHERE prodSourceLabel=:prodSourceLabel AND currentPriority<:currentPriority "
55
+ if options.killRunning:
56
+ sql += "AND jobStatus=:jobStatus "
57
+ varMap[":jobStatus"] = "running"
58
+ if options.cloud is not None:
59
+ sql += "AND cloud=:cloud "
60
+ varMap[":cloud"] = options.cloud
61
+ if options.site is not None:
62
+ sql += "AND computingSite=:site "
63
+ varMap[":site"] = options.site
64
+ for table in [
65
+ "ATLAS_PANDA.jobsActive4",
66
+ "ATLAS_PANDA.jobsDefined4",
67
+ ]:
68
+ status, res = proxyS.querySQLS(sql % table, varMap)
69
+ if res is not None:
70
+ for id, prio in res:
71
+ if prio not in jobsMap:
72
+ jobsMap[prio] = []
73
+ if id not in jobsMap[prio]:
74
+ jobsMap[prio].append(id)
75
+
76
+ # order by PandaID and currentPriority
77
+ jobs = []
78
+ prioList = sorted(jobsMap)
79
+ for prio in prioList:
80
+ # reverse order by PandaID to kill newer jobs
81
+ ids = sorted(jobsMap[prio])
82
+ ids.reverse()
83
+ jobs += ids
84
+
85
+ if options.maxJobs is not None:
86
+ jobs = jobs[: int(options.maxJobs)]
87
+
88
+ print(f"The number of jobs with priorities below {args[0]} : {len(jobs)}")
89
+ if len(jobs):
90
+ nJob = 100
91
+ iJob = 0
92
+ while iJob < len(jobs):
93
+ print(f"kill {str(jobs[iJob:iJob + nJob])}")
94
+ if options.forceKill:
95
+ Client.kill_jobs(jobs[iJob : iJob + nJob], 9)
96
+ else:
97
+ Client.kill_jobs(jobs[iJob : iJob + nJob])
98
+ iJob += nJob
99
+ time.sleep(1)
@@ -0,0 +1,56 @@
1
+ import optparse
2
+ import time
3
+
4
+ # password
5
+ from pandaserver.config import panda_config
6
+ from pandaserver.taskbuffer.OraDBProxy import DBProxy
7
+ from pandaserver.userinterface import Client
8
+
9
+ option_parser = optparse.OptionParser(conflict_handler="resolve")
10
+ option_parser.add_option(
11
+ "-9",
12
+ action="store_const",
13
+ const=True,
14
+ dest="forceKill",
15
+ default=False,
16
+ help="kill jobs before next heartbeat is coming",
17
+ )
18
+ options, args = option_parser.parse_args()
19
+
20
+ useMailAsIDV = False
21
+ if options.killOwnProdJobs:
22
+ useMailAsIDV = True
23
+
24
+ proxyS = DBProxy()
25
+ proxyS.connect(panda_config.dbhost, panda_config.dbpasswd, panda_config.dbuser, panda_config.dbname)
26
+
27
+ jobs = []
28
+
29
+ varMap = {}
30
+ varMap[":prodSourceLabel"] = "managed"
31
+ varMap[":taskID"] = args[0]
32
+ varMap[":pandaIDl"] = args[1]
33
+ varMap[":pandaIDu"] = args[2]
34
+ sql = "SELECT PandaID FROM %s WHERE prodSourceLabel=:prodSourceLabel AND taskID=:taskID AND PandaID BETWEEN :pandaIDl AND :pandaIDu ORDER BY PandaID"
35
+ for table in [
36
+ "ATLAS_PANDA.jobsActive4",
37
+ "ATLAS_PANDA.jobsDefined4",
38
+ ]:
39
+ status, res = proxyS.querySQLS(sql % table, varMap)
40
+ if res is not None:
41
+ for (id,) in res:
42
+ if id not in jobs:
43
+ jobs.append(id)
44
+
45
+ print(f"The number of jobs to be killed : {len(jobs)}")
46
+ if len(jobs):
47
+ nJob = 100
48
+ iJob = 0
49
+ while iJob < len(jobs):
50
+ print(f"kill {str(jobs[iJob:iJob + nJob])}")
51
+ if options.forceKill:
52
+ Client.kill_jobs(jobs[iJob : iJob + nJob], 9)
53
+ else:
54
+ Client.kill_jobs(jobs[iJob : iJob + nJob])
55
+ iJob += nJob
56
+ time.sleep(1)