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,111 @@
1
+ """
2
+
3
+ AlertManagerAPI - send alerts to MONIT AlertManager via API calls
4
+ """
5
+
6
+ from __future__ import division
7
+ from builtins import object
8
+ from datetime import timedelta, datetime
9
+ import socket
10
+ import json
11
+ import logging
12
+
13
+ from WMCore.Services.pycurl_manager import RequestHandler
14
+ from Utils.Timers import LocalTimezone
15
+ from Utils.Utilities import normalize_spaces
16
+ from WMCore.Services.UUIDLib import makeUUID
17
+
18
+
19
+ class AlertManagerAPI(object):
20
+ """
21
+ A class used to send alerts via the MONIT AlertManager API
22
+ """
23
+
24
+ def __init__(self, alertManagerUrl, logger=None):
25
+ self.alertManagerUrl = alertManagerUrl
26
+ # sender's hostname is added as an annotation
27
+ self.hostname = socket.gethostname()
28
+ self.mgr = RequestHandler()
29
+ self.ltz = LocalTimezone()
30
+ self.headers = {"Content-Type": "application/json"}
31
+ self.validSeverity = ["high", "medium", "low"]
32
+ self.logger = logger if logger else logging.getLogger()
33
+
34
+ def sendAlert(self, alertName, severity, summary, description, service, tag="wmcore", endSecs=600, generatorURL=""):
35
+ """
36
+ :param alertName: a unique name for the alert
37
+ :param severity: low, medium, high
38
+ :param summary: a short description of the alert
39
+ :param description: a longer informational message with details about the alert
40
+ :param service: the name of the service firing an alert
41
+ :param tag: a unique tag used to help route the alert
42
+ :param endSecs: how many minutes until the alarm is silenced
43
+ :param generatorURL: this URL will be sent to AlertManager and configured as a clickable "Source" link in the web interface
44
+
45
+ AlertManager JSON format reference: https://www.prometheus.io/docs/alerting/latest/clients/
46
+ [
47
+ {
48
+ "labels": {
49
+ "alertname": "<requiredAlertName>",
50
+ "<labelname>": "<labelvalue>",
51
+ ...
52
+ },
53
+ "annotations": {
54
+ "<labelname>": "<labelvalue>",
55
+ ...
56
+ },
57
+ "startsAt": "<rfc3339>", # optional, will be current time if not present
58
+ "endsAt": "<rfc3339>",
59
+ "generatorURL": "<generator_url>" # optional
60
+ },
61
+ ]
62
+ """
63
+
64
+ if not self._isValidSeverity(severity):
65
+ return False
66
+
67
+ request = []
68
+ alert = {}
69
+ labels = {}
70
+ annotations = {}
71
+
72
+ # add labels
73
+ labels["alertname"] = alertName
74
+ labels["severity"] = severity
75
+ labels["tag"] = tag
76
+ labels["service"] = service
77
+ labels["uuid"] = makeUUID()
78
+ alert["labels"] = labels
79
+
80
+ # add annotations
81
+ annotations["hostname"] = self.hostname
82
+ annotations["summary"] = normalize_spaces(summary)
83
+ annotations["description"] = normalize_spaces(description)
84
+ alert["annotations"] = normalize_spaces(annotations)
85
+
86
+ # In python3 we won't need the LocalTimezone class
87
+ # Will change to d = datetime.now().astimezone() + timedelta(seconds=endSecs)
88
+ d = datetime.now(self.ltz) + timedelta(seconds=endSecs)
89
+ alert["endsAt"] = d.isoformat("T")
90
+ alert["generatorURL"] = generatorURL
91
+
92
+ request.append(alert)
93
+ # need to do this because pycurl_manager only accepts dict and encoded strings type
94
+ params = json.dumps(request)
95
+
96
+ # provide dump of alert send to AM which will allow to match it in WM logs
97
+ header, res = self.mgr.request(self.alertManagerUrl, params=params, headers=self.headers, verb='POST')
98
+ self.logger.info("ALERT: name=%s UUID=%s, HTTP status code=%s", alertName, labels["uuid"], header.status)
99
+
100
+ return res
101
+
102
+ def _isValidSeverity(self, severity):
103
+ """
104
+ Used to check if the severity of the alert matches the valid levels: low, medium, high
105
+ :param severity: severity of the alert
106
+ :return: True or False
107
+ """
108
+ if severity not in self.validSeverity:
109
+ logging.critical("Alert submitted to AlertManagerAPI with invalid severity: %s", severity)
110
+ return False
111
+ return True
File without changes
@@ -0,0 +1,238 @@
1
+ from __future__ import (division, print_function)
2
+
3
+ from builtins import zip, str, bytes
4
+
5
+ from future import standard_library
6
+ standard_library.install_aliases()
7
+
8
+ import json
9
+ import logging
10
+ import re
11
+ from urllib.parse import urlencode
12
+
13
+ from WMCore.Services.Service import Service
14
+
15
+
16
+ def unflattenJSON(data):
17
+ """Tranform input to unflatten JSON format"""
18
+ columns = data['desc']['columns']
19
+ return [row2dict(columns, row) for row in data['result']]
20
+
21
+
22
+ def row2dict(columns, row):
23
+ """Convert rows to dictionaries with column keys from description"""
24
+ robj = {}
25
+ for k, v in zip(columns, row):
26
+ robj.setdefault(k, v)
27
+ return robj
28
+
29
+
30
+ class CRIC(Service):
31
+ """
32
+ Class which provides client APIs to the CRIC service.
33
+ """
34
+
35
+ def __init__(self, url=None, logger=None, configDict=None):
36
+ """
37
+ configDict is a dictionary with parameters that are passed
38
+ to the super class
39
+ """
40
+ url = url or "https://cms-cric.cern.ch/"
41
+ configDict = configDict or {}
42
+ configDict.setdefault('endpoint', url)
43
+ configDict.setdefault('cacheduration', 1) # in hours
44
+ configDict.setdefault('accept_type', 'application/json')
45
+ configDict.setdefault('content_type', 'application/json')
46
+ configDict['logger'] = logger if logger else logging.getLogger()
47
+ super(CRIC, self).__init__(configDict)
48
+ self['logger'].debug("Initializing CRIC with url: %s", self['endpoint'])
49
+
50
+ def _getResult(self, uri, callname="", args=None, unflatJson=True):
51
+ """
52
+ Either fetch data from the cache file or query the data-service
53
+ :param metricNumber: a number corresponding to the SSB metric
54
+ :return: a dictionary
55
+ """
56
+ cachedApi = "%s.json" % callname
57
+ apiUrl = '%s?json&preset=%s' % (uri, callname)
58
+
59
+ self['logger'].debug('Fetching data from %s, with args %s', apiUrl, args)
60
+ # need to make our own encoding, otherwise Requests class screws it up
61
+ if args:
62
+ apiUrl = "%s&%s" % (apiUrl, urlencode(args, doseq=True))
63
+
64
+ data = self.refreshCache(cachedApi, apiUrl)
65
+ results = data.read()
66
+ data.close()
67
+
68
+ results = json.loads(results)
69
+ if unflatJson:
70
+ results = unflattenJSON(results)
71
+ return results
72
+
73
+ def _CRICUserQuery(self, callname, unflatJson=True):
74
+ """
75
+ :param callname: name of the call
76
+ :return: dict of the result
77
+ """
78
+
79
+ uri = "/api/accounts/user/query/"
80
+ userinfo = self._getResult(uri, callname=callname, unflatJson=unflatJson)
81
+ return userinfo
82
+
83
+ def _CRICSiteQuery(self, callname):
84
+ """
85
+ :param callname: name of the call
86
+ :return: dict of the result
87
+ """
88
+
89
+ uri = "/api/cms/site/query/"
90
+ extraArgs = {"rcsite_state": "ANY"}
91
+ sitenames = self._getResult(uri, callname=callname, args=extraArgs)
92
+ return sitenames
93
+
94
+ def whoAmI(self):
95
+ """
96
+ _whoAmI_
97
+
98
+ Given the authentication mechanism used for this request (x509 so far),
99
+ return information about myself, like DN/ roles/groups, etc
100
+ :return: a list of dictionary
101
+ """
102
+ return self._CRICUserQuery('whoami', unflatJson=False)['result']
103
+
104
+ def userNameDn(self, username):
105
+ """
106
+ _userNameDn_
107
+
108
+ Convert CERN Nice username to DN.
109
+ :param username: string with the username
110
+ :return: a string wit the user's DN
111
+ """
112
+ ### TODO: use a different cache file and try again if the user is still not there
113
+ userdn = ""
114
+ userinfo = self._CRICUserQuery('people')
115
+ for x in userinfo:
116
+ if x['username'] == username:
117
+ userdn = x['dn']
118
+ break
119
+ return userdn
120
+
121
+ def getAllPSNs(self):
122
+ """
123
+ _getAllPSNs_
124
+
125
+ Retrieve all PSNs (aka CMSNames) from CRIC
126
+ :return: a flat list of CMS site names
127
+ """
128
+
129
+ sitenames = self._CRICSiteQuery(callname='site-names')
130
+ cmsnames = [x['alias'] for x in sitenames if x['type'] == 'psn']
131
+ return cmsnames
132
+
133
+ def getAllPhEDExNodeNames(self, pattern=None, excludeBuffer=False):
134
+ """
135
+ _getAllPhEDExNodeNames_
136
+ Retrieve all PNNs from CRIC and filter them out if a pattern has been
137
+ provided.
138
+ :param pattern: a regex to be applied to filter the output
139
+ :param excludeBuffer: flag to exclude T1 Buffer endpoints
140
+ :return: a flat list of PNNs
141
+ """
142
+ sitenames = self._CRICSiteQuery(callname='site-names')
143
+
144
+ nodeNames = [x['alias'] for x in sitenames if x['type'] == 'phedex']
145
+ if excludeBuffer:
146
+ nodeNames = [x for x in nodeNames if not x.endswith("_Buffer")]
147
+ if pattern and isinstance(pattern, (str, bytes)):
148
+ pattern = re.compile(pattern)
149
+ nodeNames = [x for x in nodeNames if pattern.match(x)]
150
+ return nodeNames
151
+
152
+ def PNNstoPSNs(self, pnns):
153
+ """
154
+ Given a list of PNNs, return all their PSNs
155
+
156
+ :param pnns: a string or a list of PNNs
157
+ :return: a list with unique PSNs matching those PNNs
158
+ """
159
+ mapping = self._CRICSiteQuery(callname='data-processing')
160
+
161
+ if isinstance(pnns, (str, bytes)):
162
+ pnns = [pnns]
163
+
164
+ psns = set()
165
+ for pnn in pnns:
166
+ psnSet = set()
167
+ for item in mapping:
168
+ if pnn == item['phedex_name']:
169
+ psnSet.add(item['psn_name'])
170
+ if psnSet:
171
+ psns.update(psnSet)
172
+ else:
173
+ self["logger"].debug("No PSNs for PNN: %s" % pnn)
174
+ return list(psns)
175
+
176
+ def PSNstoPNNs(self, psns, allowPNNLess=False):
177
+ """
178
+ Given a list of PSNs, return all their PNNs
179
+
180
+ :param psns: a string or a list of PSNs
181
+ :param allowPNNLess: flag to return the PSN as a PNN if no match
182
+ :return: a list with unique PNNs matching those PSNs
183
+ """
184
+ mapping = self._CRICSiteQuery(callname='data-processing')
185
+
186
+ if isinstance(psns, (str, bytes)):
187
+ psns = [psns]
188
+
189
+ pnns = set()
190
+ for psn in psns:
191
+ pnnSet = set()
192
+ for item in mapping:
193
+ if item['psn_name'] == psn:
194
+ pnnSet.add(item['phedex_name'])
195
+ if pnnSet:
196
+ pnns.update(pnnSet)
197
+ elif allowPNNLess:
198
+ pnns.add(psn)
199
+ self["logger"].debug("PSN %s has no PNNs. PNNLess flag enabled though.", psn)
200
+ else:
201
+ self["logger"].debug("No PNNs for PSN: %s" % psn)
202
+ return list(pnns)
203
+
204
+ def PSNtoPNNMap(self, psnPattern=''):
205
+ """
206
+ Given a PSN regex pattern, return a map of PSN to PNNs
207
+ :param psnPattern: a pattern string
208
+ :return: a dictionary key'ed by PSN names, with sets of PNNs as values
209
+ """
210
+ if not isinstance(psnPattern, (str, bytes)):
211
+ raise TypeError('psnPattern argument must be of type str or bytes')
212
+
213
+ results = self._CRICSiteQuery(callname='data-processing')
214
+ mapping = {}
215
+
216
+ psnPattern = re.compile(psnPattern)
217
+ for entry in results:
218
+ if psnPattern.match(entry['psn_name']):
219
+ mapping.setdefault(entry['psn_name'], set()).add(entry['phedex_name'])
220
+ return mapping
221
+
222
+ def PNNtoPSNMap(self, pnnPattern=''):
223
+ """
224
+ Given a PNN regex pattern, return a map of PNN to PSNs
225
+ :param pnnPattern: a pattern string
226
+ :return: a dictionary key'ed by PNN names, with sets of PSNs as values
227
+ """
228
+ if not isinstance(pnnPattern, (str, bytes)):
229
+ raise TypeError('pnnPattern argument must be of type str or bytes')
230
+
231
+ results = self._CRICSiteQuery(callname='data-processing')
232
+ mapping = {}
233
+
234
+ pnnPattern = re.compile(pnnPattern)
235
+ for entry in results:
236
+ if pnnPattern.match(entry['phedex_name']):
237
+ mapping.setdefault(entry['phedex_name'], set()).add(entry['psn_name'])
238
+ return mapping
File without changes