reqmgr2ms-monitor 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.
Files changed (273) hide show
  1. {reqmgr2ms-monitor-2.3.1rc3/src/python/reqmgr2ms_monitor.egg-info → reqmgr2ms-monitor-2.3.2}/PKG-INFO +1 -1
  2. reqmgr2ms-monitor-2.3.2/bin/adhoc-scripts/adjustMongoDocs.py +124 -0
  3. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/updatePileupObjects.py +88 -19
  4. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmagent-mod-config +5 -3
  5. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/setup_dependencies.py +2 -1
  6. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/FileTools.py +33 -0
  7. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Lexicon.py +8 -8
  8. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/Tools/Common.py +0 -20
  9. reqmgr2ms-monitor-2.3.2/src/python/WMCore/Services/DBS/DBSConcurrency.py +44 -0
  10. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/MSPileup/MSPileupUtils.py +0 -1
  11. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/Rucio/Rucio.py +7 -5
  12. reqmgr2ms-monitor-2.3.2/src/python/WMCore/Services/WMStats/WMStatsPycurl.py +145 -0
  13. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMStats/WMStatsReader.py +34 -17
  14. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/__init__.py +1 -1
  15. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2/src/python/reqmgr2ms_monitor.egg-info}/PKG-INFO +1 -1
  16. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/reqmgr2ms_monitor.egg-info/SOURCES.txt +2 -0
  17. reqmgr2ms-monitor-2.3.1rc3/bin/adhoc-scripts/adjustMongoDocs.py +0 -73
  18. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/LICENSE +0 -0
  19. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/MANIFEST.in +0 -0
  20. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/NOTICE +0 -0
  21. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/README.md +0 -0
  22. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/HWMon/wmcore-SysStat +0 -0
  23. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/acdcserver-tools +0 -0
  24. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/ParseSpecCmsswdist.py +0 -0
  25. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/checkDsetFileCount.py +0 -0
  26. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/checkStuckLQE.py +0 -0
  27. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/createPileupObjects.py +0 -0
  28. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/drainAgent.py +0 -0
  29. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/fixWorkflowParentage.py +0 -0
  30. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/getWQStatusByWorkflow.py +0 -0
  31. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/injectUnified.py +0 -0
  32. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/mongoInit.py +0 -0
  33. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/parseUnifiedCampaigns.py +0 -0
  34. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/setrequeststatus.py +0 -0
  35. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/summaryWMStatsFailures.py +0 -0
  36. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/updateTotalStats.py +0 -0
  37. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/adhoc-scripts/workflowCompletion.py +0 -0
  38. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/attempt-to-patch.sh +0 -0
  39. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/buildrelease.sh +0 -0
  40. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/check-ACDC-parentage +0 -0
  41. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/check-phedex-dbs-status +0 -0
  42. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/check-request-wq-status +0 -0
  43. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/clean-oracle +0 -0
  44. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/combineMinifyWMStats.py +0 -0
  45. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/couch-thrash.py +0 -0
  46. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/couch_archiver.py +0 -0
  47. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/create-iam-token.sh +0 -0
  48. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/createStoreResults.py +0 -0
  49. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/dbsbuffer-file-fix.py +0 -0
  50. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/deploy-rpm-to-jenkins.sh +0 -0
  51. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/fix-dbs-parentage +0 -0
  52. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/inject-to-config-cache +0 -0
  53. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/kill-workflow-in-agent +0 -0
  54. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/kill-workflow-in-global +0 -0
  55. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/make-local-clones.sh +0 -0
  56. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/outputmodules-from-config +0 -0
  57. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/patchComponent.sh +0 -0
  58. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/paused-jobs +0 -0
  59. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/purgeDeletedCouchDoc.py +0 -0
  60. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/reqmgr-put-default-config +0 -0
  61. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/reqmgr-sw-update +0 -0
  62. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/vaildateCMSSWMergeVersion +0 -0
  63. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmagent-couchapp-init +0 -0
  64. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmagent-delete-couchdb-workflow +0 -0
  65. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmagent-resource-control +0 -0
  66. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmagent-unregister-wmstats +0 -0
  67. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmagent-upload-config +0 -0
  68. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmagent-workqueue +0 -0
  69. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmc-dist-patch +0 -0
  70. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmc-dist-unpatch +0 -0
  71. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmc-httpd +0 -0
  72. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmcore-db-init +0 -0
  73. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmcore-new-config +0 -0
  74. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmcore-new-flow +0 -0
  75. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/bin/wmcoreD +0 -0
  76. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/requirements.txt +0 -0
  77. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/setup.cfg +0 -0
  78. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/setup.py +0 -0
  79. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/setup_build.py +0 -0
  80. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/CPMetrics.py +0 -0
  81. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/CertTools.py +0 -0
  82. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/EmailAlert.py +0 -0
  83. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/ExtendedUnitTestCase.py +0 -0
  84. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/IteratorTools.py +0 -0
  85. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/MathUtils.py +0 -0
  86. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/MemoryCache.py +0 -0
  87. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/Patterns.py +0 -0
  88. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/Pipeline.py +0 -0
  89. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/PortForward.py +0 -0
  90. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/ProcessStats.py +0 -0
  91. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/PythonVersion.py +0 -0
  92. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/Signals.py +0 -0
  93. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/TemporaryEnvironment.py +0 -0
  94. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/Throttled.py +0 -0
  95. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/Timers.py +0 -0
  96. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/Timestamps.py +0 -0
  97. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/TokenManager.py +0 -0
  98. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/Tracing.py +0 -0
  99. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/TwPrint.py +0 -0
  100. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/Utilities.py +0 -0
  101. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/Utils/__init__.py +0 -0
  102. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Algorithms/Alarm.py +0 -0
  103. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Algorithms/MathAlgos.py +0 -0
  104. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Algorithms/MiscAlgos.py +0 -0
  105. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Algorithms/ParseXMLFile.py +0 -0
  106. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Algorithms/Permissions.py +0 -0
  107. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Algorithms/Singleton.py +0 -0
  108. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Algorithms/SubprocessAlgos.py +0 -0
  109. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Algorithms/__init__.py +0 -0
  110. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Cache/GenericDataCache.py +0 -0
  111. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Cache/WMConfigCache.py +0 -0
  112. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Cache/__init__.py +0 -0
  113. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Configuration.py +0 -0
  114. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DAOFactory.py +0 -0
  115. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/File.py +0 -0
  116. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/Fileset.py +0 -0
  117. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/Job.py +0 -0
  118. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/JobGroup.py +0 -0
  119. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/JobPackage.py +0 -0
  120. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/LumiList.py +0 -0
  121. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/Mask.py +0 -0
  122. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/MathStructs/ContinuousSummaryHistogram.py +0 -0
  123. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/MathStructs/DiscreteSummaryHistogram.py +0 -0
  124. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/MathStructs/SummaryHistogram.py +0 -0
  125. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/MathStructs/__init__.py +0 -0
  126. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/Pickleable.py +0 -0
  127. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/Run.py +0 -0
  128. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/Subscription.py +0 -0
  129. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/WMObject.py +0 -0
  130. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/WorkUnit.py +0 -0
  131. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/Workflow.py +0 -0
  132. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/DataStructs/__init__.py +0 -0
  133. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/CMSCouch.py +0 -0
  134. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/ConfigDBMap.py +0 -0
  135. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/CouchUtils.py +0 -0
  136. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/DBCore.py +0 -0
  137. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/DBCreator.py +0 -0
  138. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/DBExceptionHandler.py +0 -0
  139. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/DBFactory.py +0 -0
  140. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/DBFormatter.py +0 -0
  141. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/Dialects.py +0 -0
  142. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/ExecuteDAO.py +0 -0
  143. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/MongoDB.py +0 -0
  144. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/MySQL/Destroy.py +0 -0
  145. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/MySQL/ListUserContent.py +0 -0
  146. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/MySQL/__init__.py +0 -0
  147. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/MySQLCore.py +0 -0
  148. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/Oracle/Destroy.py +0 -0
  149. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/Oracle/ListUserContent.py +0 -0
  150. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/Oracle/__init__.py +0 -0
  151. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/ResultSet.py +0 -0
  152. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/Transaction.py +0 -0
  153. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/__init__.py +0 -0
  154. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Database/ipy_profile_couch.py +0 -0
  155. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/GroupUser/CouchObject.py +0 -0
  156. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/GroupUser/Decorators.py +0 -0
  157. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/GroupUser/Group.py +0 -0
  158. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/GroupUser/Interface.py +0 -0
  159. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/GroupUser/User.py +0 -0
  160. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/GroupUser/__init__.py +0 -0
  161. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/CherryPyThreads/HeartbeatMonitor.py +0 -0
  162. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/CherryPyThreads/__init__.py +0 -0
  163. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/DataStructs/DefaultStructs.py +0 -0
  164. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/DataStructs/__init__.py +0 -0
  165. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/MSCore/MSAuth.py +0 -0
  166. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/MSCore/MSCore.py +0 -0
  167. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/MSCore/MSManager.py +0 -0
  168. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/MSCore/TaskManager.py +0 -0
  169. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/MSCore/__init__.py +0 -0
  170. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/MSMonitor/MSMonitor.py +0 -0
  171. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/MSMonitor/__init__.py +0 -0
  172. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/Service/Data.py +0 -0
  173. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/Service/RestApiHub.py +0 -0
  174. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/Service/__init__.py +0 -0
  175. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/Tools/PycurlRucio.py +0 -0
  176. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/Tools/__init__.py +0 -0
  177. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/WebGui/FrontPage.py +0 -0
  178. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/MicroService/WebGui/__init__.py +0 -0
  179. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/Auth.py +0 -0
  180. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/CherryPyPeriodicTask.py +0 -0
  181. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/Error.py +0 -0
  182. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/Format.py +0 -0
  183. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/HeartbeatMonitorBase.py +0 -0
  184. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/Main.py +0 -0
  185. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/Server.py +0 -0
  186. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/Services.py +0 -0
  187. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/Test.py +0 -0
  188. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/Tools.py +0 -0
  189. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/Validation.py +0 -0
  190. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/REST/__init__.py +0 -0
  191. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/ReqMgr/DataStructs/RequestStatus.py +0 -0
  192. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/ReqMgr/DataStructs/RequestType.py +0 -0
  193. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/ReqMgr/DataStructs/__init__.py +0 -0
  194. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/ReqMgr/__init__.py +0 -0
  195. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/AlertManager/AlertManagerAPI.py +0 -0
  196. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/AlertManager/__init__.py +0 -0
  197. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/CRIC/CRIC.py +0 -0
  198. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/CRIC/__init__.py +0 -0
  199. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/DBS/DBS3Reader.py +0 -0
  200. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/DBS/DBSErrors.py +0 -0
  201. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/DBS/DBSReader.py +0 -0
  202. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/DBS/DBSUtils.py +0 -0
  203. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/DBS/DBSWriterObjects.py +0 -0
  204. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/DBS/ProdException.py +0 -0
  205. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/DBS/__init__.py +0 -0
  206. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/FWJRDB/FWJRDBAPI.py +0 -0
  207. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/FWJRDB/__init__.py +0 -0
  208. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/HTTPS/HTTPSAuthHandler.py +0 -0
  209. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/HTTPS/__init__.py +0 -0
  210. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/LogDB/LogDB.py +0 -0
  211. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/LogDB/LogDBBackend.py +0 -0
  212. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/LogDB/LogDBExceptions.py +0 -0
  213. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/LogDB/LogDBReport.py +0 -0
  214. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/LogDB/__init__.py +0 -0
  215. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/MSPileup/__init__.py +0 -0
  216. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/McM/McM.py +0 -0
  217. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/McM/__init__.py +0 -0
  218. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/MonIT/Grafana.py +0 -0
  219. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/MonIT/__init__.py +0 -0
  220. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/PyCondor/PyCondorAPI.py +0 -0
  221. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/PyCondor/PyCondorUtils.py +0 -0
  222. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/PyCondor/__init__.py +0 -0
  223. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/ReqMgr/ReqMgr.py +0 -0
  224. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/ReqMgr/__init__.py +0 -0
  225. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/ReqMgrAux/ReqMgrAux.py +0 -0
  226. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/ReqMgrAux/__init__.py +0 -0
  227. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/RequestDB/RequestDBReader.py +0 -0
  228. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/RequestDB/RequestDBWriter.py +0 -0
  229. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/RequestDB/__init__.py +0 -0
  230. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/Requests.py +0 -0
  231. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/Rucio/RucioUtils.py +0 -0
  232. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/Rucio/__init__.py +0 -0
  233. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/RucioConMon/RucioConMon.py +0 -0
  234. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/RucioConMon/__init__.py +0 -0
  235. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/Service.py +0 -0
  236. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/StompAMQ/__init__.py +0 -0
  237. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/TagCollector/TagCollector.py +0 -0
  238. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/TagCollector/XMLUtils.py +0 -0
  239. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/TagCollector/__init__.py +0 -0
  240. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/UUIDLib.py +0 -0
  241. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/UserFileCache/UserFileCache.py +0 -0
  242. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/UserFileCache/__init__.py +0 -0
  243. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMAgent/WMAgent.py +0 -0
  244. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMAgent/__init__.py +0 -0
  245. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMArchive/CMSSWMetrics.py +0 -0
  246. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMArchive/DataMap.py +0 -0
  247. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMArchive/WMArchive.py +0 -0
  248. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMArchive/__init__.py +0 -0
  249. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMBS/WMBS.py +0 -0
  250. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMBS/__init__.py +0 -0
  251. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMStats/DataStruct/RequestInfoCollection.py +0 -0
  252. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMStats/DataStruct/__init__.py +0 -0
  253. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMStats/WMStatsWriter.py +0 -0
  254. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMStats/__init__.py +0 -0
  255. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMStatsServer/WMStatsServer.py +0 -0
  256. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WMStatsServer/__init__.py +0 -0
  257. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WorkQueue/WorkQueue.py +0 -0
  258. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/WorkQueue/__init__.py +0 -0
  259. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/__init__.py +0 -0
  260. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Services/pycurl_manager.py +0 -0
  261. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/WMBase.py +0 -0
  262. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/WMConnectionBase.py +0 -0
  263. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/WMException.py +0 -0
  264. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/WMExceptions.py +0 -0
  265. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/WMFactory.py +0 -0
  266. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/WMInit.py +0 -0
  267. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/WMLogging.py +0 -0
  268. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Wrappers/JsonWrapper/JSONThunker.py +0 -0
  269. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Wrappers/JsonWrapper/__init__.py +0 -0
  270. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/WMCore/Wrappers/__init__.py +0 -0
  271. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/reqmgr2ms_monitor.egg-info/dependency_links.txt +0 -0
  272. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/reqmgr2ms_monitor.egg-info/requires.txt +0 -0
  273. {reqmgr2ms-monitor-2.3.1rc3 → reqmgr2ms-monitor-2.3.2}/src/python/reqmgr2ms_monitor.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: reqmgr2ms-monitor
