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
@@ -0,0 +1,381 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _DBSWriterObjects_
4
+
5
+ Functions to instantiate and return DBS Objects and insert them
6
+ into DBS if required
7
+
8
+ """
9
+ from __future__ import print_function
10
+
11
+ from builtins import int
12
+
13
+ import logging
14
+
15
+ from DBSAPI.dbsException import *
16
+ from DBSAPI.dbsApiException import *
17
+ from DBSAPI.dbsPrimaryDataset import DbsPrimaryDataset
18
+ from DBSAPI.dbsAlgorithm import DbsAlgorithm
19
+ from DBSAPI.dbsQueryableParameterSet import DbsQueryableParameterSet
20
+ from DBSAPI.dbsProcessedDataset import DbsProcessedDataset
21
+ from DBSAPI.dbsFile import DbsFile
22
+ from DBSAPI.dbsFileBlock import DbsFileBlock
23
+ from DBSAPI.dbsStorageElement import DbsStorageElement
24
+ from DBSAPI.dbsRun import DbsRun
25
+ from DBSAPI.dbsLumiSection import DbsLumiSection
26
+
27
+ def makeTierList(dataTier):
28
+ """
29
+ _makeTierList_
30
+
31
+ Standard tool to split data tiers if they contain - chars
32
+ *** Do not use outside of this module ***
33
+
34
+ """
35
+ tierList = dataTier.split("-")
36
+ return tierList
37
+
38
+ def createPrimaryDataset(datasetInfo, apiRef = None):
39
+ """
40
+ _createPrimaryDataset_
41
+
42
+ Create and return a Primary Dataset object.
43
+ If apiRef is not None, it is used to insert the dataset into the
44
+ DBS
45
+
46
+ """
47
+ if 'PrimaryDatasetType' in datasetInfo:
48
+ PrimaryDatasetType = datasetInfo['PrimaryDatasetType']
49
+ else:
50
+ PrimaryDatasetType = 'mc'
51
+
52
+ logging.debug("Inserting PrimaryDataset %s with Type %s", datasetInfo["PrimaryDataset"], PrimaryDatasetType)
53
+ primary = DbsPrimaryDataset(Name = datasetInfo["PrimaryDataset"], Type=PrimaryDatasetType)
54
+
55
+ if apiRef != None:
56
+ apiRef.insertPrimaryDataset(primary)
57
+ return primary
58
+
59
+
60
+ def createAlgorithm(datasetInfo, configMetadata = None, apiRef = None):
61
+ """
62
+ _createAlgorithm_
63
+
64
+ Create an algorithm assuming that datasetInfo is a
65
+ ProdCommon.MCPayloads.DatasetInfo like dictionary
66
+
67
+ """
68
+
69
+ exeName = datasetInfo['ApplicationName']
70
+ appVersion = datasetInfo['ApplicationVersion']
71
+ appFamily = datasetInfo["ApplicationFamily"]
72
+
73
+ #
74
+ # HACK: Problem with large PSets (is this still relevant ?)
75
+ #
76
+ # Repacker jobs have no PSetContent/PSetHash
77
+ #
78
+ psetContent = datasetInfo.get('PSetContent',None)
79
+ if psetContent == None:
80
+ psetContent = "PSET_CONTENT_NOT_AVAILABLE"
81
+ psetHash = datasetInfo.get('PSetHash',None)
82
+ if psetHash == None:
83
+ psetHash = "NO_PSET_HASH"
84
+ else:
85
+ if psetHash.find(";"):
86
+ # no need for fake hash in new schema
87
+ psetHash = psetHash.split(";")[0]
88
+ psetHash = psetHash.replace("hash=", "")
89
+
90
+ ## No more hacks
91
+ #msg = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"
92
+ #msg += "TEST HACK USED FOR PSetContent\n"
93
+ #msg += ">>>>>>>>>>>>>>>>>>>>>>>>>>>>"
94
+ #logging.warning(msg)
95
+ #print msg
96
+ #psetContent = "This is not a PSet"
97
+
98
+ #
99
+ # HACK: 100 char limit on cfg file name
100
+ if configMetadata != None:
101
+ cfgName = configMetadata['name']
102
+ if len(cfgName) > 100:
103
+ msg = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"
104
+ msg += "TEST HACK USED FOR Config File Name"
105
+ msg += ">>>>>>>>>>>>>>>>>>>>>>>>>>>>"
106
+ logging.warning(msg)
107
+ print(msg)
108
+ configMetadata['name'] = cfgName[-99]
109
+
110
+ psetInstance = DbsQueryableParameterSet(
111
+ Hash = psetHash,
112
+ Name = configMetadata['name'],
113
+ Version = configMetadata['version'],
114
+ Type = configMetadata['Type'],
115
+ Annotation = configMetadata['annotation'],
116
+ Content = psetContent,
117
+ )
118
+
119
+
120
+ algorithmInstance = DbsAlgorithm(
121
+ ExecutableName = exeName,
122
+ ApplicationVersion = appVersion,
123
+ ApplicationFamily = appFamily,
124
+ ParameterSetID = psetInstance
125
+ )
126
+ else:
127
+ psetInstance = DbsQueryableParameterSet(
128
+ Hash = psetHash)
129
+ algorithmInstance = DbsAlgorithm(
130
+ ExecutableName = exeName,
131
+ ApplicationVersion = appVersion,
132
+ ApplicationFamily = appFamily,
133
+ ParameterSetID = psetInstance
134
+ )
135
+
136
+ if apiRef != None:
137
+ apiRef.insertAlgorithm(algorithmInstance)
138
+ return algorithmInstance
139
+
140
+ def createAlgorithmForInsert(datasetInfo):
141
+ """
142
+ _createPartialAlgorithm_
143
+
144
+ Create an Algorithm instance that uses the minimal info needed
145
+ to insert a file
146
+
147
+ """
148
+ exeName = datasetInfo['ApplicationName']
149
+ appVersion = datasetInfo['ApplicationVersion']
150
+ appFamily = datasetInfo["ApplicationFamily"]
151
+
152
+ #
153
+ # Repacker jobs have no PsetContent/PSetHash
154
+ #
155
+ psetContent = datasetInfo.get('PSetContent',None)
156
+ if psetContent == None:
157
+ psetContent = "PSET_CONTENT_NOT_AVAILABLE"
158
+ psetHash = datasetInfo.get('PSetHash',None)
159
+ if psetHash == None:
160
+ psetHash = "NO_PSET_HASH"
161
+ else:
162
+ if psetHash.find(";"):
163
+ # no need for fake hash in new schema
164
+ psetHash = psetHash.split(";")[0]
165
+ psetHash = psetHash.replace("hash=", "")
166
+
167
+ psetInstance = DbsQueryableParameterSet(
168
+ Hash = psetHash)
169
+ algorithmInstance = DbsAlgorithm(
170
+ ExecutableName = exeName,
171
+ ApplicationVersion = appVersion,
172
+ ApplicationFamily = appFamily,
173
+ ParameterSetID = psetInstance
174
+ )
175
+ return algorithmInstance
176
+
177
+ def createMergeAlgorithm(datasetInfo, apiRef = None):
178
+ """
179
+ _createMergeAlgorithm_
180
+
181
+ Create a DbsAlgorithm for a merge dataset
182
+
183
+ """
184
+ exeName = datasetInfo['ApplicationName']
185
+ version = datasetInfo['ApplicationVersion']
186
+ family = datasetInfo.get('ApplicationFamily', None)
187
+ if (family == None) or not (family) :
188
+ family = datasetInfo['OutputModuleName']
189
+
190
+
191
+ mergeAlgo = DbsAlgorithm (
192
+ ExecutableName = exeName,
193
+ ApplicationVersion = version,
194
+ ApplicationFamily = family,
195
+ )
196
+
197
+ if apiRef != None:
198
+ apiRef.insertAlgorithm(mergeAlgo)
199
+ return mergeAlgo
200
+
201
+
202
+
203
+
204
+ def createProcessedDataset(primaryDataset, algorithm, datasetInfo,
205
+ apiRef = None):
206
+ """
207
+ _createProcessedDataset_
208
+
209
+
210
+ """
211
+
212
+ physicsGroup = datasetInfo.get("PhysicsGroup", "NoGroup")
213
+ status = datasetInfo.get("Status", "VALID")
214
+ dataTier = datasetInfo['DataTier']
215
+ globalTag = datasetInfo.get('Conditions', None)
216
+ if globalTag is None: globalTag = ''
217
+
218
+ parents = []
219
+ inputDataset = datasetInfo.get('ParentDataset', None)
220
+ if inputDataset != None:
221
+ parents.append(inputDataset)
222
+
223
+ tierList = makeTierList(datasetInfo['DataTier'])
224
+
225
+ name = datasetInfo['ProcessedDataset']
226
+ algolist=[]
227
+ if algorithm not in ('', None):
228
+ algolist=list(algorithm)
229
+
230
+ processedDataset = DbsProcessedDataset (
231
+ PrimaryDataset = primaryDataset,
232
+ AlgoList=algolist,
233
+ Name = name,
234
+ TierList = tierList,
235
+ ParentList = parents,
236
+ PhysicsGroup = physicsGroup,
237
+ Status = status,
238
+ GlobalTag = globalTag,
239
+ )
240
+
241
+ if apiRef != None:
242
+ apiRef.insertProcessedDataset(processedDataset)
243
+ #
244
+ logging.debug("PrimaryDataset: %s ProcessedDataset: %s DataTierList: %s requested by PhysicsGroup: %s ", primaryDataset['Name'], name, tierList, physicsGroup)
245
+ return processedDataset
246
+
247
+
248
+
249
+
250
+ def createDBSFiles(fjrFileInfo, jobType = None, apiRef = None):
251
+ """
252
+ _createDBSFiles_
253
+
254
+ Create a list of DBS File instances from the file details contained
255
+ in a FwkJobRep.FileInfo instance describing an output file
256
+ Does not insert files, returns as list of DbsFile objects
257
+ Does insert runs and lumisections if DBS API reference is passed
258
+
259
+ """
260
+ results = []
261
+ inputLFNs = [ x['LFN'] for x in fjrFileInfo.inputFiles]
262
+ checksum = fjrFileInfo.checksums['cksum']
263
+ adler32sum = fjrFileInfo.checksums.get('adler32', '')
264
+
265
+ nEvents = int(fjrFileInfo['TotalEvents'])
266
+
267
+ if len(fjrFileInfo.dataset)<=0:
268
+ logging.error("No dataset info found in FWJobReport!")
269
+ return results
270
+
271
+ # //
272
+ # // Set FileType
273
+ #//
274
+ if 'FileType' in fjrFileInfo:
275
+ fileType = fjrFileInfo['FileType']
276
+ else:
277
+ fileType = 'EDM'
278
+
279
+ #
280
+ # FIXME: at this point I should use the mc or data event type from
281
+ # the jobreport. Until this is supported by the framework,
282
+ # we use the workaround that mc job reports have an empty
283
+ # lumisections list (stripped in DBSInterface)
284
+ #
285
+ lumiList = []
286
+ if ( len(fjrFileInfo.getLumiSections()) > 0 ):
287
+
288
+ #
289
+ # insert runs (for data files from detector)
290
+ #
291
+ if ( apiRef != None ):
292
+
293
+ for runinfo in fjrFileInfo.runs:
294
+
295
+ run = DbsRun(
296
+ RunNumber = int(runinfo),
297
+ NumberOfEvents = 0,
298
+ NumberOfLumiSections = 0,
299
+ TotalLuminosity = 0,
300
+ StoreNumber = 0,
301
+ StartOfRun = 0,
302
+ EndOfRun = 0,
303
+ )
304
+
305
+ apiRef.insertRun(run)
306
+
307
+ #
308
+ # insert lumisections (for data files from detector)
309
+ # associate files with lumisections (for all data files)
310
+ #
311
+ for lumiinfo in fjrFileInfo.getLumiSections():
312
+
313
+ lumi = DbsLumiSection(
314
+ LumiSectionNumber = int(lumiinfo['LumiSectionNumber']),
315
+ StartEventNumber = 0,
316
+ EndEventNumber = 0,
317
+ LumiStartTime = 0,
318
+ LumiEndTime = 0,
319
+ RunNumber = int(lumiinfo['RunNumber']),
320
+ )
321
+
322
+ # Isnt needed, causes monster slowdown
323
+ #if ( apiRef != None ):
324
+ # apiRef.insertLumiSection(lumi)
325
+
326
+ lumiList.append(lumi)
327
+
328
+ logging.debug("Lumi associated to file is: %s" % ([x for x in lumiList]))
329
+
330
+ # //
331
+ # // Dataset info related to files and creation of DbsFile object
332
+ #//
333
+ for dataset in fjrFileInfo.dataset:
334
+
335
+ primary = createPrimaryDataset(dataset)
336
+ if jobType == "Merge":
337
+ algo = createMergeAlgorithm(dataset)
338
+ else:
339
+ algo = createAlgorithmForInsert(dataset)
340
+
341
+ processed = createProcessedDataset(primary, algo, dataset)
342
+
343
+ dbsFileInstance = DbsFile(
344
+ Checksum = checksum,
345
+ Adler32 = adler32sum,
346
+ NumberOfEvents = nEvents,
347
+ LogicalFileName = fjrFileInfo['LFN'],
348
+ FileSize = int(fjrFileInfo['Size']),
349
+ Status = "VALID",
350
+ ValidationStatus = 'VALID',
351
+ FileType = fileType,
352
+ Dataset = processed,
353
+ TierList = makeTierList(dataset['DataTier']),
354
+ AlgoList = [algo],
355
+ LumiList = lumiList,
356
+ ParentList = inputLFNs,
357
+ BranchList = fjrFileInfo.branches,
358
+ )
359
+
360
+ results.append(dbsFileInstance)
361
+ return results
362
+
363
+
364
+ def createDBSStorageElement(pnn):
365
+ """
366
+ _createDBSStorageElement_
367
+
368
+ """
369
+ return DbsStorageElement(Name = pnn)
370
+
371
+
372
+ def createDBSFileBlock(blockName):
373
+ """
374
+ _createDBSFileBlock_
375
+
376
+ return a DbsFileBlock object with the block name provided
377
+
378
+ NOTE: This method DOES NOT create a new block in DBS
379
+
380
+ """
381
+ return DbsFileBlock(Name=blockName)
@@ -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