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,117 @@
1
+ import argparse
2
+ import datetime
3
+ import time
4
+
5
+ from pandacommon.pandautils.PandaUtils import naive_utcnow
6
+
7
+ # password
8
+ from pandaserver.config import panda_config
9
+ from pandaserver.taskbuffer.OraDBProxy import DBProxy
10
+ from pandaserver.userinterface import Client
11
+
12
+ proxyS = DBProxy()
13
+ proxyS.connect(panda_config.dbhost, panda_config.dbpasswd, panda_config.dbuser, panda_config.dbname)
14
+
15
+
16
+ option_parser = argparse.ArgumentParser(conflict_handler="resolve", description="Reassign jobs in a task")
17
+ option_parser.add_argument("taskid", action="store", metavar="TASKID", help="taskID of the task")
18
+ option_parser.add_argument(
19
+ "-m",
20
+ dest="limit",
21
+ type=int,
22
+ action="store",
23
+ default=60,
24
+ metavar="MIMUTES",
25
+ help="time limit in minute",
26
+ )
27
+ option_parser.add_argument(
28
+ "-9",
29
+ action="store_const",
30
+ const=True,
31
+ dest="forceKill",
32
+ default=False,
33
+ help="kill jobs before next heartbeat is coming",
34
+ )
35
+ option_parser.add_argument(
36
+ "--keepUnmerged",
37
+ action="store_const",
38
+ const=True,
39
+ dest="keepUnmerged",
40
+ default=False,
41
+ help="generate new jobs after kiliing old jobs, to keep unmerged events",
42
+ )
43
+ options = option_parser.parse_args()
44
+
45
+ taskid = options.taskid
46
+
47
+ print("")
48
+ print(f"trying to reassign jobs with modificationTime < CURRENT-{options.limit}min. Change the limit using -m if necessary")
49
+
50
+ codeV = 51
51
+ if options.forceKill:
52
+ codeV = 9
53
+
54
+ jobs = []
55
+ jediJobs = []
56
+
57
+ timeLimit = naive_utcnow() - datetime.timedelta(minutes=options.limit)
58
+ varMap = {}
59
+ varMap[":modificationTime"] = timeLimit
60
+ varMap[":taskID"] = taskid
61
+ sql = "SELECT PandaID,lockedby FROM ATLAS_PANDA.jobsDefined4 WHERE taskID=:taskID AND modificationTime<:modificationTime "
62
+ status, res = proxyS.querySQLS(sql, varMap)
63
+ if res is not None:
64
+ for id, lockedby in res:
65
+ if lockedby == "jedi":
66
+ jediJobs.append(id)
67
+ else:
68
+ jobs.append(id)
69
+
70
+
71
+ varMap = {}
72
+ varMap[":js1"] = "activated"
73
+ varMap[":js2"] = "starting"
74
+ varMap[":modificationTime"] = timeLimit
75
+ varMap[":taskID"] = taskid
76
+ sql = "SELECT PandaID,lockedby FROM ATLAS_PANDA.jobsActive4 WHERE jobStatus IN (:js1,:js2) AND taskID=:taskID AND modificationTime<:modificationTime "
77
+ status, res = proxyS.querySQLS(sql, varMap)
78
+ if res is not None:
79
+ for id, lockedby in res:
80
+ if lockedby == "jedi":
81
+ jediJobs.append(id)
82
+ else:
83
+ jobs.append(id)
84
+
85
+ varMap = {}
86
+ varMap[":jobStatus"] = "waiting"
87
+ varMap[":modificationTime"] = timeLimit
88
+ varMap[":taskID"] = taskid
89
+ sql = "SELECT PandaID,lockedby FROM ATLAS_PANDA.jobsDefined4 WHERE jobStatus=:jobStatus AND taskID=:taskID AND modificationTime<:modificationTime "
90
+ status, res = proxyS.querySQLS(sql, varMap)
91
+ if res is not None:
92
+ for id, lockedby in res:
93
+ if lockedby == "jedi":
94
+ jediJobs.append(id)
95
+ else:
96
+ jobs.append(id)
97
+
98
+ # reassign
99
+ jobs.sort()
100
+ if len(jobs):
101
+ nJob = 100
102
+ iJob = 0
103
+ while iJob < len(jobs):
104
+ print(f"reassign {str(jobs[iJob:iJob + nJob])}")
105
+ Client.reassign_jobs(jobs[iJob : iJob + nJob])
106
+ iJob += nJob
107
+ time.sleep(10)
108
+
109
+ if len(jediJobs) != 0:
110
+ nJob = 100
111
+ iJob = 0
112
+ while iJob < len(jediJobs):
113
+ print(f"kill JEDI jobs {str(jediJobs[iJob:iJob + nJob])}")
114
+ Client.kill_jobs(jediJobs[iJob : iJob + nJob], codeV, keep_unmerged=options.keepUnmerged)
115
+ iJob += nJob
116
+
117
+ print(f"\nreassigned {len(jobs + jediJobs)} jobs")
@@ -0,0 +1,39 @@
1
+ import datetime
2
+ import time
3
+
4
+ from pandacommon.pandautils.PandaUtils import naive_utcnow
5
+
6
+ # password
7
+ from pandaserver.config import panda_config
8
+ from pandaserver.taskbuffer.OraDBProxy import DBProxy
9
+ from pandaserver.userinterface import Client
10
+
11
+ # time limit
12
+ timeLimit = naive_utcnow() - datetime.timedelta(hours=1)
13
+
14
+ # instantiate DB proxies
15
+ proxyS = DBProxy()
16
+ proxyS.connect(panda_config.dbhost, panda_config.dbpasswd, panda_config.dbuser, panda_config.dbname)
17
+
18
+ while True:
19
+ # get PandaIDs
20
+ varMap = {}
21
+ varMap[":modificationTime"] = timeLimit
22
+ sql = "SELECT PandaID FROM ATLAS_PANDA.jobsDefined4 WHERE modificationTime<:modificationTime ORDER BY PandaID"
23
+ status, res = proxyS.querySQLS(sql, varMap)
24
+
25
+ # escape
26
+ if len(res) == 0:
27
+ break
28
+ # convert to list
29
+ jobs = []
30
+ for (id,) in res:
31
+ jobs.append(id)
32
+ # reassign
33
+ nJob = 300
34
+ iJob = 0
35
+ while iJob < len(jobs):
36
+ print(f"reassignJobs({jobs[iJob:iJob + nJob]})")
37
+ Client.reassign_jobs(jobs[iJob : iJob + nJob])
38
+ iJob += nJob
39
+ time.sleep(60)
@@ -0,0 +1,7 @@
1
+ from pandaserver.dataservice import RecoverLostFilesCore
2
+
3
+ s, o = RecoverLostFilesCore.main(exec_options={"userName": "CLI", "isProductionManager": True})
4
+ if s:
5
+ print("OK")
6
+ else:
7
+ print("ERROR:", o)
@@ -0,0 +1,51 @@
1
+ import argparse
2
+
3
+ from rucio.client import Client as RucioClient
4
+ from rucio.common.exception import DataIdentifierNotFound
5
+
6
+ from pandaserver.config import panda_config
7
+ from pandaserver.dataservice.ddm import rucioAPI
8
+ from pandaserver.taskbuffer.TaskBuffer import taskBuffer
9
+ from pandaserver.userinterface import Client
10
+
11
+ taskBuffer.init(panda_config.dbhost, panda_config.dbpasswd, nDBConnection=1)
12
+
13
+ # parse option
14
+ parser = argparse.ArgumentParser()
15
+ parser.add_argument("--tid", action="store", dest="tid", default=None, required=True, help="task ID")
16
+ parser.add_argument(
17
+ "--resurrectDS",
18
+ action="store_const",
19
+ const=True,
20
+ dest="resurrectDS",
21
+ default=False,
22
+ help="resurrect output and log datasets if they were already deleted",
23
+ )
24
+
25
+ options = parser.parse_args()
26
+
27
+ task_id = int(options.tid)
28
+
29
+ if True:
30
+ if options.resurrectDS:
31
+ sd, so = taskBuffer.querySQLS(
32
+ "SELECT datasetName FROM ATLAS_PANDA.JEDI_Datasets WHERE jediTaskID=:id AND type IN (:t1,:t2)",
33
+ {":id": task_id, ":t1": "output", ":t2": "log"},
34
+ )
35
+ rucio_client = RucioClient()
36
+ for (dataset_name,) in so:
37
+ for i in range(3):
38
+ try:
39
+ scope, name = rucioAPI.extract_scope(dataset_name)
40
+ rucio_client.get_did(scope, name)
41
+ break
42
+ except DataIdentifierNotFound:
43
+ print(f"resurrect {dataset_name}")
44
+ rucio_client.resurrect([{"scope": scope, "name": name}])
45
+ try:
46
+ rucio_client.set_metadata(scope, name, "lifetime", None)
47
+ except Exception:
48
+ pass
49
+
50
+ print(Client.reload_input(task_id))
51
+ print(f"done for task_id={task_id}")
@@ -0,0 +1,26 @@
1
+ import argparse
2
+
3
+ from pandaserver.userinterface import Client
4
+
5
+ # parse option
6
+ parser = argparse.ArgumentParser()
7
+ parser.add_argument(
8
+ "--panda_id",
9
+ action="store",
10
+ dest="panda_id",
11
+ type=int,
12
+ required=True,
13
+ help="PandaID of the job",
14
+ )
15
+ parser.add_argument(
16
+ "--com_str",
17
+ action="store",
18
+ dest="com",
19
+ required=True,
20
+ help="The command string passed to the pilot. max 250 chars",
21
+ )
22
+
23
+ options = parser.parse_args()
24
+
25
+ status, output = Client.send_command_to_job(options.panda_id, options.com)
26
+ print(f"Status: {status}. Output: {output}")
@@ -0,0 +1,38 @@
1
+ import optparse
2
+ import sys
3
+
4
+ from pandaserver.userinterface import Client
5
+
6
+ option_parser = optparse.OptionParser(conflict_handler="resolve", usage="%prog [options] <PandaID>")
7
+ option_parser.add_option(
8
+ "--on",
9
+ action="store_const",
10
+ const=True,
11
+ dest="modeOn",
12
+ default=False,
13
+ help="turn the debug mode on",
14
+ )
15
+ option_parser.add_option(
16
+ "--off",
17
+ action="store_const",
18
+ const=True,
19
+ dest="modeOff",
20
+ default=False,
21
+ help="turn the debug mode off",
22
+ )
23
+ options, args = option_parser.parse_args()
24
+
25
+
26
+ if (options.modeOn and options.modeOff) or (not options.modeOn and not options.modeOff):
27
+ print("ERROR: please set --on or --off")
28
+ sys.exit(1)
29
+
30
+ job_id = int(args[0])
31
+
32
+ if options.modeOn:
33
+ status, output = Client.set_debug_mode(job_id, True)
34
+ else:
35
+ status, output = Client.set_debug_mode(job_id, False)
36
+
37
+ print(f"status: {status}, output: {output}")
38
+ sys.exit(0)
@@ -0,0 +1,28 @@
1
+ import optparse
2
+ import sys
3
+
4
+ # password
5
+ from pandaserver.config import panda_config
6
+ from pandaserver.taskbuffer.OraDBProxy import DBProxy
7
+
8
+ usage = """%prog <taskID> <priority>
9
+
10
+ Set a priority to jobs in a task"""
11
+
12
+ option_parser = optparse.OptionParser(usage=usage, conflict_handler="resolve")
13
+ options, args = option_parser.parse_args()
14
+
15
+
16
+ proxyS = DBProxy()
17
+ proxyS.connect(panda_config.dbhost, panda_config.dbpasswd, panda_config.dbuser, panda_config.dbname)
18
+
19
+ varMap = {}
20
+ varMap[":prodSourceLabel"] = "managed"
21
+ varMap[":taskID"] = sys.argv[1]
22
+ varMap[":prio"] = sys.argv[2]
23
+ sql = "UPDATE %s SET currentPriority=:prio WHERE prodSourceLabel=:prodSourceLabel AND taskID=:taskID"
24
+ for table in [
25
+ "ATLAS_PANDA.jobsActive4",
26
+ "ATLAS_PANDA.jobsDefined4",
27
+ ]:
28
+ status, res = proxyS.querySQLS(sql % table, varMap)
@@ -0,0 +1,60 @@
1
+ import sys
2
+ import time
3
+ import uuid
4
+
5
+ from pandaserver.taskbuffer.FileSpec import FileSpec
6
+ from pandaserver.taskbuffer.JobSpec import JobSpec
7
+ from pandaserver.userinterface import Client
8
+
9
+ if len(sys.argv) > 1:
10
+ site = sys.argv[1]
11
+ else:
12
+ site = None
13
+
14
+ dataset_name = f"panda.destDB.{str(uuid.uuid4())}"
15
+ destination_se = None
16
+
17
+ job_list = []
18
+
19
+ n_jobs = 1
20
+
21
+ for i in range(n_jobs):
22
+ job = JobSpec()
23
+ job.jobDefinitionID = int(time.time()) % 10000
24
+ job.jobName = "%s_%d" % (str(uuid.uuid4()), i)
25
+ job.AtlasRelease = "Atlas-14.1.0"
26
+ job.homepackage = "AtlasProduction/14.1.0.3"
27
+ job.transformation = "csc_evgen_trf.py"
28
+ job.destinationDBlock = dataset_name
29
+ job.destinationSE = destination_se
30
+ job.currentPriority = 100
31
+ job.prodSourceLabel = "test"
32
+ job.computingSite = site
33
+ job.cloud = "US"
34
+ job.cmtConfig = "i686-slc4-gcc34-opt"
35
+
36
+ file = FileSpec()
37
+ file.lfn = f"{job.jobName}.evgen.pool.root"
38
+ file.destinationDBlock = job.destinationDBlock
39
+ file.destinationSE = job.destinationSE
40
+ file.dataset = job.destinationDBlock
41
+ file.destinationDBlockToken = "ATLASDATADISK"
42
+ file.type = "output"
43
+ job.addFile(file)
44
+
45
+ fileOL = FileSpec()
46
+ fileOL.lfn = f"{job.jobName}.job.log.tgz"
47
+ fileOL.destinationDBlock = job.destinationDBlock
48
+ fileOL.destinationSE = job.destinationSE
49
+ fileOL.dataset = job.destinationDBlock
50
+ fileOL.destinationDBlockToken = "ATLASDATADISK"
51
+ fileOL.type = "log"
52
+ job.addFile(fileOL)
53
+
54
+ job.jobParameters = f"5144 1 5000 1 CSC.005144.PythiaZee.py {file.lfn} NONE NONE NONE"
55
+ job_list.append(job)
56
+
57
+ for i in range(n_jobs):
58
+ status, output = Client.submit_jobs(job_list)
59
+ print("---------------------")
60
+ print(f"Status: {status}. Output: {output}")
@@ -0,0 +1,58 @@
1
+ import sys
2
+ import time
3
+ import uuid
4
+
5
+ from pandaserver.taskbuffer.FileSpec import FileSpec
6
+ from pandaserver.taskbuffer.JobSpec import JobSpec
7
+ from pandaserver.userinterface import Client
8
+
9
+ site = sys.argv[1]
10
+ cloud = sys.argv[2]
11
+
12
+ dataset_name = f"panda.destDB.{str(uuid.uuid4())}"
13
+ destination_se = None
14
+
15
+ n_jobs = 1
16
+ job_list = []
17
+
18
+ for i in range(n_jobs):
19
+ job = JobSpec()
20
+ job.jobDefinitionID = int(time.time()) % 10000
21
+ job.jobName = "%s_%d" % (str(uuid.uuid4()), i)
22
+ job.AtlasRelease = "Atlas-17.0.5"
23
+ job.homepackage = "AtlasProduction/17.0.5.6"
24
+ job.transformation = "Evgen_trf.py"
25
+ job.destinationDBlock = dataset_name
26
+ job.destinationSE = destination_se
27
+ job.currentPriority = 10000
28
+ job.prodSourceLabel = "test"
29
+ job.computingSite = site
30
+ job.cloud = cloud
31
+ job.cmtConfig = "i686-slc5-gcc43-opt"
32
+
33
+ file = FileSpec()
34
+ file.lfn = f"{job.jobName}.evgen.pool.root"
35
+ file.destinationDBlock = job.destinationDBlock
36
+ file.destinationSE = job.destinationSE
37
+ file.dataset = job.destinationDBlock
38
+ file.destinationDBlockToken = "ATLASDATADISK"
39
+ file.type = "output"
40
+ job.addFile(file)
41
+
42
+ fileOL = FileSpec()
43
+ fileOL.lfn = f"{job.jobName}.job.log.tgz"
44
+ fileOL.destinationDBlock = job.destinationDBlock
45
+ fileOL.destinationSE = job.destinationSE
46
+ fileOL.dataset = job.destinationDBlock
47
+ fileOL.destinationDBlockToken = "ATLASDATADISK"
48
+ fileOL.type = "log"
49
+ job.addFile(fileOL)
50
+
51
+ job.jobParameters = f"7000 108316 1 5000 1 MC11.108316.Pythia8_minbias_ND.py {file.lfn}"
52
+
53
+ job_list.append(job)
54
+
55
+ for i in range(n_jobs):
56
+ status, output = Client.submit_jobs(job_list)
57
+ print("---------------------")
58
+ print(f"Status: {status}. Output: {output}")
@@ -0,0 +1,81 @@
1
+ import sys
2
+ import time
3
+ import uuid
4
+
5
+ from pandaserver.taskbuffer.FileSpec import FileSpec
6
+ from pandaserver.taskbuffer.JobSpec import JobSpec
7
+ from pandaserver.userinterface import Client
8
+
9
+ if len(sys.argv) > 1:
10
+ site = sys.argv[1]
11
+ else:
12
+ site = None
13
+
14
+ dataset_name = f"panda.destDB.{str(uuid.uuid4())}"
15
+ destination_se = "BNL_ATLAS_2"
16
+ # destination_se = 'BU_ATLAS_Tier2'
17
+
18
+ files = {
19
+ "mc11.007204.singlepart_mu4.evgen.EVNT.v11000302._00037.pool.root.1": None,
20
+ "mc11.007204.singlepart_mu4.evgen.EVNT.v11000302._00038.pool.root.1": None,
21
+ }
22
+
23
+ job_list = []
24
+
25
+ for lfn in files:
26
+ job = JobSpec()
27
+ job.jobDefinitionID = int(time.time()) % 10000
28
+ job.jobName = str(uuid.uuid4())
29
+ job.AtlasRelease = "Atlas-11.0.3"
30
+ job.homepackage = "JobTransforms-11-00-03-02"
31
+ job.transformation = "share/csc.simul.trf"
32
+ job.destinationDBlock = dataset_name
33
+ job.destinationSE = destination_se
34
+ job.computingSite = site
35
+ job.prodDBlock = "mc11.007204.singlepart_mu4.evgen.EVNT.v11000302"
36
+ job.cmtConfig = "i686-slc4-gcc34-opt"
37
+
38
+ job.prodSourceLabel = "test"
39
+ job.currentPriority = 1000
40
+
41
+ fileI = FileSpec()
42
+ fileI.dataset = job.prodDBlock
43
+ fileI.prodDBlock = job.prodDBlock
44
+ fileI.lfn = lfn
45
+ fileI.type = "input"
46
+ job.addFile(fileI)
47
+
48
+ fileOE = FileSpec()
49
+ fileOE.lfn = f"{str(uuid.uuid4())}.HITS.pool.root"
50
+ fileOE.destinationDBlock = job.destinationDBlock
51
+ fileOE.destinationSE = job.destinationSE
52
+ fileOE.dataset = job.destinationDBlock
53
+ fileOE.destinationDBlockToken = "ATLASDATADISK"
54
+ fileOE.type = "output"
55
+ job.addFile(fileOE)
56
+
57
+ fileOA = FileSpec()
58
+ fileOA.lfn = f"{str(uuid.uuid4())}.RDO.pool.root"
59
+ fileOA.destinationDBlock = job.destinationDBlock
60
+ fileOA.destinationSE = job.destinationSE
61
+ fileOA.dataset = job.destinationDBlock
62
+ fileOA.destinationDBlockToken = "ATLASDATADISK"
63
+ fileOA.type = "output"
64
+ job.addFile(fileOA)
65
+
66
+ fileOL = FileSpec()
67
+ fileOL.lfn = f"{str(uuid.uuid4())}.job.log.tgz"
68
+ fileOL.destinationDBlock = job.destinationDBlock
69
+ fileOL.destinationSE = job.destinationSE
70
+ fileOL.dataset = job.destinationDBlock
71
+ fileOL.destinationDBlockToken = "ATLASDATADISK"
72
+ fileOL.type = "log"
73
+ job.addFile(fileOL)
74
+
75
+ job.jobParameters = f"{fileI.lfn} {fileOE.lfn} {fileOA.lfn} 100 700 2158"
76
+
77
+ job_list.append(job)
78
+
79
+ status, output = Client.submit_jobs(job_list)
80
+ print("---------------------")
81
+ print(f"Status: {status}. Output: {output}")
@@ -0,0 +1,90 @@
1
+ import sys
2
+ import time
3
+ import uuid
4
+
5
+ from pandaserver.taskbuffer.FileSpec import FileSpec
6
+ from pandaserver.taskbuffer.JobSpec import JobSpec
7
+ from pandaserver.userinterface import Client
8
+
9
+ site = sys.argv[1]
10
+ cloud = sys.argv[2]
11
+
12
+ prod_destination_block = "mc10_7TeV.105001.pythia_minbias.evgen.EVNT.e574_tid153937_00"
13
+ input_file = "EVNT.153937._000184.pool.root.1"
14
+
15
+ if len(sys.argv) == 5:
16
+ site = sys.argv[1]
17
+ cloud = sys.argv[2]
18
+ prod_destination_block = sys.argv[3]
19
+ input_file = sys.argv[4]
20
+
21
+ datasetName = f"panda.destDB.{str(uuid.uuid4())}"
22
+
23
+ files = {
24
+ input_file: None,
25
+ }
26
+
27
+ job_list = []
28
+
29
+ index = 0
30
+ for lfn in files:
31
+ index += 1
32
+ job = JobSpec()
33
+ job.jobDefinitionID = (time.time()) % 10000
34
+ job.jobName = "%s_%d" % (str(uuid.uuid4()), index)
35
+ job.AtlasRelease = "Atlas-17.0.5"
36
+ job.homepackage = "AtlasProduction/17.0.5.6"
37
+ job.transformation = "AtlasG4_trf.py"
38
+ job.destinationDBlock = datasetName
39
+ job.computingSite = site
40
+ job.prodDBlock = prod_destination_block
41
+
42
+ job.prodSourceLabel = "test"
43
+ job.processingType = "test"
44
+ job.currentPriority = 10000
45
+ job.cloud = cloud
46
+ job.cmtConfig = "i686-slc5-gcc43-opt"
47
+
48
+ fileI = FileSpec()
49
+ fileI.dataset = job.prodDBlock
50
+ fileI.prodDBlock = job.prodDBlock
51
+ fileI.lfn = lfn
52
+ fileI.type = "input"
53
+ job.addFile(fileI)
54
+
55
+ fileD = FileSpec()
56
+ fileD.dataset = "ddo.000001.Atlas.Ideal.DBRelease.v170602"
57
+ fileD.prodDBlock = fileD.dataset
58
+ fileD.lfn = "DBRelease-17.6.2.tar.gz"
59
+ fileD.type = "input"
60
+ job.addFile(fileD)
61
+
62
+ fileOA = FileSpec()
63
+ fileOA.lfn = f"{job.jobName}.HITS.pool.root"
64
+ fileOA.destinationDBlock = job.destinationDBlock
65
+ fileOA.destinationSE = job.destinationSE
66
+ fileOA.dataset = job.destinationDBlock
67
+ fileOA.destinationDBlockToken = "ATLASDATADISK"
68
+ fileOA.type = "output"
69
+ job.addFile(fileOA)
70
+
71
+ fileOL = FileSpec()
72
+ fileOL.lfn = f"{job.jobName}.job.log.tgz"
73
+ fileOL.destinationDBlock = job.destinationDBlock
74
+ fileOL.destinationSE = job.destinationSE
75
+ fileOL.dataset = job.destinationDBlock
76
+ fileOL.destinationDBlockToken = "ATLASDATADISK"
77
+ fileOL.type = "log"
78
+ job.addFile(fileOL)
79
+ job.jobParameters = (
80
+ f"inputEvgenFile={fileI.lfn} outputHitsFile={fileOA.lfn} maxEvents=3 skipEvents=0 "
81
+ f"DBRelease={fileD.lfn} geometryVersion=ATLAS-GEO-18-01-03_VALIDATION "
82
+ f"conditionsTag=OFLCOND-SDR-BS7T-05-14 randomSeed=1 physicsList=QGSP_BERT "
83
+ f"RunNumber=116870 firstEvent=1"
84
+ )
85
+
86
+ job_list.append(job)
87
+
88
+ status, output = Client.submit_jobs(job_list)
89
+ print("---------------------")
90
+ print(f"Status: {status}. Output: {output}")