wmglobalqueue 2.3.10rc10__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 +269 -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 +741 -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.10rc10.data/data/bin/wmc-dist-patch +15 -0
  254. wmglobalqueue-2.3.10rc10.data/data/bin/wmc-dist-unpatch +8 -0
  255. wmglobalqueue-2.3.10rc10.data/data/bin/wmc-httpd +3 -0
  256. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/.couchapprc +1 -0
  257. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/README.md +40 -0
  258. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/_attachments/index.html +264 -0
  259. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/_attachments/js/ElementInfoByWorkflow.js +96 -0
  260. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/_attachments/js/StuckElementInfo.js +57 -0
  261. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/_attachments/js/WorkloadInfoTable.js +80 -0
  262. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/_attachments/js/dataTable.js +70 -0
  263. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/_attachments/js/namespace.js +23 -0
  264. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/_attachments/style/main.css +75 -0
  265. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/couchapp.json +4 -0
  266. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/filters/childQueueFilter.js +13 -0
  267. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/filters/filterDeletedDocs.js +3 -0
  268. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/filters/queueFilter.js +11 -0
  269. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/language +1 -0
  270. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/lib/mustache.js +333 -0
  271. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/lib/validate.js +27 -0
  272. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/lib/workqueue_utils.js +61 -0
  273. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/lists/elementsDetail.js +28 -0
  274. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/lists/filter.js +86 -0
  275. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/lists/stuckElements.js +38 -0
  276. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/lists/workRestrictions.js +153 -0
  277. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/lists/workflowSummary.js +28 -0
  278. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/rewrites.json +73 -0
  279. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/shows/redirect.js +23 -0
  280. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/shows/status.js +40 -0
  281. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/templates/ElementSummaryByWorkflow.html +27 -0
  282. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/templates/StuckElementSummary.html +26 -0
  283. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/templates/TaskStatus.html +23 -0
  284. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/templates/WorkflowSummary.html +27 -0
  285. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/templates/partials/workqueue-common-lib.html +2 -0
  286. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib-remote.html +16 -0
  287. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib.html +18 -0
  288. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/updates/in-place.js +50 -0
  289. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/validate_doc_update.js +8 -0
  290. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.couch.app.js +235 -0
  291. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.pathbinder.js +173 -0
  292. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/activeData/map.js +8 -0
  293. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/activeData/reduce.js +2 -0
  294. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/activeParentData/map.js +8 -0
  295. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/activeParentData/reduce.js +2 -0
  296. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/activePileupData/map.js +8 -0
  297. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/activePileupData/reduce.js +2 -0
  298. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/analyticsData/map.js +11 -0
  299. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/analyticsData/reduce.js +1 -0
  300. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/availableByPriority/map.js +6 -0
  301. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/conflicts/map.js +5 -0
  302. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/elements/map.js +5 -0
  303. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/elementsByData/map.js +8 -0
  304. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/elementsByParent/map.js +8 -0
  305. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/elementsByParentData/map.js +8 -0
  306. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/elementsByPileupData/map.js +8 -0
  307. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/elementsByStatus/map.js +8 -0
  308. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/elementsBySubscription/map.js +6 -0
  309. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/map.js +8 -0
  310. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/reduce.js +3 -0
  311. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/elementsDetailByWorkflowAndStatus/map.js +26 -0
  312. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/map.js +10 -0
  313. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/reduce.js +1 -0
  314. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/map.js +6 -0
  315. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/reduce.js +1 -0
  316. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/map.js +6 -0
  317. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/reduce.js +1 -0
  318. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/map.js +6 -0
  319. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/reduce.js +1 -0
  320. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobsByRequest/map.js +6 -0
  321. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobsByRequest/reduce.js +1 -0
  322. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobsByStatus/map.js +6 -0
  323. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobsByStatus/reduce.js +1 -0
  324. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/map.js +6 -0
  325. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/reduce.js +1 -0
  326. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/openRequests/map.js +6 -0
  327. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/recent-items/map.js +5 -0
  328. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/map.js +6 -0
  329. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/reduce.js +1 -0
  330. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/specsByWorkflow/map.js +5 -0
  331. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/stuckElements/map.js +38 -0
  332. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/map.js +12 -0
  333. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/reduce.js +3 -0
  334. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/wmbsUrl/map.js +6 -0
  335. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/wmbsUrl/reduce.js +2 -0
  336. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/map.js +6 -0
  337. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/reduce.js +2 -0
  338. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/workflowSummary/map.js +9 -0
  339. wmglobalqueue-2.3.10rc10.data/data/data/couchapps/WorkQueue/views/workflowSummary/reduce.js +10 -0
  340. wmglobalqueue-2.3.10rc10.dist-info/METADATA +26 -0
  341. wmglobalqueue-2.3.10rc10.dist-info/RECORD +345 -0
  342. wmglobalqueue-2.3.10rc10.dist-info/WHEEL +5 -0
  343. wmglobalqueue-2.3.10rc10.dist-info/licenses/LICENSE +202 -0
  344. wmglobalqueue-2.3.10rc10.dist-info/licenses/NOTICE +16 -0
  345. wmglobalqueue-2.3.10rc10.dist-info/top_level.txt +2 -0
