wmglobalqueue 2.3.10__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.

Potentially problematic release.


This version of wmglobalqueue might be problematic. Click here for more details.

Files changed (345) hide show
  1. Utils/CPMetrics.py +270 -0
  2. Utils/CertTools.py +62 -0
  3. Utils/EmailAlert.py +50 -0
  4. Utils/ExtendedUnitTestCase.py +62 -0
  5. Utils/FileTools.py +182 -0
  6. Utils/IteratorTools.py +80 -0
  7. Utils/MathUtils.py +31 -0
  8. Utils/MemoryCache.py +119 -0
  9. Utils/Patterns.py +24 -0
  10. Utils/Pipeline.py +137 -0
  11. Utils/PortForward.py +97 -0
  12. Utils/ProcessStats.py +103 -0
  13. Utils/PythonVersion.py +17 -0
  14. Utils/Signals.py +36 -0
  15. Utils/TemporaryEnvironment.py +27 -0
  16. Utils/Throttled.py +227 -0
  17. Utils/Timers.py +130 -0
  18. Utils/Timestamps.py +86 -0
  19. Utils/TokenManager.py +143 -0
  20. Utils/Tracing.py +60 -0
  21. Utils/TwPrint.py +98 -0
  22. Utils/Utilities.py +308 -0
  23. Utils/__init__.py +11 -0
  24. WMCore/ACDC/Collection.py +57 -0
  25. WMCore/ACDC/CollectionTypes.py +12 -0
  26. WMCore/ACDC/CouchCollection.py +67 -0
  27. WMCore/ACDC/CouchFileset.py +238 -0
  28. WMCore/ACDC/CouchService.py +73 -0
  29. WMCore/ACDC/DataCollectionService.py +485 -0
  30. WMCore/ACDC/Fileset.py +94 -0
  31. WMCore/ACDC/__init__.py +11 -0
  32. WMCore/Algorithms/Alarm.py +39 -0
  33. WMCore/Algorithms/MathAlgos.py +274 -0
  34. WMCore/Algorithms/MiscAlgos.py +67 -0
  35. WMCore/Algorithms/ParseXMLFile.py +115 -0
  36. WMCore/Algorithms/Permissions.py +27 -0
  37. WMCore/Algorithms/Singleton.py +58 -0
  38. WMCore/Algorithms/SubprocessAlgos.py +129 -0
  39. WMCore/Algorithms/__init__.py +7 -0
  40. WMCore/Cache/GenericDataCache.py +98 -0
  41. WMCore/Cache/WMConfigCache.py +572 -0
  42. WMCore/Cache/__init__.py +0 -0
  43. WMCore/Configuration.py +651 -0
  44. WMCore/DAOFactory.py +47 -0
  45. WMCore/DataStructs/File.py +177 -0
  46. WMCore/DataStructs/Fileset.py +140 -0
  47. WMCore/DataStructs/Job.py +182 -0
  48. WMCore/DataStructs/JobGroup.py +142 -0
  49. WMCore/DataStructs/JobPackage.py +49 -0
  50. WMCore/DataStructs/LumiList.py +734 -0
  51. WMCore/DataStructs/Mask.py +219 -0
  52. WMCore/DataStructs/MathStructs/ContinuousSummaryHistogram.py +197 -0
  53. WMCore/DataStructs/MathStructs/DiscreteSummaryHistogram.py +92 -0
  54. WMCore/DataStructs/MathStructs/SummaryHistogram.py +117 -0
  55. WMCore/DataStructs/MathStructs/__init__.py +0 -0
  56. WMCore/DataStructs/Pickleable.py +24 -0
  57. WMCore/DataStructs/Run.py +256 -0
  58. WMCore/DataStructs/Subscription.py +175 -0
  59. WMCore/DataStructs/WMObject.py +47 -0
  60. WMCore/DataStructs/WorkUnit.py +112 -0
  61. WMCore/DataStructs/Workflow.py +60 -0
  62. WMCore/DataStructs/__init__.py +8 -0
  63. WMCore/Database/CMSCouch.py +1349 -0
  64. WMCore/Database/ConfigDBMap.py +29 -0
  65. WMCore/Database/CouchUtils.py +118 -0
  66. WMCore/Database/DBCore.py +198 -0
  67. WMCore/Database/DBCreator.py +113 -0
  68. WMCore/Database/DBExceptionHandler.py +57 -0
  69. WMCore/Database/DBFactory.py +110 -0
  70. WMCore/Database/DBFormatter.py +177 -0
  71. WMCore/Database/Dialects.py +13 -0
  72. WMCore/Database/ExecuteDAO.py +327 -0
  73. WMCore/Database/MongoDB.py +241 -0
  74. WMCore/Database/MySQL/Destroy.py +42 -0
  75. WMCore/Database/MySQL/ListUserContent.py +20 -0
  76. WMCore/Database/MySQL/__init__.py +9 -0
  77. WMCore/Database/MySQLCore.py +132 -0
  78. WMCore/Database/Oracle/Destroy.py +56 -0
  79. WMCore/Database/Oracle/ListUserContent.py +19 -0
  80. WMCore/Database/Oracle/__init__.py +9 -0
  81. WMCore/Database/ResultSet.py +44 -0
  82. WMCore/Database/Transaction.py +91 -0
  83. WMCore/Database/__init__.py +9 -0
  84. WMCore/Database/ipy_profile_couch.py +438 -0
  85. WMCore/GlobalWorkQueue/CherryPyThreads/CleanUpTask.py +29 -0
  86. WMCore/GlobalWorkQueue/CherryPyThreads/HeartbeatMonitor.py +105 -0
  87. WMCore/GlobalWorkQueue/CherryPyThreads/LocationUpdateTask.py +28 -0
  88. WMCore/GlobalWorkQueue/CherryPyThreads/ReqMgrInteractionTask.py +35 -0
  89. WMCore/GlobalWorkQueue/CherryPyThreads/__init__.py +0 -0
  90. WMCore/GlobalWorkQueue/__init__.py +0 -0
  91. WMCore/GroupUser/CouchObject.py +127 -0
  92. WMCore/GroupUser/Decorators.py +51 -0
  93. WMCore/GroupUser/Group.py +33 -0
  94. WMCore/GroupUser/Interface.py +73 -0
  95. WMCore/GroupUser/User.py +96 -0
  96. WMCore/GroupUser/__init__.py +11 -0
  97. WMCore/Lexicon.py +836 -0
  98. WMCore/REST/Auth.py +202 -0
  99. WMCore/REST/CherryPyPeriodicTask.py +166 -0
  100. WMCore/REST/Error.py +333 -0
  101. WMCore/REST/Format.py +642 -0
  102. WMCore/REST/HeartbeatMonitorBase.py +90 -0
  103. WMCore/REST/Main.py +623 -0
  104. WMCore/REST/Server.py +2435 -0
  105. WMCore/REST/Services.py +24 -0
  106. WMCore/REST/Test.py +120 -0
  107. WMCore/REST/Tools.py +38 -0
  108. WMCore/REST/Validation.py +250 -0
  109. WMCore/REST/__init__.py +1 -0
  110. WMCore/ReqMgr/DataStructs/RequestStatus.py +209 -0
  111. WMCore/ReqMgr/DataStructs/RequestType.py +13 -0
  112. WMCore/ReqMgr/DataStructs/__init__.py +0 -0
  113. WMCore/ReqMgr/__init__.py +1 -0
  114. WMCore/Services/AlertManager/AlertManagerAPI.py +111 -0
  115. WMCore/Services/AlertManager/__init__.py +0 -0
  116. WMCore/Services/CRIC/CRIC.py +238 -0
  117. WMCore/Services/CRIC/__init__.py +0 -0
  118. WMCore/Services/DBS/DBS3Reader.py +1044 -0
  119. WMCore/Services/DBS/DBSConcurrency.py +44 -0
  120. WMCore/Services/DBS/DBSErrors.py +113 -0
  121. WMCore/Services/DBS/DBSReader.py +23 -0
  122. WMCore/Services/DBS/DBSUtils.py +139 -0
  123. WMCore/Services/DBS/DBSWriterObjects.py +381 -0
  124. WMCore/Services/DBS/ProdException.py +133 -0
  125. WMCore/Services/DBS/__init__.py +8 -0
  126. WMCore/Services/FWJRDB/FWJRDBAPI.py +118 -0
  127. WMCore/Services/FWJRDB/__init__.py +0 -0
  128. WMCore/Services/HTTPS/HTTPSAuthHandler.py +66 -0
  129. WMCore/Services/HTTPS/__init__.py +0 -0
  130. WMCore/Services/LogDB/LogDB.py +201 -0
  131. WMCore/Services/LogDB/LogDBBackend.py +191 -0
  132. WMCore/Services/LogDB/LogDBExceptions.py +11 -0
  133. WMCore/Services/LogDB/LogDBReport.py +85 -0
  134. WMCore/Services/LogDB/__init__.py +0 -0
  135. WMCore/Services/MSPileup/__init__.py +0 -0
  136. WMCore/Services/MSUtils/MSUtils.py +54 -0
  137. WMCore/Services/MSUtils/__init__.py +0 -0
  138. WMCore/Services/McM/McM.py +173 -0
  139. WMCore/Services/McM/__init__.py +8 -0
  140. WMCore/Services/MonIT/Grafana.py +133 -0
  141. WMCore/Services/MonIT/__init__.py +0 -0
  142. WMCore/Services/PyCondor/PyCondorAPI.py +154 -0
  143. WMCore/Services/PyCondor/PyCondorUtils.py +105 -0
  144. WMCore/Services/PyCondor/__init__.py +0 -0
  145. WMCore/Services/ReqMgr/ReqMgr.py +261 -0
  146. WMCore/Services/ReqMgr/__init__.py +0 -0
  147. WMCore/Services/ReqMgrAux/ReqMgrAux.py +419 -0
  148. WMCore/Services/ReqMgrAux/__init__.py +0 -0
  149. WMCore/Services/RequestDB/RequestDBReader.py +267 -0
  150. WMCore/Services/RequestDB/RequestDBWriter.py +39 -0
  151. WMCore/Services/RequestDB/__init__.py +0 -0
  152. WMCore/Services/Requests.py +624 -0
  153. WMCore/Services/Rucio/Rucio.py +1287 -0
  154. WMCore/Services/Rucio/RucioUtils.py +74 -0
  155. WMCore/Services/Rucio/__init__.py +0 -0
  156. WMCore/Services/RucioConMon/RucioConMon.py +128 -0
  157. WMCore/Services/RucioConMon/__init__.py +0 -0
  158. WMCore/Services/Service.py +400 -0
  159. WMCore/Services/StompAMQ/__init__.py +0 -0
  160. WMCore/Services/TagCollector/TagCollector.py +155 -0
  161. WMCore/Services/TagCollector/XMLUtils.py +98 -0
  162. WMCore/Services/TagCollector/__init__.py +0 -0
  163. WMCore/Services/UUIDLib.py +13 -0
  164. WMCore/Services/UserFileCache/UserFileCache.py +160 -0
  165. WMCore/Services/UserFileCache/__init__.py +8 -0
  166. WMCore/Services/WMAgent/WMAgent.py +63 -0
  167. WMCore/Services/WMAgent/__init__.py +0 -0
  168. WMCore/Services/WMArchive/CMSSWMetrics.py +526 -0
  169. WMCore/Services/WMArchive/DataMap.py +463 -0
  170. WMCore/Services/WMArchive/WMArchive.py +33 -0
  171. WMCore/Services/WMArchive/__init__.py +0 -0
  172. WMCore/Services/WMBS/WMBS.py +97 -0
  173. WMCore/Services/WMBS/__init__.py +0 -0
  174. WMCore/Services/WMStats/DataStruct/RequestInfoCollection.py +300 -0
  175. WMCore/Services/WMStats/DataStruct/__init__.py +0 -0
  176. WMCore/Services/WMStats/WMStatsPycurl.py +145 -0
  177. WMCore/Services/WMStats/WMStatsReader.py +445 -0
  178. WMCore/Services/WMStats/WMStatsWriter.py +273 -0
  179. WMCore/Services/WMStats/__init__.py +0 -0
  180. WMCore/Services/WMStatsServer/WMStatsServer.py +134 -0
  181. WMCore/Services/WMStatsServer/__init__.py +0 -0
  182. WMCore/Services/WorkQueue/WorkQueue.py +492 -0
  183. WMCore/Services/WorkQueue/__init__.py +0 -0
  184. WMCore/Services/__init__.py +8 -0
  185. WMCore/Services/pycurl_manager.py +574 -0
  186. WMCore/WMBase.py +50 -0
  187. WMCore/WMConnectionBase.py +164 -0
  188. WMCore/WMException.py +183 -0
  189. WMCore/WMExceptions.py +269 -0
  190. WMCore/WMFactory.py +76 -0
  191. WMCore/WMInit.py +228 -0
  192. WMCore/WMLogging.py +108 -0
  193. WMCore/WMSpec/ConfigSectionTree.py +442 -0
  194. WMCore/WMSpec/Persistency.py +135 -0
  195. WMCore/WMSpec/Steps/BuildMaster.py +87 -0
  196. WMCore/WMSpec/Steps/BuildTools.py +201 -0
  197. WMCore/WMSpec/Steps/Builder.py +97 -0
  198. WMCore/WMSpec/Steps/Diagnostic.py +89 -0
  199. WMCore/WMSpec/Steps/Emulator.py +62 -0
  200. WMCore/WMSpec/Steps/ExecuteMaster.py +208 -0
  201. WMCore/WMSpec/Steps/Executor.py +210 -0
  202. WMCore/WMSpec/Steps/StepFactory.py +213 -0
  203. WMCore/WMSpec/Steps/TaskEmulator.py +75 -0
  204. WMCore/WMSpec/Steps/Template.py +204 -0
  205. WMCore/WMSpec/Steps/Templates/AlcaHarvest.py +76 -0
  206. WMCore/WMSpec/Steps/Templates/CMSSW.py +613 -0
  207. WMCore/WMSpec/Steps/Templates/DQMUpload.py +59 -0
  208. WMCore/WMSpec/Steps/Templates/DeleteFiles.py +70 -0
  209. WMCore/WMSpec/Steps/Templates/LogArchive.py +84 -0
  210. WMCore/WMSpec/Steps/Templates/LogCollect.py +105 -0
  211. WMCore/WMSpec/Steps/Templates/StageOut.py +105 -0
  212. WMCore/WMSpec/Steps/Templates/__init__.py +10 -0
  213. WMCore/WMSpec/Steps/WMExecutionFailure.py +21 -0
  214. WMCore/WMSpec/Steps/__init__.py +8 -0
  215. WMCore/WMSpec/Utilities.py +63 -0
  216. WMCore/WMSpec/WMSpecErrors.py +12 -0
  217. WMCore/WMSpec/WMStep.py +347 -0
  218. WMCore/WMSpec/WMTask.py +1980 -0
  219. WMCore/WMSpec/WMWorkload.py +2288 -0
  220. WMCore/WMSpec/WMWorkloadTools.py +370 -0
  221. WMCore/WMSpec/__init__.py +9 -0
  222. WMCore/WorkQueue/DataLocationMapper.py +273 -0
  223. WMCore/WorkQueue/DataStructs/ACDCBlock.py +47 -0
  224. WMCore/WorkQueue/DataStructs/Block.py +48 -0
  225. WMCore/WorkQueue/DataStructs/CouchWorkQueueElement.py +148 -0
  226. WMCore/WorkQueue/DataStructs/WorkQueueElement.py +274 -0
  227. WMCore/WorkQueue/DataStructs/WorkQueueElementResult.py +152 -0
  228. WMCore/WorkQueue/DataStructs/WorkQueueElementsSummary.py +185 -0
  229. WMCore/WorkQueue/DataStructs/__init__.py +0 -0
  230. WMCore/WorkQueue/Policy/End/EndPolicyInterface.py +44 -0
  231. WMCore/WorkQueue/Policy/End/SingleShot.py +22 -0
  232. WMCore/WorkQueue/Policy/End/__init__.py +32 -0
  233. WMCore/WorkQueue/Policy/PolicyInterface.py +17 -0
  234. WMCore/WorkQueue/Policy/Start/Block.py +258 -0
  235. WMCore/WorkQueue/Policy/Start/Dataset.py +180 -0
  236. WMCore/WorkQueue/Policy/Start/MonteCarlo.py +131 -0
  237. WMCore/WorkQueue/Policy/Start/ResubmitBlock.py +171 -0
  238. WMCore/WorkQueue/Policy/Start/StartPolicyInterface.py +316 -0
  239. WMCore/WorkQueue/Policy/Start/__init__.py +34 -0
  240. WMCore/WorkQueue/Policy/__init__.py +57 -0
  241. WMCore/WorkQueue/WMBSHelper.py +772 -0
  242. WMCore/WorkQueue/WorkQueue.py +1237 -0
  243. WMCore/WorkQueue/WorkQueueBackend.py +750 -0
  244. WMCore/WorkQueue/WorkQueueBase.py +39 -0
  245. WMCore/WorkQueue/WorkQueueExceptions.py +44 -0
  246. WMCore/WorkQueue/WorkQueueReqMgrInterface.py +278 -0
  247. WMCore/WorkQueue/WorkQueueUtils.py +130 -0
  248. WMCore/WorkQueue/__init__.py +13 -0
  249. WMCore/Wrappers/JsonWrapper/JSONThunker.py +342 -0
  250. WMCore/Wrappers/JsonWrapper/__init__.py +7 -0
  251. WMCore/Wrappers/__init__.py +6 -0
  252. WMCore/__init__.py +10 -0
  253. wmglobalqueue-2.3.10.data/data/bin/wmc-dist-patch +15 -0
  254. wmglobalqueue-2.3.10.data/data/bin/wmc-dist-unpatch +8 -0
  255. wmglobalqueue-2.3.10.data/data/bin/wmc-httpd +3 -0
  256. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/.couchapprc +1 -0
  257. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/README.md +40 -0
  258. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/index.html +264 -0
  259. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/js/ElementInfoByWorkflow.js +96 -0
  260. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/js/StuckElementInfo.js +57 -0
  261. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/js/WorkloadInfoTable.js +80 -0
  262. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/js/dataTable.js +70 -0
  263. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/js/namespace.js +23 -0
  264. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/style/main.css +75 -0
  265. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/couchapp.json +4 -0
  266. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/filters/childQueueFilter.js +13 -0
  267. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/filters/filterDeletedDocs.js +3 -0
  268. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/filters/queueFilter.js +11 -0
  269. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/language +1 -0
  270. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lib/mustache.js +333 -0
  271. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lib/validate.js +27 -0
  272. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lib/workqueue_utils.js +61 -0
  273. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lists/elementsDetail.js +28 -0
  274. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lists/filter.js +86 -0
  275. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lists/stuckElements.js +38 -0
  276. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lists/workRestrictions.js +153 -0
  277. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lists/workflowSummary.js +28 -0
  278. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/rewrites.json +73 -0
  279. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/shows/redirect.js +23 -0
  280. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/shows/status.js +40 -0
  281. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/ElementSummaryByWorkflow.html +27 -0
  282. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/StuckElementSummary.html +26 -0
  283. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/TaskStatus.html +23 -0
  284. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/WorkflowSummary.html +27 -0
  285. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/partials/workqueue-common-lib.html +2 -0
  286. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib-remote.html +16 -0
  287. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib.html +18 -0
  288. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/updates/in-place.js +50 -0
  289. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/validate_doc_update.js +8 -0
  290. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.couch.app.js +235 -0
  291. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.pathbinder.js +173 -0
  292. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activeData/map.js +8 -0
  293. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activeData/reduce.js +2 -0
  294. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activeParentData/map.js +8 -0
  295. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activeParentData/reduce.js +2 -0
  296. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activePileupData/map.js +8 -0
  297. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activePileupData/reduce.js +2 -0
  298. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/analyticsData/map.js +11 -0
  299. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/analyticsData/reduce.js +1 -0
  300. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/availableByPriority/map.js +6 -0
  301. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/conflicts/map.js +5 -0
  302. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elements/map.js +5 -0
  303. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByData/map.js +8 -0
  304. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByParent/map.js +8 -0
  305. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByParentData/map.js +8 -0
  306. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByPileupData/map.js +8 -0
  307. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByStatus/map.js +8 -0
  308. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsBySubscription/map.js +6 -0
  309. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/map.js +8 -0
  310. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/reduce.js +3 -0
  311. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsDetailByWorkflowAndStatus/map.js +26 -0
  312. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/map.js +10 -0
  313. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/reduce.js +1 -0
  314. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/map.js +6 -0
  315. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/reduce.js +1 -0
  316. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/map.js +6 -0
  317. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/reduce.js +1 -0
  318. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/map.js +6 -0
  319. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/reduce.js +1 -0
  320. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByRequest/map.js +6 -0
  321. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByRequest/reduce.js +1 -0
  322. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByStatus/map.js +6 -0
  323. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByStatus/reduce.js +1 -0
  324. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/map.js +6 -0
  325. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/reduce.js +1 -0
  326. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/openRequests/map.js +6 -0
  327. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/recent-items/map.js +5 -0
  328. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/map.js +6 -0
  329. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/reduce.js +1 -0
  330. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/specsByWorkflow/map.js +5 -0
  331. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/stuckElements/map.js +38 -0
  332. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/map.js +12 -0
  333. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/reduce.js +3 -0
  334. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsUrl/map.js +6 -0
  335. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsUrl/reduce.js +2 -0
  336. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/map.js +6 -0
  337. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/reduce.js +2 -0
  338. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/workflowSummary/map.js +9 -0
  339. wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/workflowSummary/reduce.js +10 -0
  340. wmglobalqueue-2.3.10.dist-info/LICENSE +202 -0
  341. wmglobalqueue-2.3.10.dist-info/METADATA +24 -0
  342. wmglobalqueue-2.3.10.dist-info/NOTICE +16 -0
  343. wmglobalqueue-2.3.10.dist-info/RECORD +345 -0
  344. wmglobalqueue-2.3.10.dist-info/WHEEL +5 -0
  345. wmglobalqueue-2.3.10.dist-info/top_level.txt +2 -0
