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,111 @@
|
|
|
1
|
+
"""
|
|
2
|
+
|
|
3
|
+
AlertManagerAPI - send alerts to MONIT AlertManager via API calls
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import division
|
|
7
|
+
from builtins import object
|
|
8
|
+
from datetime import timedelta, datetime
|
|
9
|
+
import socket
|
|
10
|
+
import json
|
|
11
|
+
import logging
|
|
12
|
+
|
|
13
|
+
from WMCore.Services.pycurl_manager import RequestHandler
|
|
14
|
+
from Utils.Timers import LocalTimezone
|
|
15
|
+
from Utils.Utilities import normalize_spaces
|
|
16
|
+
from WMCore.Services.UUIDLib import makeUUID
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AlertManagerAPI(object):
|
|
20
|
+
"""
|
|
21
|
+
A class used to send alerts via the MONIT AlertManager API
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, alertManagerUrl, logger=None):
|
|
25
|
+
self.alertManagerUrl = alertManagerUrl
|
|
26
|
+
# sender's hostname is added as an annotation
|
|
27
|
+
self.hostname = socket.gethostname()
|
|
28
|
+
self.mgr = RequestHandler()
|
|
29
|
+
self.ltz = LocalTimezone()
|
|
30
|
+
self.headers = {"Content-Type": "application/json"}
|
|
31
|
+
self.validSeverity = ["high", "medium", "low"]
|
|
32
|
+
self.logger = logger if logger else logging.getLogger()
|
|
33
|
+
|
|
34
|
+
def sendAlert(self, alertName, severity, summary, description, service, tag="wmcore", endSecs=600, generatorURL=""):
|
|
35
|
+
"""
|
|
36
|
+
:param alertName: a unique name for the alert
|
|
37
|
+
:param severity: low, medium, high
|
|
38
|
+
:param summary: a short description of the alert
|
|
39
|
+
:param description: a longer informational message with details about the alert
|
|
40
|
+
:param service: the name of the service firing an alert
|
|
41
|
+
:param tag: a unique tag used to help route the alert
|
|
42
|
+
:param endSecs: how many minutes until the alarm is silenced
|
|
43
|
+
:param generatorURL: this URL will be sent to AlertManager and configured as a clickable "Source" link in the web interface
|
|
44
|
+
|
|
45
|
+
AlertManager JSON format reference: https://www.prometheus.io/docs/alerting/latest/clients/
|
|
46
|
+
[
|
|
47
|
+
{
|
|
48
|
+
"labels": {
|
|
49
|
+
"alertname": "<requiredAlertName>",
|
|
50
|
+
"<labelname>": "<labelvalue>",
|
|
51
|
+
...
|
|
52
|
+
},
|
|
53
|
+
"annotations": {
|
|
54
|
+
"<labelname>": "<labelvalue>",
|
|
55
|
+
...
|
|
56
|
+
},
|
|
57
|
+
"startsAt": "<rfc3339>", # optional, will be current time if not present
|
|
58
|
+
"endsAt": "<rfc3339>",
|
|
59
|
+
"generatorURL": "<generator_url>" # optional
|
|
60
|
+
},
|
|
61
|
+
]
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
if not self._isValidSeverity(severity):
|
|
65
|
+
return False
|
|
66
|
+
|
|
67
|
+
request = []
|
|
68
|
+
alert = {}
|
|
69
|
+
labels = {}
|
|
70
|
+
annotations = {}
|
|
71
|
+
|
|
72
|
+
# add labels
|
|
73
|
+
labels["alertname"] = alertName
|
|
74
|
+
labels["severity"] = severity
|
|
75
|
+
labels["tag"] = tag
|
|
76
|
+
labels["service"] = service
|
|
77
|
+
labels["uuid"] = makeUUID()
|
|
78
|
+
alert["labels"] = labels
|
|
79
|
+
|
|
80
|
+
# add annotations
|
|
81
|
+
annotations["hostname"] = self.hostname
|
|
82
|
+
annotations["summary"] = normalize_spaces(summary)
|
|
83
|
+
annotations["description"] = normalize_spaces(description)
|
|
84
|
+
alert["annotations"] = annotations
|
|
85
|
+
|
|
86
|
+
# In python3 we won't need the LocalTimezone class
|
|
87
|
+
# Will change to d = datetime.now().astimezone() + timedelta(seconds=endSecs)
|
|
88
|
+
d = datetime.now(self.ltz) + timedelta(seconds=endSecs)
|
|
89
|
+
alert["endsAt"] = d.isoformat("T")
|
|
90
|
+
alert["generatorURL"] = generatorURL
|
|
91
|
+
|
|
92
|
+
request.append(alert)
|
|
93
|
+
# need to do this because pycurl_manager only accepts dict and encoded strings type
|
|
94
|
+
params = json.dumps(request)
|
|
95
|
+
|
|
96
|
+
# provide dump of alert send to AM which will allow to match it in WM logs
|
|
97
|
+
header, res = self.mgr.request(self.alertManagerUrl, params=params, headers=self.headers, verb='POST')
|
|
98
|
+
self.logger.info("ALERT: name=%s UUID=%s, HTTP status code=%s", alertName, labels["uuid"], header.status)
|
|
99
|
+
|
|
100
|
+
return res
|
|
101
|
+
|
|
102
|
+
def _isValidSeverity(self, severity):
|
|
103
|
+
"""
|
|
104
|
+
Used to check if the severity of the alert matches the valid levels: low, medium, high
|
|
105
|
+
:param severity: severity of the alert
|
|
106
|
+
:return: True or False
|
|
107
|
+
"""
|
|
108
|
+
if severity not in self.validSeverity:
|
|
109
|
+
logging.critical("Alert submitted to AlertManagerAPI with invalid severity: %s", severity)
|
|
110
|
+
return False
|
|
111
|
+
return True
|
|
File without changes
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
from __future__ import (division, print_function)
|
|
2
|
+
|
|
3
|
+
from builtins import zip, str, bytes
|
|
4
|
+
|
|
5
|
+
from future import standard_library
|
|
6
|
+
standard_library.install_aliases()
|
|
7
|
+
|
|
8
|
+
import json
|
|
9
|
+
import logging
|
|
10
|
+
import re
|
|
11
|
+
from urllib.parse import urlencode
|
|
12
|
+
|
|
13
|
+
from WMCore.Services.Service import Service
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def unflattenJSON(data):
|
|
17
|
+
"""Tranform input to unflatten JSON format"""
|
|
18
|
+
columns = data['desc']['columns']
|
|
19
|
+
return [row2dict(columns, row) for row in data['result']]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def row2dict(columns, row):
|
|
23
|
+
"""Convert rows to dictionaries with column keys from description"""
|
|
24
|
+
robj = {}
|
|
25
|
+
for k, v in zip(columns, row):
|
|
26
|
+
robj.setdefault(k, v)
|
|
27
|
+
return robj
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class CRIC(Service):
|
|
31
|
+
"""
|
|
32
|
+
Class which provides client APIs to the CRIC service.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def __init__(self, url=None, logger=None, configDict=None):
|
|
36
|
+
"""
|
|
37
|
+
configDict is a dictionary with parameters that are passed
|
|
38
|
+
to the super class
|
|
39
|
+
"""
|
|
40
|
+
url = url or "https://cms-cric.cern.ch/"
|
|
41
|
+
configDict = configDict or {}
|
|
42
|
+
configDict.setdefault('endpoint', url)
|
|
43
|
+
configDict.setdefault('cacheduration', 1) # in hours
|
|
44
|
+
configDict.setdefault('accept_type', 'application/json')
|
|
45
|
+
configDict.setdefault('content_type', 'application/json')
|
|
46
|
+
configDict['logger'] = logger if logger else logging.getLogger()
|
|
47
|
+
super(CRIC, self).__init__(configDict)
|
|
48
|
+
self['logger'].debug("Initializing CRIC with url: %s", self['endpoint'])
|
|
49
|
+
|
|
50
|
+
def _getResult(self, uri, callname="", args=None, unflatJson=True):
|
|
51
|
+
"""
|
|
52
|
+
Either fetch data from the cache file or query the data-service
|
|
53
|
+
:param metricNumber: a number corresponding to the SSB metric
|
|
54
|
+
:return: a dictionary
|
|
55
|
+
"""
|
|
56
|
+
cachedApi = "%s.json" % callname
|
|
57
|
+
apiUrl = '%s?json&preset=%s' % (uri, callname)
|
|
58
|
+
|
|
59
|
+
self['logger'].debug('Fetching data from %s, with args %s', apiUrl, args)
|
|
60
|
+
# need to make our own encoding, otherwise Requests class screws it up
|
|
61
|
+
if args:
|
|
62
|
+
apiUrl = "%s&%s" % (apiUrl, urlencode(args, doseq=True))
|
|
63
|
+
|
|
64
|
+
data = self.refreshCache(cachedApi, apiUrl)
|
|
65
|
+
results = data.read()
|
|
66
|
+
data.close()
|
|
67
|
+
|
|
68
|
+
results = json.loads(results)
|
|
69
|
+
if unflatJson:
|
|
70
|
+
results = unflattenJSON(results)
|
|
71
|
+
return results
|
|
72
|
+
|
|
73
|
+
def _CRICUserQuery(self, callname, unflatJson=True):
|
|
74
|
+
"""
|
|
75
|
+
:param callname: name of the call
|
|
76
|
+
:return: dict of the result
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
uri = "/api/accounts/user/query/"
|
|
80
|
+
userinfo = self._getResult(uri, callname=callname, unflatJson=unflatJson)
|
|
81
|
+
return userinfo
|
|
82
|
+
|
|
83
|
+
def _CRICSiteQuery(self, callname):
|
|
84
|
+
"""
|
|
85
|
+
:param callname: name of the call
|
|
86
|
+
:return: dict of the result
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
uri = "/api/cms/site/query/"
|
|
90
|
+
extraArgs = {"rcsite_state": "ANY"}
|
|
91
|
+
sitenames = self._getResult(uri, callname=callname, args=extraArgs)
|
|
92
|
+
return sitenames
|
|
93
|
+
|
|
94
|
+
def whoAmI(self):
|
|
95
|
+
"""
|
|
96
|
+
_whoAmI_
|
|
97
|
+
|
|
98
|
+
Given the authentication mechanism used for this request (x509 so far),
|
|
99
|
+
return information about myself, like DN/ roles/groups, etc
|
|
100
|
+
:return: a list of dictionary
|
|
101
|
+
"""
|
|
102
|
+
return self._CRICUserQuery('whoami', unflatJson=False)['result']
|
|
103
|
+
|
|
104
|
+
def userNameDn(self, username):
|
|
105
|
+
"""
|
|
106
|
+
_userNameDn_
|
|
107
|
+
|
|
108
|
+
Convert CERN Nice username to DN.
|
|
109
|
+
:param username: string with the username
|
|
110
|
+
:return: a string wit the user's DN
|
|
111
|
+
"""
|
|
112
|
+
### TODO: use a different cache file and try again if the user is still not there
|
|
113
|
+
userdn = ""
|
|
114
|
+
userinfo = self._CRICUserQuery('people')
|
|
115
|
+
for x in userinfo:
|
|
116
|
+
if x['username'] == username:
|
|
117
|
+
userdn = x['dn']
|
|
118
|
+
break
|
|
119
|
+
return userdn
|
|
120
|
+
|
|
121
|
+
def getAllPSNs(self):
|
|
122
|
+
"""
|
|
123
|
+
_getAllPSNs_
|
|
124
|
+
|
|
125
|
+
Retrieve all PSNs (aka CMSNames) from CRIC
|
|
126
|
+
:return: a flat list of CMS site names
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
sitenames = self._CRICSiteQuery(callname='site-names')
|
|
130
|
+
cmsnames = [x['alias'] for x in sitenames if x['type'] == 'psn']
|
|
131
|
+
return cmsnames
|
|
132
|
+
|
|
133
|
+
def getAllPhEDExNodeNames(self, pattern=None, excludeBuffer=False):
|
|
134
|
+
"""
|
|
135
|
+
_getAllPhEDExNodeNames_
|
|
136
|
+
Retrieve all PNNs from CRIC and filter them out if a pattern has been
|
|
137
|
+
provided.
|
|
138
|
+
:param pattern: a regex to be applied to filter the output
|
|
139
|
+
:param excludeBuffer: flag to exclude T1 Buffer endpoints
|
|
140
|
+
:return: a flat list of PNNs
|
|
141
|
+
"""
|
|
142
|
+
sitenames = self._CRICSiteQuery(callname='site-names')
|
|
143
|
+
|
|
144
|
+
nodeNames = [x['alias'] for x in sitenames if x['type'] == 'phedex']
|
|
145
|
+
if excludeBuffer:
|
|
146
|
+
nodeNames = [x for x in nodeNames if not x.endswith("_Buffer")]
|
|
147
|
+
if pattern and isinstance(pattern, (str, bytes)):
|
|
148
|
+
pattern = re.compile(pattern)
|
|
149
|
+
nodeNames = [x for x in nodeNames if pattern.match(x)]
|
|
150
|
+
return nodeNames
|
|
151
|
+
|
|
152
|
+
def PNNstoPSNs(self, pnns):
|
|
153
|
+
"""
|
|
154
|
+
Given a list of PNNs, return all their PSNs
|
|
155
|
+
|
|
156
|
+
:param pnns: a string or a list of PNNs
|
|
157
|
+
:return: a list with unique PSNs matching those PNNs
|
|
158
|
+
"""
|
|
159
|
+
mapping = self._CRICSiteQuery(callname='data-processing')
|
|
160
|
+
|
|
161
|
+
if isinstance(pnns, (str, bytes)):
|
|
162
|
+
pnns = [pnns]
|
|
163
|
+
|
|
164
|
+
psns = set()
|
|
165
|
+
for pnn in pnns:
|
|
166
|
+
psnSet = set()
|
|
167
|
+
for item in mapping:
|
|
168
|
+
if pnn == item['phedex_name']:
|
|
169
|
+
psnSet.add(item['psn_name'])
|
|
170
|
+
if psnSet:
|
|
171
|
+
psns.update(psnSet)
|
|
172
|
+
else:
|
|
173
|
+
self["logger"].debug("No PSNs for PNN: %s" % pnn)
|
|
174
|
+
return list(psns)
|
|
175
|
+
|
|
176
|
+
def PSNstoPNNs(self, psns, allowPNNLess=False):
|
|
177
|
+
"""
|
|
178
|
+
Given a list of PSNs, return all their PNNs
|
|
179
|
+
|
|
180
|
+
:param psns: a string or a list of PSNs
|
|
181
|
+
:param allowPNNLess: flag to return the PSN as a PNN if no match
|
|
182
|
+
:return: a list with unique PNNs matching those PSNs
|
|
183
|
+
"""
|
|
184
|
+
mapping = self._CRICSiteQuery(callname='data-processing')
|
|
185
|
+
|
|
186
|
+
if isinstance(psns, (str, bytes)):
|
|
187
|
+
psns = [psns]
|
|
188
|
+
|
|
189
|
+
pnns = set()
|
|
190
|
+
for psn in psns:
|
|
191
|
+
pnnSet = set()
|
|
192
|
+
for item in mapping:
|
|
193
|
+
if item['psn_name'] == psn:
|
|
194
|
+
pnnSet.add(item['phedex_name'])
|
|
195
|
+
if pnnSet:
|
|
196
|
+
pnns.update(pnnSet)
|
|
197
|
+
elif allowPNNLess:
|
|
198
|
+
pnns.add(psn)
|
|
199
|
+
self["logger"].debug("PSN %s has no PNNs. PNNLess flag enabled though.", psn)
|
|
200
|
+
else:
|
|
201
|
+
self["logger"].debug("No PNNs for PSN: %s" % psn)
|
|
202
|
+
return list(pnns)
|
|
203
|
+
|
|
204
|
+
def PSNtoPNNMap(self, psnPattern=''):
|
|
205
|
+
"""
|
|
206
|
+
Given a PSN regex pattern, return a map of PSN to PNNs
|
|
207
|
+
:param psnPattern: a pattern string
|
|
208
|
+
:return: a dictionary key'ed by PSN names, with sets of PNNs as values
|
|
209
|
+
"""
|
|
210
|
+
if not isinstance(psnPattern, (str, bytes)):
|
|
211
|
+
raise TypeError('psnPattern argument must be of type str or bytes')
|
|
212
|
+
|
|
213
|
+
results = self._CRICSiteQuery(callname='data-processing')
|
|
214
|
+
mapping = {}
|
|
215
|
+
|
|
216
|
+
psnPattern = re.compile(psnPattern)
|
|
217
|
+
for entry in results:
|
|
218
|
+
if psnPattern.match(entry['psn_name']):
|
|
219
|
+
mapping.setdefault(entry['psn_name'], set()).add(entry['phedex_name'])
|
|
220
|
+
return mapping
|
|
221
|
+
|
|
222
|
+
def PNNtoPSNMap(self, pnnPattern=''):
|
|
223
|
+
"""
|
|
224
|
+
Given a PNN regex pattern, return a map of PNN to PSNs
|
|
225
|
+
:param pnnPattern: a pattern string
|
|
226
|
+
:return: a dictionary key'ed by PNN names, with sets of PSNs as values
|
|
227
|
+
"""
|
|
228
|
+
if not isinstance(pnnPattern, (str, bytes)):
|
|
229
|
+
raise TypeError('pnnPattern argument must be of type str or bytes')
|
|
230
|
+
|
|
231
|
+
results = self._CRICSiteQuery(callname='data-processing')
|
|
232
|
+
mapping = {}
|
|
233
|
+
|
|
234
|
+
pnnPattern = re.compile(pnnPattern)
|
|
235
|
+
for entry in results:
|
|
236
|
+
if pnnPattern.match(entry['phedex_name']):
|
|
237
|
+
mapping.setdefault(entry['phedex_name'], set()).add(entry['psn_name'])
|
|
238
|
+
return mapping
|
|
File without changes
|