reqmgr2ms-output 2.3.1rc3__tar.gz → 2.3.2__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {reqmgr2ms-output-2.3.1rc3/src/python/reqmgr2ms_output.egg-info → reqmgr2ms-output-2.3.2}/PKG-INFO +1 -1
- reqmgr2ms-output-2.3.2/bin/adhoc-scripts/adjustMongoDocs.py +124 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/updatePileupObjects.py +88 -19
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmagent-mod-config +5 -3
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/setup_dependencies.py +2 -1
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/FileTools.py +33 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Lexicon.py +8 -8
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/MSOutput/MSOutput.py +4 -8
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/Tools/Common.py +0 -20
- reqmgr2ms-output-2.3.2/src/python/WMCore/Services/DBS/DBSConcurrency.py +44 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/MSPileup/MSPileupUtils.py +0 -1
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/Rucio/Rucio.py +7 -5
- reqmgr2ms-output-2.3.2/src/python/WMCore/Services/WMStats/WMStatsPycurl.py +145 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMStats/WMStatsReader.py +34 -17
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/__init__.py +1 -1
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2/src/python/reqmgr2ms_output.egg-info}/PKG-INFO +1 -1
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/reqmgr2ms_output.egg-info/SOURCES.txt +2 -0
- reqmgr2ms-output-2.3.1rc3/bin/adhoc-scripts/adjustMongoDocs.py +0 -73
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/LICENSE +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/MANIFEST.in +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/NOTICE +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/README.md +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/HWMon/wmcore-SysStat +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/acdcserver-tools +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/ParseSpecCmsswdist.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/checkDsetFileCount.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/checkStuckLQE.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/createPileupObjects.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/drainAgent.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/fixWorkflowParentage.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/getWQStatusByWorkflow.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/injectUnified.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/mongoInit.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/parseUnifiedCampaigns.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/setrequeststatus.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/summaryWMStatsFailures.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/updateTotalStats.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/workflowCompletion.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/attempt-to-patch.sh +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/buildrelease.sh +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/check-ACDC-parentage +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/check-phedex-dbs-status +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/check-request-wq-status +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/clean-oracle +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/combineMinifyWMStats.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/couch-thrash.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/couch_archiver.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/create-iam-token.sh +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/createStoreResults.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/dbsbuffer-file-fix.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/deploy-rpm-to-jenkins.sh +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/fix-dbs-parentage +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/inject-to-config-cache +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/kill-workflow-in-agent +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/kill-workflow-in-global +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/make-local-clones.sh +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/outputmodules-from-config +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/patchComponent.sh +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/paused-jobs +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/purgeDeletedCouchDoc.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/reqmgr-put-default-config +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/reqmgr-sw-update +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/vaildateCMSSWMergeVersion +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmagent-couchapp-init +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmagent-delete-couchdb-workflow +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmagent-resource-control +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmagent-unregister-wmstats +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmagent-upload-config +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmagent-workqueue +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmc-dist-patch +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmc-dist-unpatch +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmc-httpd +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmcore-db-init +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmcore-new-config +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmcore-new-flow +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/wmcoreD +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/requirements.txt +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/setup.cfg +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/setup.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/setup_build.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/CPMetrics.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/CertTools.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/EmailAlert.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/ExtendedUnitTestCase.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/IteratorTools.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/MathUtils.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/MemoryCache.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/Patterns.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/Pipeline.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/PortForward.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/ProcessStats.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/PythonVersion.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/Signals.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/TemporaryEnvironment.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/Throttled.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/Timers.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/Timestamps.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/TokenManager.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/Tracing.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/TwPrint.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/Utilities.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/Utils/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Algorithms/Alarm.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Algorithms/MathAlgos.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Algorithms/MiscAlgos.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Algorithms/ParseXMLFile.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Algorithms/Permissions.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Algorithms/Singleton.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Algorithms/SubprocessAlgos.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Algorithms/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Cache/GenericDataCache.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Cache/WMConfigCache.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Cache/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Configuration.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DAOFactory.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/File.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/Fileset.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/Job.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/JobGroup.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/JobPackage.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/LumiList.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/Mask.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/MathStructs/ContinuousSummaryHistogram.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/MathStructs/DiscreteSummaryHistogram.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/MathStructs/SummaryHistogram.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/MathStructs/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/Pickleable.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/Run.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/Subscription.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/WMObject.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/WorkUnit.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/Workflow.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/DataStructs/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/CMSCouch.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/ConfigDBMap.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/CouchUtils.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/DBCore.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/DBCreator.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/DBExceptionHandler.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/DBFactory.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/DBFormatter.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/Dialects.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/ExecuteDAO.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/MongoDB.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/MySQL/Destroy.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/MySQL/ListUserContent.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/MySQL/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/MySQLCore.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/Oracle/Destroy.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/Oracle/ListUserContent.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/Oracle/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/ResultSet.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/Transaction.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Database/ipy_profile_couch.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/GroupUser/CouchObject.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/GroupUser/Decorators.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/GroupUser/Group.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/GroupUser/Interface.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/GroupUser/User.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/GroupUser/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/CherryPyThreads/HeartbeatMonitor.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/CherryPyThreads/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/DataStructs/DefaultStructs.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/DataStructs/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/MSCore/MSAuth.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/MSCore/MSCore.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/MSCore/MSManager.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/MSCore/TaskManager.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/MSCore/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/MSOutput/MSOutputStreamer.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/MSOutput/MSOutputTemplate.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/MSOutput/RelValPolicy.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/MSOutput/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/Service/Data.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/Service/RestApiHub.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/Service/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/Tools/PycurlRucio.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/Tools/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/WebGui/FrontPage.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/WebGui/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/Auth.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/CherryPyPeriodicTask.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/Error.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/Format.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/HeartbeatMonitorBase.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/Main.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/Server.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/Services.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/Test.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/Tools.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/Validation.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/REST/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/ReqMgr/DataStructs/RequestStatus.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/ReqMgr/DataStructs/RequestType.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/ReqMgr/DataStructs/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/ReqMgr/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/AlertManager/AlertManagerAPI.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/AlertManager/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/CRIC/CRIC.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/CRIC/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/DBS/DBS3Reader.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/DBS/DBSErrors.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/DBS/DBSReader.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/DBS/DBSUtils.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/DBS/DBSWriterObjects.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/DBS/ProdException.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/DBS/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/FWJRDB/FWJRDBAPI.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/FWJRDB/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/HTTPS/HTTPSAuthHandler.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/HTTPS/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/LogDB/LogDB.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/LogDB/LogDBBackend.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/LogDB/LogDBExceptions.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/LogDB/LogDBReport.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/LogDB/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/MSPileup/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/McM/McM.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/McM/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/MonIT/Grafana.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/MonIT/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/PyCondor/PyCondorAPI.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/PyCondor/PyCondorUtils.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/PyCondor/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/ReqMgr/ReqMgr.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/ReqMgr/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/ReqMgrAux/ReqMgrAux.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/ReqMgrAux/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/RequestDB/RequestDBReader.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/RequestDB/RequestDBWriter.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/RequestDB/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/Requests.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/Rucio/RucioUtils.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/Rucio/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/RucioConMon/RucioConMon.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/RucioConMon/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/Service.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/StompAMQ/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/TagCollector/TagCollector.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/TagCollector/XMLUtils.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/TagCollector/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/UUIDLib.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/UserFileCache/UserFileCache.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/UserFileCache/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMAgent/WMAgent.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMAgent/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMArchive/CMSSWMetrics.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMArchive/DataMap.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMArchive/WMArchive.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMArchive/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMBS/WMBS.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMBS/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMStats/DataStruct/RequestInfoCollection.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMStats/DataStruct/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMStats/WMStatsWriter.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMStats/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMStatsServer/WMStatsServer.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WMStatsServer/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WorkQueue/WorkQueue.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/WorkQueue/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/pycurl_manager.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/WMBase.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/WMConnectionBase.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/WMException.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/WMExceptions.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/WMFactory.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/WMInit.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/WMLogging.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Wrappers/JsonWrapper/JSONThunker.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Wrappers/JsonWrapper/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Wrappers/__init__.py +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/reqmgr2ms_output.egg-info/dependency_links.txt +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/reqmgr2ms_output.egg-info/requires.txt +0 -0
- {reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/reqmgr2ms_output.egg-info/top_level.txt +0 -0
@@ -0,0 +1,124 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
"""
|
3
|
+
File : adjustMongoDocs.py
|
4
|
+
Author : Valentin Kuznetsov <vkuznet AT gmail dot com>
|
5
|
+
Description: adjust documents in MongoDB with given schema
|
6
|
+
The script loops over given db documents (from given db name
|
7
|
+
and collection) and add to each document a new schema provided
|
8
|
+
via input file name, e.g.
|
9
|
+
|
10
|
+
# new schema addition:
|
11
|
+
cat > /tmp/schema.json << EOF
|
12
|
+
{"foo": 1}
|
13
|
+
EOF
|
14
|
+
|
15
|
+
# run script to update all documents in test.test database and add to them
|
16
|
+
# a json structure presented in /tmp/schema.json file
|
17
|
+
adjustMongoDocs.py --fin=/tmp/schema.json --dburi=localhost:8230 --dbname=test --dbcoll=test --verbose 1
|
18
|
+
|
19
|
+
# run script to add new transition record to all MSPileup records if they do not have it
|
20
|
+
adjustMongoDocs.py --add-tran-record --dburi=localhost:8230 --dbname=test --dbcoll=test --verbose 1
|
21
|
+
|
22
|
+
NOTE: the script can run from any location assuming it has proper db uri with
|
23
|
+
credentials and availability of mongo db outside of its own cluster, but most
|
24
|
+
likely it will be run on mongo db k8s cluster
|
25
|
+
"""
|
26
|
+
|
27
|
+
import argparse
|
28
|
+
import json
|
29
|
+
from pymongo import MongoClient
|
30
|
+
|
31
|
+
# WMCore services
|
32
|
+
from Utils.Timers import gmtimeSeconds
|
33
|
+
|
34
|
+
|
35
|
+
class OptionParser(object):
|
36
|
+
"Helper class to handle script options"
|
37
|
+
|
38
|
+
def __init__(self):
|
39
|
+
"User based option parser"
|
40
|
+
self.parser = argparse.ArgumentParser(prog='PROG')
|
41
|
+
self.parser.add_argument("--fin", action="store",
|
42
|
+
dest="fin", default="", help="Input file with update fields")
|
43
|
+
self.parser.add_argument("--dburi", action="store",
|
44
|
+
dest="dburi", default="", help="MongoDB URI")
|
45
|
+
self.parser.add_argument("--dbname", action="store",
|
46
|
+
dest="dbname", default="", help="MongoDB database")
|
47
|
+
self.parser.add_argument("--dbcoll", action="store",
|
48
|
+
dest="dbcoll", default="", help="MongoDB collection")
|
49
|
+
self.parser.add_argument("--userdn", action="store",
|
50
|
+
dest="userDN", default='', help="user DN")
|
51
|
+
self.parser.add_argument("--add-tran-record", action="store_true",
|
52
|
+
dest="transition", help="add transaction record")
|
53
|
+
self.parser.add_argument("--verbose", action="store",
|
54
|
+
dest="verbose", default=0, help="verbosity level")
|
55
|
+
|
56
|
+
|
57
|
+
def addTransitionRecord(dburi, dbname, dbcoll, userDN, verbose):
|
58
|
+
"""
|
59
|
+
Helper function to add and update in place transition record for existing MSPileup records
|
60
|
+
:param dburi: database URI (string)
|
61
|
+
:param dbname: database name (string)
|
62
|
+
:param dbcoll: database collection name (string)
|
63
|
+
:param userDN: string representing user DN
|
64
|
+
:param verbose: verbose flag (boolean)
|
65
|
+
:return: nothing
|
66
|
+
"""
|
67
|
+
if not userDN:
|
68
|
+
raise Exception("No userDN provided")
|
69
|
+
conn = MongoClient(host=dburi)
|
70
|
+
records = [r for r in conn[dbname][dbcoll].find()]
|
71
|
+
for rec in records:
|
72
|
+
if not rec.get("transition"):
|
73
|
+
tranRecord = {'containerFraction': 1.0,
|
74
|
+
'customDID': rec['pileupName'],
|
75
|
+
'updateTime': gmtimeSeconds(),
|
76
|
+
'DN': userDN}
|
77
|
+
rec['transition'] = [tranRecord]
|
78
|
+
if verbose:
|
79
|
+
print(f"update rec={rec} with new transition record={tranRecord}")
|
80
|
+
spec = {'pileupName': rec['pileupName'], 'customName': rec.get('customName', '')}
|
81
|
+
# perform update of the record
|
82
|
+
conn[dbname][dbcoll].update_one(spec, {'$set': {'transition': [tranRecord]}}, upsert=True)
|
83
|
+
|
84
|
+
|
85
|
+
def adjust(dburi, dbname, dbcoll, fin, verbose):
|
86
|
+
"""
|
87
|
+
helper script to update documents in MongoDB with given db name/collection
|
88
|
+
and schema file (which should contain new addition, in form of JSON, to the
|
89
|
+
db documents)
|
90
|
+
:param dburi: database URI (string)
|
91
|
+
:param dbname: database name (string)
|
92
|
+
:param dbcoll: database collection name (string)
|
93
|
+
:param fin: input file with schema content
|
94
|
+
:param verbose: verbose flag (boolean)
|
95
|
+
:return: nothing
|
96
|
+
"""
|
97
|
+
conn = MongoClient(host=dburi)
|
98
|
+
schema = {}
|
99
|
+
with open(fin, 'r', encoding='utf-8') as istream:
|
100
|
+
schema = json.load(istream)
|
101
|
+
if schema:
|
102
|
+
if verbose:
|
103
|
+
print(f"read data from '{dburi}', {dbname}/{dbcoll}")
|
104
|
+
records = [r for r in conn[dbname][dbcoll].find()]
|
105
|
+
for doc in records:
|
106
|
+
if verbose:
|
107
|
+
print(f"update doc={doc} with schema={schema}")
|
108
|
+
conn[dbname][dbcoll].update_one(doc, {'$set': schema}, upsert=True)
|
109
|
+
|
110
|
+
|
111
|
+
def main():
|
112
|
+
"""
|
113
|
+
Main function
|
114
|
+
"""
|
115
|
+
optmgr = OptionParser()
|
116
|
+
opts = optmgr.parser.parse_args()
|
117
|
+
if opts.transition:
|
118
|
+
addTransitionRecord(opts.dburi, opts.dbname, opts.dbcoll, opts.userDN, opts.verbose)
|
119
|
+
else:
|
120
|
+
adjust(opts.dburi, opts.dbname, opts.dbcoll, opts.fin, opts.verbose)
|
121
|
+
|
122
|
+
|
123
|
+
if __name__ == '__main__':
|
124
|
+
main()
|
{reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/bin/adhoc-scripts/updatePileupObjects.py
RENAMED
@@ -9,6 +9,9 @@ used to update every single pileup document that it fetches from MSPileup.
|
|
9
9
|
|
10
10
|
Example usage is:
|
11
11
|
python3 updatePileupObjects.py --url=https://cmsweb.cern.ch --fin=override_data.json
|
12
|
+
|
13
|
+
# run script to add new transition record to all MSPileup records if they do not have it
|
14
|
+
python3 updatePileupObjects.py --add-tran-record -url=https://cmsweb.cern.ch --userDN=<user-dn>
|
12
15
|
"""
|
13
16
|
import argparse
|
14
17
|
import json
|
@@ -19,6 +22,9 @@ import urllib.request
|
|
19
22
|
import ssl
|
20
23
|
from http.client import HTTPSConnection
|
21
24
|
|
25
|
+
# WMCore services
|
26
|
+
from Utils.Timers import gmtimeSeconds
|
27
|
+
|
22
28
|
|
23
29
|
class OptionParser():
|
24
30
|
"""Class to parse the command line arguments"""
|
@@ -26,13 +32,17 @@ class OptionParser():
|
|
26
32
|
def __init__(self):
|
27
33
|
"User based option parser"
|
28
34
|
self.parser = argparse.ArgumentParser(prog='PROG')
|
29
|
-
self.parser.add_argument("--fin",
|
30
|
-
dest="fin", help="Input
|
35
|
+
self.parser.add_argument("--fin", action="store",
|
36
|
+
dest="fin", default="", help="Input file with update fields (optional)")
|
31
37
|
self.parser.add_argument("--dry-run", action="store_true",
|
32
38
|
dest="dryrun", help="Fetch docs but do not update")
|
33
39
|
self.parser.add_argument("--url", action="store",
|
34
40
|
dest="url", default="https://cmsweb-testbed.cern.ch",
|
35
41
|
help="URL for the MSPileup service")
|
42
|
+
self.parser.add_argument("--userdn", action="store",
|
43
|
+
dest="userDN", default='', help="user DN")
|
44
|
+
self.parser.add_argument("--add-tran-record", action="store_true",
|
45
|
+
dest="transition", help="add transition record")
|
36
46
|
|
37
47
|
|
38
48
|
class HTTPSClientAuthHandler(urllib.request.HTTPSHandler):
|
@@ -147,6 +157,79 @@ def writePileupDocs(mspileupUrl, puDocs, handler, logger):
|
|
147
157
|
logger.critical(msg)
|
148
158
|
|
149
159
|
|
160
|
+
def addTransitionRecords(handler, url, userDN, logger, dryrun):
|
161
|
+
"""
|
162
|
+
Helper function to add and update in place transition record for existing MSPileup records
|
163
|
+
:param handler: HTTP handler to use
|
164
|
+
:param url: url to use (string)
|
165
|
+
:param userDN: string representing user DN
|
166
|
+
:param logger: logger to use
|
167
|
+
:param dryrun: option to run dry-run mode (boolean)
|
168
|
+
:return: nothing
|
169
|
+
"""
|
170
|
+
if not userDN:
|
171
|
+
raise Exception("No userDN provided")
|
172
|
+
puDocs = getPileupDocs(url, handler, logger)
|
173
|
+
logger.info("Found %d documents in MSPileup", len(puDocs))
|
174
|
+
recordsToUpdate = []
|
175
|
+
for rec in puDocs:
|
176
|
+
if not rec.get("transition"):
|
177
|
+
tranRecord = {'containerFraction': 1.0,
|
178
|
+
'customDID': rec['pileupName'],
|
179
|
+
'updateTime': gmtimeSeconds(),
|
180
|
+
'DN': userDN}
|
181
|
+
rec['transition'] = [tranRecord]
|
182
|
+
logger.info("New pileup document is: %s", rec)
|
183
|
+
recordsToUpdate.append(rec)
|
184
|
+
|
185
|
+
if dryrun:
|
186
|
+
logger.info("%s documents needs to be updated but are not written due to --dry-run option\n", len(recordsToUpdate))
|
187
|
+
else:
|
188
|
+
# finally, update the pileup documents in the database
|
189
|
+
writePileupDocs(url, recordsToUpdate, handler, logger)
|
190
|
+
logger.info("%s documents are uploaded to MSPileup\n", len(recordsToUpdate))
|
191
|
+
|
192
|
+
|
193
|
+
def updatePileupRecords(handler, url, logger, dryrun, fin=""):
|
194
|
+
"""
|
195
|
+
helper function to update pileup records
|
196
|
+
:param handler: HTTP handler to use
|
197
|
+
:param url: url to use (string)
|
198
|
+
:param logger: logger object to use
|
199
|
+
:param dryrun: option to run dry-run mode (boolean)
|
200
|
+
:param fin: input file name to read from (optional, string)
|
201
|
+
:return: nothing
|
202
|
+
"""
|
203
|
+
if fin:
|
204
|
+
if os.path.exists(fin):
|
205
|
+
with open(fin, 'r', encoding='utf-8') as istream:
|
206
|
+
puOverride = json.load(istream)
|
207
|
+
logger.info("Pileup override file: %s has the following content: %s", fin, puOverride)
|
208
|
+
else:
|
209
|
+
logger.error("Provided %s file does not exist", fin)
|
210
|
+
os.exit(1)
|
211
|
+
else:
|
212
|
+
logger.info("No input file is provided to update pileup records")
|
213
|
+
os.exit(1)
|
214
|
+
|
215
|
+
puDocs = getPileupDocs(url, handler, logger)
|
216
|
+
logger.info("Found %d documents in MSPileup", len(puDocs))
|
217
|
+
|
218
|
+
# update the documents with the override content
|
219
|
+
for doc in puDocs:
|
220
|
+
doc.update(puOverride)
|
221
|
+
logger.info("New pileup document is: %s", doc)
|
222
|
+
|
223
|
+
if dryrun:
|
224
|
+
logger.info("Updated documents (dry-run option):")
|
225
|
+
for doc in puDocs:
|
226
|
+
logger.info(doc)
|
227
|
+
else:
|
228
|
+
# finally, update the pileup documents in the database
|
229
|
+
writePileupDocs(url, puDocs, handler, logger)
|
230
|
+
logger.info("documents are uploaded to MSPileup\n")
|
231
|
+
|
232
|
+
|
150
233
|
def main():
|
151
234
|
"""Executes everything"""
|
152
235
|
optmgr = OptionParser()
|
@@ -179,24 +262,10 @@ def main():
|
|
179
262
|
# initialize HTTPS client handler
|
180
263
|
handler = HTTPSClientAuthHandler(key, cert)
|
181
264
|
|
182
|
-
|
183
|
-
|
184
|
-
logger.info("Pileup override file: %s has the following content: %s", opts.fin, puOverride)
|
185
|
-
|
186
|
-
puDocs = getPileupDocs(opts.url, handler, logger)
|
187
|
-
logger.info("Found %d documents in MSPileup", len(puDocs))
|
188
|
-
|
189
|
-
# update the documents with the override content
|
190
|
-
for doc in puDocs:
|
191
|
-
doc.update(puOverride)
|
192
|
-
logger.info("New pileup document is: %s", doc)
|
193
|
-
|
194
|
-
if opts.dryrun:
|
195
|
-
logger.info("documents are not written due to --dry-run option\n")
|
265
|
+
if opts.transition:
|
266
|
+
addTransitionRecords(handler, opts.url, opts.userDN, logger, opts.dryrun)
|
196
267
|
else:
|
197
|
-
|
198
|
-
writePileupDocs(opts.url, puDocs, handler, logger)
|
199
|
-
logger.info("documents are uploaded to MSPileup\n")
|
268
|
+
updatePileupRecords(handler, opts.url, logger, opts.dryrun, opts.fin)
|
200
269
|
|
201
270
|
|
202
271
|
if __name__ == '__main__':
|
@@ -288,13 +288,15 @@ def modifyConfiguration(config, **args):
|
|
288
288
|
if hasattr(config, "ArchiveDataReporter"):
|
289
289
|
config.ArchiveDataReporter.WMArchiveURL = args["wmarchive_url"]
|
290
290
|
|
291
|
-
|
291
|
+
# custom WMArchiveReporter
|
292
292
|
if hasattr(config, "WorkflowUpdater"):
|
293
|
+
config.WorkflowUpdater.dbsUrl = args.get("dbs3_reader_url", None)
|
293
294
|
config.WorkflowUpdater.rucioUrl = args["rucio_host"]
|
294
295
|
config.WorkflowUpdater.rucioAuthUrl = args["rucio_auth"]
|
295
296
|
if args.get("mspileup_url", None):
|
296
297
|
config.WorkflowUpdater.msPileupUrl = args["mspileup_url"]
|
297
298
|
|
299
|
+
|
298
300
|
return config
|
299
301
|
|
300
302
|
|
@@ -319,7 +321,7 @@ def main(argv=None):
|
|
319
321
|
"sb_hostname=", "sb_port=", "sb_basepath=", "ufc_hostname=", "ufc_port=",
|
320
322
|
"ufc_service_url=", "ufc_cachedir=", "client_mapping=",
|
321
323
|
"workload_summary_url=", "coredb_url=", "wmstats_url=", "ops_proxy=",
|
322
|
-
"reqmgr2_url=", "acdc_url=", "amq_auth_file=", "dbs3_url=",
|
324
|
+
"reqmgr2_url=", "acdc_url=", "amq_auth_file=", "dbs3_url=", "dbs3_reader_url=",
|
323
325
|
"dqm_url=", "grafana_token=", "requestcouch_url=", "central_logdb_url=",
|
324
326
|
"wmarchive_url=", "amq_credentials=",
|
325
327
|
"rucio_account=", "rucio_host=", "rucio_auth=", "mspileup_url="])
|
@@ -343,7 +345,7 @@ def main(argv=None):
|
|
343
345
|
'--ufc_port', '--ufc_service_url', '--ufc_cachedir',
|
344
346
|
'--client_mapping', '--workload_summary_url',
|
345
347
|
'--wmstats_url', '--ops_proxy', '--reqmgr2_url', '--acdc_url',
|
346
|
-
'--amq_auth_file', '--dbs3_url', '--dqm_url',
|
348
|
+
'--amq_auth_file', '--dbs3_url', '--dbs3_reader_url', '--dqm_url',
|
347
349
|
'--grafana_token', '--requestcouch_url', '--central_logdb_url',
|
348
350
|
'--wmarchive_url', '--amq_credentials',
|
349
351
|
'--rucio_account', '--rucio_host', '--rucio_auth', '--mspileup_url'):
|
@@ -223,7 +223,8 @@ dependencies = {
|
|
223
223
|
'packages': ['WMCore.Credential', 'WMCore.Algorithms+', 'WMCore.WMSpec+',
|
224
224
|
'WMCore.JobSplitting', 'WMCore.Services+', 'Utils+'],
|
225
225
|
'systems': ['wmc-database', 'wmc-runtime'],
|
226
|
-
'modules': ['WMCore.WMBS.File', 'WMCore.WMBS.WMBSBase', 'WMCore.WMBS.__init__'
|
226
|
+
'modules': ['WMCore.WMBS.File', 'WMCore.WMBS.WMBSBase', 'WMCore.WMBS.__init__',
|
227
|
+
'WMCore.BossAir.Plugins.BasePlugin', 'WMCore.BossAir.Plugins.__init__'],
|
227
228
|
},
|
228
229
|
'wmclient': {
|
229
230
|
'systems': ['wmc-runtime', 'wmc-database']
|
@@ -6,6 +6,7 @@ Utilities related to file handling
|
|
6
6
|
|
7
7
|
import io
|
8
8
|
import os
|
9
|
+
import glob
|
9
10
|
import stat
|
10
11
|
import subprocess
|
11
12
|
import time
|
@@ -13,6 +14,37 @@ import zlib
|
|
13
14
|
|
14
15
|
from Utils.Utilities import decodeBytesToUnicode
|
15
16
|
|
17
|
+
|
18
|
+
def findFiles(path, pat):
|
19
|
+
"""
|
20
|
+
Find files within given path and matching given pattern.
|
21
|
+
:param path: starting directory path (string)
|
22
|
+
:param pat: match pattern (string), e.g. *.py or name of the file
|
23
|
+
:return: matched file names
|
24
|
+
"""
|
25
|
+
files = []
|
26
|
+
for idir, _, _ in os.walk(path):
|
27
|
+
files.extend(glob.glob(os.path.join(idir, pat)))
|
28
|
+
return files
|
29
|
+
|
30
|
+
|
31
|
+
def tarMode(tfile, opMode):
|
32
|
+
"""
|
33
|
+
Extract proper mode of operation for given tar file. For instance,
|
34
|
+
if op='r' and tfile name is file.tar.gz we should get 'r:gz',
|
35
|
+
while if tfile name is file.tar.bz2 we should get 'r':bz2', while
|
36
|
+
if tfile name is file.tar we should get 'r', etc.
|
37
|
+
:param opMode: mode of operation (string), e.g. 'r', or 'w'
|
38
|
+
:param tfile: sandbox tar file name (string)
|
39
|
+
:return: mode of operation
|
40
|
+
"""
|
41
|
+
ext = tfile.split(".")[-1]
|
42
|
+
if ext == 'tar':
|
43
|
+
return opMode
|
44
|
+
mode = opMode + ':' + ext
|
45
|
+
return mode
|
46
|
+
|
47
|
+
|
16
48
|
def calculateChecksums(filename):
|
17
49
|
"""
|
18
50
|
_calculateChecksums_
|
@@ -108,6 +140,7 @@ def findMagicStr(filename, matchString):
|
|
108
140
|
if matchString in line:
|
109
141
|
yield line
|
110
142
|
|
143
|
+
|
111
144
|
def getFullPath(name, envPath="PATH"):
|
112
145
|
"""
|
113
146
|
:param name: file name
|
@@ -26,7 +26,7 @@ from WMCore.WMException import WMException, WMEXCEPTION_START_STR, WMEXCEPTION_E
|
|
26
26
|
# i.e production should end with v[number]
|
27
27
|
PRIMARY_DS = {'re': '^[a-zA-Z][a-zA-Z0-9\-_]*$', 'maxLength': 99}
|
28
28
|
PROCESSED_DS = {'re': '[a-zA-Z0-9\.\-_]+', 'maxLength': 199}
|
29
|
-
TIER = {'re': '[A-
|
29
|
+
TIER = {'re': '[A-Z0-9\-_]+', 'maxLength': 99}
|
30
30
|
BLOCK_STR = {'re': '#[a-zA-Z0-9\.\-_]+', 'maxLength': 100}
|
31
31
|
|
32
32
|
lfnParts = {
|
@@ -99,11 +99,11 @@ def searchblock(candidate):
|
|
99
99
|
"""
|
100
100
|
A block name with a * wildcard one or more times in it.
|
101
101
|
"""
|
102
|
-
regexp = r"^/(\*|[a-zA-Z\*][a-zA-Z0-9_\*]{0,100})(/(\*|[a-zA-Z0-9_\.\-\*]{1,199})){0,1}(/(\*|[A-
|
102
|
+
regexp = r"^/(\*|[a-zA-Z\*][a-zA-Z0-9_\*]{0,100})(/(\*|[a-zA-Z0-9_\.\-\*]{1,199})){0,1}(/(\*|[A-Z0-9\-\*]{1,99})(#(\*|[a-zA-Z0-9\.\-_\*]){0,100}){0,1}){0,1}$"
|
103
103
|
return check(regexp, candidate)
|
104
104
|
|
105
105
|
|
106
|
-
SEARCHDATASET_RE = r'^/(\*|[a-zA-Z\*][a-zA-Z0-9_\*\-]{0,100})(/(\*|[a-zA-Z0-9_\.\-\*]{1,199})){0,1}(/(\*|[A-
|
106
|
+
SEARCHDATASET_RE = r'^/(\*|[a-zA-Z\*][a-zA-Z0-9_\*\-]{0,100})(/(\*|[a-zA-Z0-9_\.\-\*]{1,199})){0,1}(/(\*|[A-Z0-9\-\*]{1,99})){0,1}$'
|
107
107
|
|
108
108
|
|
109
109
|
def searchdataset(candidate):
|
@@ -202,7 +202,7 @@ def globalTag(candidate):
|
|
202
202
|
return check(r'[a-zA-Z0-9\s\.\-_:]{1,100}$', candidate)
|
203
203
|
|
204
204
|
|
205
|
-
DATASET_RE = r'^/[a-zA-Z0-9\-_]{1,99}/[a-zA-Z0-9\.\-_]{1,199}/[A-
|
205
|
+
DATASET_RE = r'^/[a-zA-Z0-9\-_]{1,99}/[a-zA-Z0-9\.\-_]{1,199}/[A-Z0-9\-]{1,99}$'
|
206
206
|
|
207
207
|
|
208
208
|
def dataset(candidate):
|
@@ -354,8 +354,8 @@ def lfn(candidate):
|
|
354
354
|
|
355
355
|
Add for LHE files: /data/lhe/...
|
356
356
|
"""
|
357
|
-
regexp1 = '/([a-z]+)/([a-z0-9]+)/(%(era)s)/([a-zA-Z0-9\-_]+)/([A-
|
358
|
-
regexp2 = '/([a-z]+)/([a-z0-9]+)/([a-z0-9]+)/([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)/([A-
|
357
|
+
regexp1 = '/([a-z]+)/([a-z0-9]+)/(%(era)s)/([a-zA-Z0-9\-_]+)/([A-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)((/[0-9]+){3}){0,1}/([0-9]+)/([a-zA-Z0-9\-_]+).root' % lfnParts
|
358
|
+
regexp2 = '/([a-z]+)/([a-z0-9]+)/([a-z0-9]+)/([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)/([A-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)((/[0-9]+){3}){0,1}/([0-9]+)/([a-zA-Z0-9\-_]+).root'
|
359
359
|
regexp3 = '/store/(temp/)*(user|group)/(%(hnName)s|%(physics_group)s)/%(primDS)s/%(procDS)s/%(version)s/%(counter)s/%(root)s' % lfnParts
|
360
360
|
regexp4 = '/store/(temp/)*(user|group)/(%(hnName)s|%(physics_group)s)/%(primDS)s/(%(subdir)s/)+%(root)s' % lfnParts
|
361
361
|
|
@@ -437,8 +437,8 @@ def lfnBase(candidate):
|
|
437
437
|
As lfn above, but for doing the lfnBase
|
438
438
|
i.e., for use in spec generation and parsing
|
439
439
|
"""
|
440
|
-
regexp1 = '/([a-z]+)/([a-z0-9]+)/([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)/([A-
|
441
|
-
regexp2 = '/([a-z]+)/([a-z0-9]+)/([a-z0-9]+)/([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)/([A-
|
440
|
+
regexp1 = '/([a-z]+)/([a-z0-9]+)/([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)/([A-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)'
|
441
|
+
regexp2 = '/([a-z]+)/([a-z0-9]+)/([a-z0-9]+)/([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)/([A-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)((/[0-9]+){3}){0,1}'
|
442
442
|
regexp3 = '/(store)/(temp/)*(user|group)/(%(hnName)s|%(physics_group)s)/%(primDS)s/%(procDS)s/%(version)s' % lfnParts
|
443
443
|
|
444
444
|
tier0LFN = '/store/(backfill/[0-9]/){0,1}(t0temp/|unmerged/){0,1}(data|express|hidata)/%(era)s/%(primDS)s/%(tier)s/%(version)s/%(counter)s/%(counter)s/%(counter)s' % lfnParts
|
@@ -1,14 +1,10 @@
|
|
1
1
|
"""
|
2
|
-
File :
|
2
|
+
File : MSOutput.py
|
3
3
|
|
4
4
|
Description: MSOutput.py class provides the whole logic behind
|
5
5
|
the Output data placement in WMCore MicroServices.
|
6
6
|
"""
|
7
7
|
|
8
|
-
# futures
|
9
|
-
from __future__ import division, print_function
|
10
|
-
from future.utils import viewitems
|
11
|
-
|
12
8
|
# system modules
|
13
9
|
import time
|
14
10
|
from pymongo import IndexModel, ReturnDocument, errors
|
@@ -88,7 +84,7 @@ class MSOutput(MSCore):
|
|
88
84
|
self.msConfig.setdefault("enableRelValCustodial", False)
|
89
85
|
self.msConfig.setdefault("excludeDataTier", [])
|
90
86
|
self.msConfig.setdefault("rucioAccount", 'wmcore_transferor')
|
91
|
-
self.msConfig.setdefault("rucioRSEAttribute", '
|
87
|
+
self.msConfig.setdefault("rucioRSEAttribute", 'dm_weight')
|
92
88
|
self.msConfig.setdefault("rucioDiskRuleWeight", 'ddm_quota')
|
93
89
|
self.msConfig.setdefault("rucioTapeExpression", 'rse_type=TAPE\cms_type=test')
|
94
90
|
# This Disk expression wil target all real DISK T1 and T2 RSEs
|
@@ -240,7 +236,7 @@ class MSOutput(MSCore):
|
|
240
236
|
|
241
237
|
# filter out documents already produced
|
242
238
|
finalRequests = []
|
243
|
-
for reqName, reqData in
|
239
|
+
for reqName, reqData in requestRecords.items():
|
244
240
|
if reqName in mongoDocNames:
|
245
241
|
self.logger.info("Mongo document already created for %s, skipping it.", reqName)
|
246
242
|
else:
|
@@ -634,7 +630,7 @@ class MSOutput(MSCore):
|
|
634
630
|
A function used to update one or few particular fields in a document
|
635
631
|
:**kwargs: The keys/value pairs to be updated (will be tested against MSOutputTemplate)
|
636
632
|
"""
|
637
|
-
for key, value in
|
633
|
+
for key, value in kwargs.items():
|
638
634
|
try:
|
639
635
|
msOutDoc.setKey(key, value)
|
640
636
|
msOutDoc.updateTime()
|
{reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/MicroService/Tools/Common.py
RENAMED
@@ -106,26 +106,6 @@ def dbsInfo(datasets, dbsUrl):
|
|
106
106
|
return datasetBlocks, datasetSizes, datasetTransfers
|
107
107
|
|
108
108
|
|
109
|
-
def getPileupDocs(mspileupUrl, queryDict):
|
110
|
-
"""
|
111
|
-
Fetch documents from MSPileup according to the query passed in.
|
112
|
-
:param mspileupUrl: string with the MSPileup url
|
113
|
-
:param queryDict: dictionary with the MongoDB query to run
|
114
|
-
:return: returns a list with all the pileup objects, or raises
|
115
|
-
an exception in case of failure
|
116
|
-
"""
|
117
|
-
mgr = RequestHandler()
|
118
|
-
headers = {'Content-Type': 'application/json'}
|
119
|
-
data = mgr.getdata(mspileupUrl, queryDict, headers, verb='POST',
|
120
|
-
ckey=ckey(), cert=cert(), encode=True, decode=True)
|
121
|
-
if data and data.get("result", []):
|
122
|
-
if "error" in data["result"][0]:
|
123
|
-
msg = f"Failed to retrieve MSPileup documents with query: {queryDict}"
|
124
|
-
msg += f" and error message: {data}"
|
125
|
-
raise RuntimeError(msg)
|
126
|
-
return data["result"]
|
127
|
-
|
128
|
-
|
129
109
|
def getPileupDatasetSizes(datasets, phedexUrl):
|
130
110
|
"""
|
131
111
|
Given a list of datasets, find all their blocks with replicas
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
"""
|
3
|
+
File : DBSConcurrency.py
|
4
|
+
Author : Valentin Kuznetsov <vkuznet AT gmail dot com>
|
5
|
+
Description: dedicated module to holds DBS related functions executed
|
6
|
+
concurrent calls to DBS APIs.
|
7
|
+
"""
|
8
|
+
|
9
|
+
import json
|
10
|
+
import urllib
|
11
|
+
from WMCore.Services.pycurl_manager import getdata as multi_getdata
|
12
|
+
|
13
|
+
|
14
|
+
def getBlockInfo4PU(blockNames, dbsUrl, ckey, cert):
|
15
|
+
"""
|
16
|
+
Fetch block information details, file list and number of events, from DBS
|
17
|
+
server. Here we use concrete set of parameters for DBS to use in this case, i.e.
|
18
|
+
we must look-up only valid files and get full details from the DBS API (in order
|
19
|
+
to get number of events).
|
20
|
+
:param blockNames: list of block names
|
21
|
+
:param dbsUrl: dbs URL
|
22
|
+
:param ckey: user keyfile
|
23
|
+
:param cert: user certificate
|
24
|
+
:return: dictionary of {block: {"FileList": list of strings, "NumberOfEvents": integer}, ...}
|
25
|
+
"""
|
26
|
+
urls = []
|
27
|
+
for blk in blockNames:
|
28
|
+
# need to encode block name properly
|
29
|
+
block = urllib.parse.quote_plus(blk)
|
30
|
+
url = f"{dbsUrl}/files?detail=true&validFileOnly=1&block_name={block}"
|
31
|
+
urls.append(url)
|
32
|
+
# place concurrent calls to DBS, please note that multi_getdata is generator, therefore
|
33
|
+
# it does not put DBS results into the memory until this generator is iterated
|
34
|
+
results = multi_getdata(urls, ckey, cert)
|
35
|
+
# parse output of getdata in some form
|
36
|
+
blockInfo = {}
|
37
|
+
for row in results:
|
38
|
+
blk = row['url'].split('block_name=')[-1]
|
39
|
+
block = urllib.parse.unquote_plus(blk)
|
40
|
+
data = json.loads(row['data'])
|
41
|
+
files = [r['logical_file_name'] for r in data]
|
42
|
+
nevents = sum([r['event_count'] for r in data])
|
43
|
+
blockInfo[block] = {'FileList': files, 'NumberOfEvents': nevents}
|
44
|
+
return blockInfo
|
@@ -21,7 +21,6 @@ def getPileupDocs(mspileupUrl, queryDict=None, method='GET'):
|
|
21
21
|
queryDict = queryDict or {}
|
22
22
|
mgr = RequestHandler()
|
23
23
|
headers = {'Content-Type': 'application/json'}
|
24
|
-
# TODO: Use GET instead?
|
25
24
|
data = mgr.getdata(mspileupUrl, queryDict, headers, verb=method,
|
26
25
|
ckey=ckey(), cert=cert(), encode=True, decode=True)
|
27
26
|
if data and data.get("result", []):
|
{reqmgr2ms-output-2.3.1rc3 → reqmgr2ms-output-2.3.2}/src/python/WMCore/Services/Rucio/Rucio.py
RENAMED
@@ -169,7 +169,7 @@ class Rucio(object):
|
|
169
169
|
:return: a list of block names
|
170
170
|
"""
|
171
171
|
blockNames = []
|
172
|
-
if not self.isContainer(container):
|
172
|
+
if not self.isContainer(container, scope=scope):
|
173
173
|
# input container wasn't really a container
|
174
174
|
self.logger.warning("Provided DID name is not a CONTAINER type: %s", container)
|
175
175
|
return blockNames
|
@@ -360,7 +360,9 @@ class Rucio(object):
|
|
360
360
|
"""
|
361
361
|
if not isinstance(dids, list):
|
362
362
|
dids = [dids]
|
363
|
-
dids
|
363
|
+
# NOTE: the attaching dids do not create new container within a scope
|
364
|
+
# and it is safe to use cms scope for it
|
365
|
+
dids = [{'scope': 'cms', 'name': did} for did in dids]
|
364
366
|
|
365
367
|
response = False
|
366
368
|
try:
|
@@ -881,7 +883,7 @@ class Rucio(object):
|
|
881
883
|
|
882
884
|
# At this point, we might already have some of the RSEs where the data is available and locked
|
883
885
|
# Now check dataset locks and compare those rules against our list of multi RSE rules
|
884
|
-
if self.isContainer(kwargs['name']):
|
886
|
+
if self.isContainer(kwargs['name'], scope=kwargs.get('scope', 'cms')):
|
885
887
|
# It's a container! Find what those RSEs are and add them to the finalRSEs set
|
886
888
|
rseLocks = self._getContainerLockedAndAvailable(multiRSERules, returnTape=returnTape, **kwargs)
|
887
889
|
self.logger.debug("Data location for %s from multiple RSE locks and available at: %s",
|
@@ -988,7 +990,7 @@ class Rucio(object):
|
|
988
990
|
a specific method for this process, even though that adds some code duplication.
|
989
991
|
"""
|
990
992
|
result = dict()
|
991
|
-
if not self.isContainer(container):
|
993
|
+
if not self.isContainer(container, scope=scope):
|
992
994
|
raise WMRucioException("Pileup location needs to be resolved for a container DID type")
|
993
995
|
|
994
996
|
multiRSERules = []
|
@@ -1096,7 +1098,7 @@ class Rucio(object):
|
|
1096
1098
|
"""
|
1097
1099
|
if 'name' not in kwargs:
|
1098
1100
|
raise WMRucioException("A DID name must be provided to the getBlockLockedAndAvailable API")
|
1099
|
-
if self.isContainer(kwargs['name']):
|
1101
|
+
if self.isContainer(kwargs['name'], scope=kwargs.get('scope', 'cms')):
|
1100
1102
|
# then resolve it at container level and all its blocks
|
1101
1103
|
return self.getContainerLockedAndAvailable(**kwargs)
|
1102
1104
|
|