wmglobalqueue 2.4.5.1__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 (347) hide show
  1. Utils/CPMetrics.py +270 -0
  2. Utils/CertTools.py +100 -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/ProcFS.py +112 -0
  13. Utils/ProcessStats.py +194 -0
  14. Utils/PythonVersion.py +17 -0
  15. Utils/Signals.py +36 -0
  16. Utils/TemporaryEnvironment.py +27 -0
  17. Utils/Throttled.py +227 -0
  18. Utils/Timers.py +130 -0
  19. Utils/Timestamps.py +86 -0
  20. Utils/TokenManager.py +143 -0
  21. Utils/Tracing.py +60 -0
  22. Utils/TwPrint.py +98 -0
  23. Utils/Utilities.py +318 -0
  24. Utils/__init__.py +11 -0
  25. Utils/wmcoreDTools.py +707 -0
  26. WMCore/ACDC/Collection.py +57 -0
  27. WMCore/ACDC/CollectionTypes.py +12 -0
  28. WMCore/ACDC/CouchCollection.py +67 -0
  29. WMCore/ACDC/CouchFileset.py +238 -0
  30. WMCore/ACDC/CouchService.py +73 -0
  31. WMCore/ACDC/DataCollectionService.py +485 -0
  32. WMCore/ACDC/Fileset.py +94 -0
  33. WMCore/ACDC/__init__.py +11 -0
  34. WMCore/Algorithms/Alarm.py +39 -0
  35. WMCore/Algorithms/MathAlgos.py +274 -0
  36. WMCore/Algorithms/MiscAlgos.py +67 -0
  37. WMCore/Algorithms/ParseXMLFile.py +115 -0
  38. WMCore/Algorithms/Permissions.py +27 -0
  39. WMCore/Algorithms/Singleton.py +58 -0
  40. WMCore/Algorithms/SubprocessAlgos.py +129 -0
  41. WMCore/Algorithms/__init__.py +7 -0
  42. WMCore/Cache/GenericDataCache.py +98 -0
  43. WMCore/Cache/WMConfigCache.py +572 -0
  44. WMCore/Cache/__init__.py +0 -0
  45. WMCore/Configuration.py +659 -0
  46. WMCore/DAOFactory.py +47 -0
  47. WMCore/DataStructs/File.py +177 -0
  48. WMCore/DataStructs/Fileset.py +140 -0
  49. WMCore/DataStructs/Job.py +182 -0
  50. WMCore/DataStructs/JobGroup.py +142 -0
  51. WMCore/DataStructs/JobPackage.py +49 -0
  52. WMCore/DataStructs/LumiList.py +734 -0
  53. WMCore/DataStructs/Mask.py +219 -0
  54. WMCore/DataStructs/MathStructs/ContinuousSummaryHistogram.py +197 -0
  55. WMCore/DataStructs/MathStructs/DiscreteSummaryHistogram.py +92 -0
  56. WMCore/DataStructs/MathStructs/SummaryHistogram.py +117 -0
  57. WMCore/DataStructs/MathStructs/__init__.py +0 -0
  58. WMCore/DataStructs/Pickleable.py +24 -0
  59. WMCore/DataStructs/Run.py +256 -0
  60. WMCore/DataStructs/Subscription.py +175 -0
  61. WMCore/DataStructs/WMObject.py +47 -0
  62. WMCore/DataStructs/WorkUnit.py +112 -0
  63. WMCore/DataStructs/Workflow.py +60 -0
  64. WMCore/DataStructs/__init__.py +8 -0
  65. WMCore/Database/CMSCouch.py +1430 -0
  66. WMCore/Database/ConfigDBMap.py +29 -0
  67. WMCore/Database/CouchMonitoring.py +450 -0
  68. WMCore/Database/CouchUtils.py +118 -0
  69. WMCore/Database/DBCore.py +198 -0
  70. WMCore/Database/DBCreator.py +113 -0
  71. WMCore/Database/DBExceptionHandler.py +59 -0
  72. WMCore/Database/DBFactory.py +117 -0
  73. WMCore/Database/DBFormatter.py +177 -0
  74. WMCore/Database/Dialects.py +13 -0
  75. WMCore/Database/ExecuteDAO.py +327 -0
  76. WMCore/Database/MongoDB.py +241 -0
  77. WMCore/Database/MySQL/Destroy.py +42 -0
  78. WMCore/Database/MySQL/ListUserContent.py +20 -0
  79. WMCore/Database/MySQL/__init__.py +9 -0
  80. WMCore/Database/MySQLCore.py +132 -0
  81. WMCore/Database/Oracle/Destroy.py +56 -0
  82. WMCore/Database/Oracle/ListUserContent.py +19 -0
  83. WMCore/Database/Oracle/__init__.py +9 -0
  84. WMCore/Database/ResultSet.py +44 -0
  85. WMCore/Database/Transaction.py +91 -0
  86. WMCore/Database/__init__.py +9 -0
  87. WMCore/Database/ipy_profile_couch.py +438 -0
  88. WMCore/GlobalWorkQueue/CherryPyThreads/CleanUpTask.py +29 -0
  89. WMCore/GlobalWorkQueue/CherryPyThreads/HeartbeatMonitor.py +105 -0
  90. WMCore/GlobalWorkQueue/CherryPyThreads/LocationUpdateTask.py +28 -0
  91. WMCore/GlobalWorkQueue/CherryPyThreads/ReqMgrInteractionTask.py +35 -0
  92. WMCore/GlobalWorkQueue/CherryPyThreads/__init__.py +0 -0
  93. WMCore/GlobalWorkQueue/__init__.py +0 -0
  94. WMCore/GroupUser/CouchObject.py +127 -0
  95. WMCore/GroupUser/Decorators.py +51 -0
  96. WMCore/GroupUser/Group.py +33 -0
  97. WMCore/GroupUser/Interface.py +73 -0
  98. WMCore/GroupUser/User.py +96 -0
  99. WMCore/GroupUser/__init__.py +11 -0
  100. WMCore/Lexicon.py +836 -0
  101. WMCore/REST/Auth.py +202 -0
  102. WMCore/REST/CherryPyPeriodicTask.py +166 -0
  103. WMCore/REST/Error.py +333 -0
  104. WMCore/REST/Format.py +642 -0
  105. WMCore/REST/HeartbeatMonitorBase.py +90 -0
  106. WMCore/REST/Main.py +636 -0
  107. WMCore/REST/Server.py +2435 -0
  108. WMCore/REST/Services.py +24 -0
  109. WMCore/REST/Test.py +120 -0
  110. WMCore/REST/Tools.py +38 -0
  111. WMCore/REST/Validation.py +250 -0
  112. WMCore/REST/__init__.py +1 -0
  113. WMCore/ReqMgr/DataStructs/RequestStatus.py +209 -0
  114. WMCore/ReqMgr/DataStructs/RequestType.py +13 -0
  115. WMCore/ReqMgr/DataStructs/__init__.py +0 -0
  116. WMCore/ReqMgr/__init__.py +1 -0
  117. WMCore/Services/AlertManager/AlertManagerAPI.py +111 -0
  118. WMCore/Services/AlertManager/__init__.py +0 -0
  119. WMCore/Services/CRIC/CRIC.py +238 -0
  120. WMCore/Services/CRIC/__init__.py +0 -0
  121. WMCore/Services/DBS/DBS3Reader.py +1044 -0
  122. WMCore/Services/DBS/DBSConcurrency.py +44 -0
  123. WMCore/Services/DBS/DBSErrors.py +112 -0
  124. WMCore/Services/DBS/DBSReader.py +23 -0
  125. WMCore/Services/DBS/DBSUtils.py +166 -0
  126. WMCore/Services/DBS/DBSWriterObjects.py +381 -0
  127. WMCore/Services/DBS/ProdException.py +133 -0
  128. WMCore/Services/DBS/__init__.py +8 -0
  129. WMCore/Services/FWJRDB/FWJRDBAPI.py +118 -0
  130. WMCore/Services/FWJRDB/__init__.py +0 -0
  131. WMCore/Services/HTTPS/HTTPSAuthHandler.py +66 -0
  132. WMCore/Services/HTTPS/__init__.py +0 -0
  133. WMCore/Services/LogDB/LogDB.py +201 -0
  134. WMCore/Services/LogDB/LogDBBackend.py +191 -0
  135. WMCore/Services/LogDB/LogDBExceptions.py +11 -0
  136. WMCore/Services/LogDB/LogDBReport.py +85 -0
  137. WMCore/Services/LogDB/__init__.py +0 -0
  138. WMCore/Services/MSPileup/__init__.py +0 -0
  139. WMCore/Services/MSUtils/MSUtils.py +54 -0
  140. WMCore/Services/MSUtils/__init__.py +0 -0
  141. WMCore/Services/McM/McM.py +173 -0
  142. WMCore/Services/McM/__init__.py +8 -0
  143. WMCore/Services/MonIT/Grafana.py +133 -0
  144. WMCore/Services/MonIT/__init__.py +0 -0
  145. WMCore/Services/PyCondor/PyCondorAPI.py +154 -0
  146. WMCore/Services/PyCondor/__init__.py +0 -0
  147. WMCore/Services/ReqMgr/ReqMgr.py +261 -0
  148. WMCore/Services/ReqMgr/__init__.py +0 -0
  149. WMCore/Services/ReqMgrAux/ReqMgrAux.py +419 -0
  150. WMCore/Services/ReqMgrAux/__init__.py +0 -0
  151. WMCore/Services/RequestDB/RequestDBReader.py +267 -0
  152. WMCore/Services/RequestDB/RequestDBWriter.py +39 -0
  153. WMCore/Services/RequestDB/__init__.py +0 -0
  154. WMCore/Services/Requests.py +624 -0
  155. WMCore/Services/Rucio/Rucio.py +1290 -0
  156. WMCore/Services/Rucio/RucioUtils.py +74 -0
  157. WMCore/Services/Rucio/__init__.py +0 -0
  158. WMCore/Services/RucioConMon/RucioConMon.py +121 -0
  159. WMCore/Services/RucioConMon/__init__.py +0 -0
  160. WMCore/Services/Service.py +400 -0
  161. WMCore/Services/StompAMQ/__init__.py +0 -0
  162. WMCore/Services/TagCollector/TagCollector.py +155 -0
  163. WMCore/Services/TagCollector/XMLUtils.py +98 -0
  164. WMCore/Services/TagCollector/__init__.py +0 -0
  165. WMCore/Services/UUIDLib.py +13 -0
  166. WMCore/Services/UserFileCache/UserFileCache.py +160 -0
  167. WMCore/Services/UserFileCache/__init__.py +8 -0
  168. WMCore/Services/WMAgent/WMAgent.py +63 -0
  169. WMCore/Services/WMAgent/__init__.py +0 -0
  170. WMCore/Services/WMArchive/CMSSWMetrics.py +526 -0
  171. WMCore/Services/WMArchive/DataMap.py +463 -0
  172. WMCore/Services/WMArchive/WMArchive.py +33 -0
  173. WMCore/Services/WMArchive/__init__.py +0 -0
  174. WMCore/Services/WMBS/WMBS.py +97 -0
  175. WMCore/Services/WMBS/__init__.py +0 -0
  176. WMCore/Services/WMStats/DataStruct/RequestInfoCollection.py +300 -0
  177. WMCore/Services/WMStats/DataStruct/__init__.py +0 -0
  178. WMCore/Services/WMStats/WMStatsPycurl.py +145 -0
  179. WMCore/Services/WMStats/WMStatsReader.py +445 -0
  180. WMCore/Services/WMStats/WMStatsWriter.py +273 -0
  181. WMCore/Services/WMStats/__init__.py +0 -0
  182. WMCore/Services/WMStatsServer/WMStatsServer.py +134 -0
  183. WMCore/Services/WMStatsServer/__init__.py +0 -0
  184. WMCore/Services/WorkQueue/WorkQueue.py +492 -0
  185. WMCore/Services/WorkQueue/__init__.py +0 -0
  186. WMCore/Services/__init__.py +8 -0
  187. WMCore/Services/pycurl_manager.py +574 -0
  188. WMCore/WMBase.py +50 -0
  189. WMCore/WMConnectionBase.py +164 -0
  190. WMCore/WMException.py +183 -0
  191. WMCore/WMExceptions.py +269 -0
  192. WMCore/WMFactory.py +76 -0
  193. WMCore/WMInit.py +377 -0
  194. WMCore/WMLogging.py +104 -0
  195. WMCore/WMSpec/ConfigSectionTree.py +442 -0
  196. WMCore/WMSpec/Persistency.py +135 -0
  197. WMCore/WMSpec/Steps/BuildMaster.py +87 -0
  198. WMCore/WMSpec/Steps/BuildTools.py +201 -0
  199. WMCore/WMSpec/Steps/Builder.py +97 -0
  200. WMCore/WMSpec/Steps/Diagnostic.py +89 -0
  201. WMCore/WMSpec/Steps/Emulator.py +62 -0
  202. WMCore/WMSpec/Steps/ExecuteMaster.py +208 -0
  203. WMCore/WMSpec/Steps/Executor.py +210 -0
  204. WMCore/WMSpec/Steps/StepFactory.py +213 -0
  205. WMCore/WMSpec/Steps/TaskEmulator.py +75 -0
  206. WMCore/WMSpec/Steps/Template.py +204 -0
  207. WMCore/WMSpec/Steps/Templates/AlcaHarvest.py +76 -0
  208. WMCore/WMSpec/Steps/Templates/CMSSW.py +613 -0
  209. WMCore/WMSpec/Steps/Templates/DQMUpload.py +59 -0
  210. WMCore/WMSpec/Steps/Templates/DeleteFiles.py +70 -0
  211. WMCore/WMSpec/Steps/Templates/LogArchive.py +84 -0
  212. WMCore/WMSpec/Steps/Templates/LogCollect.py +105 -0
  213. WMCore/WMSpec/Steps/Templates/StageOut.py +105 -0
  214. WMCore/WMSpec/Steps/Templates/__init__.py +10 -0
  215. WMCore/WMSpec/Steps/WMExecutionFailure.py +21 -0
  216. WMCore/WMSpec/Steps/__init__.py +8 -0
  217. WMCore/WMSpec/Utilities.py +63 -0
  218. WMCore/WMSpec/WMSpecErrors.py +12 -0
  219. WMCore/WMSpec/WMStep.py +347 -0
  220. WMCore/WMSpec/WMTask.py +1997 -0
  221. WMCore/WMSpec/WMWorkload.py +2288 -0
  222. WMCore/WMSpec/WMWorkloadTools.py +382 -0
  223. WMCore/WMSpec/__init__.py +9 -0
  224. WMCore/WorkQueue/DataLocationMapper.py +273 -0
  225. WMCore/WorkQueue/DataStructs/ACDCBlock.py +47 -0
  226. WMCore/WorkQueue/DataStructs/Block.py +48 -0
  227. WMCore/WorkQueue/DataStructs/CouchWorkQueueElement.py +148 -0
  228. WMCore/WorkQueue/DataStructs/WorkQueueElement.py +274 -0
  229. WMCore/WorkQueue/DataStructs/WorkQueueElementResult.py +152 -0
  230. WMCore/WorkQueue/DataStructs/WorkQueueElementsSummary.py +185 -0
  231. WMCore/WorkQueue/DataStructs/__init__.py +0 -0
  232. WMCore/WorkQueue/Policy/End/EndPolicyInterface.py +44 -0
  233. WMCore/WorkQueue/Policy/End/SingleShot.py +22 -0
  234. WMCore/WorkQueue/Policy/End/__init__.py +32 -0
  235. WMCore/WorkQueue/Policy/PolicyInterface.py +17 -0
  236. WMCore/WorkQueue/Policy/Start/Block.py +258 -0
  237. WMCore/WorkQueue/Policy/Start/Dataset.py +180 -0
  238. WMCore/WorkQueue/Policy/Start/MonteCarlo.py +131 -0
  239. WMCore/WorkQueue/Policy/Start/ResubmitBlock.py +171 -0
  240. WMCore/WorkQueue/Policy/Start/StartPolicyInterface.py +316 -0
  241. WMCore/WorkQueue/Policy/Start/__init__.py +34 -0
  242. WMCore/WorkQueue/Policy/__init__.py +57 -0
  243. WMCore/WorkQueue/WMBSHelper.py +772 -0
  244. WMCore/WorkQueue/WorkQueue.py +1237 -0
  245. WMCore/WorkQueue/WorkQueueBackend.py +750 -0
  246. WMCore/WorkQueue/WorkQueueBase.py +39 -0
  247. WMCore/WorkQueue/WorkQueueExceptions.py +44 -0
  248. WMCore/WorkQueue/WorkQueueReqMgrInterface.py +278 -0
  249. WMCore/WorkQueue/WorkQueueUtils.py +130 -0
  250. WMCore/WorkQueue/__init__.py +13 -0
  251. WMCore/Wrappers/JsonWrapper/JSONThunker.py +342 -0
  252. WMCore/Wrappers/JsonWrapper/__init__.py +7 -0
  253. WMCore/Wrappers/__init__.py +6 -0
  254. WMCore/__init__.py +10 -0
  255. wmglobalqueue-2.4.5.1.data/data/bin/wmc-dist-patch +15 -0
  256. wmglobalqueue-2.4.5.1.data/data/bin/wmc-dist-unpatch +8 -0
  257. wmglobalqueue-2.4.5.1.data/data/bin/wmc-httpd +3 -0
  258. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/.couchapprc +1 -0
  259. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/README.md +40 -0
  260. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/index.html +264 -0
  261. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/ElementInfoByWorkflow.js +96 -0
  262. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/StuckElementInfo.js +57 -0
  263. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/WorkloadInfoTable.js +80 -0
  264. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/dataTable.js +70 -0
  265. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/namespace.js +23 -0
  266. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/style/main.css +75 -0
  267. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/couchapp.json +4 -0
  268. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/childQueueFilter.js +13 -0
  269. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/filterDeletedDocs.js +3 -0
  270. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/queueFilter.js +11 -0
  271. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/language +1 -0
  272. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/mustache.js +333 -0
  273. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/validate.js +27 -0
  274. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/workqueue_utils.js +61 -0
  275. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/elementsDetail.js +28 -0
  276. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/filter.js +86 -0
  277. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/stuckElements.js +38 -0
  278. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/workRestrictions.js +153 -0
  279. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/workflowSummary.js +28 -0
  280. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/rewrites.json +73 -0
  281. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/shows/redirect.js +23 -0
  282. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/shows/status.js +40 -0
  283. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/ElementSummaryByWorkflow.html +27 -0
  284. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/StuckElementSummary.html +26 -0
  285. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/TaskStatus.html +23 -0
  286. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/WorkflowSummary.html +27 -0
  287. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/workqueue-common-lib.html +2 -0
  288. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib-remote.html +16 -0
  289. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib.html +18 -0
  290. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/updates/in-place.js +50 -0
  291. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/validate_doc_update.js +8 -0
  292. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.couch.app.js +235 -0
  293. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.pathbinder.js +173 -0
  294. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeData/map.js +8 -0
  295. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeData/reduce.js +2 -0
  296. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeParentData/map.js +8 -0
  297. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeParentData/reduce.js +2 -0
  298. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activePileupData/map.js +8 -0
  299. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activePileupData/reduce.js +2 -0
  300. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/analyticsData/map.js +11 -0
  301. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/analyticsData/reduce.js +1 -0
  302. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/availableByPriority/map.js +6 -0
  303. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/conflicts/map.js +5 -0
  304. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elements/map.js +5 -0
  305. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByData/map.js +8 -0
  306. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByParent/map.js +8 -0
  307. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByParentData/map.js +8 -0
  308. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByPileupData/map.js +8 -0
  309. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByStatus/map.js +8 -0
  310. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsBySubscription/map.js +6 -0
  311. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/map.js +8 -0
  312. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/reduce.js +3 -0
  313. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsDetailByWorkflowAndStatus/map.js +26 -0
  314. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/map.js +10 -0
  315. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/reduce.js +1 -0
  316. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/map.js +6 -0
  317. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/reduce.js +1 -0
  318. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/map.js +6 -0
  319. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/reduce.js +1 -0
  320. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/map.js +6 -0
  321. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/reduce.js +1 -0
  322. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByRequest/map.js +6 -0
  323. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByRequest/reduce.js +1 -0
  324. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatus/map.js +6 -0
  325. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatus/reduce.js +1 -0
  326. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/map.js +6 -0
  327. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/reduce.js +1 -0
  328. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/openRequests/map.js +6 -0
  329. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/recent-items/map.js +5 -0
  330. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/map.js +6 -0
  331. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/reduce.js +1 -0
  332. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/specsByWorkflow/map.js +5 -0
  333. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/stuckElements/map.js +38 -0
  334. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/map.js +12 -0
  335. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/reduce.js +3 -0
  336. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrl/map.js +6 -0
  337. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrl/reduce.js +2 -0
  338. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/map.js +6 -0
  339. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/reduce.js +2 -0
  340. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/workflowSummary/map.js +9 -0
  341. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/workflowSummary/reduce.js +10 -0
  342. wmglobalqueue-2.4.5.1.dist-info/METADATA +26 -0
  343. wmglobalqueue-2.4.5.1.dist-info/RECORD +347 -0
  344. wmglobalqueue-2.4.5.1.dist-info/WHEEL +5 -0
  345. wmglobalqueue-2.4.5.1.dist-info/licenses/LICENSE +202 -0
  346. wmglobalqueue-2.4.5.1.dist-info/licenses/NOTICE +16 -0
  347. wmglobalqueue-2.4.5.1.dist-info/top_level.txt +2 -0