@@ -0,0 +1,210 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _Executor_
4
+
5
+ Interface definition for a step executor
6
+
7
+
8
+ """
9
+ from __future__ import absolute_import
10
+ from builtins import object
11
+
12
+ import json
13
+ import logging
14
+ import os
15
+ import subprocess
16
+ import sys
17
+
18
+ from Utils.FileTools import getFullPath
19
+ from Utils.PythonVersion import PY3
20
+ from Utils.Utilities import zipEncodeStr, decodeBytesToUnicodeConditional
21
+ from WMCore.FwkJobReport.Report import Report
22
+ from WMCore.WMSpec.Steps.StepFactory import getStepEmulator
23
+ from WMCore.WMSpec.WMStep import WMStepHelper
24
+
25
+ getStepName = lambda step: WMStepHelper(step).name()
26
+ getStepErrorDestination = lambda step: WMStepHelper(step).getErrorDestinationStep()
27
+
28
+
29
+ def getStepSpace(stepName):
30
+ """
31
+ _getStepSpace_
32
+
33
+ Util to get the runtime step space.
34
+ This imports dynamic runtime libraries so be careful how
35
+ you use it
36
+
37
+ """
38
+ modName = "WMTaskSpace"
39
+ if modName in sys.modules:
40
+ taskspace = sys.modules[modName]
41
+ else:
42
+ try:
43
+ # taskspace = __import__(modName, globals(), locals(), ['taskSpace'], -1)
44
+ taskspace = __import__(modName, globals(), locals(), ['taskSpace'])
45
+
46
+ except ImportError as ex:
47
+ msg = "Unable to load WMTaskSpace module:\n"
48
+ msg += str(ex)
49
+ # TODO: Generic ExecutionException...
50
+ raise RuntimeError(msg)
51
+
52
+ try:
53
+ stepSpace = taskspace.taskSpace.stepSpace(stepName)
54
+ except Exception as ex:
55
+ msg = "Error retrieving stepSpace from TaskSpace:\n"
56
+ msg += str(ex)
57
+ raise RuntimeError(msg)
58
+ return stepSpace
59
+
60
+
61
+ class Executor(object):
62
+ """
63
+ _Executor_
64
+
65
+ Define API for a step during execution
66
+
67
+ """
68
+
69
+ def __init__(self):
70
+ self.report = None
71
+ self.diagnostic = None
72
+ self.emulator = None
73
+ self.emulationMode = False
74
+ self.step = None
75
+ self.stepName = None
76
+ self.stepSpace = None
77
+ self.task = None
78
+ self.workload = None
79
+ self.job = None
80
+ self.errorDestination = None
81
+ self.logger = logging.getLogger()
82
+ self.logger.info("Steps.Executor logging started")
83
+
84
+ def initialise(self, step, job):
85
+ """
86
+ _initialise_
87
+
88
+
89
+ Initialise the executor attributes
90
+
91
+ """
92
+ self.step = step
93
+ self.job = job
94
+ self.stepName = getStepName(self.step)
95
+ self.stepSpace = getStepSpace(self.stepName)
96
+ self.task = self.stepSpace.getWMTask()
97
+ self.workload = self.stepSpace.taskSpace.workload
98
+ self.report = Report(self.stepName)
99
+ self.report.data.task = self.task.name()
100
+ self.report.data.workload = self.stepSpace.taskSpace.workloadName()
101
+ self.report.data.id = job['id']
102
+ self.errorDestination = getStepErrorDestination(self.step)
103
+
104
+ self.step.section_("execution")
105
+ self.step.execution.exitStatus = 0
106
+ self.step.execution.reportLocation = "%s/Report.pkl" % (
107
+ self.stepSpace.location,
108
+ )
109
+
110
+ # Set overall step status to 1 (failed)
111
+ self.report.setStepStatus(stepName=self.stepName, status=1)
112
+
113
+ # //
114
+ # // Does the step contain settings for an emulator?
115
+ # // If so, load it up
116
+
117
+ emulatorName = getattr(self.step.emulator, "emulatorName", None)
118
+ if emulatorName != None:
119
+ self.emulator = getStepEmulator(emulatorName)
120
+ self.emulator.initialise(self)
121
+ self.emulationMode = True
122
+
123
+ return
124
+
125
+ def saveReport(self):
126
+ """
127
+ _saveReport_
128
+
129
+ Save the job report
130
+
131
+ """
132
+ self.report.persist(self.step.execution.reportLocation)
133
+ return
134
+
135
+ def pre(self, emulator=None):
136
+ """
137
+ _pre_
138
+
139
+ pre execution checks. Can alter flow of execution by returning
140
+ a different step in the task. If None, then current step will
141
+ be passed to execute.
142
+
143
+ TODO: Define better how to switch to different step within the task
144
+
145
+ """
146
+ return None
147
+
148
+ def execute(self, emulator=None):
149
+ """
150
+ _execute_
151
+
152
+ Override behaviour to execute this step type.
153
+ If Emulator is provided, execute the emulator instead.
154
+ Return a framework job report instance
155
+
156
+ """
157
+ msg = "WMSpec.Steps.Executor.execute method not overridden in "
158
+ msg += "implementation: %s\n" % self.__class__.__name__
159
+ raise NotImplementedError(msg)
160
+
161
+ def post(self, emulator=None):
162
+ """
163
+ _post_
164
+
165
+ post execution checks. Can alter flow of execution by returning
166
+ a different step in the task. If None, then the next step in the task
167
+ will be used next.
168
+
169
+ TODO: Define better how to switch to different step within the task
170
+
171
+ """
172
+ return None
173
+
174
+ def setCondorChirpAttrDelayed(self, key, value, compress=False, maxLen=5120):
175
+ """
176
+ _setCondorChirpAttrDelayed_
177
+
178
+ Util to call condor_chirp and publish the key/value pair
179
+
180
+ """
181
+
182
+ if compress:
183
+ value = zipEncodeStr(value, maxLen=maxLen)
184
+
185
+ # bytes object is not JSON serializable in Python3
186
+ value = decodeBytesToUnicodeConditional(value, condition=PY3)
187
+ # construct condor_chirp binary location from CONDOR_CONFIG
188
+ # Note: This works when we do not use containers.
189
+ condor_chirp_bin = None
190
+ condor_config = os.getenv('CONDOR_CONFIG', None)
191
+ if condor_config:
192
+ condor_config_dir = os.path.dirname(condor_config)
193
+ condor_chirp_bin = os.path.join(condor_config_dir, 'main/condor/libexec/condor_chirp')
194
+
195
+ # If the above fails, look for the executable in the environment
196
+ # This is the usual case for containers
197
+ if not condor_chirp_bin or not os.path.isfile(condor_chirp_bin):
198
+ condor_chirp_bin = getFullPath("condor_chirp")
199
+
200
+ if condor_chirp_bin and os.access(condor_chirp_bin, os.X_OK):
201
+ args = [condor_chirp_bin, 'set_job_attr_delayed', key, json.dumps(value)]
202
+ subprocess.call(args)
203
+ else:
204
+ if condor_chirp_bin and not os.access(condor_chirp_bin, os.X_OK):
205
+ msg = 'condor_chirp was found in: %s, but it was not an executable.' % condor_chirp_bin
206
+ else:
207
+ msg = 'condor_chirp was not found in the system.'
208
+ self.logger.warning(msg)
209
+
210
+ return
@@ -0,0 +1,213 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _StepFactory_
4
+
5
+ Factory implementation to retrieve Step Template instances
6
+
7
+ """
8
+
9
+
10
+ from WMCore.WMFactory import WMFactory
11
+ from WMCore.WMException import WMException
12
+
13
+ class StepFactoryException(WMException):
14
+ """
15
+ _StepFactortyException_
16
+
17
+ Exception for missing objects or problems
18
+
19
+ """
20
+ pass
21
+
22
+
23
+
24
+ class TemplateFactory(WMFactory):
25
+ """
26
+ _TemplateFactory_
27
+
28
+ Instantiate a WMFactory instance with the appropriate namespace
29
+
30
+ """
31
+ def __init__(self):
32
+ WMFactory.__init__(self, self.__class__.__name__,
33
+ "WMCore.WMSpec.Steps.Templates")
34
+
35
+ class BuilderFactory(WMFactory):
36
+ """
37
+ _BuilderFactory_
38
+
39
+ Instantiate a WMFactory instance with the appropriate namespace
40
+
41
+ """
42
+ def __init__(self):
43
+ WMFactory.__init__(self, self.__class__.__name__,
44
+ "WMCore.WMSpec.Steps.Builders")
45
+
46
+ class ExecutorFactory(WMFactory):
47
+ """
48
+ _ExecutorFactory_
49
+
50
+ Instantiate a WMFactory instance with the appropriate namespace
51
+
52
+ """
53
+ def __init__(self):
54
+ WMFactory.__init__(self, self.__class__.__name__,
55
+ "WMCore.WMSpec.Steps.Executors")
56
+ class EmulatorFactory(WMFactory):
57
+ """
58
+ _EmulatorFactory_
59
+
60
+ Instantiate a WMFactory instance with the appropriate namespace
61
+
62
+ """
63
+ def __init__(self):
64
+ WMFactory.__init__(self, self.__class__.__name__,
65
+ "WMCore.WMSpec.Steps.Emulators")
66
+
67
+ class FetcherFactory(WMFactory):
68
+ """
69
+ _FetcherFactory_
70
+
71
+ Instantiate a WMFactory instance for the Fetchers package
72
+
73
+ """
74
+ def __init__(self):
75
+ WMFactory.__init__(self, self.__class__.__name__,
76
+ "WMCore.WMSpec.Steps.Fetchers")
77
+
78
+ class DiagnosticFactory(WMFactory):
79
+ """
80
+ _DiagnosticFactory_
81
+
82
+ Instantiate a WMFactory instance for the Diagnostics package
83
+
84
+ """
85
+ def __init__(self):
86
+ WMFactory.__init__(self, self.__class__.__name__,
87
+ "WMCore.WMSpec.Steps.Diagnostics")
88
+
89
+
90
+
91
+ _TemplateFactory = TemplateFactory()
92
+ _BuilderFactory = BuilderFactory()
93
+ _ExecutorFactory = ExecutorFactory()
94
+ _EmulatorFactory = EmulatorFactory()
95
+ _FetcherFactory = FetcherFactory()
96
+ _DiagnosticFactory = DiagnosticFactory()
97
+
98
+ def getStepTemplate(stepType):
99
+ """
100
+ _getStepTemplate_
101
+
102
+ factory method to return a step template instance based on the
103
+ name of the step
104
+
105
+ """
106
+ # try:
107
+ return _TemplateFactory.loadObject(stepType)
108
+ # except WMException, wmEx:
109
+ # msg = "TemplateFactory Unable to load Object: %s" % stepType
110
+ # raise StepFactoryException(msg)
111
+ # except Exception, ex:
112
+ # msg = "Error creating object %s in TemplateFactory:\n" % stepType
113
+ # msg += str(ex)
114
+ # raise StepFactoryException(msg)
115
+
116
+ def getStepTypeHelper(stepReference):
117
+ """
118
+ _getStepTypeHelper_
119
+
120
+ Given a step instance, get its type, use that to get a template
121
+ from the factory and use the template to instantiate the type
122
+ specific helper
123
+
124
+ """
125
+ stepType = getattr(stepReference, "stepType", None)
126
+ if stepType == None:
127
+ msg = "Unable to find stepType attribute for step reference passed\n"
128
+ msg += "to getStepTypeHelper method"
129
+ raise StepFactoryException(msg)
130
+ template = getStepTemplate(stepType)
131
+ helper = template.helper(stepReference)
132
+ return helper
133
+
134
+
135
+ def getStepBuilder(stepType):
136
+ """
137
+ _getStepBuilder_
138
+
139
+ """
140
+ #try:
141
+ return _BuilderFactory.loadObject(stepType)
142
+ # except WMException, wmEx:
143
+ # msg = "BuilderFactory Unable to load Object: %s" % stepType
144
+ # raise StepFactoryException(msg)
145
+ # except Exception, ex:
146
+ # msg = "Error creating object %s in BuilderFactory:\n" % stepType
147
+ # msg += str(ex)
148
+ # raise StepFactoryException(msg)
149
+
150
+ def getStepExecutor(stepType):
151
+ """
152
+ _getStepExecutor_
153
+
154
+ Get an Executor for the given step type
155
+
156
+ """
157
+ # try:
158
+ executor =_ExecutorFactory.loadObject(stepType)
159
+ # except WMException, wmEx:
160
+ # msg = "ExecutorFactory Unable to load Object: %s" % stepType
161
+ # raise StepFactoryException(msg)
162
+ # except Exception, ex:
163
+ # msg = "Error creating object %s in ExecutorFactory:\n" % stepType
164
+ # msg += str(ex)
165
+ # raise StepFactoryException(msg)
166
+
167
+ executor.diagnostic = getDiagnostic(stepType)
168
+ return executor
169
+
170
+ def getStepEmulator(stepEmuName):
171
+ """
172
+ _getStepEmulator_
173
+
174
+ Get an instance of a given emulator, Note that this takes the name
175
+ of the emulator rather than the step Type since there are multiple
176
+ ways to emulate a given step
177
+
178
+ """
179
+ #try:
180
+ return _EmulatorFactory.loadObject(stepEmuName)
181
+ #except WMException, wmEx:
182
+ # msg = "EmulatorFactory Unable to load Object: %s" % stepEmuName
183
+ # raise StepFactoryException(msg)
184
+ #except Exception, ex:
185
+ # msg = "Error creating object %s in EmulatorFactory:\n" % stepEmuName
186
+ # msg += str(ex)
187
+ # raise StepFactoryException(msg)
188
+
189
+ def getFetcher(fetcherName):
190
+ """
191
+ _getFetcher_
192
+
193
+ Get an instance of the named Fetcher implementation
194
+
195
+ """
196
+ return _FetcherFactory.loadObject(fetcherName)
197
+
198
+ def getDiagnostic(stepType):
199
+ """
200
+ _getDiagnostic_
201
+
202
+ Get the appropriate Diagnostic for the stepType, falling back
203
+ on a Generic Diagnostic if there isnt a specific impl
204
+
205
+ """
206
+ try:
207
+ return _DiagnosticFactory.loadObject(stepType)
208
+ except WMException as wmEx:
209
+ return _DiagnosticFactory.loadObject("Generic")
210
+ # except Exception, ex:
211
+ # msg = "Error creating object %s in DiagnosticFactory:\n" % stepType
212
+ # msg += str(ex)
213
+ # raise StepFactoryException(msg)
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _TaskEmulator_
4
+
5
+ Top level emulator controller
6
+
7
+ """
8
+
9
+ from builtins import object
10
+ from WMCore.WMSpec.WMStep import WMStepHelper
11
+ import WMCore.WMSpec.Steps.StepFactory as StepFactory
12
+
13
+
14
+ class TaskEmulator(object):
15
+ """
16
+ _TaskEmulator_
17
+
18
+ Top Level Emulator that contains a map of all the steps to step emulators
19
+ and be able to run them
20
+
21
+ Instantiate with the task to be emulated
22
+
23
+ """
24
+ def __init__(self, task):
25
+ self.task = task
26
+ self.emulators = {}
27
+
28
+ def getEmulator(self, stepName):
29
+ """
30
+ _getEmulator_
31
+
32
+ Retrieve the Emulator for the step name provided, returns None if
33
+ there is no emulator
34
+
35
+ """
36
+ return self.emulators.get(stepName, None)
37
+
38
+
39
+ def addEmulator(self, nodeName, emulatorName):
40
+ """
41
+ _addEmulator_
42
+
43
+ Add an Emulator for the node provided, emulatorName is the name
44
+ of the emulator class to be loaded by the Emulator factory
45
+
46
+ TODO: Exception handling
47
+
48
+ """
49
+ emuInstance = StepFactory.getStepEmulator(emulatorName)
50
+ self.emulators[nodeName] = emuInstance
51
+ return
52
+
53
+ def emulateAll(self):
54
+ """
55
+ _emulateAll_
56
+
57
+ Traverse all Steps and load up the default Emulator based on
58
+ type.
59
+
60
+ """
61
+ for step in self.task.steps().nodeIterator():
62
+ helper = WMStepHelper(step)
63
+ stepType = helper.stepType()
64
+ stepName = helper.name()
65
+ self.addEmulator(stepName, stepType)
66
+
67
+
68
+
69
+ def __call__(self, step):
70
+ """
71
+ _operator(step)_
72
+
73
+ Invoke the emulator for the given step
74
+
75
+ """
@@ -0,0 +1,204 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _Template_
4
+
5
+ Template class for all Step Template implementations to inherit and implement
6
+ the API
7
+
8
+ """
9
+ from builtins import object
10
+ import os
11
+
12
+ from WMCore.WMSpec.WMStep import WMStepHelper
13
+ from WMCore.WMSpec.ConfigSectionTree import nodeName
14
+
15
+ class CoreHelper(WMStepHelper):
16
+ """
17
+ _CoreHelper_
18
+
19
+ Helper API for core settings
20
+
21
+ """
22
+ def stepName(self):
23
+ """
24
+ _stepName_
25
+
26
+ Get the name of the step
27
+
28
+ """
29
+ return nodeName(self.data)
30
+
31
+
32
+ def addEnvironmentVariable(self, varname, setting):
33
+ """
34
+ _addEnvironmentVariable_
35
+
36
+ add a key = value style setting to the environment for this
37
+ step
38
+
39
+ """
40
+ setattr(self.data.environment.variables, varname, setting)
41
+ return
42
+
43
+ def addEnvironmentPath(self, pathname, setting):
44
+ """
45
+ _addEnvironmentPath_
46
+
47
+ add a key = value1:value2:value3 environment setting to this step
48
+
49
+ """
50
+ if getattr(self.data.environment.paths, pathname, None) == None:
51
+ setattr(self.data.environment.paths, pathname, [])
52
+ pathentry = getattr(self.data.environment.paths, pathname)
53
+ pathentry.append(setting)
54
+ return
55
+
56
+ def environment(self):
57
+ """
58
+ _environment_
59
+
60
+ Get the environment settings for this step
61
+
62
+ """
63
+ return self.data.environment
64
+
65
+ def setOverrideCatalog(self, overrideCatalog):
66
+ """
67
+ _setOverrideCatalog_
68
+ set the override catalog needed at least at CERN to use production castor pools
69
+ """
70
+ if overrideCatalog is not None:
71
+ self.data.application.overrideCatalog = overrideCatalog
72
+
73
+ def getOverrideCatalog(self):
74
+ """
75
+ _getOverrideCatalog_
76
+ return the TFC specified in overrideCatalog.
77
+ """
78
+ return getattr(self.data.application, "overrideCatalog", None)
79
+
80
+ def addDirectory(self, dirName):
81
+ """
82
+ _addDirectory_
83
+
84
+ Add a subdirectory structure to the template that will be built by
85
+ the builder
86
+
87
+ """
88
+ split = dirName.split("/")
89
+ split = [ x for x in split if x.strip() != "" ]
90
+
91
+ dirs = getattr(self.data.build.directories, self.stepName())
92
+ for subdir in split:
93
+ exists = getattr(dirs, subdir, None)
94
+ if exists == None:
95
+ dirs.section_(subdir)
96
+ dirs = getattr(dirs, subdir)
97
+ return dirs
98
+
99
+
100
+
101
+ def addFile(self, fileName, newLocation = None):
102
+ """
103
+ _addFile_
104
+
105
+ Add a file to the job at build time. This file must be
106
+ a local filesystem file available at fileName.
107
+
108
+ An optional location within the step can be specified which
109
+ may include a path structure that gets translated into calls
110
+ to addDirectory
111
+
112
+ """
113
+ dirs = getattr(self.data.build.directories, self.stepName())
114
+ if newLocation != None:
115
+ filename = os.path.basename(newLocation)
116
+ dirname = os.path.dirname(newLocation)
117
+ dirs = self.addDirectory(dirname)
118
+ setattr(dirs, filename, { "Source" : fileName, "Target" : filename})
119
+ else:
120
+ filename = os.path.basename(fileName)
121
+ setattr(dirs, filename, {"Target" : filename, "Source" : fileName })
122
+ return
123
+
124
+
125
+ def directoryStructure(self):
126
+ """
127
+ _directoryStructure_
128
+
129
+ Util to retrieve the directory structure
130
+
131
+ """
132
+ return self.data.build.directories
133
+
134
+ class Template(object):
135
+ """
136
+ _Template_
137
+
138
+ Base interface definition for any WMStep Template
139
+
140
+ """
141
+
142
+ def __init__(self):
143
+ pass
144
+
145
+ def __call__(self, step):
146
+ """
147
+ _operator(step)_
148
+
149
+ Install the template on the step instance provided
150
+
151
+ """
152
+ self.coreInstall(step)
153
+ self.install(step)
154
+
155
+
156
+ def coreInstall(self, step):
157
+ """
158
+ _coreInstall_
159
+
160
+ Install attributes common to all steps
161
+
162
+ """
163
+ # Environment settings to pass to the step
164
+ step.section_("environment")
165
+ step.environment.section_("variables")
166
+ step.environment.section_("paths")
167
+
168
+ # Directory structure and files to be included in the job
169
+ # beyond those that would be added by a Step Specific builder
170
+ # Step Specific subclasses can simply append to these to get files
171
+ # and dirs into the job
172
+ step.section_("build")
173
+ step.build.section_("directories")
174
+ step.build.directories.section_(nodeName(step))
175
+
176
+
177
+
178
+
179
+
180
+
181
+ def install(self, step):
182
+ """
183
+ _install_
184
+
185
+ Override this method to install the required attributes
186
+ in the step Instance provided
187
+
188
+ """
189
+ msg = "WMSpec.Steps.Template.install method not overridden in "
190
+ msg += "implementation: %s\n" % self.__class__.__name__
191
+ raise NotImplementedError(msg)
192
+
193
+
194
+ def helper(self, step):
195
+ """
196
+ _helper_
197
+
198
+ Wrap the step instance in a helper class tailored to this particular
199
+ step type
200
+
201
+ """
202
+ msg = "WMSpec.Steps.Template.helper method not overridden in "
203
+ msg += "implementation: %s\n" % self.__class__.__name__
204
+ raise NotImplementedError(msg)