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
WMCore/REST/Error.py
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
from builtins import str as newstr
|
|
2
|
+
import random, cherrypy
|
|
3
|
+
|
|
4
|
+
class RESTError(Exception):
|
|
5
|
+
"""Base class for REST errors.
|
|
6
|
+
|
|
7
|
+
.. attribute:: http_code
|
|
8
|
+
|
|
9
|
+
Integer, HTTP status code for this error. Also emitted as X-Error-HTTP
|
|
10
|
+
header value.
|
|
11
|
+
|
|
12
|
+
.. attribute:: app_code
|
|
13
|
+
|
|
14
|
+
Integer, application error code, to be emitted as X-REST-Status header.
|
|
15
|
+
|
|
16
|
+
.. attribute:: message
|
|
17
|
+
|
|
18
|
+
String, information about the error, to be emitted as X-Error-Detail
|
|
19
|
+
header. Should not contain anything sensitive, and in particular should
|
|
20
|
+
never include any unvalidated or unsafe data, e.g. input parameters or
|
|
21
|
+
data from a database. Normally a fixed label with one-to-one match with
|
|
22
|
+
the :obj:`app-code`. If the text exceeds 200 characters, it's truncated.
|
|
23
|
+
Since this is emitted as a HTTP header, it cannot contain newlines or
|
|
24
|
+
anything encoding-dependent.
|
|
25
|
+
|
|
26
|
+
.. attribute:: info
|
|
27
|
+
|
|
28
|
+
String, additional information beyond :obj:`message`, to be emitted as
|
|
29
|
+
X-Error-Info header. Like :obj:`message` should not contain anything
|
|
30
|
+
sensitive or unsafe, or text inappropriate for a HTTP response header,
|
|
31
|
+
and should be short enough to fit in 200 characters. This is normally
|
|
32
|
+
free form text to clarify why the error happened.
|
|
33
|
+
|
|
34
|
+
.. attribute:: errid
|
|
35
|
+
|
|
36
|
+
String, random unique identifier for this error, to be emitted as
|
|
37
|
+
X-Error-ID header and output into server logs when logging the error.
|
|
38
|
+
The purpose is that clients save this id when they receive an error,
|
|
39
|
+
and further error reporting or debugging can use this value to identify
|
|
40
|
+
the specific error, and for example to grep logs for more information.
|
|
41
|
+
|
|
42
|
+
.. attribute:: errobj
|
|
43
|
+
|
|
44
|
+
If the problem was caused by another exception being raised in the code,
|
|
45
|
+
reference to the original exception object. For example if the code dies
|
|
46
|
+
with an :class:`KeyError`, this is the original exception object. This
|
|
47
|
+
error is logged to the server logs when reporting the error, but no
|
|
48
|
+
information about it is returned to the HTTP client.
|
|
49
|
+
|
|
50
|
+
.. attribute:: trace
|
|
51
|
+
|
|
52
|
+
The origin of the exception as returned by :func:`format_exc`. The full
|
|
53
|
+
trace is emitted to the server logs, each line prefixed with timestamp.
|
|
54
|
+
This information is not returned to the HTTP client.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
http_code = None
|
|
58
|
+
app_code = None
|
|
59
|
+
message = None
|
|
60
|
+
info = None
|
|
61
|
+
errid = None
|
|
62
|
+
errobj = None
|
|
63
|
+
trace = None
|
|
64
|
+
|
|
65
|
+
def __init__(self, info = None, errobj = None, trace = None):
|
|
66
|
+
self.errid = "%032x" % random.randrange(1 << 128)
|
|
67
|
+
self.errobj = errobj
|
|
68
|
+
self.info = info
|
|
69
|
+
self.trace = trace
|
|
70
|
+
|
|
71
|
+
def __str__(self):
|
|
72
|
+
return "%s %s [HTTP %d, APP %d, MSG %s, INFO %s, ERR %s]" \
|
|
73
|
+
% (self.__class__.__name__, self.errid, self.http_code, self.app_code,
|
|
74
|
+
repr(self.message).replace("\n", " ~~ "),
|
|
75
|
+
repr(self.info).replace("\n", " ~~ "),
|
|
76
|
+
repr(self.errobj).replace("\n", " ~~ "))
|
|
77
|
+
|
|
78
|
+
class NotAcceptable(RESTError):
|
|
79
|
+
"Client did not specify format it accepts, or no compatible format was found."
|
|
80
|
+
http_code = 406
|
|
81
|
+
app_code = 201
|
|
82
|
+
message = "Not acceptable"
|
|
83
|
+
|
|
84
|
+
class UnsupportedMethod(RESTError):
|
|
85
|
+
"Client used HTTP request method which isn't supported for any API call."
|
|
86
|
+
http_code = 405
|
|
87
|
+
app_code = 202
|
|
88
|
+
message = "Request method not supported"
|
|
89
|
+
|
|
90
|
+
class MethodWithoutQueryString(RESTError):
|
|
91
|
+
"Client provided a query string which isn't acceptable for this request method."
|
|
92
|
+
http_code = 405
|
|
93
|
+
app_code = 203
|
|
94
|
+
message = "Query arguments not supported for this request method"
|
|
95
|
+
|
|
96
|
+
class APIMethodMismatch(RESTError):
|
|
97
|
+
"""Both the API and HTTP request methods are supported, but not in that
|
|
98
|
+
combination."""
|
|
99
|
+
http_code = 405
|
|
100
|
+
app_code = 204
|
|
101
|
+
message = "API not supported for this request method"
|
|
102
|
+
|
|
103
|
+
class APINotSpecified(RESTError):
|
|
104
|
+
"The request URL is missing API argument."
|
|
105
|
+
http_code = 400
|
|
106
|
+
app_code = 205
|
|
107
|
+
message = "API not specified"
|
|
108
|
+
|
|
109
|
+
class NoSuchInstance(RESTError):
|
|
110
|
+
"""The request URL is missing instance argument or the specified instance
|
|
111
|
+
does not exist."""
|
|
112
|
+
http_code = 404
|
|
113
|
+
app_code = 206
|
|
114
|
+
message = "No such instance"
|
|
115
|
+
|
|
116
|
+
class APINotSupported(RESTError):
|
|
117
|
+
"The request URL provides wrong API argument."
|
|
118
|
+
http_code = 404
|
|
119
|
+
app_code = 207
|
|
120
|
+
message = "API not supported"
|
|
121
|
+
|
|
122
|
+
class DataCacheEmpty(RESTError):
|
|
123
|
+
"The wmstats data cache has not be created."
|
|
124
|
+
http_code = 503
|
|
125
|
+
app_code = 208
|
|
126
|
+
message = "DataCache is Empty"
|
|
127
|
+
|
|
128
|
+
class DatabaseError(RESTError):
|
|
129
|
+
"""Parent class for database-related errors.
|
|
130
|
+
|
|
131
|
+
.. attribute: lastsql
|
|
132
|
+
|
|
133
|
+
A tuple of *(sql, binds, kwbinds),* where `sql` is the last SQL statement
|
|
134
|
+
executed and `binds`, `kwbinds` are the bind values used with it. Any
|
|
135
|
+
sensitive parts like passwords have already been censored from the `sql`
|
|
136
|
+
string. Note that for massive requests `binds` or `kwbinds` can get large.
|
|
137
|
+
These are logged out in the server logs when reporting the error, but no
|
|
138
|
+
information about these are returned to the HTTP client.
|
|
139
|
+
|
|
140
|
+
.. attribute: intance
|
|
141
|
+
|
|
142
|
+
String, the database instance for which the error occurred. This is
|
|
143
|
+
reported in the error message output to server logs, but no information
|
|
144
|
+
about this is returned to the HTTP client."""
|
|
145
|
+
|
|
146
|
+
lastsql = None
|
|
147
|
+
instance = None
|
|
148
|
+
def __init__(self, info = None, errobj = None, trace = None,
|
|
149
|
+
lastsql = None, instance = None):
|
|
150
|
+
RESTError.__init__(self, info, errobj, trace)
|
|
151
|
+
self.lastsql = lastsql
|
|
152
|
+
self.instance = instance
|
|
153
|
+
|
|
154
|
+
class DatabaseUnavailable(DatabaseError):
|
|
155
|
+
"""The instance argument is correct, but cannot connect to the database.
|
|
156
|
+
This error will only occur at initial attempt to connect to the database,
|
|
157
|
+
:class:`~.DatabaseConnectionError` is raised instead if the connection
|
|
158
|
+
ends prematurely after the transaction has already begun successfully."""
|
|
159
|
+
http_code = 503
|
|
160
|
+
app_code = 401
|
|
161
|
+
message = "Database unavailable"
|
|
162
|
+
|
|
163
|
+
class DatabaseConnectionError(DatabaseError):
|
|
164
|
+
"""Database was available when the operation started, but the connection
|
|
165
|
+
was lost or otherwise failed during the application operation."""
|
|
166
|
+
http_code = 504
|
|
167
|
+
app_code = 402
|
|
168
|
+
message = "Database connection failure"
|
|
169
|
+
|
|
170
|
+
class DatabaseExecutionError(DatabaseError):
|
|
171
|
+
"""Database operation failed."""
|
|
172
|
+
http_code = 500
|
|
173
|
+
app_code = 403
|
|
174
|
+
message = "Execution error"
|
|
175
|
+
|
|
176
|
+
class MissingParameter(RESTError):
|
|
177
|
+
"Client did not supply a parameter which is required."
|
|
178
|
+
http_code = 400
|
|
179
|
+
app_code = 301
|
|
180
|
+
message = "Missing required parameter"
|
|
181
|
+
|
|
182
|
+
class InvalidParameter(RESTError):
|
|
183
|
+
"Client supplied invalid value for a parameter."
|
|
184
|
+
http_code = 400
|
|
185
|
+
app_code = 302
|
|
186
|
+
message = "Invalid input parameter"
|
|
187
|
+
|
|
188
|
+
class MissingObject(RESTError):
|
|
189
|
+
"""An object required for the operation is missing. This might be a
|
|
190
|
+
pre-requisite needed to create a reference, or attempt to delete
|
|
191
|
+
an object which does not exist."""
|
|
192
|
+
http_code = 400
|
|
193
|
+
app_code = 303
|
|
194
|
+
message = "Required object is missing"
|
|
195
|
+
|
|
196
|
+
class TooManyObjects(RESTError):
|
|
197
|
+
"""Too many objects matched specified criteria. Usually this means
|
|
198
|
+
more than one object was matched, deleted, or inserted, when only
|
|
199
|
+
exactly one should have been subject to the operation."""
|
|
200
|
+
http_code = 400
|
|
201
|
+
app_code = 304
|
|
202
|
+
message = "Too many objects"
|
|
203
|
+
|
|
204
|
+
class ObjectAlreadyExists(RESTError):
|
|
205
|
+
"""An already existing object is on the way of the operation. This
|
|
206
|
+
is usually caused by uniqueness constraint violations when creating
|
|
207
|
+
new objects."""
|
|
208
|
+
http_code = 400
|
|
209
|
+
app_code = 305
|
|
210
|
+
message = "Object already exists"
|
|
211
|
+
|
|
212
|
+
class InvalidObject(RESTError):
|
|
213
|
+
"The specified object is invalid."
|
|
214
|
+
http_code = 400
|
|
215
|
+
app_code = 306
|
|
216
|
+
message = "Invalid object"
|
|
217
|
+
|
|
218
|
+
class ExecutionError(RESTError):
|
|
219
|
+
"""Input was in principle correct but there was an error processing
|
|
220
|
+
the request. This normally means either programming error, timeout, or
|
|
221
|
+
an unusual and unexpected problem with the database. For security reasons
|
|
222
|
+
little additional information is returned. If the problem persists, client
|
|
223
|
+
should contact service operators. The returned error id can be used as a
|
|
224
|
+
reference."""
|
|
225
|
+
http_code = 500
|
|
226
|
+
app_code = 403
|
|
227
|
+
message = "Execution error"
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
class MissingBodyData(RESTError):
|
|
231
|
+
"""Exception for requests missing body data."""
|
|
232
|
+
http_code = 400
|
|
233
|
+
app_code = 1201
|
|
234
|
+
|
|
235
|
+
def __init__(self):
|
|
236
|
+
RESTError.__init__(self)
|
|
237
|
+
self.message = "User did not pass any body data with the request"
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
class InvalidUnifiedSchema(RESTError):
|
|
241
|
+
"""Exception for incorrect user data schema."""
|
|
242
|
+
http_code = 400
|
|
243
|
+
app_code = 1202
|
|
244
|
+
|
|
245
|
+
def __init__(self, message):
|
|
246
|
+
RESTError.__init__(self)
|
|
247
|
+
self.message = message
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def report_error_header(header, val):
|
|
251
|
+
"""If `val` is non-empty, set CherryPy response `header` to `val`.
|
|
252
|
+
Replaces all newlines with "; " characters. If the resulting value is
|
|
253
|
+
longer than 200 characters, truncates it to the first 197 characters
|
|
254
|
+
and leaves a trailing ellipsis "..."."""
|
|
255
|
+
if val:
|
|
256
|
+
val = val.replace("\n", "; ")
|
|
257
|
+
if len(val) > 200: val = val[:197] + "..."
|
|
258
|
+
cherrypy.response.headers[header] = val
|
|
259
|
+
|
|
260
|
+
def report_rest_error(err, trace, throw):
|
|
261
|
+
"""Report a REST error: generate an appropriate log message, set the
|
|
262
|
+
response headers and raise an appropriate :class:`~.HTTPError`.
|
|
263
|
+
|
|
264
|
+
Normally `throw` would be True to translate the exception `err` into
|
|
265
|
+
a HTTP server error, but the function can also be called with `throw`
|
|
266
|
+
set to False if the purpose is merely to log an exception message.
|
|
267
|
+
|
|
268
|
+
:arg err: exception object.
|
|
269
|
+
:arg trace: stack trace to use in case `err` doesn't have one.
|
|
270
|
+
:arg throw: raise a :class:`~.HTTPError` if True."""
|
|
271
|
+
if isinstance(err, DatabaseError) and err.errobj:
|
|
272
|
+
offset = None
|
|
273
|
+
sql, binds, kwbinds = err.lastsql
|
|
274
|
+
if sql and err.errobj.args and hasattr(err.errobj.args[0], 'offset'):
|
|
275
|
+
offset = err.errobj.args[0].offset
|
|
276
|
+
sql = sql[:offset] + "<**>" + sql[offset:]
|
|
277
|
+
cherrypy.log("SERVER DATABASE ERROR %d/%d %s %s.%s %s [instance: %s] (%s);"
|
|
278
|
+
" last statement: %s; binds: %s, %s; offset: %s"
|
|
279
|
+
% (err.http_code, err.app_code, err.message,
|
|
280
|
+
getattr(err.errobj, "__module__", "__builtins__"),
|
|
281
|
+
err.errobj.__class__.__name__,
|
|
282
|
+
err.errid, err.instance, newstr(err.errobj).rstrip(),
|
|
283
|
+
sql, binds, kwbinds, offset))
|
|
284
|
+
for line in err.trace.rstrip().split("\n"): cherrypy.log(" " + line)
|
|
285
|
+
cherrypy.response.headers["X-REST-Status"] = newstr(err.app_code)
|
|
286
|
+
cherrypy.response.headers["X-Error-HTTP"] = newstr(err.http_code)
|
|
287
|
+
cherrypy.response.headers["X-Error-ID"] = err.errid
|
|
288
|
+
report_error_header("X-Error-Detail", err.message)
|
|
289
|
+
report_error_header("X-Error-Info", err.info)
|
|
290
|
+
if throw: raise cherrypy.HTTPError(err.http_code, err.message)
|
|
291
|
+
elif isinstance(err, RESTError):
|
|
292
|
+
if err.errobj:
|
|
293
|
+
cherrypy.log("SERVER REST ERROR %s.%s %s (%s); derived from %s.%s (%s)"
|
|
294
|
+
% (err.__module__, err.__class__.__name__,
|
|
295
|
+
err.errid, err.message,
|
|
296
|
+
getattr(err.errobj, "__module__", "__builtins__"),
|
|
297
|
+
err.errobj.__class__.__name__,
|
|
298
|
+
newstr(err.errobj).rstrip()))
|
|
299
|
+
trace = err.trace
|
|
300
|
+
else:
|
|
301
|
+
cherrypy.log("SERVER REST ERROR %s.%s %s (%s)"
|
|
302
|
+
% (err.__module__, err.__class__.__name__,
|
|
303
|
+
err.errid, err.message))
|
|
304
|
+
for line in trace.rstrip().split("\n"): cherrypy.log(" " + line)
|
|
305
|
+
cherrypy.response.headers["X-REST-Status"] = newstr(err.app_code)
|
|
306
|
+
cherrypy.response.headers["X-Error-HTTP"] = newstr(err.http_code)
|
|
307
|
+
cherrypy.response.headers["X-Error-ID"] = err.errid
|
|
308
|
+
report_error_header("X-Error-Detail", err.message)
|
|
309
|
+
report_error_header("X-Error-Info", err.info)
|
|
310
|
+
if throw: raise cherrypy.HTTPError(err.http_code, err.message)
|
|
311
|
+
elif isinstance(err, cherrypy.HTTPError):
|
|
312
|
+
errid = "%032x" % random.randrange(1 << 128)
|
|
313
|
+
cherrypy.log("SERVER HTTP ERROR %s.%s %s (%s)"
|
|
314
|
+
% (err.__module__, err.__class__.__name__,
|
|
315
|
+
errid, newstr(err).rstrip()))
|
|
316
|
+
for line in trace.rstrip().split("\n"): cherrypy.log(" " + line)
|
|
317
|
+
cherrypy.response.headers["X-REST-Status"] = newstr(200)
|
|
318
|
+
cherrypy.response.headers["X-Error-HTTP"] = newstr(err.status)
|
|
319
|
+
cherrypy.response.headers["X-Error-ID"] = errid
|
|
320
|
+
report_error_header("X-Error-Detail", err._message)
|
|
321
|
+
if throw: raise err
|
|
322
|
+
else:
|
|
323
|
+
errid = "%032x" % random.randrange(1 << 128)
|
|
324
|
+
cherrypy.log("SERVER OTHER ERROR %s.%s %s (%s)"
|
|
325
|
+
% (getattr(err, "__module__", "__builtins__"),
|
|
326
|
+
err.__class__.__name__,
|
|
327
|
+
errid, newstr(err).rstrip()))
|
|
328
|
+
for line in trace.rstrip().split("\n"): cherrypy.log(" " + line)
|
|
329
|
+
cherrypy.response.headers["X-REST-Status"] = 400
|
|
330
|
+
cherrypy.response.headers["X-Error-HTTP"] = 500
|
|
331
|
+
cherrypy.response.headers["X-Error-ID"] = errid
|
|
332
|
+
report_error_header("X-Error-Detail", "Server error")
|
|
333
|
+
if throw: raise cherrypy.HTTPError(500, "Server error")
|