WMCore/WMFactory.py ADDED
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ A factory Class that is 'not thread safe' but is intended to work in threads
4
+ (no sharing). The class dynamically loads objects from files when needed and
5
+ caches them (or not). It is a generalized factory object. If needed this class
6
+ can be made threadsafe.
7
+ """
8
+
9
+ from builtins import object
10
+ import threading
11
+
12
+
13
+ class WMFactory(object):
14
+ """
15
+ A factory Class that is 'not thread safe' but is intended to work in
16
+ threads (no sharing). The class dynamically loads objects from files
17
+ when needed and caches them.
18
+ """
19
+
20
+ def __init__(self, name, namespace=''):
21
+ """
22
+ Initializes the factory, and checks if this thread already
23
+ has an attribute for storing registries. It uses the reserved
24
+ 'registries' attribute in the thread.
25
+ """
26
+ self.namespace = namespace
27
+ self.objectList = {}
28
+
29
+ myThread = threading.currentThread()
30
+ if not hasattr(myThread, "factory"):
31
+ myThread.factory = {}
32
+ myThread.factory[name] = self
33
+
34
+ def loadObject(self, classname, args=None, storeInCache=True,
35
+ getFromCache=True, listFlag=False, alteredClassName=None):
36
+ """
37
+ Dynamically loads the object from file.
38
+ For this to work the class name has to
39
+ be the same as the file name (minus the .py)
40
+
41
+ Be default objects are loaded from cache. However if you
42
+ want several different instances of the same object in one
43
+ thread, you set cache to False.
44
+ """
45
+ if getFromCache:
46
+ if classname in self.objectList:
47
+ return self.objectList[classname]
48
+
49
+ if self.namespace == '':
50
+ module = classname
51
+ # FIXME: hoky way of doing this! Change this please!
52
+ errModule = classname
53
+ else:
54
+ module = "%s.%s" % (self.namespace, classname)
55
+ errModule = "%s.%s" % (self.namespace, classname)
56
+ if alteredClassName:
57
+ classname = alteredClassName
58
+ module = __import__(module, globals(), locals(), [classname])
59
+ obj = getattr(module, classname.split('.')[-1])
60
+ if args is None:
61
+ classinstance = obj()
62
+ else:
63
+ # This handles the passing of list-style arguments instead of dicts
64
+ # Primarily for setting the schema
65
+ # Or anywhere you need arguments of the form (a,b,c,...)
66
+ if isinstance(args, list) and listFlag:
67
+ classinstance = obj(*args)
68
+ elif isinstance(args, dict):
69
+ classinstance = obj(**args)
70
+ else:
71
+ # But if you actually need to pass a list, better do it the old fashioned way
72
+ classinstance = obj(args)
73
+ if storeInCache:
74
+ self.objectList[classname] = classinstance
75
+
76
+ return classinstance
WMCore/WMInit.py ADDED
@@ -0,0 +1,377 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _WMInit
4
+
5
+ Init class that can be used by external projects
6
+ that only use part of the libraries
7
+ """
8
+ from __future__ import print_function
9
+
10
+ import logging
11
+ import os
12
+ import os.path
13
+ import sys
14
+ import threading
15
+ import traceback
16
+ import warnings
17
+ import wmcoredb
18
+
19
+ from WMCore.Configuration import loadConfigurationFile
20
+ from WMCore.DAOFactory import DAOFactory
21
+ from WMCore.Database.DBFactory import DBFactory
22
+ from WMCore.Database.Transaction import Transaction
23
+ from WMCore.WMBase import getWMBASE
24
+ from WMCore.WMException import WMException
25
+
26
+
27
+ class WMInitException(WMException):
28
+ """
29
+ WMInitException
30
+
31
+ You should never, ever see one of these.
32
+ I'm not optimistic that this will be the case.
33
+ """
34
+
35
+
36
+ def connectToDB():
37
+ """
38
+ _connectToDB_
39
+
40
+ Connect to the database specified in the WMAgent config.
41
+ """
42
+ if "WMAGENT_CONFIG" not in os.environ:
43
+ print("Please set WMAGENT_CONFIG to point at your WMAgent configuration.")
44
+ sys.exit(1)
45
+
46
+ if not os.path.exists(os.environ["WMAGENT_CONFIG"]):
47
+ print("Can't find config: %s" % os.environ["WMAGENT_CONFIG"])
48
+ sys.exit(1)
49
+
50
+ wmAgentConfig = loadConfigurationFile(os.environ["WMAGENT_CONFIG"])
51
+
52
+ if not hasattr(wmAgentConfig, "CoreDatabase"):
53
+ print("Your config is missing the CoreDatabase section.")
54
+ sys.exit(1)
55
+
56
+ socketLoc = getattr(wmAgentConfig.CoreDatabase, "socket", None)
57
+ connectUrl = getattr(wmAgentConfig.CoreDatabase, "connectUrl", None)
58
+ (dialect, _) = connectUrl.split(":", 1)
59
+
60
+ myWMInit = WMInit()
61
+ myWMInit.setDatabaseConnection(dbConfig=connectUrl, dialect=dialect,
62
+ socketLoc=socketLoc)
63
+
64
+ return
65
+
66
+
67
+ class WMInit(object):
68
+ def __init__(self):
69
+ return
70
+
71
+ def getWMBASE(self):
72
+ """ for those that don't want to use the static version"""
73
+ return getWMBASE()
74
+
75
+ def setLogging(self, logFile=None, logName=None, logLevel=logging.INFO, logExists=True):
76
+ """
77
+ Sets logging parameters, depending on the settings,
78
+ this method will create a logging file.
79
+ """
80
+ # use logName as name for file is no log file is given
81
+ if not logExists:
82
+ logging.basicConfig(level=logLevel, \
83
+ format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', \
84
+ datefmt='%m-%d %H:%M', \
85
+ filename='%s.log' % logFile, \
86
+ filemode='w')
87
+ logging.debug("Log file ready")
88
+
89
+ myThread = threading.currentThread()
90
+ if logName != None:
91
+ myThread.logger = logging.getLogger(logName)
92
+ else:
93
+ myThread.logger = logging.getLogger()
94
+
95
+ def setDatabaseConnection(self, dbConfig, dialect, socketLoc=None):
96
+ """
97
+ Sets the default connection parameters, without having to worry
98
+ much on what attributes need to be set. This is esepcially
99
+ advantagous for developers of third party projects that want
100
+ to use only parts of the WMCore lib.
101
+
102
+ The class differentiates between different formats used by external
103
+ projects. External project formats that are supported can activated
104
+ it by setting the flavor flag.
105
+ """
106
+ myThread = threading.currentThread()
107
+ if getattr(myThread, "dialect", None) != None:
108
+ # Database is already initialized, we'll create a new
109
+ # transaction and move on.
110
+ if hasattr(myThread, "transaction"):
111
+ if myThread.transaction != None:
112
+ myThread.transaction.commit()
113
+
114
+ myThread.transaction = Transaction(myThread.dbi)
115
+ return
116
+
117
+ options = {}
118
+ if dialect.lower() in ['mysql', 'mariadb']:
119
+ dialect = 'mariadb' # Both MySQL and MariaDB use the mariadb directory
120
+ if socketLoc != None:
121
+ options['unix_socket'] = socketLoc
122
+ elif dialect.lower() == 'oracle':
123
+ dialect = 'oracle' # Keep lowercase for consistency
124
+ elif dialect.lower() == 'http':
125
+ dialect = 'CouchDB'
126
+ else:
127
+ msg = "Unsupported dialect %s !" % dialect
128
+ logging.error(msg)
129
+ raise WMInitException(msg)
130
+
131
+ myThread.dialect = dialect
132
+ myThread.logger = logging
133
+ myThread.dbFactory = DBFactory(logging, dbConfig, options)
134
+ myThread.dbi = myThread.dbFactory.connect()
135
+
136
+ # The transaction object will begin a transaction as soon as it is
137
+ # initialized. I'd rather have the user handle that, so we'll commit
138
+ # it here.
139
+ myThread.transaction = Transaction(myThread.dbi)
140
+ myThread.transaction.commit()
141
+
142
+ return
143
+
144
+ def setSchema(self, modules=None, params=None):
145
+ """
146
+ Creates the schema in the database based on the modules
147
+ input.
148
+
149
+ This method needs to have been preceded by the
150
+ setDatabaseConnection.
151
+
152
+ @deprecated: Use setSchemaFromModules instead
153
+ """
154
+ warnings.warn("setSchema is deprecated. Use setSchemaFromModules instead.", DeprecationWarning)
155
+
156
+ # create a map of old to new SQL module names
157
+ moduleMap = {
158
+ 'WMCore.WMBS': 'wmbs',
159
+ 'WMCore.ResourceControl': 'resourcecontrol',
160
+ 'WMCore.BossAir': 'bossair',
161
+ 'WMCore.Agent.Database': 'agent',
162
+ 'WMComponent.DBS3Buffer': 'dbs3buffer',
163
+ 'T0.WMBS': 'tier0',
164
+ 'WMQuality.TestDB': 'testdb'
165
+ }
166
+
167
+ # convert old module names to new format
168
+ if modules:
169
+ modules = [moduleMap.get(module, module) for module in modules]
170
+
171
+ self.setSchemaFromModules(modules)
172
+
173
+ def setSchemaFromModules(self, sqlModules):
174
+ """
175
+ Initialize database schema for one or more SQL packages.
176
+ It finds out which dialect is being used and then looks for the
177
+ appropriate SQL files in the sql directory.
178
+
179
+ :param sqlModules: List of SQL database modules to be initialized.
180
+ Current supported values are (default is 'wmbs'):
181
+ - 'wmbs'
182
+ - 'resourcecontrol'
183
+ - 'bossair'
184
+ - 'agent'
185
+ - 'dbs3buffer'
186
+ - 'tier0'
187
+ """
188
+ myThread = threading.currentThread()
189
+ if not hasattr(myThread, 'dbi'):
190
+ raise WMInitException("Database connection not initialized. Call setDatabaseConnection first.")
191
+
192
+ # Get the database dialect
193
+ dialect = myThread.dialect.lower()
194
+ if dialect not in ['mariadb', 'oracle']:
195
+ raise WMInitException(f"Unsupported database dialect: {dialect}")
196
+
197
+ # Get the base directory (WMCore root)
198
+ if os.environ.get('WMCORE_ROOT'):
199
+ baseDir = os.environ['WMCORE_ROOT']
200
+ logging.info("SQL base directory based on WMCORE_ROOT: %s", baseDir)
201
+ else:
202
+ baseDir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
203
+ logging.info("SQL base directory based on WMInit-relative path: %s", baseDir)
204
+
205
+ # Define the SQL files needed for each module and their dependencies
206
+ # The order matters - modules that depend on others should come later
207
+ moduleSQLFiles = {
208
+ 'wmbs': {
209
+ 'files': ['create_wmbs_tables.sql', 'create_wmbs_indexes.sql', 'initial_wmbs_data.sql'],
210
+ 'dependencies': []
211
+ },
212
+ 'resourcecontrol': {
213
+ 'files': ['create_resourcecontrol.sql'],
214
+ 'dependencies': ['wmbs']
215
+ },
216
+ 'bossair': {
217
+ 'files': ['create_bossair.sql'],
218
+ 'dependencies': ['wmbs']
219
+ },
220
+ 'agent': {
221
+ 'files': ['create_agent.sql'],
222
+ 'dependencies': []
223
+ },
224
+ 'dbs3buffer': {
225
+ 'files': ['create_dbs3buffer.sql'],
226
+ 'dependencies': ['wmbs']
227
+ },
228
+ 'tier0': {
229
+ 'files': ['create_tier0_tables.sql', 'create_tier0_indexes.sql', 'create_tier0_functions.sql', 'initial_tier0_data.sql'],
230
+ 'dependencies': ['wmbs', 'dbs3buffer']
231
+ },
232
+ 'testdb': {
233
+ 'files': ['create_testdb.sql'],
234
+ 'dependencies': []
235
+ },
236
+ }
237
+
238
+ # Validate all requested modules exist
239
+ for module in sqlModules:
240
+ if module not in moduleSQLFiles:
241
+ raise WMInitException(f"Unknown module: {module}")
242
+
243
+ # Sort modules based on dependencies
244
+ sorted_modules = []
245
+ remaining_modules = set(sqlModules)
246
+
247
+ while remaining_modules:
248
+ # Find modules with no remaining dependencies
249
+ ready_modules = [
250
+ mod for mod in remaining_modules
251
+ if all(dep in sorted_modules for dep in moduleSQLFiles[mod]['dependencies'])
252
+ ]
253
+
254
+ if not ready_modules:
255
+ # Circular dependency detected
256
+ raise WMInitException("Circular dependency detected in module dependencies")
257
+
258
+ sorted_modules.extend(ready_modules)
259
+ remaining_modules -= set(ready_modules)
260
+
261
+ # Execute SQL files in dependency order
262
+ for module in sorted_modules:
263
+ logging.info("Executing SQL files for: %s", module)
264
+ for sql_file in moduleSQLFiles[module]['files']:
265
+ dialect_sql_file = wmcoredb.get_sql_file(module_name=module, file_name=sql_file, backend=dialect)
266
+
267
+ # now execute each SQL statement
268
+ for stmt in self._getSQLStatements(dialect_sql_file, dialect):
269
+ try:
270
+ myThread.dbi.processData(stmt)
271
+ except Exception as ex:
272
+ msg = f"Error executing SQL file {dialect_sql_file}. "
273
+ msg += f"Statement: {stmt}"
274
+ msg += str(ex)
275
+ raise WMInitException(msg)
276
+
277
+ return
278
+
279
+ def _getSQLStatements(self, sqlFile, dialect):
280
+ """
281
+ Return the SQL statements from the file.
282
+ For MariaDB, it accepts the whole SQL file content in a single statement.
283
+ For Oracle, it splits the SQL file content into statements using the slash (/) terminator
284
+ when it appears as the first character in a line.
285
+ """
286
+ if not os.path.exists(sqlFile):
287
+ raise WMInitException(f"SQL file not found: {sqlFile}")
288
+
289
+ with open(sqlFile, 'r', encoding='utf-8') as f:
290
+ sql = f.read()
291
+
292
+ if dialect == 'mariadb':
293
+ return [sql]
294
+ elif dialect == 'oracle':
295
+ statements = []
296
+ current_statement = []
297
+
298
+ for line in sql.split('\n'):
299
+ line = line.strip()
300
+ # Skip empty lines and comments
301
+ if not line or line.startswith('--'):
302
+ continue
303
+
304
+ # If we find a slash terminator at the start of a line
305
+ if line == '/':
306
+ # Join all lines collected so far into a statement
307
+ stmt = '\n'.join(current_statement)
308
+ if stmt.strip():
309
+ statements.append(stmt)
310
+ current_statement = []
311
+ else:
312
+ current_statement.append(line)
313
+
314
+ # Add any remaining statement
315
+ if current_statement:
316
+ stmt = '\n'.join(current_statement)
317
+ if stmt.strip():
318
+ statements.append(stmt)
319
+
320
+ return statements
321
+ else:
322
+ raise WMInitException(f"Unsupported database dialect: {dialect}")
323
+
324
+ def clearDatabase(self, modules=None):
325
+ """
326
+ Database deletion. Global, ignore modules.
327
+ """
328
+ myThread = threading.currentThread()
329
+ if hasattr(myThread, 'transaction') and getattr(myThread.transaction, 'transaction', None):
330
+ # Then we have an open transaction
331
+ # We should try and close it first
332
+ try:
333
+ myThread.transaction.commit()
334
+ except:
335
+ try:
336
+ myThread.transaction.rollback()
337
+ except:
338
+ pass
339
+
340
+ # Setup the DAO
341
+ daoFactory = DAOFactory(package="WMCore.Database",
342
+ logger=myThread.logger,
343
+ dbinterface=myThread.dbi)
344
+ destroyDAO = daoFactory(classname="Destroy")
345
+
346
+ # Actually run a transaction and delete the DB
347
+ try:
348
+ destroyDAO.execute()
349
+ except Exception as ex:
350
+ msg = "Critical error while attempting to delete entire DB!\n"
351
+ msg += str(ex)
352
+ msg += str(traceback.format_exc())
353
+ logging.error(msg)
354
+ raise WMInitException(msg)
355
+
356
+ return
357
+
358
+ def checkDatabaseContents(self):
359
+ """
360
+ _checkDatabaseContents_
361
+
362
+ Check and see if anything is in the database.
363
+ This should be called by methods about to build the schema to make sure
364
+ that the DB itself is empty.
365
+ """
366
+
367
+ myThread = threading.currentThread()
368
+ daoFactory = DAOFactory(package="WMCore.Database",
369
+ logger=myThread.logger,
370
+ dbinterface=myThread.dbi)
371
+
372
+ testDAO = daoFactory(classname="ListUserContent")
373
+
374
+ result = testDAO.execute()
375
+ myThread.dbi.engine.dispose()
376
+
377
+ return result
WMCore/WMLogging.py ADDED
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _WMLogging_
4
+
5
+ Logging facilities used in WMCore.
6
+ """
7
+ import logging
8
+ from datetime import date, timedelta
9
+ from logging.handlers import HTTPHandler, RotatingFileHandler, TimedRotatingFileHandler
10
+
11
+ # a new log level which is lower than debug
12
+ # to prevent a tsunami of log messages in debug
13
+ # mode but to have the possibility to see all
14
+ # database queries if necessary.
15
+ logging.SQLDEBUG = 5
16
+ logging.addLevelName(logging.SQLDEBUG,"SQLDEBUG")
17
+
18
+ def sqldebug(msg):
19
+ """
20
+ A convenience method that all default levels
21
+ have for publishing log messages.
22
+ """
23
+ logging.log(logging.SQLDEBUG, msg)
24
+
25
+ def setupRotatingHandler(fileName, maxBytes = 200000000, backupCount = 3):
26
+ """
27
+ _setupRotatingHandler_
28
+
29
+ Create a rotating log handler with the given parameters.
30
+ """
31
+ handler = RotatingFileHandler(fileName, "a", maxBytes, backupCount)
32
+ logging.getLogger().addHandler(handler)
33
+ return
34
+
35
+
36
+ def getTimeRotatingLogger(name, logFile, duration = 'midnight'):
37
+ """ Set the logger for time based lotaing.
38
+ """
39
+ logger = logging.getLogger(name)
40
+ if duration == 'midnight':
41
+ handler = MyTimedRotatingFileHandler(logFile, duration, backupCount = 10)
42
+ else:
43
+ handler = TimedRotatingFileHandler(logFile, duration, backupCount = 10)
44
+ formatter = logging.Formatter("%(asctime)s:%(levelname)s:%(module)s:%(message)s")
45
+ handler.setFormatter(formatter)
46
+ logger.addHandler(handler)
47
+ logger.setLevel(logging.INFO)
48
+
49
+ return logger
50
+
51
+
52
+ class MyTimedRotatingFileHandler(TimedRotatingFileHandler):
53
+ """
54
+ _MyTimedRotatingFileHandler_
55
+
56
+ Overwrite the standard filename functionality from
57
+ logging.handlers.MyTimedRotatingFileHandler
58
+ such that it mimics the same behaviour as rotatelogs tool.
59
+
60
+ Source code from:
61
+ https://stackoverflow.com/questions/338450/timedrotatingfilehandler-changing-file-name
62
+ """
63
+ def __init__(self, logName, interval, backupCount):
64
+ super(MyTimedRotatingFileHandler, self).__init__(logName, when=interval,
65
+ backupCount=backupCount)
66
+
67
+ def doRollover(self):
68
+ """
69
+ _doRollover_
70
+
71
+ Rotate the log file and add the date between the log name
72
+ and its extension, e.g.:
73
+ reqmgr2.log becomes reqmgr2-20170815.log
74
+ """
75
+ self.stream.close()
76
+ # replace yesterday's date by today
77
+ yesterdayStr = (date.today() - timedelta(1)).strftime("%Y%m%d")
78
+ todayStr = date.today().strftime("%Y%m%d")
79
+ self.baseFilename = self.baseFilename.replace(yesterdayStr, todayStr)
80
+ self.stream = open(self.baseFilename, 'w', encoding='utf-8')
81
+ self.rolloverAt = self.rolloverAt + self.interval
82
+
83
+
84
+ class CouchHandler(logging.handlers.HTTPHandler):
85
+ def __init__(self, host, database):
86
+ HTTPHandler.__init__(self, host, database, 'POST')
87
+ from WMCore.Database.CMSCouch import CouchServer
88
+ self.database = CouchServer(dburl=host).connectDatabase(database, size=10)
89
+
90
+ def emit(self, record):
91
+ """
92
+ Write a document to CouchDB representing the log message.
93
+ """
94
+ doc = {}
95
+ doc['message'] = record.msg
96
+ doc['threadName'] = record.threadName
97
+ doc['name'] = record.name
98
+ doc['created'] = record.created
99
+ doc['process'] = record.process
100
+ doc['levelno'] = record.levelno
101
+ doc['lineno'] = record.lineno
102
+ doc['processName'] = record.processName
103
+ doc['levelname'] = record.levelname
104
+ self.database.commitOne(doc, timestamp=True)