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,133 @@
1
+ #!/usr/bin/python
2
+ """
3
+ _ProdException_
4
+
5
+ General Exception class for Prod modules
6
+
7
+ """
8
+
9
+ from future.utils import viewitems
10
+
11
+ try:
12
+ import exceptions
13
+ except ImportError:
14
+ import builtins as exceptions
15
+
16
+ import inspect
17
+ import logging
18
+
19
+
20
+ class ProdException(exceptions.Exception):
21
+ """
22
+ _ProdException_
23
+
24
+ Exception class which works out details of where
25
+ it was raised.
26
+
27
+ """
28
+ def __init__(self, message, errorNo=1000,**data):
29
+ self.name = str(self.__class__.__name__)
30
+ exceptions.Exception.__init__(self, self.name,
31
+ message)
32
+
33
+ # //
34
+ # // Init data dictionary with defaults
35
+ #//
36
+ self.data = {}
37
+ self.data.setdefault("ClassName", None)
38
+ self.data.setdefault("ModuleName", None)
39
+ self.data.setdefault("MethodName", None)
40
+ self.data.setdefault("ClassInstance", None)
41
+ self.data.setdefault("FileName", None)
42
+ self.data.setdefault("LineNumber", None)
43
+ if errorNo==None:
44
+ self.data.setdefault("ErrorNr",0)
45
+ else:
46
+ self.data.setdefault("ErrorNr",errorNo)
47
+
48
+ self.message = message
49
+ self.data.update(data)
50
+
51
+ # //
52
+ # // Automatically determine the module name
53
+ #// if not set
54
+ if self.data['ModuleName'] == None:
55
+ frame = inspect.currentframe()
56
+ lastframe = inspect.getouterframes(frame)[1][0]
57
+ excepModule = inspect.getmodule(lastframe)
58
+ if excepModule != None:
59
+ modName = excepModule.__name__
60
+ self.data['ModuleName'] = modName
61
+
62
+
63
+ # //
64
+ # // Find out where the exception came from
65
+ #//
66
+ stack = inspect.stack(1)[1]
67
+ self.data['FileName'] = stack[1]
68
+ self.data['LineNumber'] = stack[2]
69
+ self.data['MethodName'] = stack[3]
70
+
71
+ # //
72
+ # // ClassName if ClassInstance is passed
73
+ #//
74
+ if self.data['ClassInstance'] != None:
75
+ self.data['ClassName'] = \
76
+ self.data['ClassInstance'].__class__.__name__
77
+
78
+ logging.error(str(self))
79
+
80
+ def __getitem__(self, key):
81
+ """
82
+ make exception look like a dictionary
83
+ """
84
+ return self.data[key]
85
+
86
+ def __setitem__(self, key, value):
87
+ """
88
+ make exception look like a dictionary
89
+ """
90
+ self.data[key] = value
91
+
92
+ def addInfo(self, **data):
93
+ """
94
+ _addInfo_
95
+
96
+ Add key=value information pairs to an
97
+ exception instance
98
+ """
99
+ for key, value in viewitems(data):
100
+ self.data[key] = value
101
+ return
102
+
103
+ def xml(self):
104
+ """create a xml string rep of this exception"""
105
+ strg ="<Exception>\n"
106
+ strg +="<Object>\n"
107
+ strg += "%s\n" % self.name
108
+ strg +="</Object>\n"
109
+ strg +="<Message>\n"
110
+ strg += self.message
111
+ strg +="</Message>\n"
112
+ strg +="<DataItems>\n"
113
+ for key, value in viewitems(self.data):
114
+ strg +="<DataItem>\n"
115
+ strg += "<Key>\n"
116
+ strg += str(key)
117
+ strg += "</Key>\n"
118
+ strg += "<Value>\n"
119
+ strg += str(value)
120
+ strg += "</Value>\n"
121
+ strg +="</DataItem>\n"
122
+ strg +="</DataItems>\n"
123
+ strg +="</Exception>\n"
124
+ logging.error(strg)
125
+ return strg
126
+
127
+ def __str__(self):
128
+ """create a string rep of this exception"""
129
+ strg = "%s\n" % self.name
130
+ strg += "Message: %s\n" % self.message
131
+ for key, value in viewitems(self.data):
132
+ strg += "\t%s : %s\n" % (key, value, )
133
+ return strg
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _DBSUpload.DBSInterface_
4
+
5
+ DBS APIs for DBSUpload
6
+
7
+ """
8
+ __all__ = []
@@ -0,0 +1,118 @@
1
+ from __future__ import (division, print_function)
2
+
3
+ from builtins import str, bytes, object
4
+
5
+ from WMCore.Database.CMSCouch import CouchServer, Database
6
+ from WMCore.Lexicon import splitCouchServiceURL
7
+
8
+ class FWJRDBAPI(object):
9
+
10
+ def __init__(self, couchURL, dbName=None):
11
+ """
12
+ setting up comon variables for inherited class.
13
+ inherited class should call this in their init function
14
+ """
15
+ if isinstance(couchURL, Database):
16
+ self.couchDB = couchURL
17
+ self.couchURL = self.couchDB['host']
18
+ self.dbName = self.couchDB.name
19
+ self.couchServer = CouchServer(self.couchURL)
20
+ else:
21
+ if dbName == None:
22
+ self.couchURL, self.dbName = splitCouchServiceURL(couchURL)
23
+ else:
24
+ self.couchURL = couchURL
25
+ self.dbName = dbName
26
+ self.couchServer = CouchServer(self.couchURL)
27
+ self.couchDB = self.couchServer.connectDatabase(self.dbName, False)
28
+ self.couchapp = "FWJRDump"
29
+ self.defaultStale = {"stale": "update_after"}
30
+
31
+
32
+ def setDefaultStaleOptions(self, options):
33
+ if not options:
34
+ options = {}
35
+ if 'stale' not in options:
36
+ options.update(self.defaultStale)
37
+ return options
38
+
39
+ def _setNoStale(self):
40
+ """
41
+ Use this only for the unittest
42
+ """
43
+ self.defaultStale = {}
44
+
45
+ def _getCouchView(self, view, options, keys = []):
46
+
47
+ options = self.setDefaultStaleOptions(options)
48
+
49
+ if keys and isinstance(keys, (str, bytes)):
50
+ keys = [keys]
51
+ return self.couchDB.loadView(self.couchapp, view, options, keys)
52
+
53
+
54
+ def _filterCouchInfo(self, couchInfo):
55
+ # remove the couch specific information
56
+ for key in ['_rev', '_attachments']:
57
+ if key in couchInfo:
58
+ del couchInfo[key]
59
+ return
60
+
61
+
62
+ def _formatCouchData(self, data, key = "id", detail = True, filterCouch = True,
63
+ returnDict = False):
64
+ result = {}
65
+ for row in data['rows']:
66
+ if 'error' in row:
67
+ continue
68
+ if "doc" in row:
69
+ if filterCouch:
70
+ self._filterCouchInfo(row["doc"])
71
+ result[row[key]] = row["doc"]
72
+ else:
73
+ result[row[key]] = row["value"]
74
+ if detail or returnDict:
75
+ return result
76
+ else:
77
+ return list(result)
78
+
79
+ def getFWJRByArchiveStatus(self, status, limit=None, skip=None):
80
+ """
81
+ 'status': list of the status or status string
82
+ """
83
+ options = {}
84
+ options["include_docs"] = True
85
+
86
+ if limit != None:
87
+ options["limit"] = limit
88
+ if skip != None:
89
+ options["skip"] = skip
90
+ keys = status
91
+ return self._getCouchView("reportsByArchiveStatus", options, keys)
92
+
93
+ def updateArchiveUploadedStatus(self, docID):
94
+
95
+ return self.couchDB.updateDocument(docID, self.couchapp, "archiveStatus")
96
+
97
+ def isAllFWJRArchived(self, workflow):
98
+ keys = [[workflow, "ready"]]
99
+ options = {"reduce": True, "group": True}
100
+ result = self._getCouchView("byWorkflowAndArchiveStatus", options, keys)
101
+ if len(result["rows"]) == 0:
102
+ return True
103
+ else:
104
+ return False
105
+
106
+
107
+ def outputByWorkflowName(self):
108
+
109
+ options = {"group": True, "stale": "ok", "reduce": True}
110
+ # site of data should be relatively small (~1M) for put in the memory
111
+ # If not, find a way to stream
112
+ return self._getCouchView("outputByWorkflowName", options)
113
+
114
+
115
+ def getFWJRWithSkippedFiles(self):
116
+ options = {"reduce": True, "group": True, "include_docs": False}
117
+ return self._getCouchView("skippedFileInfoByTaskAndSite", options)
118
+
File without changes
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Basic interface to HTTPS requests using ssl object managers, for python >= 2.7.9.
4
+ See usage example in:
5
+ src/python/WMCore/WMSpec/Steps/Executors/DQMUpload.py
6
+ """
7
+ from __future__ import print_function, division
8
+
9
+ import logging
10
+ import ssl
11
+ try:
12
+ # python2
13
+ import urllib2
14
+ import httplib
15
+ HTTPSHandler = urllib2.HTTPSHandler
16
+ HTTPSConnection = httplib.HTTPSConnection
17
+ except:
18
+ # python3
19
+ import urllib.request
20
+ import http.client
21
+ HTTPSHandler = urllib.request.HTTPSHandler
22
+ HTTPSConnection = http.client.HTTPSConnection
23
+
24
+
25
+ class HTTPSAuthHandler(HTTPSHandler):
26
+ """
27
+ HTTPS authentication class to provide a ssl context with the certificates.
28
+ """
29
+ def __init__(self, key=None, cert=None, capath='/etc/grid-security/certificates/', level=0):
30
+ self.logger = logging.getLogger(__name__)
31
+ if cert:
32
+ # then create a default ssl context manager to carry the credentials.
33
+ # It also loads the default CA certificates
34
+ self.ctx = ssl.create_default_context()
35
+ self.ctx.load_cert_chain(cert, keyfile=key)
36
+ self.ctx.load_verify_locations(None, capath)
37
+
38
+ self.logger.info("Found %d default trusted CA certificates.", len(self.ctx.get_ca_certs()))
39
+ ### DEBUG start ###
40
+ #for ca in self.ctx.get_ca_certs():
41
+ # if 'CERN' in str(ca['subject']):
42
+ # print(" %s" % str(ca['subject']))
43
+ ### DEBUG end ###
44
+ self.logger.info("SSL context manager created with the following settings:")
45
+ self.logger.info(" check_hostname : %s", self.ctx.check_hostname) # default to True
46
+ self.logger.info(" options : %s", self.ctx.options) # default to 2197947391
47
+ self.logger.info(" protocol : %s", self.ctx.protocol) # default to 2 (PROTOCOL_SSLv23)
48
+ self.logger.info(" verify_flags : %s", self.ctx.verify_flags) # default to 0 (VERIFY_DEFAULT)
49
+ self.logger.info(" verify_mode : %s", self.ctx.verify_mode) # default to 2 (CERT_REQUIRED)
50
+ HTTPSHandler.__init__(self, debuglevel=level, context=self.ctx)
51
+ else:
52
+ self.logger.info("Certificate not provided for HTTPSHandler")
53
+ HTTPSHandler.__init__(self, debuglevel=level)
54
+
55
+ def get_connection(self, host, **kwargs):
56
+ if self.ctx:
57
+ return HTTPSConnection(host, context=self.ctx, **kwargs)
58
+ return HTTPSConnection(host)
59
+
60
+ def https_open(self, req):
61
+ """
62
+ Overwrite the default https_open.
63
+ """
64
+ self.logger.debug("%s method to %s", req.get_method(), req.get_full_url())
65
+ self.logger.debug(" with the following headers: %s", req.headers)
66
+ return self.do_open(self.get_connection, req)
File without changes
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ LogDB provides functionality to post/search messages into LogDB.
4
+ https://github.com/dmwm/WMCore/issues/5705
5
+ """
6
+ # futures
7
+ from builtins import object
8
+ from future.utils import viewitems
9
+
10
+ from future import standard_library
11
+ standard_library.install_aliases()
12
+
13
+ # standard modules
14
+ import logging
15
+ import re
16
+ import threading
17
+ from collections import defaultdict
18
+ from http.client import HTTPException
19
+
20
+ # project modules
21
+ from WMCore.Lexicon import splitCouchServiceURL
22
+ from WMCore.Services.LogDB.LogDBBackend import LogDBBackend
23
+
24
+
25
+ def getLogDBInstanceFromThread():
26
+ """This function only gets to call when LogDB is instantiated before hand
27
+ All the WMComponentWorkers instatntiate LogDB automatically
28
+ """
29
+ myThread = threading.currentThread()
30
+ if not hasattr(myThread, "logdbClient") or not isinstance(myThread.logdbClient, LogDB):
31
+ # logdb is not set do anything
32
+ return None
33
+ return myThread.logdbClient
34
+
35
+
36
+ class LogDB(object):
37
+ """
38
+ _LogDB_
39
+
40
+ LogDB object - interface to LogDB functionality.
41
+ """
42
+
43
+ def __init__(self, url, identifier, logger=None, **kwds):
44
+ self.logger = logger if logger else logging.getLogger()
45
+ self.url = url if url else 'https://cmsweb.cern.ch/couchdb/wmstats_logdb'
46
+ self.identifier = identifier if identifier else 'unknown'
47
+ self.default_user = "HEARTBEAT"
48
+
49
+ try:
50
+ self.thread_name = kwds.pop('thread_name')
51
+ except KeyError:
52
+ self.thread_name = threading.currentThread().getName()
53
+
54
+ self.user_pat = re.compile(r'^/[a-zA-Z][a-zA-Z0-9/\=\s()\']*\=[a-zA-Z0-9/\=\.\-_/#:\s\']*$')
55
+ self.agent = 0 if self.user_pat.match(self.identifier) else 1
56
+ couch_url, db_name = splitCouchServiceURL(self.url)
57
+ self.backend = LogDBBackend(couch_url, db_name, identifier,
58
+ self.thread_name, agent=self.agent, **kwds)
59
+ self.logger.info(self)
60
+
61
+ def __repr__(self):
62
+ "Return representation for class"
63
+ return "<LogDB(url=%s, identifier=%s, agent=%d)>" \
64
+ % (self.url, self.identifier, self.agent)
65
+
66
+ def post(self, request=None, msg="", mtype="comment"):
67
+ """Post new entry into LogDB for given request"""
68
+ res = 'post-error'
69
+ try:
70
+ if request is None:
71
+ request = self.default_user
72
+ if self.user_pat.match(self.identifier):
73
+ res = self.backend.user_update(request, msg, mtype)
74
+ else:
75
+ res = self.backend.agent_update(request, msg, mtype)
76
+ except HTTPException as ex:
77
+ msg = "Failed to post doc to LogDB. Reason: %s, status: %s" % (ex.reason, ex.status)
78
+ self.logger.error(msg)
79
+ except Exception as exc:
80
+ self.logger.error("LogDBBackend post API failed, error=%s", str(exc))
81
+ self.logger.debug("LogDB post request, res=%s", res)
82
+ return res
83
+
84
+ def get(self, request=None, mtype=None):
85
+ """Retrieve all entries from LogDB for given request"""
86
+ res = []
87
+ try:
88
+ if request is None:
89
+ request = self.default_user
90
+ if self.user_pat.match(self.identifier):
91
+ agent = False
92
+ else:
93
+ agent = True
94
+ for row in self.backend.get(request, mtype, agent=agent).get('rows', []):
95
+ request = row['doc']['request']
96
+ identifier = row['doc']['identifier']
97
+ thr = row['doc']['thr']
98
+ mtype = row['doc']['type']
99
+ for rec in row['doc']['messages']:
100
+ rec.update({'request': request, 'identifier': identifier, 'thr': thr, 'type': mtype})
101
+ res.append(rec)
102
+ except HTTPException as ex:
103
+ msg = "Failed to get doc from LogDB. Reason: %s, status: %s" % (ex.reason, ex.status)
104
+ self.logger.error(msg)
105
+ res = 'get-error'
106
+ except Exception as exc:
107
+ self.logger.error("LogDBBackend get API failed, error=%s", str(exc))
108
+ res = 'get-error'
109
+ self.logger.debug("LogDB get request, res=%s", res)
110
+ return res
111
+
112
+ def get_all_requests(self):
113
+ """Retrieve all entries from LogDB for given request"""
114
+ try:
115
+ results = self.backend.get_all_requests()
116
+ res = []
117
+ for row in results['rows']:
118
+ res.append(row["key"])
119
+ except Exception as exc:
120
+ self.logger.error("LogDBBackend get_all_requests API failed, error=%s", str(exc))
121
+ res = 'get-error'
122
+ self.logger.debug("LogDB get_all_requests request, res=%s", res)
123
+ return res
124
+
125
+ def delete(self, request=None, mtype=None, this_thread=False, agent=True):
126
+ """
127
+ Delete entry in LogDB for given request
128
+ if mtype == None - delete all the log for that request
129
+ mtype != None - only delete specified mtype
130
+ """
131
+ res = 'delete-error'
132
+ try:
133
+ if request is None:
134
+ request = self.default_user
135
+ res = self.backend.delete(request, mtype, this_thread, agent)
136
+ except HTTPException as ex:
137
+ msg = "Failed to delete doc in LogDB. Reason: %s, status: %s" % (ex.reason, ex.status)
138
+ self.logger.error(msg)
139
+ except Exception as ex:
140
+ self.logger.error("LogDBBackend delete API failed, error=%s", str(ex))
141
+ self.logger.debug("LogDB delete request, res=%s", res)
142
+ return res
143
+
144
+ def cleanup(self, thr, backend='local'):
145
+ """Clean-up back-end LogDB"""
146
+ docs = []
147
+ try:
148
+ docs = self.backend.cleanup(thr)
149
+ except Exception as exc:
150
+ self.logger.error('LogDBBackend cleanup API failed, backend=%s, error=%s', backend, str(exc))
151
+ return docs
152
+
153
+ def heartbeat_report(self):
154
+ report = defaultdict(dict)
155
+ if self.user_pat.match(self.identifier):
156
+ self.logger.error("User %s: doesn't allow this function", self.identifier)
157
+ return report
158
+
159
+ for row in self.backend.get(self.default_user, None, agent=True).get('rows', []):
160
+ identifier = row['doc']['identifier']
161
+ # wmstats thread can run in multiple boxed.
162
+ if self.identifier == identifier or identifier.startswith(self.identifier):
163
+ # this will handle wmstats DataCacheUpdate thread with multiple machine
164
+ postfix = identifier.replace(self.identifier, "")
165
+ thr = "%s%s" % (row['doc']['thr'], postfix)
166
+ mtype = row['doc']['type']
167
+ ts = row['doc']['messages'][-1]['ts']
168
+ msg = row['doc']['messages'][-1]['msg']
169
+ if (thr in report) and ('ts' in report[thr]) and ts <= report[thr]['ts']:
170
+ continue
171
+ else:
172
+ report[thr]['type'] = mtype
173
+ report[thr]['msg'] = msg
174
+ report[thr]['ts'] = ts
175
+ return report
176
+
177
+ def _append_down_component_detail(self, report, thr, msg, ts=0, state="error"):
178
+ report['down_components'].append(thr)
179
+ detail = {'name': thr, 'worker_name': thr, 'state': state,
180
+ 'last_error': ts, 'error_message': msg,
181
+ 'pid': 'N/A'}
182
+ report['down_component_detail'].append(detail)
183
+ return
184
+
185
+ def wmstats_down_components_report(self, thread_list):
186
+ report = {}
187
+ report['down_components'] = []
188
+ report['down_component_detail'] = []
189
+
190
+ hbinfo = self.heartbeat_report()
191
+ for thr in thread_list:
192
+ # skip DataCacheUpdate thread. It will have multiple with post fix.
193
+ # i.e. DataCacheUpdate-vocms111
194
+ # TODO, need a better way to check
195
+ if thr != "DataCacheUpdate" and thr not in hbinfo:
196
+ self._append_down_component_detail(report, thr, "Thread not running")
197
+
198
+ for thr, info in viewitems(hbinfo):
199
+ if info['type'] == 'agent-error':
200
+ self._append_down_component_detail(report, thr, info['msg'], info['ts'])
201
+ return report