wmglobalqueue 2.3.10__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of wmglobalqueue might be problematic. Click here for more details.
- Utils/CPMetrics.py +270 -0
- Utils/CertTools.py +62 -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/ProcessStats.py +103 -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 +308 -0
- Utils/__init__.py +11 -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 +651 -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 +1349 -0
- WMCore/Database/ConfigDBMap.py +29 -0
- WMCore/Database/CouchUtils.py +118 -0
- WMCore/Database/DBCore.py +198 -0
- WMCore/Database/DBCreator.py +113 -0
- WMCore/Database/DBExceptionHandler.py +57 -0
- WMCore/Database/DBFactory.py +110 -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 +623 -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 +113 -0
- WMCore/Services/DBS/DBSReader.py +23 -0
- WMCore/Services/DBS/DBSUtils.py +139 -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/PyCondorUtils.py +105 -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 +1287 -0
- WMCore/Services/Rucio/RucioUtils.py +74 -0
- WMCore/Services/Rucio/__init__.py +0 -0
- WMCore/Services/RucioConMon/RucioConMon.py +128 -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 +228 -0
- WMCore/WMLogging.py +108 -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 +1980 -0
- WMCore/WMSpec/WMWorkload.py +2288 -0
- WMCore/WMSpec/WMWorkloadTools.py +370 -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.3.10.data/data/bin/wmc-dist-patch +15 -0
- wmglobalqueue-2.3.10.data/data/bin/wmc-dist-unpatch +8 -0
- wmglobalqueue-2.3.10.data/data/bin/wmc-httpd +3 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/.couchapprc +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/README.md +40 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/index.html +264 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/js/ElementInfoByWorkflow.js +96 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/js/StuckElementInfo.js +57 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/js/WorkloadInfoTable.js +80 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/js/dataTable.js +70 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/js/namespace.js +23 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/_attachments/style/main.css +75 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/couchapp.json +4 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/filters/childQueueFilter.js +13 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/filters/filterDeletedDocs.js +3 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/filters/queueFilter.js +11 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/language +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lib/mustache.js +333 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lib/validate.js +27 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lib/workqueue_utils.js +61 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lists/elementsDetail.js +28 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lists/filter.js +86 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lists/stuckElements.js +38 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lists/workRestrictions.js +153 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/lists/workflowSummary.js +28 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/rewrites.json +73 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/shows/redirect.js +23 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/shows/status.js +40 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/ElementSummaryByWorkflow.html +27 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/StuckElementSummary.html +26 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/TaskStatus.html +23 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/WorkflowSummary.html +27 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/partials/workqueue-common-lib.html +2 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib-remote.html +16 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib.html +18 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/updates/in-place.js +50 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/validate_doc_update.js +8 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.couch.app.js +235 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.pathbinder.js +173 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activeData/map.js +8 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activeData/reduce.js +2 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activeParentData/map.js +8 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activeParentData/reduce.js +2 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activePileupData/map.js +8 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/activePileupData/reduce.js +2 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/analyticsData/map.js +11 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/analyticsData/reduce.js +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/availableByPriority/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/conflicts/map.js +5 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elements/map.js +5 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByData/map.js +8 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByParent/map.js +8 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByParentData/map.js +8 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByPileupData/map.js +8 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByStatus/map.js +8 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsBySubscription/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/map.js +8 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/reduce.js +3 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/elementsDetailByWorkflowAndStatus/map.js +26 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/map.js +10 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/reduce.js +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/reduce.js +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/reduce.js +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/reduce.js +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByRequest/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByRequest/reduce.js +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByStatus/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByStatus/reduce.js +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/reduce.js +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/openRequests/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/recent-items/map.js +5 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/reduce.js +1 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/specsByWorkflow/map.js +5 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/stuckElements/map.js +38 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/map.js +12 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/reduce.js +3 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsUrl/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsUrl/reduce.js +2 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/map.js +6 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/reduce.js +2 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/workflowSummary/map.js +9 -0
- wmglobalqueue-2.3.10.data/data/data/couchapps/WorkQueue/views/workflowSummary/reduce.js +10 -0
- wmglobalqueue-2.3.10.dist-info/LICENSE +202 -0
- wmglobalqueue-2.3.10.dist-info/METADATA +24 -0
- wmglobalqueue-2.3.10.dist-info/NOTICE +16 -0
- wmglobalqueue-2.3.10.dist-info/RECORD +345 -0
- wmglobalqueue-2.3.10.dist-info/WHEEL +5 -0
- wmglobalqueue-2.3.10.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)
|