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,133 @@
|
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
"""
|
|
3
|
+
_ProdException_
|
|
4
|
+
|
|
5
|
+
General Exception class for Prod modules
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from future.utils import viewitems
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
import exceptions
|
|
13
|
+
except ImportError:
|
|
14
|
+
import builtins as exceptions
|
|
15
|
+
|
|
16
|
+
import inspect
|
|
17
|
+
import logging
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ProdException(exceptions.Exception):
|
|
21
|
+
"""
|
|
22
|
+
_ProdException_
|
|
23
|
+
|
|
24
|
+
Exception class which works out details of where
|
|
25
|
+
it was raised.
|
|
26
|
+
|
|
27
|
+
"""
|
|
28
|
+
def __init__(self, message, errorNo=1000,**data):
|
|
29
|
+
self.name = str(self.__class__.__name__)
|
|
30
|
+
exceptions.Exception.__init__(self, self.name,
|
|
31
|
+
message)
|
|
32
|
+
|
|
33
|
+
# //
|
|
34
|
+
# // Init data dictionary with defaults
|
|
35
|
+
#//
|
|
36
|
+
self.data = {}
|
|
37
|
+
self.data.setdefault("ClassName", None)
|
|
38
|
+
self.data.setdefault("ModuleName", None)
|
|
39
|
+
self.data.setdefault("MethodName", None)
|
|
40
|
+
self.data.setdefault("ClassInstance", None)
|
|
41
|
+
self.data.setdefault("FileName", None)
|
|
42
|
+
self.data.setdefault("LineNumber", None)
|
|
43
|
+
if errorNo==None:
|
|
44
|
+
self.data.setdefault("ErrorNr",0)
|
|
45
|
+
else:
|
|
46
|
+
self.data.setdefault("ErrorNr",errorNo)
|
|
47
|
+
|
|
48
|
+
self.message = message
|
|
49
|
+
self.data.update(data)
|
|
50
|
+
|
|
51
|
+
# //
|
|
52
|
+
# // Automatically determine the module name
|
|
53
|
+
#// if not set
|
|
54
|
+
if self.data['ModuleName'] == None:
|
|
55
|
+
frame = inspect.currentframe()
|
|
56
|
+
lastframe = inspect.getouterframes(frame)[1][0]
|
|
57
|
+
excepModule = inspect.getmodule(lastframe)
|
|
58
|
+
if excepModule != None:
|
|
59
|
+
modName = excepModule.__name__
|
|
60
|
+
self.data['ModuleName'] = modName
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# //
|
|
64
|
+
# // Find out where the exception came from
|
|
65
|
+
#//
|
|
66
|
+
stack = inspect.stack(1)[1]
|
|
67
|
+
self.data['FileName'] = stack[1]
|
|
68
|
+
self.data['LineNumber'] = stack[2]
|
|
69
|
+
self.data['MethodName'] = stack[3]
|
|
70
|
+
|
|
71
|
+
# //
|
|
72
|
+
# // ClassName if ClassInstance is passed
|
|
73
|
+
#//
|
|
74
|
+
if self.data['ClassInstance'] != None:
|
|
75
|
+
self.data['ClassName'] = \
|
|
76
|
+
self.data['ClassInstance'].__class__.__name__
|
|
77
|
+
|
|
78
|
+
logging.error(str(self))
|
|
79
|
+
|
|
80
|
+
def __getitem__(self, key):
|
|
81
|
+
"""
|
|
82
|
+
make exception look like a dictionary
|
|
83
|
+
"""
|
|
84
|
+
return self.data[key]
|
|
85
|
+
|
|
86
|
+
def __setitem__(self, key, value):
|
|
87
|
+
"""
|
|
88
|
+
make exception look like a dictionary
|
|
89
|
+
"""
|
|
90
|
+
self.data[key] = value
|
|
91
|
+
|
|
92
|
+
def addInfo(self, **data):
|
|
93
|
+
"""
|
|
94
|
+
_addInfo_
|
|
95
|
+
|
|
96
|
+
Add key=value information pairs to an
|
|
97
|
+
exception instance
|
|
98
|
+
"""
|
|
99
|
+
for key, value in viewitems(data):
|
|
100
|
+
self.data[key] = value
|
|
101
|
+
return
|
|
102
|
+
|
|
103
|
+
def xml(self):
|
|
104
|
+
"""create a xml string rep of this exception"""
|
|
105
|
+
strg ="<Exception>\n"
|
|
106
|
+
strg +="<Object>\n"
|
|
107
|
+
strg += "%s\n" % self.name
|
|
108
|
+
strg +="</Object>\n"
|
|
109
|
+
strg +="<Message>\n"
|
|
110
|
+
strg += self.message
|
|
111
|
+
strg +="</Message>\n"
|
|
112
|
+
strg +="<DataItems>\n"
|
|
113
|
+
for key, value in viewitems(self.data):
|
|
114
|
+
strg +="<DataItem>\n"
|
|
115
|
+
strg += "<Key>\n"
|
|
116
|
+
strg += str(key)
|
|
117
|
+
strg += "</Key>\n"
|
|
118
|
+
strg += "<Value>\n"
|
|
119
|
+
strg += str(value)
|
|
120
|
+
strg += "</Value>\n"
|
|
121
|
+
strg +="</DataItem>\n"
|
|
122
|
+
strg +="</DataItems>\n"
|
|
123
|
+
strg +="</Exception>\n"
|
|
124
|
+
logging.error(strg)
|
|
125
|
+
return strg
|
|
126
|
+
|
|
127
|
+
def __str__(self):
|
|
128
|
+
"""create a string rep of this exception"""
|
|
129
|
+
strg = "%s\n" % self.name
|
|
130
|
+
strg += "Message: %s\n" % self.message
|
|
131
|
+
for key, value in viewitems(self.data):
|
|
132
|
+
strg += "\t%s : %s\n" % (key, value, )
|
|
133
|
+
return strg
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
from __future__ import (division, print_function)
|
|
2
|
+
|
|
3
|
+
from builtins import str, bytes, object
|
|
4
|
+
|
|
5
|
+
from WMCore.Database.CMSCouch import CouchServer, Database
|
|
6
|
+
from WMCore.Lexicon import splitCouchServiceURL
|
|
7
|
+
|
|
8
|
+
class FWJRDBAPI(object):
|
|
9
|
+
|
|
10
|
+
def __init__(self, couchURL, dbName=None):
|
|
11
|
+
"""
|
|
12
|
+
setting up comon variables for inherited class.
|
|
13
|
+
inherited class should call this in their init function
|
|
14
|
+
"""
|
|
15
|
+
if isinstance(couchURL, Database):
|
|
16
|
+
self.couchDB = couchURL
|
|
17
|
+
self.couchURL = self.couchDB['host']
|
|
18
|
+
self.dbName = self.couchDB.name
|
|
19
|
+
self.couchServer = CouchServer(self.couchURL)
|
|
20
|
+
else:
|
|
21
|
+
if dbName == None:
|
|
22
|
+
self.couchURL, self.dbName = splitCouchServiceURL(couchURL)
|
|
23
|
+
else:
|
|
24
|
+
self.couchURL = couchURL
|
|
25
|
+
self.dbName = dbName
|
|
26
|
+
self.couchServer = CouchServer(self.couchURL)
|
|
27
|
+
self.couchDB = self.couchServer.connectDatabase(self.dbName, False)
|
|
28
|
+
self.couchapp = "FWJRDump"
|
|
29
|
+
self.defaultStale = {"stale": "update_after"}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def setDefaultStaleOptions(self, options):
|
|
33
|
+
if not options:
|
|
34
|
+
options = {}
|
|
35
|
+
if 'stale' not in options:
|
|
36
|
+
options.update(self.defaultStale)
|
|
37
|
+
return options
|
|
38
|
+
|
|
39
|
+
def _setNoStale(self):
|
|
40
|
+
"""
|
|
41
|
+
Use this only for the unittest
|
|
42
|
+
"""
|
|
43
|
+
self.defaultStale = {}
|
|
44
|
+
|
|
45
|
+
def _getCouchView(self, view, options, keys = []):
|
|
46
|
+
|
|
47
|
+
options = self.setDefaultStaleOptions(options)
|
|
48
|
+
|
|
49
|
+
if keys and isinstance(keys, (str, bytes)):
|
|
50
|
+
keys = [keys]
|
|
51
|
+
return self.couchDB.loadView(self.couchapp, view, options, keys)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _filterCouchInfo(self, couchInfo):
|
|
55
|
+
# remove the couch specific information
|
|
56
|
+
for key in ['_rev', '_attachments']:
|
|
57
|
+
if key in couchInfo:
|
|
58
|
+
del couchInfo[key]
|
|
59
|
+
return
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _formatCouchData(self, data, key = "id", detail = True, filterCouch = True,
|
|
63
|
+
returnDict = False):
|
|
64
|
+
result = {}
|
|
65
|
+
for row in data['rows']:
|
|
66
|
+
if 'error' in row:
|
|
67
|
+
continue
|
|
68
|
+
if "doc" in row:
|
|
69
|
+
if filterCouch:
|
|
70
|
+
self._filterCouchInfo(row["doc"])
|
|
71
|
+
result[row[key]] = row["doc"]
|
|
72
|
+
else:
|
|
73
|
+
result[row[key]] = row["value"]
|
|
74
|
+
if detail or returnDict:
|
|
75
|
+
return result
|
|
76
|
+
else:
|
|
77
|
+
return list(result)
|
|
78
|
+
|
|
79
|
+
def getFWJRByArchiveStatus(self, status, limit=None, skip=None):
|
|
80
|
+
"""
|
|
81
|
+
'status': list of the status or status string
|
|
82
|
+
"""
|
|
83
|
+
options = {}
|
|
84
|
+
options["include_docs"] = True
|
|
85
|
+
|
|
86
|
+
if limit != None:
|
|
87
|
+
options["limit"] = limit
|
|
88
|
+
if skip != None:
|
|
89
|
+
options["skip"] = skip
|
|
90
|
+
keys = status
|
|
91
|
+
return self._getCouchView("reportsByArchiveStatus", options, keys)
|
|
92
|
+
|
|
93
|
+
def updateArchiveUploadedStatus(self, docID):
|
|
94
|
+
|
|
95
|
+
return self.couchDB.updateDocument(docID, self.couchapp, "archiveStatus")
|
|
96
|
+
|
|
97
|
+
def isAllFWJRArchived(self, workflow):
|
|
98
|
+
keys = [[workflow, "ready"]]
|
|
99
|
+
options = {"reduce": True, "group": True}
|
|
100
|
+
result = self._getCouchView("byWorkflowAndArchiveStatus", options, keys)
|
|
101
|
+
if len(result["rows"]) == 0:
|
|
102
|
+
return True
|
|
103
|
+
else:
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def outputByWorkflowName(self):
|
|
108
|
+
|
|
109
|
+
options = {"group": True, "stale": "ok", "reduce": True}
|
|
110
|
+
# site of data should be relatively small (~1M) for put in the memory
|
|
111
|
+
# If not, find a way to stream
|
|
112
|
+
return self._getCouchView("outputByWorkflowName", options)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def getFWJRWithSkippedFiles(self):
|
|
116
|
+
options = {"reduce": True, "group": True, "include_docs": False}
|
|
117
|
+
return self._getCouchView("skippedFileInfoByTaskAndSite", options)
|
|
118
|
+
|
|
File without changes
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
Basic interface to HTTPS requests using ssl object managers, for python >= 2.7.9.
|
|
4
|
+
See usage example in:
|
|
5
|
+
src/python/WMCore/WMSpec/Steps/Executors/DQMUpload.py
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import print_function, division
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
import ssl
|
|
11
|
+
try:
|
|
12
|
+
# python2
|
|
13
|
+
import urllib2
|
|
14
|
+
import httplib
|
|
15
|
+
HTTPSHandler = urllib2.HTTPSHandler
|
|
16
|
+
HTTPSConnection = httplib.HTTPSConnection
|
|
17
|
+
except:
|
|
18
|
+
# python3
|
|
19
|
+
import urllib.request
|
|
20
|
+
import http.client
|
|
21
|
+
HTTPSHandler = urllib.request.HTTPSHandler
|
|
22
|
+
HTTPSConnection = http.client.HTTPSConnection
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class HTTPSAuthHandler(HTTPSHandler):
|
|
26
|
+
"""
|
|
27
|
+
HTTPS authentication class to provide a ssl context with the certificates.
|
|
28
|
+
"""
|
|
29
|
+
def __init__(self, key=None, cert=None, capath='/etc/grid-security/certificates/', level=0):
|
|
30
|
+
self.logger = logging.getLogger(__name__)
|
|
31
|
+
if cert:
|
|
32
|
+
# then create a default ssl context manager to carry the credentials.
|
|
33
|
+
# It also loads the default CA certificates
|
|
34
|
+
self.ctx = ssl.create_default_context()
|
|
35
|
+
self.ctx.load_cert_chain(cert, keyfile=key)
|
|
36
|
+
self.ctx.load_verify_locations(None, capath)
|
|
37
|
+
|
|
38
|
+
self.logger.info("Found %d default trusted CA certificates.", len(self.ctx.get_ca_certs()))
|
|
39
|
+
### DEBUG start ###
|
|
40
|
+
#for ca in self.ctx.get_ca_certs():
|
|
41
|
+
# if 'CERN' in str(ca['subject']):
|
|
42
|
+
# print(" %s" % str(ca['subject']))
|
|
43
|
+
### DEBUG end ###
|
|
44
|
+
self.logger.info("SSL context manager created with the following settings:")
|
|
45
|
+
self.logger.info(" check_hostname : %s", self.ctx.check_hostname) # default to True
|
|
46
|
+
self.logger.info(" options : %s", self.ctx.options) # default to 2197947391
|
|
47
|
+
self.logger.info(" protocol : %s", self.ctx.protocol) # default to 2 (PROTOCOL_SSLv23)
|
|
48
|
+
self.logger.info(" verify_flags : %s", self.ctx.verify_flags) # default to 0 (VERIFY_DEFAULT)
|
|
49
|
+
self.logger.info(" verify_mode : %s", self.ctx.verify_mode) # default to 2 (CERT_REQUIRED)
|
|
50
|
+
HTTPSHandler.__init__(self, debuglevel=level, context=self.ctx)
|
|
51
|
+
else:
|
|
52
|
+
self.logger.info("Certificate not provided for HTTPSHandler")
|
|
53
|
+
HTTPSHandler.__init__(self, debuglevel=level)
|
|
54
|
+
|
|
55
|
+
def get_connection(self, host, **kwargs):
|
|
56
|
+
if self.ctx:
|
|
57
|
+
return HTTPSConnection(host, context=self.ctx, **kwargs)
|
|
58
|
+
return HTTPSConnection(host)
|
|
59
|
+
|
|
60
|
+
def https_open(self, req):
|
|
61
|
+
"""
|
|
62
|
+
Overwrite the default https_open.
|
|
63
|
+
"""
|
|
64
|
+
self.logger.debug("%s method to %s", req.get_method(), req.get_full_url())
|
|
65
|
+
self.logger.debug(" with the following headers: %s", req.headers)
|
|
66
|
+
return self.do_open(self.get_connection, req)
|
|
File without changes
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
LogDB provides functionality to post/search messages into LogDB.
|
|
4
|
+
https://github.com/dmwm/WMCore/issues/5705
|
|
5
|
+
"""
|
|
6
|
+
# futures
|
|
7
|
+
from builtins import object
|
|
8
|
+
from future.utils import viewitems
|
|
9
|
+
|
|
10
|
+
from future import standard_library
|
|
11
|
+
standard_library.install_aliases()
|
|
12
|
+
|
|
13
|
+
# standard modules
|
|
14
|
+
import logging
|
|
15
|
+
import re
|
|
16
|
+
import threading
|
|
17
|
+
from collections import defaultdict
|
|
18
|
+
from http.client import HTTPException
|
|
19
|
+
|
|
20
|
+
# project modules
|
|
21
|
+
from WMCore.Lexicon import splitCouchServiceURL
|
|
22
|
+
from WMCore.Services.LogDB.LogDBBackend import LogDBBackend
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def getLogDBInstanceFromThread():
|
|
26
|
+
"""This function only gets to call when LogDB is instantiated before hand
|
|
27
|
+
All the WMComponentWorkers instatntiate LogDB automatically
|
|
28
|
+
"""
|
|
29
|
+
myThread = threading.currentThread()
|
|
30
|
+
if not hasattr(myThread, "logdbClient") or not isinstance(myThread.logdbClient, LogDB):
|
|
31
|
+
# logdb is not set do anything
|
|
32
|
+
return None
|
|
33
|
+
return myThread.logdbClient
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class LogDB(object):
|
|
37
|
+
"""
|
|
38
|
+
_LogDB_
|
|
39
|
+
|
|
40
|
+
LogDB object - interface to LogDB functionality.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, url, identifier, logger=None, **kwds):
|
|
44
|
+
self.logger = logger if logger else logging.getLogger()
|
|
45
|
+
self.url = url if url else 'https://cmsweb.cern.ch/couchdb/wmstats_logdb'
|
|
46
|
+
self.identifier = identifier if identifier else 'unknown'
|
|
47
|
+
self.default_user = "HEARTBEAT"
|
|
48
|
+
|
|
49
|
+
try:
|
|
50
|
+
self.thread_name = kwds.pop('thread_name')
|
|
51
|
+
except KeyError:
|
|
52
|
+
self.thread_name = threading.currentThread().getName()
|
|
53
|
+
|
|
54
|
+
self.user_pat = re.compile(r'^/[a-zA-Z][a-zA-Z0-9/\=\s()\']*\=[a-zA-Z0-9/\=\.\-_/#:\s\']*$')
|
|
55
|
+
self.agent = 0 if self.user_pat.match(self.identifier) else 1
|
|
56
|
+
couch_url, db_name = splitCouchServiceURL(self.url)
|
|
57
|
+
self.backend = LogDBBackend(couch_url, db_name, identifier,
|
|
58
|
+
self.thread_name, agent=self.agent, **kwds)
|
|
59
|
+
self.logger.info(self)
|
|
60
|
+
|
|
61
|
+
def __repr__(self):
|
|
62
|
+
"Return representation for class"
|
|
63
|
+
return "<LogDB(url=%s, identifier=%s, agent=%d)>" \
|
|
64
|
+
% (self.url, self.identifier, self.agent)
|
|
65
|
+
|
|
66
|
+
def post(self, request=None, msg="", mtype="comment"):
|
|
67
|
+
"""Post new entry into LogDB for given request"""
|
|
68
|
+
res = 'post-error'
|
|
69
|
+
try:
|
|
70
|
+
if request is None:
|
|
71
|
+
request = self.default_user
|
|
72
|
+
if self.user_pat.match(self.identifier):
|
|
73
|
+
res = self.backend.user_update(request, msg, mtype)
|
|
74
|
+
else:
|
|
75
|
+
res = self.backend.agent_update(request, msg, mtype)
|
|
76
|
+
except HTTPException as ex:
|
|
77
|
+
msg = "Failed to post doc to LogDB. Reason: %s, status: %s" % (ex.reason, ex.status)
|
|
78
|
+
self.logger.error(msg)
|
|
79
|
+
except Exception as exc:
|
|
80
|
+
self.logger.error("LogDBBackend post API failed, error=%s", str(exc))
|
|
81
|
+
self.logger.debug("LogDB post request, res=%s", res)
|
|
82
|
+
return res
|
|
83
|
+
|
|
84
|
+
def get(self, request=None, mtype=None):
|
|
85
|
+
"""Retrieve all entries from LogDB for given request"""
|
|
86
|
+
res = []
|
|
87
|
+
try:
|
|
88
|
+
if request is None:
|
|
89
|
+
request = self.default_user
|
|
90
|
+
if self.user_pat.match(self.identifier):
|
|
91
|
+
agent = False
|
|
92
|
+
else:
|
|
93
|
+
agent = True
|
|
94
|
+
for row in self.backend.get(request, mtype, agent=agent).get('rows', []):
|
|
95
|
+
request = row['doc']['request']
|
|
96
|
+
identifier = row['doc']['identifier']
|
|
97
|
+
thr = row['doc']['thr']
|
|
98
|
+
mtype = row['doc']['type']
|
|
99
|
+
for rec in row['doc']['messages']:
|
|
100
|
+
rec.update({'request': request, 'identifier': identifier, 'thr': thr, 'type': mtype})
|
|
101
|
+
res.append(rec)
|
|
102
|
+
except HTTPException as ex:
|
|
103
|
+
msg = "Failed to get doc from LogDB. Reason: %s, status: %s" % (ex.reason, ex.status)
|
|
104
|
+
self.logger.error(msg)
|
|
105
|
+
res = 'get-error'
|
|
106
|
+
except Exception as exc:
|
|
107
|
+
self.logger.error("LogDBBackend get API failed, error=%s", str(exc))
|
|
108
|
+
res = 'get-error'
|
|
109
|
+
self.logger.debug("LogDB get request, res=%s", res)
|
|
110
|
+
return res
|
|
111
|
+
|
|
112
|
+
def get_all_requests(self):
|
|
113
|
+
"""Retrieve all entries from LogDB for given request"""
|
|
114
|
+
try:
|
|
115
|
+
results = self.backend.get_all_requests()
|
|
116
|
+
res = []
|
|
117
|
+
for row in results['rows']:
|
|
118
|
+
res.append(row["key"])
|
|
119
|
+
except Exception as exc:
|
|
120
|
+
self.logger.error("LogDBBackend get_all_requests API failed, error=%s", str(exc))
|
|
121
|
+
res = 'get-error'
|
|
122
|
+
self.logger.debug("LogDB get_all_requests request, res=%s", res)
|
|
123
|
+
return res
|
|
124
|
+
|
|
125
|
+
def delete(self, request=None, mtype=None, this_thread=False, agent=True):
|
|
126
|
+
"""
|
|
127
|
+
Delete entry in LogDB for given request
|
|
128
|
+
if mtype == None - delete all the log for that request
|
|
129
|
+
mtype != None - only delete specified mtype
|
|
130
|
+
"""
|
|
131
|
+
res = 'delete-error'
|
|
132
|
+
try:
|
|
133
|
+
if request is None:
|
|
134
|
+
request = self.default_user
|
|
135
|
+
res = self.backend.delete(request, mtype, this_thread, agent)
|
|
136
|
+
except HTTPException as ex:
|
|
137
|
+
msg = "Failed to delete doc in LogDB. Reason: %s, status: %s" % (ex.reason, ex.status)
|
|
138
|
+
self.logger.error(msg)
|
|
139
|
+
except Exception as ex:
|
|
140
|
+
self.logger.error("LogDBBackend delete API failed, error=%s", str(ex))
|
|
141
|
+
self.logger.debug("LogDB delete request, res=%s", res)
|
|
142
|
+
return res
|
|
143
|
+
|
|
144
|
+
def cleanup(self, thr, backend='local'):
|
|
145
|
+
"""Clean-up back-end LogDB"""
|
|
146
|
+
docs = []
|
|
147
|
+
try:
|
|
148
|
+
docs = self.backend.cleanup(thr)
|
|
149
|
+
except Exception as exc:
|
|
150
|
+
self.logger.error('LogDBBackend cleanup API failed, backend=%s, error=%s', backend, str(exc))
|
|
151
|
+
return docs
|
|
152
|
+
|
|
153
|
+
def heartbeat_report(self):
|
|
154
|
+
report = defaultdict(dict)
|
|
155
|
+
if self.user_pat.match(self.identifier):
|
|
156
|
+
self.logger.error("User %s: doesn't allow this function", self.identifier)
|
|
157
|
+
return report
|
|
158
|
+
|
|
159
|
+
for row in self.backend.get(self.default_user, None, agent=True).get('rows', []):
|
|
160
|
+
identifier = row['doc']['identifier']
|
|
161
|
+
# wmstats thread can run in multiple boxed.
|
|
162
|
+
if self.identifier == identifier or identifier.startswith(self.identifier):
|
|
163
|
+
# this will handle wmstats DataCacheUpdate thread with multiple machine
|
|
164
|
+
postfix = identifier.replace(self.identifier, "")
|
|
165
|
+
thr = "%s%s" % (row['doc']['thr'], postfix)
|
|
166
|
+
mtype = row['doc']['type']
|
|
167
|
+
ts = row['doc']['messages'][-1]['ts']
|
|
168
|
+
msg = row['doc']['messages'][-1]['msg']
|
|
169
|
+
if (thr in report) and ('ts' in report[thr]) and ts <= report[thr]['ts']:
|
|
170
|
+
continue
|
|
171
|
+
else:
|
|
172
|
+
report[thr]['type'] = mtype
|
|
173
|
+
report[thr]['msg'] = msg
|
|
174
|
+
report[thr]['ts'] = ts
|
|
175
|
+
return report
|
|
176
|
+
|
|
177
|
+
def _append_down_component_detail(self, report, thr, msg, ts=0, state="error"):
|
|
178
|
+
report['down_components'].append(thr)
|
|
179
|
+
detail = {'name': thr, 'worker_name': thr, 'state': state,
|
|
180
|
+
'last_error': ts, 'error_message': msg,
|
|
181
|
+
'pid': 'N/A'}
|
|
182
|
+
report['down_component_detail'].append(detail)
|
|
183
|
+
return
|
|
184
|
+
|
|
185
|
+
def wmstats_down_components_report(self, thread_list):
|
|
186
|
+
report = {}
|
|
187
|
+
report['down_components'] = []
|
|
188
|
+
report['down_component_detail'] = []
|
|
189
|
+
|
|
190
|
+
hbinfo = self.heartbeat_report()
|
|
191
|
+
for thr in thread_list:
|
|
192
|
+
# skip DataCacheUpdate thread. It will have multiple with post fix.
|
|
193
|
+
# i.e. DataCacheUpdate-vocms111
|
|
194
|
+
# TODO, need a better way to check
|
|
195
|
+
if thr != "DataCacheUpdate" and thr not in hbinfo:
|
|
196
|
+
self._append_down_component_detail(report, thr, "Thread not running")
|
|
197
|
+
|
|
198
|
+
for thr, info in viewitems(hbinfo):
|
|
199
|
+
if info['type'] == 'agent-error':
|
|
200
|
+
self._append_down_component_detail(report, thr, info['msg'], info['ts'])
|
|
201
|
+
return report
|