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/Auth.py
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
from builtins import map, str, bytes
|
|
2
|
+
from future.utils import viewitems
|
|
3
|
+
|
|
4
|
+
import cherrypy
|
|
5
|
+
import hashlib
|
|
6
|
+
import hmac
|
|
7
|
+
import re
|
|
8
|
+
|
|
9
|
+
from Utils.Utilities import lowerCmsHeaders, encodeUnicodeToBytes
|
|
10
|
+
from Utils.PythonVersion import PY3
|
|
11
|
+
|
|
12
|
+
def get_user_info():
|
|
13
|
+
"Helper function to return user based information of the request"
|
|
14
|
+
return cherrypy.request.user
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def user_info_from_headers(key, verbose=False):
|
|
18
|
+
"""Read the user information HTTP request headers added by front-end.
|
|
19
|
+
Validates the HMAC on them to check for tampering, and if all is ok,
|
|
20
|
+
returns user info object with the data from the headers."""
|
|
21
|
+
# Set initial user information for this request
|
|
22
|
+
log = cherrypy.log
|
|
23
|
+
headers = lowerCmsHeaders(cherrypy.request.headers)
|
|
24
|
+
user = {'dn': None, 'method': None, 'login': None, 'name': None, 'roles': {}}
|
|
25
|
+
|
|
26
|
+
# Reject if request was not authenticated.
|
|
27
|
+
if 'cms-auth-status' not in headers:
|
|
28
|
+
if headers.get('Remote-Addr', '') == '127.0.0.1':
|
|
29
|
+
# since we are using localhost access we can skip authentication
|
|
30
|
+
log("DEBUG: non-authenticated request performed on localhost")
|
|
31
|
+
return
|
|
32
|
+
log("ERROR: authz denied, front-end headers not present")
|
|
33
|
+
raise cherrypy.HTTPError(403, "You are not allowed to access this resource.")
|
|
34
|
+
|
|
35
|
+
# If authentication is optional and wasn't done, accept.
|
|
36
|
+
if headers['cms-auth-status'] == 'NONE':
|
|
37
|
+
if verbose: log("DEBUG: authn optional and missing")
|
|
38
|
+
return
|
|
39
|
+
|
|
40
|
+
# Extract user information from the headers. Collect data required
|
|
41
|
+
# for HMAC validation while processing headers.
|
|
42
|
+
prefix = suffix = ""
|
|
43
|
+
hkeys = sorted(headers.keys())
|
|
44
|
+
for hk in hkeys:
|
|
45
|
+
hk = hk.lower()
|
|
46
|
+
if hk[0:9] in ("cms-authn", "cms-authz") and hk != "cms-authn-hmac":
|
|
47
|
+
prefix += "h%xv%x" % (len(hk), len(headers[hk]))
|
|
48
|
+
suffix += "%s%s" % (hk, headers[hk])
|
|
49
|
+
hkname = hk.split('-', 2)[-1]
|
|
50
|
+
if hk.startswith("cms-authn"):
|
|
51
|
+
val = headers[hk]
|
|
52
|
+
if hk in ("cms-authn-name", "cms-authn-dn"):
|
|
53
|
+
val = str(val) if PY3 else str(val, "utf-8")
|
|
54
|
+
user[hkname] = val
|
|
55
|
+
if hk.startswith("cms-authz"):
|
|
56
|
+
user['roles'][hkname] = {'site': set(), 'group': set()}
|
|
57
|
+
for r in headers[hk].split():
|
|
58
|
+
site_or_group, name = r.split(':')
|
|
59
|
+
user['roles'][hkname][site_or_group].add(name)
|
|
60
|
+
|
|
61
|
+
# Check HMAC over authn/z headers with server key. If differs, reject.
|
|
62
|
+
msg = prefix + "#" + suffix
|
|
63
|
+
if PY3:
|
|
64
|
+
key = encodeUnicodeToBytes(key)
|
|
65
|
+
msg = encodeUnicodeToBytes(msg)
|
|
66
|
+
cksum = hmac.new(key, msg, hashlib.sha1).hexdigest()
|
|
67
|
+
if cksum != headers["cms-authn-hmac"]:
|
|
68
|
+
log("ERROR: authz hmac mismatch, %s vs. %s" % (cksum, headers["cms-authn-hmac"]))
|
|
69
|
+
raise cherrypy.HTTPError(403, "You are not allowed to access this resource.")
|
|
70
|
+
|
|
71
|
+
# Authn/z is legal, accept
|
|
72
|
+
if verbose:
|
|
73
|
+
log("DEBUG: authn accepted for user %s" % user)
|
|
74
|
+
return user
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def authz_canonical(val):
|
|
78
|
+
"""Make a name canonical."""
|
|
79
|
+
return re.sub(r"[^a-z0-9]+", "-", val.lower())
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def authz_match(role=None, group=None, site=None, verbose=False):
|
|
83
|
+
"""Match user against authorisation requirements."""
|
|
84
|
+
role = role or []
|
|
85
|
+
group = group or []
|
|
86
|
+
site = site or []
|
|
87
|
+
user = get_user_info()
|
|
88
|
+
log = cherrypy.log
|
|
89
|
+
|
|
90
|
+
# If role, group or site are strings, convert to list first.
|
|
91
|
+
role = (role and isinstance(role, (str, bytes)) and [role]) or role
|
|
92
|
+
group = (group and isinstance(group, (str, bytes)) and [group]) or group
|
|
93
|
+
site = (site and isinstance(site, (str, bytes)) and [site]) or site
|
|
94
|
+
|
|
95
|
+
# Reformat all items into canonical format.
|
|
96
|
+
role = role and list(map(authz_canonical, role))
|
|
97
|
+
group = group and list(map(authz_canonical, group))
|
|
98
|
+
site = site and list(map(authz_canonical, site))
|
|
99
|
+
|
|
100
|
+
# If role, group and site are all empty, no authz requirements: pass
|
|
101
|
+
if not (role or group or site):
|
|
102
|
+
if verbose:
|
|
103
|
+
log("DEBUG: authz accepted nil requirements for user %s" % user)
|
|
104
|
+
return
|
|
105
|
+
|
|
106
|
+
# Otherwise determine set intersection of requirements.
|
|
107
|
+
for r, authz in viewitems((user and user['roles']) or {}):
|
|
108
|
+
if (not role) or (r in role):
|
|
109
|
+
if not (group or site):
|
|
110
|
+
if verbose:
|
|
111
|
+
log("DEBUG: authz accepted role '%s' for user %s" % (r, user))
|
|
112
|
+
return
|
|
113
|
+
if set(group) & authz['group']:
|
|
114
|
+
if verbose:
|
|
115
|
+
log("DEBUG: authz accepted role '%s' group %s for user %s" % (r, group, user))
|
|
116
|
+
return
|
|
117
|
+
if set(site) & authz['site']:
|
|
118
|
+
if verbose:
|
|
119
|
+
log("DEBUG: authz accepted role '%s' site %s for user %s" % (r, site, user))
|
|
120
|
+
return
|
|
121
|
+
|
|
122
|
+
# Deny access, requirements weren't fulfilled
|
|
123
|
+
log("ERROR: authz denied role %s group %s site %s for user %s" % (role, group, site, user))
|
|
124
|
+
raise cherrypy.HTTPError(403, "You are not allowed to access this resource.")
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def authz_user(role=None, group=None, site=None, key=None, verbose=False):
|
|
128
|
+
"""Default authorisation implementation: returns True for an authorised
|
|
129
|
+
user, one with any of the requested roles for the given sites or groups.
|
|
130
|
+
|
|
131
|
+
If no roles are specified, belonging to any of the requested sites or
|
|
132
|
+
groups is sufficient."""
|
|
133
|
+
role = role or []
|
|
134
|
+
group = group or []
|
|
135
|
+
site = site or []
|
|
136
|
+
# Get user information from request headers, then run real matcher.
|
|
137
|
+
assert getattr(cherrypy.request, "user", None) == None
|
|
138
|
+
cherrypy.request.user = user_info_from_headers(key, verbose)
|
|
139
|
+
authz_match(role, group, site, verbose)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
_fake_warned = False
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def authz_fake(role=None, group=None, site=None, verbose=False):
|
|
146
|
+
"""Fake authorisation routine."""
|
|
147
|
+
role = role or []
|
|
148
|
+
group = group or []
|
|
149
|
+
site = site or []
|
|
150
|
+
log = cherrypy.log
|
|
151
|
+
global _fake_warned
|
|
152
|
+
if not _fake_warned:
|
|
153
|
+
if cherrypy.server.environment == 'production':
|
|
154
|
+
log("ERROR: authz faking denied in production server")
|
|
155
|
+
raise Exception("authz faking denied in production server")
|
|
156
|
+
if cherrypy.server.socket_host not in ("127.0.0.1", "::1"):
|
|
157
|
+
log("ERROR: authz faking denied on non-local interface")
|
|
158
|
+
raise Exception("authz faking denied on non-local interface")
|
|
159
|
+
log("WARNING: authz faking activated, only test use is permitted")
|
|
160
|
+
_fake_warned = True
|
|
161
|
+
cherrypy.request.user = {
|
|
162
|
+
'method': 'fake',
|
|
163
|
+
'login': 'fake_insecure_auth',
|
|
164
|
+
'name': 'Fake Insecure Auth',
|
|
165
|
+
'dn': '/CN=Fake Insecure Auth',
|
|
166
|
+
'roles': {'fake': {'site': set(['fake']), 'group': set(['fake'])}}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if verbose:
|
|
170
|
+
log("DEBUG: authz accepted bypass role %s group %s site %s for user %s"
|
|
171
|
+
% (role, group, site, cherrypy.request.user))
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class RESTAuth(cherrypy.Tool):
|
|
175
|
+
"""Restrict access based on CMSWEB authn/z information."""
|
|
176
|
+
_key = None
|
|
177
|
+
|
|
178
|
+
def __init__(self):
|
|
179
|
+
cherrypy.Tool.__init__(self, 'before_request_body', authz_user, priority=60)
|
|
180
|
+
|
|
181
|
+
def _setup(self):
|
|
182
|
+
"""Hook this tool into cherrypy request."""
|
|
183
|
+
log = cherrypy.log
|
|
184
|
+
hooks = cherrypy.request.hooks
|
|
185
|
+
conf = self._merged_args()
|
|
186
|
+
|
|
187
|
+
# Install authz policy. Load front-end hmac key on first use.
|
|
188
|
+
prio = conf.pop("priority", self._priority)
|
|
189
|
+
policy = conf.pop("policy", "user")
|
|
190
|
+
if policy == "user":
|
|
191
|
+
key_file = conf.pop("key_file")
|
|
192
|
+
if not self._key:
|
|
193
|
+
with open(key_file, "rb") as fd:
|
|
194
|
+
self._key = fd.read()
|
|
195
|
+
conf["key"] = self._key
|
|
196
|
+
|
|
197
|
+
hooks.attach(self._point, self.callable, priority=prio, **conf)
|
|
198
|
+
elif policy == "dangerously_insecure":
|
|
199
|
+
conf.pop("key_file", None)
|
|
200
|
+
hooks.attach(self._point, authz_fake, priority=prio, **conf)
|
|
201
|
+
else:
|
|
202
|
+
raise Exception('unknown authz policy "%s"' % policy)
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
'''
|
|
2
|
+
Created on Jul 31, 2014
|
|
3
|
+
|
|
4
|
+
@author: sryu
|
|
5
|
+
'''
|
|
6
|
+
from __future__ import print_function, division
|
|
7
|
+
from builtins import object
|
|
8
|
+
|
|
9
|
+
import cherrypy
|
|
10
|
+
import traceback
|
|
11
|
+
from threading import Thread, Condition
|
|
12
|
+
|
|
13
|
+
from WMCore.WMLogging import getTimeRotatingLogger
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CherryPyPeriodicTask(object):
|
|
17
|
+
|
|
18
|
+
def __init__(self, config):
|
|
19
|
+
|
|
20
|
+
"""
|
|
21
|
+
BaseClass which can set up the concurrent task using cherrypy thread.
|
|
22
|
+
WARNING: This assumes each task doesn't share the object.
|
|
23
|
+
(It can be share only read operation is performed)
|
|
24
|
+
If the object shared by multple task and read/write operation is performed.
|
|
25
|
+
Lock is not provided for these object
|
|
26
|
+
|
|
27
|
+
:arg config WMCore.Configuration object. which need to contain in duration attr.
|
|
28
|
+
TODO: add validation for config.duration
|
|
29
|
+
"""
|
|
30
|
+
self.logger = getTimeRotatingLogger(config._internal_name, config.log_file)
|
|
31
|
+
self.logger.info("Setting CherryPy periodic task with the following config:\n%s", config)
|
|
32
|
+
self.setConcurrentTasks(config)
|
|
33
|
+
self.setUpLogDB(config)
|
|
34
|
+
|
|
35
|
+
for task in self.concurrentTasks:
|
|
36
|
+
PeriodicWorker(task['func'], config, task['duration'], logger=self.logger, logDB=self.logDB)
|
|
37
|
+
|
|
38
|
+
def setUpLogDB(self, config):
|
|
39
|
+
if hasattr(config, "central_logdb_url"):
|
|
40
|
+
# default set up for logDB config section need to contain propervalues
|
|
41
|
+
from WMCore.Services.LogDB.LogDB import LogDB
|
|
42
|
+
self.logDB = LogDB(config.central_logdb_url, config.log_reporter, logger=self.logger,
|
|
43
|
+
thread_name=config.object.rsplit(".", 1)[-1])
|
|
44
|
+
else:
|
|
45
|
+
self.logDB = None
|
|
46
|
+
|
|
47
|
+
def setConcurrentTasks(self, config):
|
|
48
|
+
"""
|
|
49
|
+
sets the list of function reference for concurrent tasks,
|
|
50
|
+
sub class should implement this
|
|
51
|
+
|
|
52
|
+
each function in the list should have the same signature with
|
|
53
|
+
3 arguments (self, config, duration)
|
|
54
|
+
config is WMCore.Configuration object
|
|
55
|
+
"""
|
|
56
|
+
self.concurrentTasks = {'func': None, 'duration': None}
|
|
57
|
+
raise NotImplementedError("need to implement setSequencialTas assign self._callSequence")
|
|
58
|
+
|
|
59
|
+
class PeriodicWorker(Thread):
|
|
60
|
+
|
|
61
|
+
def __init__(self, func, config, duration=600, logger=cherrypy.log, logDB=None):
|
|
62
|
+
# use default RLock from condition
|
|
63
|
+
# Lock wan't be shared between the instance used only for wait
|
|
64
|
+
# func : function or callable object pointer
|
|
65
|
+
self.wakeUp = Condition()
|
|
66
|
+
self.stopFlag = False
|
|
67
|
+
self.taskFunc = func
|
|
68
|
+
self.config = config
|
|
69
|
+
self.duration = duration
|
|
70
|
+
self.logger = logger
|
|
71
|
+
self.logDB = logDB
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
name = func.__name__
|
|
75
|
+
print(name)
|
|
76
|
+
except AttributeError:
|
|
77
|
+
name = func.__class__.__name__
|
|
78
|
+
print(name)
|
|
79
|
+
|
|
80
|
+
Thread.__init__(self, name=name)
|
|
81
|
+
cherrypy.engine.subscribe('start', self.start, priority=100)
|
|
82
|
+
cherrypy.engine.subscribe('stop', self.stop, priority=100)
|
|
83
|
+
|
|
84
|
+
def stop(self):
|
|
85
|
+
self.wakeUp.acquire()
|
|
86
|
+
self.stopFlag = True
|
|
87
|
+
self.wakeUp.notifyAll()
|
|
88
|
+
self.wakeUp.release()
|
|
89
|
+
|
|
90
|
+
def run(self):
|
|
91
|
+
|
|
92
|
+
while not self.stopFlag:
|
|
93
|
+
self.wakeUp.acquire()
|
|
94
|
+
try:
|
|
95
|
+
self.taskFunc(self.config)
|
|
96
|
+
self.heartBeatInfoToLogDB()
|
|
97
|
+
except Exception as e:
|
|
98
|
+
self.logger.error("Periodic Thread ERROR %s.%s %s"
|
|
99
|
+
% (getattr(e, "__module__", "__builtins__"),
|
|
100
|
+
e.__class__.__name__, str(e)))
|
|
101
|
+
traceMsg = traceback.format_exc()
|
|
102
|
+
for line in traceMsg.rstrip().split("\n"):
|
|
103
|
+
self.logger.error(" " + line)
|
|
104
|
+
self.heartBeatErrorToLogDB(traceMsg)
|
|
105
|
+
|
|
106
|
+
self.wakeUp.wait(self.duration)
|
|
107
|
+
self.wakeUp.release()
|
|
108
|
+
|
|
109
|
+
def heartBeatInfoToLogDB(self):
|
|
110
|
+
if self.logDB:
|
|
111
|
+
self.logDB.delete(mtype="error", this_thread=True, agent=False)
|
|
112
|
+
self.logDB.post(mtype="info")
|
|
113
|
+
return
|
|
114
|
+
|
|
115
|
+
def heartBeatErrorToLogDB(self, msg):
|
|
116
|
+
if self.logDB:
|
|
117
|
+
self.logDB.post(msg=msg, mtype="error")
|
|
118
|
+
return
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class SequentialTaskBase(object):
|
|
122
|
+
|
|
123
|
+
"""
|
|
124
|
+
Base class for the tasks which should run sequentially
|
|
125
|
+
"""
|
|
126
|
+
def __init__(self):
|
|
127
|
+
self.setCallSequence()
|
|
128
|
+
|
|
129
|
+
def __call__(self, config):
|
|
130
|
+
for call in self._callSequence:
|
|
131
|
+
try:
|
|
132
|
+
call(config)
|
|
133
|
+
except Exception as ex:
|
|
134
|
+
#log the excpeiotn and break.
|
|
135
|
+
#SequencialTasks are interconnected between functions
|
|
136
|
+
trace = traceback.format_exc()
|
|
137
|
+
self.logger.error("%s:\n %s" % (str(ex), trace))
|
|
138
|
+
break
|
|
139
|
+
|
|
140
|
+
def setCallSequence(self):
|
|
141
|
+
"""
|
|
142
|
+
set the list of function call with out args on self.callSequence
|
|
143
|
+
|
|
144
|
+
i.e.
|
|
145
|
+
self.callSequence = [self.do_something1, self.do_something1]
|
|
146
|
+
"""
|
|
147
|
+
raise NotImplementedError("need to implement setCallSequence assign self._callSequence")
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
#this is the sckeleton of request data collector
|
|
151
|
+
class DataUploadTask(SequentialTaskBase):
|
|
152
|
+
|
|
153
|
+
def setCallSequence(self):
|
|
154
|
+
self._callSequence = [self.getData, self.convertData, self.putData]
|
|
155
|
+
|
|
156
|
+
def getData(self, config):
|
|
157
|
+
# self.data = getData(self.sourceUrl)
|
|
158
|
+
pass
|
|
159
|
+
|
|
160
|
+
def convertData(self, config):
|
|
161
|
+
# self.data = convertData(self.data)
|
|
162
|
+
pass
|
|
163
|
+
|
|
164
|
+
def putData(self, config):
|
|
165
|
+
# putData(self.destUrl)
|
|
166
|
+
pass
|