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.
- Utils/CPMetrics.py +270 -0
- Utils/CertTools.py +100 -0
- Utils/EmailAlert.py +50 -0
- Utils/ExtendedUnitTestCase.py +62 -0
- Utils/FileTools.py +182 -0
- Utils/IteratorTools.py +80 -0
- Utils/MathUtils.py +31 -0
- Utils/MemoryCache.py +119 -0
- Utils/Patterns.py +24 -0
- Utils/Pipeline.py +137 -0
- Utils/PortForward.py +97 -0
- Utils/ProcFS.py +112 -0
- Utils/ProcessStats.py +194 -0
- Utils/PythonVersion.py +17 -0
- Utils/Signals.py +36 -0
- Utils/TemporaryEnvironment.py +27 -0
- Utils/Throttled.py +227 -0
- Utils/Timers.py +130 -0
- Utils/Timestamps.py +86 -0
- Utils/TokenManager.py +143 -0
- Utils/Tracing.py +60 -0
- Utils/TwPrint.py +98 -0
- Utils/Utilities.py +318 -0
- Utils/__init__.py +11 -0
- Utils/wmcoreDTools.py +707 -0
- WMCore/ACDC/Collection.py +57 -0
- WMCore/ACDC/CollectionTypes.py +12 -0
- WMCore/ACDC/CouchCollection.py +67 -0
- WMCore/ACDC/CouchFileset.py +238 -0
- WMCore/ACDC/CouchService.py +73 -0
- WMCore/ACDC/DataCollectionService.py +485 -0
- WMCore/ACDC/Fileset.py +94 -0
- WMCore/ACDC/__init__.py +11 -0
- WMCore/Algorithms/Alarm.py +39 -0
- WMCore/Algorithms/MathAlgos.py +274 -0
- WMCore/Algorithms/MiscAlgos.py +67 -0
- WMCore/Algorithms/ParseXMLFile.py +115 -0
- WMCore/Algorithms/Permissions.py +27 -0
- WMCore/Algorithms/Singleton.py +58 -0
- WMCore/Algorithms/SubprocessAlgos.py +129 -0
- WMCore/Algorithms/__init__.py +7 -0
- WMCore/Cache/GenericDataCache.py +98 -0
- WMCore/Cache/WMConfigCache.py +572 -0
- WMCore/Cache/__init__.py +0 -0
- WMCore/Configuration.py +659 -0
- WMCore/DAOFactory.py +47 -0
- WMCore/DataStructs/File.py +177 -0
- WMCore/DataStructs/Fileset.py +140 -0
- WMCore/DataStructs/Job.py +182 -0
- WMCore/DataStructs/JobGroup.py +142 -0
- WMCore/DataStructs/JobPackage.py +49 -0
- WMCore/DataStructs/LumiList.py +734 -0
- WMCore/DataStructs/Mask.py +219 -0
- WMCore/DataStructs/MathStructs/ContinuousSummaryHistogram.py +197 -0
- WMCore/DataStructs/MathStructs/DiscreteSummaryHistogram.py +92 -0
- WMCore/DataStructs/MathStructs/SummaryHistogram.py +117 -0
- WMCore/DataStructs/MathStructs/__init__.py +0 -0
- WMCore/DataStructs/Pickleable.py +24 -0
- WMCore/DataStructs/Run.py +256 -0
- WMCore/DataStructs/Subscription.py +175 -0
- WMCore/DataStructs/WMObject.py +47 -0
- WMCore/DataStructs/WorkUnit.py +112 -0
- WMCore/DataStructs/Workflow.py +60 -0
- WMCore/DataStructs/__init__.py +8 -0
- WMCore/Database/CMSCouch.py +1430 -0
- WMCore/Database/ConfigDBMap.py +29 -0
- WMCore/Database/CouchMonitoring.py +450 -0
- WMCore/Database/CouchUtils.py +118 -0
- WMCore/Database/DBCore.py +198 -0
- WMCore/Database/DBCreator.py +113 -0
- WMCore/Database/DBExceptionHandler.py +59 -0
- WMCore/Database/DBFactory.py +117 -0
- WMCore/Database/DBFormatter.py +177 -0
- WMCore/Database/Dialects.py +13 -0
- WMCore/Database/ExecuteDAO.py +327 -0
- WMCore/Database/MongoDB.py +241 -0
- WMCore/Database/MySQL/Destroy.py +42 -0
- WMCore/Database/MySQL/ListUserContent.py +20 -0
- WMCore/Database/MySQL/__init__.py +9 -0
- WMCore/Database/MySQLCore.py +132 -0
- WMCore/Database/Oracle/Destroy.py +56 -0
- WMCore/Database/Oracle/ListUserContent.py +19 -0
- WMCore/Database/Oracle/__init__.py +9 -0
- WMCore/Database/ResultSet.py +44 -0
- WMCore/Database/Transaction.py +91 -0
- WMCore/Database/__init__.py +9 -0
- WMCore/Database/ipy_profile_couch.py +438 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/CleanUpTask.py +29 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/HeartbeatMonitor.py +105 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/LocationUpdateTask.py +28 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/ReqMgrInteractionTask.py +35 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/__init__.py +0 -0
- WMCore/GlobalWorkQueue/__init__.py +0 -0
- WMCore/GroupUser/CouchObject.py +127 -0
- WMCore/GroupUser/Decorators.py +51 -0
- WMCore/GroupUser/Group.py +33 -0
- WMCore/GroupUser/Interface.py +73 -0
- WMCore/GroupUser/User.py +96 -0
- WMCore/GroupUser/__init__.py +11 -0
- WMCore/Lexicon.py +836 -0
- WMCore/REST/Auth.py +202 -0
- WMCore/REST/CherryPyPeriodicTask.py +166 -0
- WMCore/REST/Error.py +333 -0
- WMCore/REST/Format.py +642 -0
- WMCore/REST/HeartbeatMonitorBase.py +90 -0
- WMCore/REST/Main.py +636 -0
- WMCore/REST/Server.py +2435 -0
- WMCore/REST/Services.py +24 -0
- WMCore/REST/Test.py +120 -0
- WMCore/REST/Tools.py +38 -0
- WMCore/REST/Validation.py +250 -0
- WMCore/REST/__init__.py +1 -0
- WMCore/ReqMgr/DataStructs/RequestStatus.py +209 -0
- WMCore/ReqMgr/DataStructs/RequestType.py +13 -0
- WMCore/ReqMgr/DataStructs/__init__.py +0 -0
- WMCore/ReqMgr/__init__.py +1 -0
- WMCore/Services/AlertManager/AlertManagerAPI.py +111 -0
- WMCore/Services/AlertManager/__init__.py +0 -0
- WMCore/Services/CRIC/CRIC.py +238 -0
- WMCore/Services/CRIC/__init__.py +0 -0
- WMCore/Services/DBS/DBS3Reader.py +1044 -0
- WMCore/Services/DBS/DBSConcurrency.py +44 -0
- WMCore/Services/DBS/DBSErrors.py +112 -0
- WMCore/Services/DBS/DBSReader.py +23 -0
- WMCore/Services/DBS/DBSUtils.py +166 -0
- WMCore/Services/DBS/DBSWriterObjects.py +381 -0
- WMCore/Services/DBS/ProdException.py +133 -0
- WMCore/Services/DBS/__init__.py +8 -0
- WMCore/Services/FWJRDB/FWJRDBAPI.py +118 -0
- WMCore/Services/FWJRDB/__init__.py +0 -0
- WMCore/Services/HTTPS/HTTPSAuthHandler.py +66 -0
- WMCore/Services/HTTPS/__init__.py +0 -0
- WMCore/Services/LogDB/LogDB.py +201 -0
- WMCore/Services/LogDB/LogDBBackend.py +191 -0
- WMCore/Services/LogDB/LogDBExceptions.py +11 -0
- WMCore/Services/LogDB/LogDBReport.py +85 -0
- WMCore/Services/LogDB/__init__.py +0 -0
- WMCore/Services/MSPileup/__init__.py +0 -0
- WMCore/Services/MSUtils/MSUtils.py +54 -0
- WMCore/Services/MSUtils/__init__.py +0 -0
- WMCore/Services/McM/McM.py +173 -0
- WMCore/Services/McM/__init__.py +8 -0
- WMCore/Services/MonIT/Grafana.py +133 -0
- WMCore/Services/MonIT/__init__.py +0 -0
- WMCore/Services/PyCondor/PyCondorAPI.py +154 -0
- WMCore/Services/PyCondor/__init__.py +0 -0
- WMCore/Services/ReqMgr/ReqMgr.py +261 -0
- WMCore/Services/ReqMgr/__init__.py +0 -0
- WMCore/Services/ReqMgrAux/ReqMgrAux.py +419 -0
- WMCore/Services/ReqMgrAux/__init__.py +0 -0
- WMCore/Services/RequestDB/RequestDBReader.py +267 -0
- WMCore/Services/RequestDB/RequestDBWriter.py +39 -0
- WMCore/Services/RequestDB/__init__.py +0 -0
- WMCore/Services/Requests.py +624 -0
- WMCore/Services/Rucio/Rucio.py +1290 -0
- WMCore/Services/Rucio/RucioUtils.py +74 -0
- WMCore/Services/Rucio/__init__.py +0 -0
- WMCore/Services/RucioConMon/RucioConMon.py +121 -0
- WMCore/Services/RucioConMon/__init__.py +0 -0
- WMCore/Services/Service.py +400 -0
- WMCore/Services/StompAMQ/__init__.py +0 -0
- WMCore/Services/TagCollector/TagCollector.py +155 -0
- WMCore/Services/TagCollector/XMLUtils.py +98 -0
- WMCore/Services/TagCollector/__init__.py +0 -0
- WMCore/Services/UUIDLib.py +13 -0
- WMCore/Services/UserFileCache/UserFileCache.py +160 -0
- WMCore/Services/UserFileCache/__init__.py +8 -0
- WMCore/Services/WMAgent/WMAgent.py +63 -0
- WMCore/Services/WMAgent/__init__.py +0 -0
- WMCore/Services/WMArchive/CMSSWMetrics.py +526 -0
- WMCore/Services/WMArchive/DataMap.py +463 -0
- WMCore/Services/WMArchive/WMArchive.py +33 -0
- WMCore/Services/WMArchive/__init__.py +0 -0
- WMCore/Services/WMBS/WMBS.py +97 -0
- WMCore/Services/WMBS/__init__.py +0 -0
- WMCore/Services/WMStats/DataStruct/RequestInfoCollection.py +300 -0
- WMCore/Services/WMStats/DataStruct/__init__.py +0 -0
- WMCore/Services/WMStats/WMStatsPycurl.py +145 -0
- WMCore/Services/WMStats/WMStatsReader.py +445 -0
- WMCore/Services/WMStats/WMStatsWriter.py +273 -0
- WMCore/Services/WMStats/__init__.py +0 -0
- WMCore/Services/WMStatsServer/WMStatsServer.py +134 -0
- WMCore/Services/WMStatsServer/__init__.py +0 -0
- WMCore/Services/WorkQueue/WorkQueue.py +492 -0
- WMCore/Services/WorkQueue/__init__.py +0 -0
- WMCore/Services/__init__.py +8 -0
- WMCore/Services/pycurl_manager.py +574 -0
- WMCore/WMBase.py +50 -0
- WMCore/WMConnectionBase.py +164 -0
- WMCore/WMException.py +183 -0
- WMCore/WMExceptions.py +269 -0
- WMCore/WMFactory.py +76 -0
- WMCore/WMInit.py +377 -0
- WMCore/WMLogging.py +104 -0
- WMCore/WMSpec/ConfigSectionTree.py +442 -0
- WMCore/WMSpec/Persistency.py +135 -0
- WMCore/WMSpec/Steps/BuildMaster.py +87 -0
- WMCore/WMSpec/Steps/BuildTools.py +201 -0
- WMCore/WMSpec/Steps/Builder.py +97 -0
- WMCore/WMSpec/Steps/Diagnostic.py +89 -0
- WMCore/WMSpec/Steps/Emulator.py +62 -0
- WMCore/WMSpec/Steps/ExecuteMaster.py +208 -0
- WMCore/WMSpec/Steps/Executor.py +210 -0
- WMCore/WMSpec/Steps/StepFactory.py +213 -0
- WMCore/WMSpec/Steps/TaskEmulator.py +75 -0
- WMCore/WMSpec/Steps/Template.py +204 -0
- WMCore/WMSpec/Steps/Templates/AlcaHarvest.py +76 -0
- WMCore/WMSpec/Steps/Templates/CMSSW.py +613 -0
- WMCore/WMSpec/Steps/Templates/DQMUpload.py +59 -0
- WMCore/WMSpec/Steps/Templates/DeleteFiles.py +70 -0
- WMCore/WMSpec/Steps/Templates/LogArchive.py +84 -0
- WMCore/WMSpec/Steps/Templates/LogCollect.py +105 -0
- WMCore/WMSpec/Steps/Templates/StageOut.py +105 -0
- WMCore/WMSpec/Steps/Templates/__init__.py +10 -0
- WMCore/WMSpec/Steps/WMExecutionFailure.py +21 -0
- WMCore/WMSpec/Steps/__init__.py +8 -0
- WMCore/WMSpec/Utilities.py +63 -0
- WMCore/WMSpec/WMSpecErrors.py +12 -0
- WMCore/WMSpec/WMStep.py +347 -0
- WMCore/WMSpec/WMTask.py +1997 -0
- WMCore/WMSpec/WMWorkload.py +2288 -0
- WMCore/WMSpec/WMWorkloadTools.py +382 -0
- WMCore/WMSpec/__init__.py +9 -0
- WMCore/WorkQueue/DataLocationMapper.py +273 -0
- WMCore/WorkQueue/DataStructs/ACDCBlock.py +47 -0
- WMCore/WorkQueue/DataStructs/Block.py +48 -0
- WMCore/WorkQueue/DataStructs/CouchWorkQueueElement.py +148 -0
- WMCore/WorkQueue/DataStructs/WorkQueueElement.py +274 -0
- WMCore/WorkQueue/DataStructs/WorkQueueElementResult.py +152 -0
- WMCore/WorkQueue/DataStructs/WorkQueueElementsSummary.py +185 -0
- WMCore/WorkQueue/DataStructs/__init__.py +0 -0
- WMCore/WorkQueue/Policy/End/EndPolicyInterface.py +44 -0
- WMCore/WorkQueue/Policy/End/SingleShot.py +22 -0
- WMCore/WorkQueue/Policy/End/__init__.py +32 -0
- WMCore/WorkQueue/Policy/PolicyInterface.py +17 -0
- WMCore/WorkQueue/Policy/Start/Block.py +258 -0
- WMCore/WorkQueue/Policy/Start/Dataset.py +180 -0
- WMCore/WorkQueue/Policy/Start/MonteCarlo.py +131 -0
- WMCore/WorkQueue/Policy/Start/ResubmitBlock.py +171 -0
- WMCore/WorkQueue/Policy/Start/StartPolicyInterface.py +316 -0
- WMCore/WorkQueue/Policy/Start/__init__.py +34 -0
- WMCore/WorkQueue/Policy/__init__.py +57 -0
- WMCore/WorkQueue/WMBSHelper.py +772 -0
- WMCore/WorkQueue/WorkQueue.py +1237 -0
- WMCore/WorkQueue/WorkQueueBackend.py +750 -0
- WMCore/WorkQueue/WorkQueueBase.py +39 -0
- WMCore/WorkQueue/WorkQueueExceptions.py +44 -0
- WMCore/WorkQueue/WorkQueueReqMgrInterface.py +278 -0
- WMCore/WorkQueue/WorkQueueUtils.py +130 -0
- WMCore/WorkQueue/__init__.py +13 -0
- WMCore/Wrappers/JsonWrapper/JSONThunker.py +342 -0
- WMCore/Wrappers/JsonWrapper/__init__.py +7 -0
- WMCore/Wrappers/__init__.py +6 -0
- WMCore/__init__.py +10 -0
- wmglobalqueue-2.4.5.1.data/data/bin/wmc-dist-patch +15 -0
- wmglobalqueue-2.4.5.1.data/data/bin/wmc-dist-unpatch +8 -0
- wmglobalqueue-2.4.5.1.data/data/bin/wmc-httpd +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/.couchapprc +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/README.md +40 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/index.html +264 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/ElementInfoByWorkflow.js +96 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/StuckElementInfo.js +57 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/WorkloadInfoTable.js +80 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/dataTable.js +70 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/namespace.js +23 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/style/main.css +75 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/couchapp.json +4 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/childQueueFilter.js +13 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/filterDeletedDocs.js +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/queueFilter.js +11 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/language +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/mustache.js +333 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/validate.js +27 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/workqueue_utils.js +61 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/elementsDetail.js +28 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/filter.js +86 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/stuckElements.js +38 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/workRestrictions.js +153 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/workflowSummary.js +28 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/rewrites.json +73 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/shows/redirect.js +23 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/shows/status.js +40 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/ElementSummaryByWorkflow.html +27 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/StuckElementSummary.html +26 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/TaskStatus.html +23 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/WorkflowSummary.html +27 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/workqueue-common-lib.html +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib-remote.html +16 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib.html +18 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/updates/in-place.js +50 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/validate_doc_update.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.couch.app.js +235 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.pathbinder.js +173 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeData/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeParentData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeParentData/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activePileupData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activePileupData/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/analyticsData/map.js +11 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/analyticsData/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/availableByPriority/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/conflicts/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elements/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByParent/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByParentData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByPileupData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByStatus/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsBySubscription/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/reduce.js +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsDetailByWorkflowAndStatus/map.js +26 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/map.js +10 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatus/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatus/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/openRequests/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/recent-items/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/specsByWorkflow/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/stuckElements/map.js +38 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/map.js +12 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/reduce.js +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrl/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrl/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/workflowSummary/map.js +9 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/workflowSummary/reduce.js +10 -0
- wmglobalqueue-2.4.5.1.dist-info/METADATA +26 -0
- wmglobalqueue-2.4.5.1.dist-info/RECORD +347 -0
- wmglobalqueue-2.4.5.1.dist-info/WHEEL +5 -0
- wmglobalqueue-2.4.5.1.dist-info/licenses/LICENSE +202 -0
- wmglobalqueue-2.4.5.1.dist-info/licenses/NOTICE +16 -0
- 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
|