3
- Version: 2.3.1rc3
3
+ Version: 2.3.2
4
4
  Summary: UNKNOWN
5
5
  Home-page: https://github.com/dmwm/WMCore
6
6
  Maintainer: CMS DMWM Group
@@ -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()
@@ -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", required=True,
30
- dest="fin", help="Input JSON file")
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
- with open(opts.fin, 'r', encoding='utf-8') as istream:
183
- puOverride = json.load(istream)
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
- # finally, update the pileup documents in the database
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
- # custom WMArchiveReporter
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-Z\-_]+', 'maxLength': 99}
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-Z\-\*]{1,99})(#(\*|[a-zA-Z0-9\.\-_\*]){0,100}){0,1}){0,1}$"
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-Z\-\*]{1,50})){0,1}$'
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-Z\-]{1,50}$'
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-Z\-_]+)/([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-Z\-_]+)/([a-zA-Z0-9\-_]+)((/[0-9]+){3}){0,1}/([0-9]+)/([a-zA-Z0-9\-_]+).root'
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-Z\-_]+)/([a-zA-Z0-9\-_]+)'
441
- regexp2 = '/([a-z]+)/([a-z0-9]+)/([a-z0-9]+)/([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)/([A-Z\-_]+)/([a-zA-Z0-9\-_]+)((/[0-9]+){3}){0,1}'
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
@@ -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", []):
@@ -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 = [{'scope': scope, 'name': did} for did in 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