@@ -0,0 +1,177 @@
1
+ """
2
+ _DBFormatter_
3
+
4
+ A class to define the standardised formatting of database results.
5
+ Holds a bunch of helper methods to format input and output of sql
6
+ interactions.
7
+ """
8
+
9
+ from builtins import str, bytes, zip, range
10
+
11
+ import datetime
12
+ import time
13
+ import types
14
+
15
+ from Utils.Utilities import decodeBytesToUnicodeConditional
16
+ from WMCore.DataStructs.WMObject import WMObject
17
+ from Utils.PythonVersion import PY3
18
+
19
+
20
+ class DBFormatter(WMObject):
21
+ def __init__(self, logger, dbinterface):
22
+ """
23
+ The class holds a connection to the database in self.dbi. This is a
24
+ DBCore.DBInterface object.
25
+ """
26
+ self.logger = logger
27
+ self.dbi = dbinterface
28
+
29
+ def truefalse(self, value):
30
+ if value in ('False', 'FALSE', 'n', 'N', 'NO', 'No'):
31
+ value = 0
32
+ return bool(value)
33
+
34
+ def convertdatetime(self, t):
35
+ return int(time.mktime(t.timetuple()))
36
+
37
+ def timestamp(self):
38
+ """
39
+ generate a timestamp
40
+ """
41
+ t = datetime.datetime.now()
42
+ return self.convertdatetime(t)
43
+
44
+ def format(self, result):
45
+ """
46
+ Some standard formatting, put all records into a list.
47
+ Returns a list of lists
48
+ """
49
+ out = []
50
+ for r in result:
51
+ for i in r.fetchall():
52
+ row = []
53
+ for j in i:
54
+ row.append(j)
55
+ out.append(row)
56
+ r.close()
57
+ return out
58
+
59
+ def formatOne(self, result):
60
+ """
61
+ Return one record
62
+ """
63
+ out = []
64
+ for r in result:
65
+ for i in r.fetchone():
66
+ out.append(i)
67
+ return out
68
+
69
+ def formatDict(self, result):
70
+ """
71
+ Returns an array of dictionaries representing the results
72
+ """
73
+ dictOut = []
74
+ for r in result:
75
+ descriptions = r.keys
76
+ for i in r.fetchall():
77
+ # WARNING: this can generate errors for some stupid reason
78
+ # in both oracle and mysql.
79
+ entry = {}
80
+ for index in range(0, len(descriptions)):
81
+ # WARNING: Oracle returns table names in CAP!
82
+ if isinstance(descriptions[index], (str, bytes)):
83
+ keyName = decodeBytesToUnicodeConditional(descriptions[index], condition=PY3)
84
+ else:
85
+ keyName = descriptions[index]
86
+ if isinstance(i[index], (str, bytes)):
87
+ entry[keyName.lower()] = decodeBytesToUnicodeConditional(i[index], condition=PY3)
88
+ else:
89
+ entry[keyName.lower()] = i[index]
90
+
91
+ dictOut.append(entry)
92
+
93
+ r.close()
94
+
95
+ return dictOut
96
+
97
+ def formatList(self, result):
98
+ """
99
+ Returns a flat array with the results.
100
+ Ideally used for single column queries
101
+ """
102
+ listOut = []
103
+ for r in result:
104
+ descriptions = r.keys
105
+ for i in r.fetchall():
106
+ for index in range(0, len(descriptions)):
107
+ if isinstance(i[index], (str, bytes)):
108
+ listOut.append(decodeBytesToUnicodeConditional(i[index], condition=PY3))
109
+ else:
110
+ listOut.append(i[index])
111
+ r.close()
112
+ return listOut
113
+
114
+ def formatOneDict(self, result):
115
+ """
116
+ Return a dictionary representing the first record
117
+ """
118
+ if (len(result) == 0):
119
+ return {}
120
+
121
+ r = result[0]
122
+ description = [str(x).lower() for x in r.keys]
123
+ if len(r.data) < 1:
124
+ return {}
125
+
126
+ return dict(list(zip(description, r.fetchone())))
127
+
128
+ def formatCursor(self, cursor, size=10):
129
+ """
130
+ Fetch the driver cursor directly.
131
+ Tested only with cx_Oracle.
132
+ Cursor must be already executed.
133
+ Use fetchmany(size = default arraysize = 50)
134
+
135
+ """
136
+ if isinstance(cursor.keys, types.MethodType):
137
+ keys = [x.lower() for x in cursor.keys()] # warning: do not modernize this line.
138
+ else:
139
+ keys = [x.lower() for x in cursor.keys]
140
+ result = []
141
+ while True:
142
+ if not cursor.closed:
143
+ rows = cursor.fetchmany(size=size)
144
+ if not rows:
145
+ cursor.close()
146
+ break
147
+ for r in rows:
148
+ result.append(dict(list(zip(keys, r))))
149
+ else:
150
+ break
151
+ if not cursor.closed:
152
+ cursor.close()
153
+ return result
154
+
155
+ def getBinds(self, **kwargs):
156
+ binds = {}
157
+ for i in kwargs:
158
+ binds = self.dbi.buildbinds(self.dbi.makelist(kwargs[i]), i, binds)
159
+ return binds
160
+
161
+ def execute(self, conn=None, transaction=False, returnCursor=False):
162
+ """
163
+ A simple select with no binds/arguments is the default
164
+ """
165
+ result = self.dbi.processData(self.sql, self.getBinds(),
166
+ conn=conn, transaction=transaction,
167
+ returnCursor=returnCursor)
168
+ return self.format(result)
169
+
170
+ def executeOne(self, conn=None, transaction=False, returnCursor=False):
171
+ """
172
+ A simple select with no binds/arguments is the default
173
+ """
174
+ result = self.dbi.processData(self.sql, self.getBinds(),
175
+ conn=conn, transaction=transaction,
176
+ returnCursor=returnCursor)
177
+ return self.formatOne(result)
@@ -0,0 +1,13 @@
1
+
2
+ """
3
+ sqlalchemy breaks this because they reorganized things. Fail.
4
+ see: http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg18392.html
5
+ -AMM 6/15/10
6
+ """
7
+
8
+ try:
9
+ from sqlalchemy.databases.mysql import MySQLDialect
10
+ from sqlalchemy.databases.oracle import OracleDialect
11
+ except:
12
+ from sqlalchemy.dialects.mysql.base import MySQLDialect
13
+ from sqlalchemy.dialects.oracle.base import OracleDialect
@@ -0,0 +1,327 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Script to create a dedicated DAOFactory and execute a single DAO.
5
+
6
+ This script is intended to be used by developers and experts only.
7
+ The execution environment should be under any of the WMAgents we have. And the full set
8
+ of agent management and initialisation scripts need to be sourced in advance i.e.:
9
+
10
+ Usage:
11
+
12
+ For production:
13
+ source /data/admin/wmagent/env.sh
14
+ source /data/srv/wmagent/current/apps/wmagent/etc/profile.d/init.sh
15
+ python3 ExecuteDAO.py [--options] -- [SQL Query Arguments]
16
+
17
+ For tier0:
18
+ source /data/tier0/admin/env.sh
19
+ source /data/tier0/srv/wmagent/current/apps/t0/etc/profile.d/init.sh
20
+ python3 ExecuteDAO.py [--options] -- [SQL Query Arguments]
21
+
22
+ """
23
+
24
+ import sys
25
+ import os
26
+ import re
27
+
28
+ import threading
29
+ import logging
30
+ import argparse
31
+ import pickle
32
+ from pprint import pformat
33
+
34
+ from WMCore.DAOFactory import DAOFactory
35
+ from WMCore.WMInit import WMInit
36
+ from WMCore.Agent.Configuration import Configuration, loadConfigurationFile
37
+ from Utils.FileTools import loadEnvFile
38
+
39
+ def parseArgs():
40
+ """
41
+ Generic Argument Parser function
42
+ """
43
+ parser = argparse.ArgumentParser(
44
+ prog='ExecuteDAO',
45
+ formatter_class=argparse.RawTextHelpFormatter,
46
+ description=__doc__)
47
+
48
+ parser.add_argument('-c', '--config', required=False,
49
+ default=os.environ.get("WMA_CONFIG_FILE", None),
50
+ help="""\
51
+ The WMAgent config file to be used for the this execution. Default is taken from
52
+ the current's shell environment variable $WMA_CONFIG_FILE
53
+ """)
54
+ parser.add_argument('-e', '--envFile', required=False,
55
+ default=os.environ.get("WMA_ENV_FILE", None),
56
+ help="""
57
+ The WMAgent environment file to be used for the this execution. Default is taken from
58
+ the current's shell environment variable $WMA_ENV_FILE
59
+ """)
60
+ parser.add_argument('-p', '--package', required=True,
61
+ help="""\
62
+ The package from which the DAO factory to be created for this execution, e.g. WMCore.WMBS or WMComponent.DBS3Buffer""")
63
+ parser.add_argument('-m', '--module', required=True,
64
+ help="""\
65
+ The DAO Module to be executed, e.g. Workflow.GetDeletableWorkflows or CountUndeletedBlocksByWorkflow""")
66
+ parser.add_argument('-d', '--debug', action='store_true', default=False,
67
+ help="""\
68
+ Set logging to debug mode.""")
69
+ parser.add_argument('--dryRun', action='store_true', default=False,
70
+ help="""\
71
+ Simulation mode only""")
72
+ parser.add_argument('-s', '--sqlKwArgs', default={},
73
+ help="""\
74
+ Named paramaters to be forwarded to the DAO execute method and used as SQL arguments in the query.
75
+ Should be formatted as a dictionary e.g.:
76
+ -s "{'workflowName': name, injected: True}"
77
+ """)
78
+ parser.add_argument('sqlArgs', nargs=argparse.REMAINDER, default=(),
79
+ help="""\
80
+ -- Positional parameters to be forwarded to the DAO execute method and used as SQL arguments in the query.""")
81
+ parser.add_argument('-f', '--pklFile', default=None,
82
+ help="""\
83
+ An extra *.pkl file containing any additional python objects needed for the given dao
84
+ e.g. WMCore.WMBS.Files.AddRunLumi.
85
+ The object is always loaded under the name `pklFile`. One can access the contents of the so loaded pkl file
86
+ during the dao execution trough the -s arguent e.g.:
87
+ ExecuteDAO.py -p WMCore.WMBS -m Files.AddRunLumi -c $WMA_CONFIG_FILE -f runLumiBinds_2035-4016.pkl -s "{'file': pklFile['data']}
88
+ """)
89
+ currArgs = parser.parse_args()
90
+
91
+ return currArgs
92
+
93
+
94
+ def loggerSetup(logLevel=logging.INFO):
95
+ """
96
+ Return a logger which writes everything to stdout.
97
+ """
98
+ currLogger = logging.getLogger()
99
+ outHandler = logging.StreamHandler(sys.stdout)
100
+ outHandler.setFormatter(logging.Formatter("%(asctime)s:%(levelname)s:%(module)s: %(message)s"))
101
+ outHandler.setLevel(logLevel)
102
+ if currLogger.handlers:
103
+ currLogger.handlers.clear()
104
+ currLogger.addHandler(outHandler)
105
+ currLogger.setLevel(logLevel)
106
+ return currLogger
107
+
108
+
109
+ def getBackendFromDbURL(dburl):
110
+ """
111
+ Auxiliary function for determining sql dialect from a connection Url
112
+ :param dbUrl: The connection Url to be parsed.
113
+ :return: A string pointing to the correct dialect.
114
+ """
115
+ dialectPart = dburl.split(":")[0]
116
+ if dialectPart == 'mysql':
117
+ return 'MySQL'
118
+ elif dialectPart == 'oracle':
119
+ return 'Oracle'
120
+ else:
121
+ raise RuntimeError("Unrecognized dialect %s" % dialectPart)
122
+
123
+
124
+ class ExecuteDAO():
125
+ """
126
+ A generic class to create the DAO Factory and execute the DAO module.
127
+ """
128
+ def __init__(self, connectUrl=None, socket=None, configFile=None,
129
+ package=None, daoModule=None, logger=None):
130
+ """
131
+ __init__
132
+ The ExecuteDAO constructor method.
133
+ :param package: The Package from which the DAO factory to be initialised.
134
+ :param connectUrl: Database connection URL (overwrites the connectUrl param from configFile if both present)
135
+ :param socket: Database connection URL (overwrites the socket param from configFile if both present)
136
+ :param module: The DAO module to be executed.
137
+ """
138
+ # Get the current thread:
139
+ myThread = threading.currentThread()
140
+
141
+ # Create default WMCore Init thread and configs:
142
+ self.init = WMInit()
143
+
144
+ if logger is None:
145
+ self.init.setLogging()
146
+ self.logger = logging.getLogger()
147
+ else:
148
+ self.logger = logger
149
+
150
+ if configFile is not None:
151
+ self.logger.info("Loading configFile: %s", configFile)
152
+ config = loadConfigurationFile(configFile)
153
+ else:
154
+ config = Configuration()
155
+
156
+ # Overwrite database config parameters from configFile if present as init arguments:
157
+ config.section_("CoreDatabase")
158
+ if connectUrl is not None:
159
+ config.CoreDatabase.connectUrl = connectUrl
160
+
161
+ if socket is not None:
162
+ config.CoreDatabase.socket = socket
163
+
164
+ # If still no proper database connection parameters provided,
165
+ # last resort - try fetching them from the environment:
166
+ if getattr(config.CoreDatabase, "connectUrl", None) is None and os.getenv('DATABASE', None):
167
+ config.CoreDatabase.connectUrl = os.getenv('DATABASE')
168
+ config.CoreDatabase.dialect = getBackendFromDbURL(os.getenv("DATABASE"))
169
+ config.CoreDatabase.socket = os.getenv("DBSOCK", None)
170
+
171
+ # always try to determine the dialect from the URL
172
+ if getattr(config.CoreDatabase, "connectUrl", None):
173
+ config.CoreDatabase.dialect = getBackendFromDbURL(config.CoreDatabase.connectUrl)
174
+
175
+ # finally if no socket is provided, set it to None and let WMInit to create it.
176
+ config.CoreDatabase.socket = getattr(config.CoreDatabase, "socket", None)
177
+
178
+ # check if all database connection parameters are provided:
179
+ if not all([getattr(config.CoreDatabase, "connectUrl", None),
180
+ getattr(config.CoreDatabase, "dialect", None)]):
181
+ raise RuntimeError("You must set proper DATABASE parameters: connectUrl, dialect, socket!")
182
+
183
+ # Connecting to database:
184
+ self.init.setDatabaseConnection(config.CoreDatabase.connectUrl,
185
+ config.CoreDatabase.dialect,
186
+ socketLoc=config.CoreDatabase.socket)
187
+
188
+ self.dbi = myThread.dbi
189
+ self.package = package
190
+ self.daoModule = daoModule
191
+
192
+ # Avoid any name that starts with _
193
+ self.sqlRegEx = re.compile("^(?!_.*)", re.IGNORECASE)
194
+
195
+ self.daoFactory = DAOFactory(package=package,
196
+ logger=self.logger,
197
+ dbinterface=self.dbi)
198
+ self.logger.info("DAO Factory initialised from package: %s", self.package)
199
+
200
+ self.dao = self.daoFactory(classname=daoModule)
201
+ self.logger.info("DAO Module initialised as: %s", self.daoModule)
202
+
203
+ def __call__(self, *sqlArgs, dryRun=False, daoHelp=False, **sqlKwArgs):
204
+ """
205
+ __call__
206
+ The ExecuteDAO call method. This is the method to forward all provided
207
+ arguments to the execute method of the DAO and return the result from the query
208
+ :param dryRun: Bool flag to indicate dryrun method
209
+ :param *sqlArgs: All positional arguments to be forwarded to the DAO's execute method.
210
+ :param **sqlKwArgs: All named arguments to be forwarded to the DAO's execute method.
211
+ :return: The result from the DAO. Depending on the DAO itself it Could be one of:
212
+ * A dictionary
213
+ * A list
214
+ * A generator
215
+ """
216
+ if dryRun:
217
+ results = []
218
+ if daoHelp:
219
+ self.getHelp()
220
+ self.logger.info("DAO SQL queries to be executed:")
221
+ sqlQueries = self.getSqlQuery()
222
+ for sqlName, sqlStr in sqlQueries.items():
223
+ msg = "\n----------------------------------------------------------------------\n"
224
+ msg += "%s: %s"
225
+ msg += "\n----------------------------------------------------------------------\n"
226
+ self.logger.info(msg, sqlName, sqlStr)
227
+ self.logger.info("DAO SQL arguments provided:\n%s, %s", pformat(sqlArgs), pformat(sqlKwArgs))
228
+ else:
229
+ results = self.dao.execute(*sqlArgs, **sqlKwArgs)
230
+ # self.logger.info("DAO Results:\n%s", pformat(results if isinstance(results, dict) else list(results)))
231
+ if isinstance(results, dict):
232
+ self.logger.info("DAO Results:\n%s", pformat(results))
233
+ elif isinstance(results, bool):
234
+ self.logger.info("DAO Results:\n%s", results)
235
+ else:
236
+ self.logger.info("DAO Results:\n%s", list(results))
237
+ return results
238
+
239
+ def getSqlQuery(self):
240
+ """
241
+ A simple method to inspect all DAO object attributes and accumulate any sql query it finds in a simple list
242
+ :return: A list of all sql queries it finds in the object.
243
+ """
244
+ # NOTE: Use this method with caution because it may also return an object which is not an sql query.
245
+ # This may happen if there is a DAO attribute which is of type string and satisfies self.sqlRegEx
246
+ sqlQueries = {}
247
+ for attr in dir(self.dao):
248
+ if self.sqlRegEx.match(attr) and isinstance(getattr(self.dao, attr), (str, bytes)):
249
+ sqlQueries[attr] = getattr(self.dao, attr)
250
+ return sqlQueries
251
+
252
+ def getHelp(self):
253
+ """
254
+ A simple method to generate interactive DAO help message from the DAO source.
255
+ """
256
+ help(self.dao)
257
+
258
+
259
+ def strToDict(dString, logger=None):
260
+ """
261
+ A simple Function to parse a string and produce a dictionary out of it.
262
+ :param dString: The dictionary string to be parsed. Possible formats are either a string
263
+ of multiple space separated named values of the form 'name=value':
264
+ or a srting fully defining the dictionary itself.
265
+ :return: The constructed dictionary
266
+ """
267
+ if not logger:
268
+ logger = logging.getLogger()
269
+ # result = ast.literal_eval(dString)
270
+ result = eval(dString)
271
+ if not isinstance(result, dict):
272
+ logger.error("The Query named arguments need to be provided as a dictionary. WRONG option: %s", pformat(dString))
273
+ raise TypeError(pformat(dString))
274
+ return result
275
+
276
+
277
+ if __name__ == '__main__':
278
+ args = parseArgs()
279
+
280
+ if args.debug:
281
+ logger = loggerSetup(logging.DEBUG)
282
+ else:
283
+ logger = loggerSetup()
284
+
285
+ # Create an instance of the *.pkl file provided with the dao call, if any.
286
+ if args.pklFile:
287
+ pklFilePath = os.path.normpath(args.pklFile)
288
+ if not os.path.exists(pklFilePath):
289
+ logger.error("Cannot find the pkl file: %s. Exit!", pklFilePath)
290
+ sys.exit(1)
291
+ with open(pklFilePath, 'rb') as fd:
292
+ pklFile = pickle.load(fd)
293
+ logger.info('PklFile: %s loaded as: `pklFile`. You can refer to its content through the -s argument.', pklFilePath)
294
+ # logger.info(pformat(pklFile))
295
+
296
+ # Remove leading double slash if present:
297
+ if args.sqlArgs and args.sqlArgs[0] == '--':
298
+ args.sqlArgs = args.sqlArgs[1:]
299
+
300
+ # Convert the positional arguments to a tuple:
301
+ if not isinstance(args.sqlArgs, tuple):
302
+ args.sqlArgs = tuple(args.sqlArgs)
303
+
304
+ # Parse named arguments to a proper dictionary:
305
+ if not isinstance(args.sqlKwArgs, dict):
306
+ args.sqlKwArgs = strToDict(args.sqlKwArgs)
307
+
308
+ # Trying to load WMA_ENV_FILE
309
+ if not args.envFile or not os.path.exists(args.envFile):
310
+ logger.warning("Missing WMAgent environment file! One may expect DAO misbehavior!")
311
+ else:
312
+ logger.info("Trying to source explicitely the WMAgent environment file: %s", args.envFile)
313
+ try:
314
+ loadEnvFile(args.envFile)
315
+ except Exception as ex:
316
+ logger.error("Failed to load wmaEnvFile: %s", args.envFile)
317
+ raise
318
+
319
+ if not args.config or not os.path.exists(args.config):
320
+ logger.warning("Missing WMAgent config file! One may expect DAO failure")
321
+ else:
322
+ # resetting the configuration file in the env (if the default is overwritten through args)
323
+ os.environ['WMAGENT_CONFIG'] = args.config
324
+ os.environ['WMA_CONFIG_FILE'] = args.config
325
+
326
+ daoObject = ExecuteDAO(package=args.package, daoModule=args.module, configFile=args.config)
327
+ daoObject(*args.sqlArgs, dryRun=args.dryRun, daoHelp=True, **args.sqlKwArgs)