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,273 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import random
|
|
3
|
+
import time
|
|
4
|
+
from json import JSONEncoder
|
|
5
|
+
|
|
6
|
+
import WMCore
|
|
7
|
+
from Utils.IteratorTools import grouper
|
|
8
|
+
from WMCore.Database.CMSCouch import CouchNotFoundError
|
|
9
|
+
from WMCore.Services.WMStats.WMStatsReader import WMStatsReader
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def monitorDocFromRequestSchema(schema):
|
|
13
|
+
"""
|
|
14
|
+
prun and convert
|
|
15
|
+
"""
|
|
16
|
+
doc = {}
|
|
17
|
+
doc["_id"] = schema['RequestName']
|
|
18
|
+
doc["workflow"] = schema['RequestName']
|
|
19
|
+
doc["requestor"] = schema['Requestor']
|
|
20
|
+
doc["campaign"] = schema['Campaign']
|
|
21
|
+
doc["request_type"] = schema['RequestType']
|
|
22
|
+
doc["priority"] = schema['RequestPriority']
|
|
23
|
+
doc["group"] = schema['Group']
|
|
24
|
+
doc["request_date"] = schema['RequestDate']
|
|
25
|
+
doc["type"] = "reqmgr_request"
|
|
26
|
+
# additional field
|
|
27
|
+
doc["inputdataset"] = schema.get('InputDataset', "")
|
|
28
|
+
# additional field for Analysis work
|
|
29
|
+
doc["vo_group"] = schema.get('VoGroup', "")
|
|
30
|
+
doc["vo_role"] = schema.get('VoRole', "")
|
|
31
|
+
doc["user_dn"] = schema.get('RequestorDN', "")
|
|
32
|
+
doc["async_dest"] = schema.get('asyncDest', "")
|
|
33
|
+
doc["dbs_url"] = schema.get("DbsUrl", "")
|
|
34
|
+
doc["publish_dbs_url"] = schema.get("PublishDbsUrl", "")
|
|
35
|
+
doc["outputdatasets"] = schema.get('OutputDatasets', [])
|
|
36
|
+
doc["cmssw"] = schema.get('CMSSWVersion', [])
|
|
37
|
+
doc['prep_id'] = schema.get('PrepID', None)
|
|
38
|
+
|
|
39
|
+
# team name is not yet available need to be updated in assign status
|
|
40
|
+
# doc['team'] = schema['team']
|
|
41
|
+
return doc
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def convertToServiceCouchDoc(wqInfo, wqURL):
|
|
45
|
+
"""
|
|
46
|
+
Convert services generic info into a proper couch doc.
|
|
47
|
+
"""
|
|
48
|
+
wqDoc = {}
|
|
49
|
+
wqDoc['_id'] = wqURL
|
|
50
|
+
wqDoc['agent_url'] = wqURL
|
|
51
|
+
wqDoc['agent_team'] = ""
|
|
52
|
+
wqDoc['agent_version'] = WMCore.__version__
|
|
53
|
+
wqDoc['timestamp'] = int(time.time())
|
|
54
|
+
wqDoc['down_components'] = []
|
|
55
|
+
wqDoc['type'] = "agent_info"
|
|
56
|
+
wqDoc.update(wqInfo)
|
|
57
|
+
|
|
58
|
+
return wqDoc
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class WMStatsWriter(WMStatsReader):
|
|
62
|
+
def __init__(self, couchURL, appName="WMStats", reqdbURL=None, reqdbCouchApp="ReqMgr"):
|
|
63
|
+
# set the connection for local couchDB call
|
|
64
|
+
WMStatsReader.__init__(self, couchURL, appName, reqdbURL, reqdbCouchApp)
|
|
65
|
+
|
|
66
|
+
def _sanitizeURL(self, couchURL):
|
|
67
|
+
"""
|
|
68
|
+
don't sanitize url for writer
|
|
69
|
+
"""
|
|
70
|
+
return couchURL
|
|
71
|
+
|
|
72
|
+
def uploadData(self, docs):
|
|
73
|
+
"""
|
|
74
|
+
upload to given couchURL using cert and key authentication and authorization
|
|
75
|
+
"""
|
|
76
|
+
# add delete docs as well for the compaction
|
|
77
|
+
# need to check whether delete and update is successful
|
|
78
|
+
if isinstance(docs, dict):
|
|
79
|
+
docs = [docs]
|
|
80
|
+
for doc in docs:
|
|
81
|
+
self.couchDB.queue(doc)
|
|
82
|
+
return self.couchDB.commit(returndocs=True)
|
|
83
|
+
|
|
84
|
+
def bulkUpdateData(self, docs, existingDocs):
|
|
85
|
+
"""
|
|
86
|
+
Update documents to WMStats in bulk, breaking down to 100 docs chunks.
|
|
87
|
+
:param docs: docs to insert or update
|
|
88
|
+
:param existingDocs: dict of docId: docRev of docs already existent in wmstats
|
|
89
|
+
"""
|
|
90
|
+
if isinstance(docs, dict):
|
|
91
|
+
docs = [docs]
|
|
92
|
+
for chunk in grouper(docs, 100):
|
|
93
|
+
for doc in chunk:
|
|
94
|
+
if doc['_id'] in existingDocs:
|
|
95
|
+
revList = existingDocs[doc['_id']].split('-')
|
|
96
|
+
# update the revision number and keep the history of the revision
|
|
97
|
+
doc['_revisions'] = {"start": int(revList[0]) + 1, "ids": [str(int(revList[1]) + 1), revList[1]]}
|
|
98
|
+
else:
|
|
99
|
+
# then create a random 10 digits uid for the first revision number, required by new_edits=False
|
|
100
|
+
firstId = "%10d" % random.randrange(9999999999)
|
|
101
|
+
doc['_revisions'] = {"start": 1, "ids": [firstId]}
|
|
102
|
+
self.couchDB.queue(doc)
|
|
103
|
+
|
|
104
|
+
logging.info("Committing bulk of %i docs ...", len(chunk))
|
|
105
|
+
self.couchDB.commit(new_edits=False)
|
|
106
|
+
return
|
|
107
|
+
|
|
108
|
+
def insertRequest(self, schema):
|
|
109
|
+
doc = monitorDocFromRequestSchema(schema)
|
|
110
|
+
return self.insertGenericRequest(doc)
|
|
111
|
+
|
|
112
|
+
def updateTeam(self, request, team):
|
|
113
|
+
return self.couchDB.updateDocument(request, self.couchapp, 'team',
|
|
114
|
+
fields={'team': team})
|
|
115
|
+
|
|
116
|
+
def insertTotalStats(self, request, totalStats):
|
|
117
|
+
"""
|
|
118
|
+
update the total stats of given workflow (total_jobs, input_events, input_lumis, input_num_files)
|
|
119
|
+
"""
|
|
120
|
+
return self.couchDB.updateDocument(request, self.couchapp, 'totalStats',
|
|
121
|
+
fields=totalStats)
|
|
122
|
+
|
|
123
|
+
def updateFromWMSpec(self, spec):
|
|
124
|
+
# currently only update priority and siteWhitelist and output dataset
|
|
125
|
+
# complex field needs to be JSON encoded
|
|
126
|
+
# assuming all the toplevel tasks has the same site white lists
|
|
127
|
+
# priority is priority + user priority + group priority
|
|
128
|
+
fields = {'priority': spec.priority(),
|
|
129
|
+
'site_white_list': spec.getTopLevelTask()[0].siteWhitelist(),
|
|
130
|
+
'outputdatasets': spec.listOutputDatasets()}
|
|
131
|
+
return self.couchDB.updateDocument(spec.name(), self.couchapp,
|
|
132
|
+
'generalFields',
|
|
133
|
+
fields={'general_fields': JSONEncoder().encode(fields)})
|
|
134
|
+
|
|
135
|
+
def updateRequestsInfo(self, docs):
|
|
136
|
+
"""
|
|
137
|
+
bulk update for request documents.
|
|
138
|
+
TODO: change to bulk update handler when it gets supported
|
|
139
|
+
"""
|
|
140
|
+
for doc in docs:
|
|
141
|
+
del doc['type']
|
|
142
|
+
self.couchDB.updateDocument(doc['workflow'], self.couchapp,
|
|
143
|
+
'generalFields',
|
|
144
|
+
fields={'general_fields': JSONEncoder().encode(doc)})
|
|
145
|
+
|
|
146
|
+
def updateAgentInfo(self, agentInfo, propertiesToKeep=None):
|
|
147
|
+
"""
|
|
148
|
+
replace the agentInfo document with new one.
|
|
149
|
+
:param agentInfo: dictionary for agent info
|
|
150
|
+
:param propertiesToKeep: list of properties to keep original value
|
|
151
|
+
:return: None
|
|
152
|
+
"""
|
|
153
|
+
try:
|
|
154
|
+
exist_doc = self.couchDB.document(agentInfo["_id"])
|
|
155
|
+
agentInfo["_rev"] = exist_doc["_rev"]
|
|
156
|
+
if propertiesToKeep and isinstance(propertiesToKeep, list):
|
|
157
|
+
for prop in propertiesToKeep:
|
|
158
|
+
if prop in exist_doc:
|
|
159
|
+
agentInfo[prop] = exist_doc[prop]
|
|
160
|
+
|
|
161
|
+
except CouchNotFoundError:
|
|
162
|
+
# this means document is not exist so we will just insert
|
|
163
|
+
pass
|
|
164
|
+
finally:
|
|
165
|
+
result = self.couchDB.commitOne(agentInfo)
|
|
166
|
+
return result
|
|
167
|
+
|
|
168
|
+
def updateAgentInfoInPlace(self, agentURL, agentInfo):
|
|
169
|
+
"""
|
|
170
|
+
:param agentInfo: dictionary for agent info
|
|
171
|
+
:return: document update status
|
|
172
|
+
|
|
173
|
+
update agentInfo in couch in place without replacing a doucment
|
|
174
|
+
"""
|
|
175
|
+
return self.couchDB.updateDocument(agentURL, self.couchapp, 'agentInfo', fields=agentInfo)
|
|
176
|
+
|
|
177
|
+
def updateLogArchiveLFN(self, jobNames, logArchiveLFN):
|
|
178
|
+
for jobName in jobNames:
|
|
179
|
+
self.couchDB.updateDocument(jobName, self.couchapp,
|
|
180
|
+
'jobLogArchiveLocation',
|
|
181
|
+
fields={'logArchiveLFN': logArchiveLFN})
|
|
182
|
+
|
|
183
|
+
def deleteOldDocs(self, days):
|
|
184
|
+
"""
|
|
185
|
+
delete the documents from wmstats db older than param 'days'
|
|
186
|
+
"""
|
|
187
|
+
sec = int(days * 24 * 60 * 60)
|
|
188
|
+
threshold = int(time.time()) - sec
|
|
189
|
+
options = {"startkey": threshold, "descending": True,
|
|
190
|
+
"stale": "update_after"}
|
|
191
|
+
result = self._getCouchView("time", options)
|
|
192
|
+
|
|
193
|
+
for row in result['rows']:
|
|
194
|
+
doc = {}
|
|
195
|
+
doc['_id'] = row['value']['id']
|
|
196
|
+
doc['_rev'] = row['value']['rev']
|
|
197
|
+
self.couchDB.queueDelete(doc)
|
|
198
|
+
committed = self.couchDB.commit()
|
|
199
|
+
|
|
200
|
+
if committed:
|
|
201
|
+
errorReport = {}
|
|
202
|
+
deleted = 0
|
|
203
|
+
for data in committed:
|
|
204
|
+
if 'error' in data:
|
|
205
|
+
errorReport.setdefault(data['error'], 0)
|
|
206
|
+
errorReport[data['error']] += 1
|
|
207
|
+
else:
|
|
208
|
+
deleted += 1
|
|
209
|
+
return {'delete': deleted, 'error': errorReport}
|
|
210
|
+
else:
|
|
211
|
+
return "nothing"
|
|
212
|
+
|
|
213
|
+
def replicate(self, target):
|
|
214
|
+
return self.couchServer.replicate(self.dbName, target, continuous=True,
|
|
215
|
+
filter='WMStats/repfilter')
|
|
216
|
+
|
|
217
|
+
def getActiveTasks(self):
|
|
218
|
+
"""
|
|
219
|
+
This is in Writter instance since it needs admin permission
|
|
220
|
+
"""
|
|
221
|
+
couchStatus = self.couchServer.status()
|
|
222
|
+
return couchStatus['active_tasks']
|
|
223
|
+
|
|
224
|
+
def deleteDocsByIDs(self, ids):
|
|
225
|
+
|
|
226
|
+
if not ids:
|
|
227
|
+
# if ids is empty don't run this
|
|
228
|
+
# it will delete all the docs
|
|
229
|
+
return None
|
|
230
|
+
|
|
231
|
+
docs = self.couchDB.allDocs(keys=ids)['rows']
|
|
232
|
+
for j in docs:
|
|
233
|
+
doc = {}
|
|
234
|
+
doc["_id"] = j['id']
|
|
235
|
+
doc["_rev"] = j['value']['rev']
|
|
236
|
+
self.couchDB.queueDelete(doc)
|
|
237
|
+
committed = self.couchDB.commit()
|
|
238
|
+
return committed
|
|
239
|
+
|
|
240
|
+
def replaceRequestTransitionFromReqMgr(self, docs):
|
|
241
|
+
"""
|
|
242
|
+
bulk update for request documents.
|
|
243
|
+
TODO: change to bulk update handler when it gets supported
|
|
244
|
+
"""
|
|
245
|
+
|
|
246
|
+
for doc in docs:
|
|
247
|
+
requestName = doc["RequestName"]
|
|
248
|
+
requestTransition = {}
|
|
249
|
+
requestTransition['request_status'] = []
|
|
250
|
+
for r in doc["RequestTransition"]:
|
|
251
|
+
newR = {}
|
|
252
|
+
newR['status'] = r['Status']
|
|
253
|
+
newR['update_time'] = r['UpdateTime']
|
|
254
|
+
requestTransition['request_status'].append(newR)
|
|
255
|
+
|
|
256
|
+
self.couchDB.updateDocument(requestName, self.couchapp,
|
|
257
|
+
'generalFields',
|
|
258
|
+
fields={'general_fields': JSONEncoder().encode(requestTransition)})
|
|
259
|
+
|
|
260
|
+
def deleteDocsByWorkflow(self, requestName):
|
|
261
|
+
"""
|
|
262
|
+
delete all wmstats docs for a given requestName
|
|
263
|
+
"""
|
|
264
|
+
options = {"reduce": False, "key": requestName}
|
|
265
|
+
docs = self._getCouchView("allWorkflows", options)['rows']
|
|
266
|
+
|
|
267
|
+
for j in docs:
|
|
268
|
+
doc = {}
|
|
269
|
+
doc["_id"] = j['value']['id']
|
|
270
|
+
doc["_rev"] = j['value']['rev']
|
|
271
|
+
self.couchDB.queueDelete(doc)
|
|
272
|
+
committed = self.couchDB.commit()
|
|
273
|
+
return committed
|
|
File without changes
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
from builtins import str, bytes
|
|
2
|
+
from future.utils import viewitems
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
from WMCore.Services.Service import Service
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class WMStatsServer(Service):
|
|
11
|
+
"""
|
|
12
|
+
API to query wmstats server: mostly against acive datacache
|
|
13
|
+
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def __init__(self, url, header=None, logger=None):
|
|
17
|
+
"""
|
|
18
|
+
responseType will be either xml or json
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
httpDict = {}
|
|
22
|
+
header = header or {}
|
|
23
|
+
# url is end point
|
|
24
|
+
httpDict['endpoint'] = "%s/data" % url
|
|
25
|
+
httpDict['logger'] = logger if logger else logging.getLogger()
|
|
26
|
+
|
|
27
|
+
# cherrypy converts request.body to params when content type is set
|
|
28
|
+
# application/x-www-form-urlencodeds
|
|
29
|
+
httpDict.setdefault("content_type", 'application/json')
|
|
30
|
+
httpDict.setdefault('cacheduration', 0)
|
|
31
|
+
httpDict.setdefault("accept_type", "application/json")
|
|
32
|
+
httpDict.update(header)
|
|
33
|
+
self.encoder = json.dumps
|
|
34
|
+
Service.__init__(self, httpDict)
|
|
35
|
+
|
|
36
|
+
def _getResult(self, callname, clearCache=True, args=None, verb="GET",
|
|
37
|
+
encoder=json.loads, decoder=json.loads, contentType=None):
|
|
38
|
+
"""
|
|
39
|
+
_getResult_
|
|
40
|
+
"""
|
|
41
|
+
cfile = callname.replace("/", "_")
|
|
42
|
+
if clearCache:
|
|
43
|
+
self.clearCache(cfile, args, verb)
|
|
44
|
+
|
|
45
|
+
f = self.refreshCache(cfile, callname, args, encoder=encoder,
|
|
46
|
+
verb=verb, contentType=contentType)
|
|
47
|
+
result = f.read()
|
|
48
|
+
f.close()
|
|
49
|
+
|
|
50
|
+
if result and decoder:
|
|
51
|
+
result = decoder(result)
|
|
52
|
+
|
|
53
|
+
return result['result']
|
|
54
|
+
|
|
55
|
+
def _createQuery(self, queryDict):
|
|
56
|
+
"""
|
|
57
|
+
_createQuery
|
|
58
|
+
:param queryDict: is the format of {name: values} fair. value can be sting, int or list
|
|
59
|
+
:type queryDict: dict
|
|
60
|
+
:returns: url query string
|
|
61
|
+
"""
|
|
62
|
+
args = ""
|
|
63
|
+
for name, values in viewitems(queryDict):
|
|
64
|
+
if isinstance(values, (str, bytes, int)):
|
|
65
|
+
values = [values]
|
|
66
|
+
for val in values:
|
|
67
|
+
args += '%s=%s&' % (name, val)
|
|
68
|
+
|
|
69
|
+
return args.rstrip('&')
|
|
70
|
+
|
|
71
|
+
def getGlobalLocks(self):
|
|
72
|
+
"""
|
|
73
|
+
_getGlobalLocks_
|
|
74
|
+
|
|
75
|
+
A public method to return the global locks from WMStatServer.
|
|
76
|
+
:returns: A list of datasets
|
|
77
|
+
"""
|
|
78
|
+
callname = 'globallocks'
|
|
79
|
+
return self._getResult(callname, clearCache=True, verb="GET")
|
|
80
|
+
|
|
81
|
+
def getActiveData(self):
|
|
82
|
+
|
|
83
|
+
"""
|
|
84
|
+
_getActiveData_
|
|
85
|
+
|
|
86
|
+
:returns:
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
callname = 'requestcache'
|
|
90
|
+
return self._getResult(callname, verb="GET")[0]
|
|
91
|
+
|
|
92
|
+
def getFilteredActiveData(self, inputCondition, outputMask):
|
|
93
|
+
"""
|
|
94
|
+
_getFilteredActiveData_
|
|
95
|
+
|
|
96
|
+
:param inputCondition: dict of Condition
|
|
97
|
+
:type inputCondition: dict
|
|
98
|
+
:param outputMask: list of output mask
|
|
99
|
+
:type outputMask: list
|
|
100
|
+
:returns: list of dict or which passes the input condition and only result on outputMask
|
|
101
|
+
"""
|
|
102
|
+
inputCondition.update({'mask': outputMask})
|
|
103
|
+
query = self._createQuery(inputCondition)
|
|
104
|
+
callname = 'filtered_requests?%s' % query
|
|
105
|
+
return self._getResult(callname, verb="GET")
|
|
106
|
+
|
|
107
|
+
def getChildParentDatasetMap(self, requestType="StepChain", parentageResolved=False):
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
:param requestType: specify the type of requests you want find the parentag
|
|
111
|
+
:param dataset: child dataset
|
|
112
|
+
:param includeInputDataset:
|
|
113
|
+
:return: dict of {child_dataset_name: parent_dataset_name}
|
|
114
|
+
"""
|
|
115
|
+
queryFilter = {"RequestType": requestType, "ParentageResolved": parentageResolved}
|
|
116
|
+
mask = ["ChainParentageMap"]
|
|
117
|
+
|
|
118
|
+
results = self.getFilteredActiveData(queryFilter, mask)
|
|
119
|
+
childParentMap = {}
|
|
120
|
+
for info in results:
|
|
121
|
+
if info["ChainParentageMap"]:
|
|
122
|
+
for childParentDS in info["ChainParentageMap"]:
|
|
123
|
+
if childParentDS["ParentDset"]:
|
|
124
|
+
for childDS in childParentDS["ChildDsets"]:
|
|
125
|
+
childParentMap[childDS] = childParentDS["ParentDset"]
|
|
126
|
+
return childParentMap
|
|
127
|
+
|
|
128
|
+
def getProtectedLFNs(self):
|
|
129
|
+
"""
|
|
130
|
+
A method to be used for fetching a list of all protected lfns from WMStatServer
|
|
131
|
+
:returns: a unique list of protected LFNs
|
|
132
|
+
"""
|
|
133
|
+
callname = 'protectedlfns'
|
|
134
|
+
return list(set(self._getResult(callname, verb="GET")))
|
|
File without changes
|