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,201 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _BuildTools_
4
+
5
+ Utils to assist in the build process
6
+
7
+
8
+ """
9
+
10
+ from builtins import object
11
+ from future.utils import viewvalues
12
+
13
+ import os
14
+ import logging
15
+ from WMCore.WMSpec.ConfigSectionTree import nodeName
16
+
17
+
18
+ class File(object):
19
+ """
20
+ _File_
21
+
22
+ Class representing a file added to a directory.
23
+
24
+ Contains a source for the file and a name within
25
+ the directory
26
+
27
+ """
28
+ def __init__(self, directory, name, source):
29
+ self.directory = directory
30
+ self.name = name
31
+ self.source = source
32
+
33
+
34
+
35
+
36
+ def path(self):
37
+ """
38
+ _path_
39
+
40
+ Get name of this file within directory structure
41
+
42
+ """
43
+ return "%s/%s" % (self.directory.path(), self.name)
44
+
45
+ def fetch(self, targetDir):
46
+ """
47
+ _fetch_
48
+
49
+ Get the source and put it in the target dir.
50
+
51
+ Note: for now this uses cp, could use other
52
+ things based on source type, eg http:// etc etc
53
+
54
+ """
55
+ command = "/bin/cp -rf %s %s/%s" % (self.source,
56
+ targetDir,
57
+ self.name)
58
+ logging.info("fetch:%s" % command)
59
+ os.system(command)
60
+ return
61
+
62
+
63
+
64
+
65
+ class Directory(object):
66
+ """
67
+ _Directory_
68
+
69
+ structure representing a dir, to which files can be attached
70
+
71
+
72
+ """
73
+ def __init__(self, name):
74
+ self.name = name
75
+ self.parent = None
76
+ self.children = {}
77
+ self.files = {}
78
+ self.physicalPath = None
79
+
80
+
81
+ def addDirectory(self, name):
82
+ """
83
+ _addDirectory_
84
+
85
+ Add a new child Directory to this.
86
+ Return reference to new Directory instance
87
+
88
+ """
89
+ if name in self.children:
90
+ return self.children[name]
91
+
92
+ self.children[name] = Directory(name)
93
+ self.children[name].parent = self
94
+ return self.children[name]
95
+
96
+
97
+ def addFile(self, source, targetName = None):
98
+ """
99
+ _addFile_
100
+
101
+ Add a file to this directory.
102
+ The file will be pulled in from the source specified.
103
+ targetName is the optional name of the file in this
104
+ directory. If not specified, the basename of the file
105
+ will be used
106
+
107
+ """
108
+ target = targetName
109
+ if target == None:
110
+ target = os.path.basename(source)
111
+
112
+ if target in self.files:
113
+ msg = "File %s already exists in directory %s" % (
114
+ self.name, target)
115
+ raise RuntimeError(msg)
116
+
117
+ newFile = File(self, target, source)
118
+ self.files[target] = newFile
119
+ return
120
+
121
+
122
+ def path(self):
123
+ """
124
+ _path_
125
+
126
+ Get name of this dir within directory structure
127
+
128
+ """
129
+ if self.parent == None:
130
+ return self.name
131
+ return "%s/%s" % (self.parent.path(), self.name)
132
+
133
+
134
+ def create(self, targetDir):
135
+ """
136
+ _create_
137
+
138
+ Make this directory in the targetDirectory provided,
139
+ pull in all files and then recursively create any
140
+ children
141
+
142
+ """
143
+ newDir = "%s/%s" % (targetDir, self.name)
144
+ logging.info("create(%s)" % newDir)
145
+ if not os.path.exists(newDir):
146
+ os.makedirs(newDir)
147
+ for f in viewvalues(self.files):
148
+ f.fetch(newDir)
149
+
150
+ for child in viewvalues(self.children):
151
+ child.create(newDir)
152
+ return
153
+
154
+ def __str__(self):
155
+ result = "%s\n" % self.path()
156
+ for f in viewvalues(self.files):
157
+ result += "%s ==> %s\n" % (f.path(), f.source)
158
+ for d in viewvalues(self.children):
159
+ result += str(d)
160
+
161
+ return result
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+ def processDir( cfgSect, parent):
171
+ """
172
+ _processDir_
173
+
174
+ Process a ConfigSection based directory
175
+
176
+ """
177
+ for setting in cfgSect._internal_settings:
178
+ value = getattr(cfgSect, setting)
179
+ if not isinstance(value, dict): continue
180
+ parent.addFile(value['Source'], value['Target'])
181
+
182
+ for subdir in cfgSect._internal_children:
183
+ newsubdir = parent.addDirectory(subdir)
184
+ processDir(getattr(cfgSect, subdir), newsubdir)
185
+ return
186
+
187
+
188
+ def makeDirectory(step):
189
+ """
190
+ _makeDirectory_
191
+
192
+ Create a Directory & file structure from the step provided
193
+
194
+ """
195
+
196
+ dirs = getattr(step.build.directories, nodeName(step))
197
+ topDir = Directory(nodeName(step))
198
+
199
+ processDir(dirs, topDir)
200
+
201
+ return topDir
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _Builder_
4
+
5
+ Interface definition for Step Builder implementations
6
+
7
+ """
8
+ from __future__ import print_function
9
+
10
+ from builtins import object
11
+ import logging
12
+
13
+ import WMCore.WMSpec.Steps.BuildTools as BuildTools
14
+ from WMCore.WMSpec.ConfigSectionTree import nodeName
15
+
16
+ taskSpaceInit = "#!/usr/bin/env python\n"
17
+ taskSpaceInit += "# StepSpace Init module for Step\n"
18
+ taskSpaceInit += "# Autogenerated by WMCore.WMSpec.Steps.Builder\n"
19
+ taskSpaceInit += "\n__all__ = []\n\n"
20
+ taskSpaceInit += "from WMCore.WMRuntime.Bootstrap import establishStepSpace\n\n"
21
+ taskSpaceInit += "def _Locator():\n"
22
+ taskSpaceInit += " pass\n\n"
23
+ taskSpaceInit += "args = {}\n"
24
+
25
+
26
+ class Builder(object):
27
+ """
28
+ _Builder_
29
+
30
+ base interface for any WMStep Builder
31
+
32
+ """
33
+
34
+ def __init__(self):
35
+ self.taskName = None
36
+ self.stepName = None
37
+ self.stepDir = None
38
+ self.taskSpaceInitMod = None
39
+
40
+ def __call__(self, step, taskName, workingDirectory, **args):
41
+ """
42
+ _operator(step)_
43
+
44
+
45
+ """
46
+ self.stepName = nodeName(step)
47
+ self.taskName = taskName
48
+ self.coreBuild(step, workingDirectory)
49
+ self.build(step, workingDirectory, **args)
50
+
51
+ def coreBuild(self, step, workingDirectory):
52
+ """
53
+ _coreBuild_
54
+
55
+ Build standard stuff that is common to all jobs
56
+
57
+ """
58
+ logging.info("%s.coreBuild invoked", self.__class__.__name__)
59
+ dirs = BuildTools.makeDirectory(step)
60
+ dirs.create(workingDirectory)
61
+ self.stepDir = "%s/%s" % (workingDirectory, self.stepName)
62
+ #
63
+ # Install the basic __init__.py module into the step
64
+ # directory
65
+
66
+ self.taskSpaceInitMod = "%s/__init__.py" % self.stepDir
67
+
68
+ with open(self.taskSpaceInitMod, 'w') as handle:
69
+ handle.write(taskSpaceInit)
70
+ handle.write("""args["TaskName"] = "%s"\n""" % self.taskName)
71
+ handle.write("""args["StepName"] = "%s"\n""" % self.stepName)
72
+ handle.write("""args["Locator"] = _Locator\n""")
73
+ handle.write("""stepSpace = establishStepSpace(**args)\n""")
74
+
75
+ def build(self, step, workingDirectory, **args):
76
+ """
77
+ _build_
78
+
79
+ Build the step into the working area provided
80
+ args is for all the things we havent thought of yet
81
+
82
+ """
83
+ msg = "WMSpec.Steps.Builder.build method not overridden in "
84
+ msg += "implementation: %s\n" % self.__class__.__name__
85
+ raise NotImplementedError(msg)
86
+
87
+ def installWorkingArea(self, step, workingArea, **args):
88
+ """
89
+ _installWorkingArea_
90
+
91
+ Install working directory information into the step in a standard
92
+ way.
93
+
94
+ """
95
+ step.section_("builder")
96
+ step.builder.workingDir = workingArea
97
+ return
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ _Diagnostic_
4
+
5
+
6
+ Interface and base class for step specific diagnostic handlers
7
+
8
+
9
+ """
10
+ from builtins import object
11
+
12
+ from WMCore.FwkJobReport.Report import FwkJobReportException
13
+
14
+
15
+ class DiagnosticHandler(object):
16
+ """
17
+ _DiagnosticHandler_
18
+
19
+ Interface definition for handlers for a specific error condition
20
+
21
+
22
+ """
23
+ def __call__(self, errorCode, executorInstance, **args):
24
+ """
25
+ _operator(errCode, executor)_
26
+
27
+ Override to act on a particular error, use the executorInstance
28
+ to access things like the step, logfiles, and report.
29
+
30
+ Args will be used to provide extra information such as Exception
31
+ instances etc
32
+
33
+ """
34
+ msg = "DiagnosticHandler.__call__ not "
35
+ msg += "implemented for class %s" % self.__class__.__name__
36
+ raise NotImplementedError(msg)
37
+
38
+ def parse(self, executorInstance, jobRepXml):
39
+ """
40
+ Add an error to report if parsing the xml fails.
41
+ """
42
+ try:
43
+ executorInstance.report.parse(jobRepXml, executorInstance.stepName)
44
+ except FwkJobReportException as ex:
45
+ # Job report is bad, the parse already puts a 50115 in the file
46
+ msg = "Error reading XML job report file, possibly corrupt XML File:\n"
47
+ msg += "Details: %s" % str(ex)
48
+ executorInstance.report.addError(executorInstance.stepName, 50115, "BadFWJRXML", msg)
49
+ raise
50
+
51
+
52
+ class DefaultDiagnosticHandler(DiagnosticHandler):
53
+ """
54
+ _DefaultDiagnosticHandler_
55
+
56
+ Catch-all that just adds information to the report
57
+
58
+ """
59
+ def __call__(self, errorCode, executorInstance, **args):
60
+ pass
61
+
62
+
63
+
64
+
65
+
66
+ class Diagnostic(object):
67
+ """
68
+ _Diagnostic_
69
+
70
+ Base class for a Diagnostic implementation specific to a step type
71
+ Also works as a bare minimum Diagnostic if overriding is not needed
72
+
73
+ """
74
+ def __init__(self):
75
+ self.handlers = {}
76
+ self.defaultHandler = DefaultDiagnosticHandler()
77
+
78
+
79
+
80
+ def __call__(self, errCode, executor, **args):
81
+ """
82
+ _operator(errCode, executor, args)_
83
+
84
+ Invoke the diagnostic to produce an error report
85
+
86
+ """
87
+ handler = self.handlers.get(errCode, self.defaultHandler)
88
+ handler(errCode, executor, **args)
89
+ executor.saveReport()
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env python2.5
2
+ """
3
+ _Emulator_
4
+
5
+ Define the Interface for a Step Emulator
6
+
7
+
8
+ """
9
+
10
+
11
+ from builtins import object
12
+ class Emulator(object):
13
+ """
14
+ _Emulator_
15
+
16
+ Base class for an Emulator implementation for a given step
17
+
18
+ """
19
+ def initialise(self, executorInstance):
20
+ """
21
+ _initialise_
22
+
23
+ Post ctor initialisation, shortcut to some of the standard variables provided by the executor
24
+
25
+ """
26
+ self.executor = executorInstance
27
+ self.job = self.executor.job
28
+ self.report = self.executor.report
29
+ self.task = self.executor.task
30
+ self.step = self.executor.step
31
+ self.stepSpace = self.executor.stepSpace
32
+ self.stepName = self.executor.stepName
33
+
34
+
35
+ def pre(self):
36
+ """
37
+ _pre_
38
+
39
+ Override pre step to emulate
40
+ """
41
+ return None
42
+
43
+
44
+ def execute(self):
45
+ """
46
+ _emulate_
47
+
48
+ Emulate the response to the step provided
49
+
50
+ """
51
+ msg = "WMStep.Steps.Emulator.emulate not implemented for "
52
+ msg += "class %s" % self.__class__.__name__
53
+ raise NotImplementedError(msg)
54
+
55
+ def post(self):
56
+ """
57
+ _post_
58
+
59
+ Override to emulate post execution step
60
+
61
+ """
62
+ return None
@@ -0,0 +1,208 @@
1
+ #!/usr/bin/env python
2
+ # pylint: disable=E1101
3
+ # E1101: Allow imports from currentThread
4
+ """
5
+ _ExecuteMaster_
6
+
7
+ Overseer object that traverses a task and invokes the type based executor
8
+ for each step
9
+
10
+ """
11
+
12
+ from builtins import object
13
+
14
+ import logging
15
+ import os
16
+ import threading
17
+ import traceback
18
+
19
+ import WMCore.WMSpec.Steps.StepFactory as StepFactory
20
+ from WMCore.WMException import WMException
21
+ from WMCore.WMSpec.Steps.WMExecutionFailure import WMExecutionFailure
22
+ from WMCore.WMSpec.WMStep import WMStepHelper
23
+
24
+
25
+ class ExecuteMaster(object):
26
+ """
27
+ _ExecuteMaster_
28
+
29
+ Traverse the given task and invoke the execute framework
30
+ If an emulator is provided, then invoke the appropriate emulator
31
+ instead of the executor
32
+
33
+ """
34
+
35
+ def __init__(self):
36
+ pass
37
+
38
+ def __call__(self, task, wmbsJob):
39
+ """
40
+ _operator(task)_
41
+
42
+ Load and run executors for all steps in Task, if an emulator is
43
+ available for that step, use it instead.
44
+
45
+ """
46
+
47
+ myThread = threading.currentThread
48
+
49
+ try:
50
+ myThread.watchdogMonitor.setupMonitors(task, wmbsJob)
51
+ myThread.watchdogMonitor.notifyJobStart(task)
52
+ except WMException:
53
+ self.toTaskDirectory()
54
+ raise
55
+ except Exception as ex:
56
+ msg = "Encountered unhandled exception while starting monitors:\n"
57
+ msg += str(ex) + '\n'
58
+ msg += str(traceback.format_exc()) + '\n'
59
+ logging.error(msg)
60
+ self.toTaskDirectory()
61
+ raise WMExecutionFailure(msg)
62
+
63
+ failureUpstream = False
64
+ for step in task.steps().nodeIterator():
65
+ try:
66
+ helper = WMStepHelper(step)
67
+ stepType = helper.stepType()
68
+ stepName = helper.name()
69
+ if failureUpstream:
70
+ # for chained steps, don't execute further steps if a
71
+ # failure has already happened
72
+ helper.addOverride("previousCmsRunFailure", True)
73
+
74
+ executor = StepFactory.getStepExecutor(stepType)
75
+ result = self.doExecution(executor, step, wmbsJob)
76
+ logging.info("StepName: %s, StepType: %s, with result: %r", stepName, stepType, result)
77
+ if result: # can be either None, or the step exit code
78
+ failureUpstream = True
79
+ except WMException as ex:
80
+ msg = "Encountered error while running ExecuteMaster:\n"
81
+ msg += str(ex) + "\n"
82
+ logging.error(msg)
83
+ self.toTaskDirectory()
84
+ break
85
+ except Exception as ex:
86
+ msg = "Encountered error while running ExecuteMaster:\n"
87
+ msg += str(ex) + "\n"
88
+ msg += str(traceback.format_exc()) + "\n"
89
+ self.toTaskDirectory()
90
+ logging.error(msg)
91
+ break
92
+
93
+ try:
94
+ myThread.watchdogMonitor.notifyJobEnd(task)
95
+ except WMException:
96
+ self.toTaskDirectory()
97
+ except Exception as ex:
98
+ msg = "Encountered unhandled exception while ending the job:\n"
99
+ msg += str(ex) + '\n'
100
+ msg += str(traceback.format_exc()) + '\n'
101
+ logging.error(msg)
102
+ self.toTaskDirectory()
103
+
104
+ return
105
+
106
+ def doExecution(self, executor, step, job):
107
+ """
108
+ _doExecution_
109
+
110
+ Invoke the Executor for the step provided
111
+
112
+ TODO: Add Monitoring thread & setup
113
+ TODO: Exception Handling
114
+ TODO: pre/post outcome can change the next execution task, need to
115
+ ensure that this happens
116
+
117
+
118
+ """
119
+ myThread = threading.currentThread
120
+ # Tell the watchdog that we're starting the step
121
+ myThread.watchdogMonitor.notifyStepStart(step)
122
+
123
+ self.toStepDirectory(step)
124
+ executor.initialise(step, job)
125
+ executionObject = executor
126
+ error = False
127
+ if executor.emulationMode:
128
+ executionObject = executor.emulator
129
+
130
+ preOutcome = executionObject.pre()
131
+ if preOutcome is not None:
132
+ logging.info("Pre Executor Task Change: %s", preOutcome)
133
+ executor.saveReport()
134
+ self.toTaskDirectory()
135
+ myThread.watchdogMonitor.notifyStepEnd(step=step,
136
+ stepReport=executor.report)
137
+ executor.saveReport()
138
+ return preOutcome
139
+ try:
140
+ executor.report.setStepStartTime(stepName=executor.stepName)
141
+ executionObject.execute()
142
+ except WMExecutionFailure as ex:
143
+ executor.diagnostic(ex.code, executor, ExceptionInstance=ex)
144
+ executor.report.addError(executor.stepName, ex.code, "WMAgentStepExecutionError", str(ex))
145
+ error = True
146
+ except Exception as ex:
147
+ logging.error("Exception occured when executing step")
148
+ logging.error("Exception is %s", ex)
149
+ logging.error("Traceback: ")
150
+ logging.error(traceback.format_exc())
151
+ executor.diagnostic(99109, executor, ExceptionInstance=ex)
152
+ executor.report.addError(executor.stepName, 99109, "WMAgentStepExecutionError", str(ex))
153
+ error = True
154
+ executor.report.setStepStopTime(stepName=executor.stepName)
155
+ # TODO: Handle generic Exception that indicates development/code errors
156
+ executor.saveReport()
157
+
158
+ postOutcome = executionObject.post()
159
+ if postOutcome is not None:
160
+ logging.info("Post Executor Task Change: %s", postOutcome)
161
+ executor.saveReport()
162
+ self.toTaskDirectory()
163
+ myThread.watchdogMonitor.notifyStepEnd(step=step,
164
+ stepReport=executor.report)
165
+ executor.saveReport()
166
+ return postOutcome
167
+
168
+ self.toTaskDirectory()
169
+
170
+ # Okay, we're done, set the job to successful
171
+ stepExitCode = executor.report.getExitCode() # 0 is successful
172
+ if not error and not stepExitCode:
173
+ executor.report.setStepStatus(stepName=executor.stepName,
174
+ status=0)
175
+ executor.saveReport()
176
+
177
+ # Tell the watchdog that we're done with the step
178
+ myThread.watchdogMonitor.notifyStepEnd(step=step,
179
+ stepReport=executor.report)
180
+ executor.saveReport()
181
+
182
+ return stepExitCode
183
+
184
+ def toStepDirectory(self, step):
185
+ """
186
+ _toStepDirectory_
187
+
188
+ Switch current working directory to the step location
189
+ within WMTaskSpace
190
+
191
+ """
192
+ stepName = WMStepHelper(step).name()
193
+ from WMTaskSpace import taskSpace
194
+ stepSpace = taskSpace.stepSpace(stepName)
195
+
196
+ os.chdir(stepSpace.location)
197
+
198
+ def toTaskDirectory(self):
199
+ """
200
+ _toTaskDirectory_
201
+
202
+ Switch to current working directory to the task location
203
+ within WMTaskSpace
204
+
205
+ """
206
+ from WMTaskSpace import taskSpace
207
+ os.chdir(taskSpace.location)
208
+ return