rucio 32.6.0.post1__tar.gz → 33.0.0rc2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rucio might be problematic. Click here for more details.

Files changed (587) hide show
  1. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/PKG-INFO +25 -25
  2. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/alembicrevision.py +1 -1
  3. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/request.py +25 -2
  4. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/didclient.py +0 -13
  5. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/did_meta_plugins/filter_engine.py +2 -2
  6. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/oidc.py +113 -4
  7. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/permission/atlas.py +13 -0
  8. rucio-33.0.0rc2/lib/rucio/core/plugins.py +148 -0
  9. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/request.py +598 -20
  10. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/rse.py +59 -6
  11. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/rule.py +149 -90
  12. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/rule_grouping.py +6 -6
  13. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/topology.py +36 -0
  14. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/transfer.py +421 -170
  15. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/conveyor/poller.py +40 -17
  16. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/conveyor/receiver.py +20 -6
  17. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/reaper/reaper.py +15 -22
  18. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/storage/consistency/actions.py +1 -1
  19. rucio-33.0.0rc2/lib/rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +56 -0
  20. rucio-33.0.0rc2/lib/rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +56 -0
  21. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/models.py +21 -39
  22. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/sautils.py +1 -1
  23. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/gfal.py +1 -1
  24. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/rclone.py +1 -1
  25. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/srm.py +1 -1
  26. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/ssh.py +1 -1
  27. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/xrootd.py +1 -1
  28. rucio-33.0.0rc2/lib/rucio/vcsversion.py +11 -0
  29. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/ping.py +2 -2
  30. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/requests.py +91 -1
  31. rucio-33.0.0rc2/lib/rucio/web/rest/ping.py +28 -0
  32. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio.egg-info/SOURCES.txt +4 -6
  33. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/requirements.txt +26 -26
  34. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_conveyor.py +16 -1
  35. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_conveyor_submitter.py +9 -2
  36. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_daemons.py +1 -2
  37. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_oidc.py +31 -1
  38. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_request.py +80 -1
  39. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_transfer.py +33 -1
  40. rucio-32.6.0.post1/bin/rucio-light-reaper +0 -53
  41. rucio-32.6.0.post1/lib/rucio/api/temporary_did.py +0 -49
  42. rucio-32.6.0.post1/lib/rucio/core/temporary_did.py +0 -188
  43. rucio-32.6.0.post1/lib/rucio/daemons/reaper/light_reaper.py +0 -255
  44. rucio-32.6.0.post1/lib/rucio/vcsversion.py +0 -11
  45. rucio-32.6.0.post1/lib/rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -115
  46. rucio-32.6.0.post1/tests/test_temporary_did.py +0 -74
  47. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/AUTHORS.rst +0 -0
  48. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/ChangeLog +0 -0
  49. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/LICENSE +0 -0
  50. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/MANIFEST.in +0 -0
  51. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/README.rst +0 -0
  52. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio +0 -0
  53. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-abacus-account +0 -0
  54. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-abacus-collection-replica +0 -0
  55. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-abacus-rse +0 -0
  56. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-admin +0 -0
  57. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-atropos +0 -0
  58. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-auditor +0 -0
  59. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-automatix +0 -0
  60. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-bb8 +0 -0
  61. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-c3po +0 -0
  62. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-cache-client +0 -0
  63. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-cache-consumer +0 -0
  64. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-conveyor-finisher +0 -0
  65. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-conveyor-poller +0 -0
  66. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-conveyor-preparer +0 -0
  67. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-conveyor-receiver +0 -0
  68. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-conveyor-stager +0 -0
  69. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-conveyor-submitter +0 -0
  70. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-conveyor-throttler +0 -0
  71. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-dark-reaper +0 -0
  72. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-dumper +0 -0
  73. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-follower +0 -0
  74. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-hermes +0 -0
  75. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-judge-cleaner +0 -0
  76. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-judge-evaluator +0 -0
  77. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-judge-injector +0 -0
  78. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-judge-repairer +0 -0
  79. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-kronos +0 -0
  80. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-minos +0 -0
  81. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-minos-temporary-expiration +0 -0
  82. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-necromancer +0 -0
  83. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-oauth-manager +0 -0
  84. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-reaper +0 -0
  85. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-replica-recoverer +0 -0
  86. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-storage-consistency-actions +0 -0
  87. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-transmogrifier +0 -0
  88. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/bin/rucio-undertaker +0 -0
  89. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/alembic.ini.template +0 -0
  90. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/alembic_offline.ini.template +0 -0
  91. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/globus-config.yml.template +0 -0
  92. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/ldap.cfg.template +0 -0
  93. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/mail_templates/rule_approval_request.tmpl +0 -0
  94. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
  95. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/mail_templates/rule_approved_user.tmpl +0 -0
  96. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
  97. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/mail_templates/rule_denied_user.tmpl +0 -0
  98. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
  99. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/rse-accounts.cfg.template +0 -0
  100. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/rucio.cfg.atlas.client.template +0 -0
  101. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/rucio.cfg.template +0 -0
  102. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/etc/rucio_multi_vo.cfg.template +0 -0
  103. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/__init__.py +0 -0
  104. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/__init__.py +0 -0
  105. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/account.py +0 -0
  106. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/account_limit.py +0 -0
  107. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/authentication.py +0 -0
  108. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/config.py +0 -0
  109. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/credential.py +0 -0
  110. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/did.py +0 -0
  111. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/dirac.py +0 -0
  112. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/exporter.py +0 -0
  113. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/heartbeat.py +0 -0
  114. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/identity.py +0 -0
  115. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/importer.py +0 -0
  116. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/lifetime_exception.py +0 -0
  117. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/lock.py +0 -0
  118. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/meta.py +0 -0
  119. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/permission.py +0 -0
  120. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/quarantined_replica.py +0 -0
  121. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/replica.py +0 -0
  122. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/rse.py +0 -0
  123. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/rule.py +0 -0
  124. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/scope.py +0 -0
  125. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/subscription.py +0 -0
  126. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/api/vo.py +0 -0
  127. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/__init__.py +0 -0
  128. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/accountclient.py +0 -0
  129. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/accountlimitclient.py +0 -0
  130. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/baseclient.py +0 -0
  131. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/client.py +0 -0
  132. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/configclient.py +0 -0
  133. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/credentialclient.py +0 -0
  134. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/diracclient.py +0 -0
  135. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/downloadclient.py +0 -0
  136. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/exportclient.py +0 -0
  137. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/fileclient.py +0 -0
  138. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/importclient.py +0 -0
  139. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/lifetimeclient.py +0 -0
  140. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/lockclient.py +0 -0
  141. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/metaclient.py +0 -0
  142. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/pingclient.py +0 -0
  143. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/replicaclient.py +0 -0
  144. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/requestclient.py +0 -0
  145. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/rseclient.py +0 -0
  146. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/ruleclient.py +0 -0
  147. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/scopeclient.py +0 -0
  148. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/subscriptionclient.py +0 -0
  149. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/touchclient.py +0 -0
  150. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/client/uploadclient.py +0 -0
  151. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/__init__.py +0 -0
  152. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/cache.py +0 -0
  153. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/config.py +0 -0
  154. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/constants.py +0 -0
  155. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/constraints.py +0 -0
  156. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/didtype.py +0 -0
  157. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/dumper/__init__.py +0 -0
  158. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/dumper/consistency.py +0 -0
  159. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/dumper/data_models.py +0 -0
  160. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/dumper/path_parsing.py +0 -0
  161. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/exception.py +0 -0
  162. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/extra.py +0 -0
  163. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/logging.py +0 -0
  164. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/pcache.py +0 -0
  165. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/policy.py +0 -0
  166. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/schema/__init__.py +0 -0
  167. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/schema/atlas.py +0 -0
  168. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/schema/belleii.py +0 -0
  169. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/schema/cms.py +0 -0
  170. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/schema/domatpc.py +0 -0
  171. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/schema/escape.py +0 -0
  172. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/schema/generic.py +0 -0
  173. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
  174. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/schema/icecube.py +0 -0
  175. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/schema/lsst.py +0 -0
  176. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/stomp_utils.py +0 -0
  177. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/stopwatch.py +0 -0
  178. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/test_rucio_server.py +0 -0
  179. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/types.py +0 -0
  180. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/common/utils.py +0 -0
  181. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/__init__.py +0 -0
  182. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/account.py +0 -0
  183. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/account_counter.py +0 -0
  184. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/account_limit.py +0 -0
  185. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/authentication.py +0 -0
  186. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/config.py +0 -0
  187. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/credential.py +0 -0
  188. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/did.py +0 -0
  189. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/did_meta_plugins/__init__.py +0 -0
  190. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/did_meta_plugins/did_column_meta.py +0 -0
  191. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +0 -0
  192. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/did_meta_plugins/json_meta.py +0 -0
  193. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/did_meta_plugins/mongo_meta.py +0 -0
  194. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/did_meta_plugins/postgres_meta.py +0 -0
  195. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/dirac.py +0 -0
  196. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/distance.py +0 -0
  197. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/exporter.py +0 -0
  198. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/heartbeat.py +0 -0
  199. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/identity.py +0 -0
  200. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/importer.py +0 -0
  201. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/lifetime_exception.py +0 -0
  202. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/lock.py +0 -0
  203. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/message.py +0 -0
  204. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/meta.py +0 -0
  205. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/monitor.py +0 -0
  206. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/naming_convention.py +0 -0
  207. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/nongrid_trace.py +0 -0
  208. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/permission/__init__.py +0 -0
  209. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/permission/belleii.py +0 -0
  210. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/permission/cms.py +0 -0
  211. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/permission/escape.py +0 -0
  212. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/permission/generic.py +0 -0
  213. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
  214. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/quarantined_replica.py +0 -0
  215. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/replica.py +0 -0
  216. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/replica_sorter.py +0 -0
  217. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/rse_counter.py +0 -0
  218. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/rse_expression_parser.py +0 -0
  219. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/rse_selector.py +0 -0
  220. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/scope.py +0 -0
  221. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/subscription.py +0 -0
  222. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/trace.py +0 -0
  223. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/vo.py +0 -0
  224. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/core/volatile_replica.py +0 -0
  225. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/__init__.py +0 -0
  226. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/abacus/__init__.py +0 -0
  227. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/abacus/account.py +0 -0
  228. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
  229. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/abacus/rse.py +0 -0
  230. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/atropos/__init__.py +0 -0
  231. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/atropos/atropos.py +0 -0
  232. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/auditor/__init__.py +0 -0
  233. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/auditor/hdfs.py +0 -0
  234. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
  235. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/automatix/__init__.py +0 -0
  236. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/automatix/automatix.py +0 -0
  237. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
  238. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/badreplicas/minos.py +0 -0
  239. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
  240. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
  241. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/bb8/__init__.py +0 -0
  242. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/bb8/bb8.py +0 -0
  243. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/bb8/common.py +0 -0
  244. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
  245. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
  246. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/__init__.py +0 -0
  247. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/algorithms/__init__.py +0 -0
  248. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/algorithms/simple.py +0 -0
  249. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/algorithms/t2_free_space.py +0 -0
  250. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +0 -0
  251. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +0 -0
  252. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/c3po.py +0 -0
  253. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/collectors/__init__.py +0 -0
  254. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/collectors/agis.py +0 -0
  255. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/collectors/free_space.py +0 -0
  256. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/collectors/jedi_did.py +0 -0
  257. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/collectors/mock_did.py +0 -0
  258. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/collectors/network_metrics.py +0 -0
  259. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/collectors/workload.py +0 -0
  260. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/utils/__init__.py +0 -0
  261. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/utils/dataset_cache.py +0 -0
  262. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/utils/expiring_dataset_cache.py +0 -0
  263. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/utils/expiring_list.py +0 -0
  264. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/utils/popularity.py +0 -0
  265. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/c3po/utils/timeseries.py +0 -0
  266. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/cache/__init__.py +0 -0
  267. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/cache/consumer.py +0 -0
  268. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/common.py +0 -0
  269. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/conveyor/__init__.py +0 -0
  270. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/conveyor/common.py +0 -0
  271. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/conveyor/finisher.py +0 -0
  272. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/conveyor/preparer.py +0 -0
  273. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/conveyor/stager.py +0 -0
  274. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/conveyor/submitter.py +0 -0
  275. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/conveyor/throttler.py +0 -0
  276. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/follower/__init__.py +0 -0
  277. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/follower/follower.py +0 -0
  278. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/hermes/__init__.py +0 -0
  279. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/hermes/hermes.py +0 -0
  280. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/judge/__init__.py +0 -0
  281. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/judge/cleaner.py +0 -0
  282. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/judge/evaluator.py +0 -0
  283. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/judge/injector.py +0 -0
  284. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/judge/repairer.py +0 -0
  285. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
  286. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
  287. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/reaper/__init__.py +0 -0
  288. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
  289. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
  290. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +0 -0
  291. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/storage/__init__.py +0 -0
  292. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
  293. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/tracer/__init__.py +0 -0
  294. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/tracer/kronos.py +0 -0
  295. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
  296. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
  297. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/undertaker/__init__.py +0 -0
  298. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
  299. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/__init__.py +0 -0
  300. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/__init__.py +0 -0
  301. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/constants.py +0 -0
  302. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
  303. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
  304. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -0
  305. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -0
  306. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
  307. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -0
  308. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
  309. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
  310. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
  311. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +0 -0
  312. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -0
  313. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -0
  314. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -0
  315. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -0
  316. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -0
  317. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
  318. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
  319. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -0
  320. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -0
  321. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
  322. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +0 -0
  323. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -0
  324. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -0
  325. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
  326. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +0 -0
  327. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -0
  328. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -0
  329. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -0
  330. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
  331. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -0
  332. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
  333. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -0
  334. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -0
  335. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
  336. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -0
  337. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
  338. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -0
  339. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +0 -0
  340. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -0
  341. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
  342. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -0
  343. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +0 -0
  344. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +0 -0
  345. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
  346. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
  347. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +0 -0
  348. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -0
  349. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
  350. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
  351. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
  352. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +0 -0
  353. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
  354. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -0
  355. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -0
  356. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -0
  357. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -0
  358. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -0
  359. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -0
  360. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
  361. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
  362. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
  363. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +0 -0
  364. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -0
  365. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -0
  366. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -0
  367. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
  368. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
  369. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -0
  370. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -0
  371. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
  372. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -0
  373. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -0
  374. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
  375. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -0
  376. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
  377. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +0 -0
  378. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
  379. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -0
  380. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -0
  381. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
  382. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +0 -0
  383. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -0
  384. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +0 -0
  385. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
  386. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -0
  387. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +0 -0
  388. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -0
  389. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +0 -0
  390. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
  391. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
  392. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
  393. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
  394. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +0 -0
  395. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -0
  396. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
  397. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -0
  398. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
  399. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
  400. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
  401. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -0
  402. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -0
  403. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
  404. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +0 -0
  405. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -0
  406. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +0 -0
  407. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
  408. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -0
  409. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +0 -0
  410. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +0 -0
  411. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
  412. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +0 -0
  413. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +0 -0
  414. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +0 -0
  415. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +0 -0
  416. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +0 -0
  417. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -0
  418. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
  419. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -0
  420. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
  421. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
  422. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
  423. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +0 -0
  424. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
  425. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -0
  426. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +0 -0
  427. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -0
  428. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/session.py +0 -0
  429. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/types.py +0 -0
  430. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/db/sqla/util.py +0 -0
  431. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/__init__.py +0 -0
  432. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/__init__.py +0 -0
  433. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/cache.py +0 -0
  434. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/dummy.py +0 -0
  435. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/globus.py +0 -0
  436. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/gsiftp.py +0 -0
  437. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/http_cache.py +0 -0
  438. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/mock.py +0 -0
  439. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/ngarc.py +0 -0
  440. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/posix.py +0 -0
  441. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/protocol.py +0 -0
  442. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/rfio.py +0 -0
  443. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/storm.py +0 -0
  444. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/protocols/webdav.py +0 -0
  445. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/rse/rsemanager.py +0 -0
  446. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/tests/__init__.py +0 -0
  447. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/tests/common.py +0 -0
  448. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/tests/common_server.py +0 -0
  449. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/transfertool/__init__.py +0 -0
  450. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/transfertool/fts3.py +0 -0
  451. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/transfertool/globus.py +0 -0
  452. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/transfertool/globus_library.py +0 -0
  453. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/transfertool/mock.py +0 -0
  454. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/transfertool/transfertool.py +0 -0
  455. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/version.py +0 -0
  456. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/__init__.py +0 -0
  457. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/__init__.py +0 -0
  458. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
  459. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
  460. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
  461. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +0 -0
  462. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/accounts.py +0 -0
  463. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/archives.py +0 -0
  464. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/auth.py +0 -0
  465. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/common.py +0 -0
  466. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/config.py +0 -0
  467. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/credentials.py +0 -0
  468. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/dids.py +0 -0
  469. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/dirac.py +0 -0
  470. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/export.py +0 -0
  471. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +0 -0
  472. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/identities.py +0 -0
  473. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/import.py +0 -0
  474. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +0 -0
  475. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/locks.py +0 -0
  476. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/main.py +0 -0
  477. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/meta.py +0 -0
  478. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/metrics.py +0 -0
  479. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +0 -0
  480. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/redirect.py +0 -0
  481. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/replicas.py +0 -0
  482. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/rses.py +0 -0
  483. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/rules.py +0 -0
  484. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/scopes.py +0 -0
  485. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +0 -0
  486. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
  487. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
  488. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/traces.py +0 -0
  489. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/flaskapi/v1/vos.py +0 -0
  490. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/main.py +0 -0
  491. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/lib/rucio/web/rest/metrics.py +0 -0
  492. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/pylintrc +0 -0
  493. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/pyproject.toml +0 -0
  494. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/setup.cfg +0 -0
  495. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/setup.py +0 -0
  496. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/setuputil.py +0 -0
  497. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_abacus_account.py +0 -0
  498. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_abacus_collection_replica.py +0 -0
  499. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_abacus_rse.py +0 -0
  500. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_account.py +0 -0
  501. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_account_limits.py +0 -0
  502. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_api_external_representation.py +0 -0
  503. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_archive.py +0 -0
  504. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_auditor.py +0 -0
  505. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_auditor_hdfs.py +0 -0
  506. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_auditor_srmdumps.py +0 -0
  507. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_authentication.py +0 -0
  508. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_automatix.py +0 -0
  509. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_bad_replica.py +0 -0
  510. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_bb8.py +0 -0
  511. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_belleii.py +0 -0
  512. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_bin_rucio.py +0 -0
  513. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_boolean.py +0 -0
  514. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_clients.py +0 -0
  515. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_common_types.py +0 -0
  516. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_config.py +0 -0
  517. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_counter.py +0 -0
  518. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_credential.py +0 -0
  519. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_curl.py +0 -0
  520. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_dataset_replicas.py +0 -0
  521. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_db.py +0 -0
  522. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_did.py +0 -0
  523. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_did_meta_plugins.py +0 -0
  524. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_didtype.py +0 -0
  525. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_download.py +0 -0
  526. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_dumper.py +0 -0
  527. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_dumper_consistency.py +0 -0
  528. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_dumper_data_model.py +0 -0
  529. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_dumper_path_parsing.py +0 -0
  530. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_filter_engine.py +0 -0
  531. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_heartbeat.py +0 -0
  532. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_hermes.py +0 -0
  533. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_identity.py +0 -0
  534. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_impl_upload_download.py +0 -0
  535. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_import_export.py +0 -0
  536. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_judge_cleaner.py +0 -0
  537. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_judge_evaluator.py +0 -0
  538. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_judge_injector.py +0 -0
  539. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_judge_repairer.py +0 -0
  540. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_lifetime.py +0 -0
  541. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_message.py +0 -0
  542. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_meta.py +0 -0
  543. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_meta_did.py +0 -0
  544. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_module_import.py +0 -0
  545. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_monitor.py +0 -0
  546. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_multi_vo.py +0 -0
  547. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_naming_convention.py +0 -0
  548. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_oauthmanager.py +0 -0
  549. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_permission.py +0 -0
  550. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_pfns.py +0 -0
  551. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_ping.py +0 -0
  552. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_preparer.py +0 -0
  553. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_qos.py +0 -0
  554. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_quarantined_replica.py +0 -0
  555. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_reaper.py +0 -0
  556. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_redirect.py +0 -0
  557. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_replica.py +0 -0
  558. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_replica_recoverer.py +0 -0
  559. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_replica_sorting.py +0 -0
  560. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_root_proxy.py +0 -0
  561. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse.py +0 -0
  562. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_expression_parser.py +0 -0
  563. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_lfn2path.py +0 -0
  564. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_protocol_gfal2.py +0 -0
  565. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_protocol_gfal2_impl.py +0 -0
  566. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_protocol_posix.py +0 -0
  567. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_protocol_rclone.py +0 -0
  568. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_protocol_rsync.py +0 -0
  569. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_protocol_srm.py +0 -0
  570. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_protocol_ssh.py +0 -0
  571. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_protocol_webdav.py +0 -0
  572. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_protocol_xrootd.py +0 -0
  573. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rse_selector.py +0 -0
  574. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rucio_server.py +0 -0
  575. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_rule.py +0 -0
  576. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_schema_cms.py +0 -0
  577. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_scope.py +0 -0
  578. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_subscription.py +0 -0
  579. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_throttler.py +0 -0
  580. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_tpc.py +0 -0
  581. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_trace.py +0 -0
  582. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_undertaker.py +0 -0
  583. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_upload.py +0 -0
  584. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tests/test_utils.py +0 -0
  585. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tools/bootstrap.py +0 -0
  586. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tools/merge_rucio_configs.py +0 -0
  587. {rucio-32.6.0.post1 → rucio-33.0.0rc2}/tools/reset_database.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rucio
3
- Version: 32.6.0.post1
3
+ Version: 33.0.0rc2
4
4
  Summary: Rucio Package
5
5
  Home-page: https://rucio.cern.ch/
6
6
  Author: Rucio
@@ -21,32 +21,32 @@ Requires-Python: >=3.9, <4
21
21
  License-File: LICENSE
22
22
  License-File: AUTHORS.rst
23
23
  Requires-Dist: requests<=2.31.0,>=2.25.1
24
- Requires-Dist: urllib3~=1.26.16
24
+ Requires-Dist: urllib3~=1.26.18
25
25
  Requires-Dist: dogpile.cache~=1.2.2
26
26
  Requires-Dist: tabulate~=0.9.0
27
- Requires-Dist: jsonschema~=4.18.4
28
- Requires-Dist: paramiko~=3.2.0
29
- Requires-Dist: argcomplete~=3.1.1
27
+ Requires-Dist: jsonschema~=4.20.0
28
+ Requires-Dist: paramiko~=3.3.1
29
+ Requires-Dist: argcomplete~=3.1.6
30
30
  Requires-Dist: python-magic~=0.4.27
31
- Requires-Dist: SQLAlchemy==2.0.19
32
- Requires-Dist: alembic~=1.11.1
31
+ Requires-Dist: SQLAlchemy==2.0.23
32
+ Requires-Dist: alembic~=1.12.1
33
33
  Requires-Dist: pymemcache==4.0.0
34
34
  Requires-Dist: python-dateutil==2.8.2
35
35
  Requires-Dist: stomp.py==8.1.0
36
36
  Requires-Dist: statsd==4.0.1
37
37
  Requires-Dist: geoip2==4.7.0
38
- Requires-Dist: google-auth==2.22.0
39
- Requires-Dist: redis==4.6.0
40
- Requires-Dist: Flask==2.3.2
38
+ Requires-Dist: google-auth==2.23.4
39
+ Requires-Dist: redis==5.0.1
40
+ Requires-Dist: Flask==3.0.0
41
41
  Requires-Dist: oic==1.6.1
42
- Requires-Dist: prometheus_client==0.17.1
43
- Requires-Dist: boto3==1.28.5
42
+ Requires-Dist: prometheus_client==0.19.0
43
+ Requires-Dist: boto3==1.29.5
44
44
  Provides-Extra: oracle
45
45
  Requires-Dist: cx_oracle==8.3.0; extra == "oracle"
46
46
  Provides-Extra: mongo
47
- Requires-Dist: pymongo==4.4.1; extra == "mongo"
47
+ Requires-Dist: pymongo==4.6.0; extra == "mongo"
48
48
  Provides-Extra: postgresql
49
- Requires-Dist: psycopg2-binary==2.9.6; extra == "postgresql"
49
+ Requires-Dist: psycopg2-binary==2.9.9; extra == "postgresql"
50
50
  Provides-Extra: mysql
51
51
  Requires-Dist: PyMySQL==1.1.0; extra == "mysql"
52
52
  Provides-Extra: kerberos
@@ -55,19 +55,19 @@ Requires-Dist: pykerberos~=1.2.4; extra == "kerberos"
55
55
  Requires-Dist: requests-kerberos>=0.14.0; extra == "kerberos"
56
56
  Provides-Extra: globus
57
57
  Requires-Dist: PyYAML==6.0.1; extra == "globus"
58
- Requires-Dist: globus-sdk==3.24.0; extra == "globus"
58
+ Requires-Dist: globus-sdk==3.32.0; extra == "globus"
59
59
  Provides-Extra: saml
60
- Requires-Dist: python3-saml==1.15.0; extra == "saml"
60
+ Requires-Dist: python3-saml==1.16.0; extra == "saml"
61
61
  Provides-Extra: dev
62
62
  Requires-Dist: PyYAML==6.0.1; extra == "dev"
63
- Requires-Dist: pytest==7.4.0; extra == "dev"
64
- Requires-Dist: pytest-xdist~=3.3.1; extra == "dev"
65
- Requires-Dist: pyflakes==3.0.1; extra == "dev"
66
- Requires-Dist: flake8==6.0.0; extra == "dev"
67
- Requires-Dist: pycodestyle==2.10.0; extra == "dev"
68
- Requires-Dist: pylint==3.0.0a7; extra == "dev"
69
- Requires-Dist: virtualenv==20.24.0; extra == "dev"
63
+ Requires-Dist: pytest==7.4.3; extra == "dev"
64
+ Requires-Dist: pytest-xdist~=3.5.0; extra == "dev"
65
+ Requires-Dist: pyflakes==3.1.0; extra == "dev"
66
+ Requires-Dist: flake8==6.1.0; extra == "dev"
67
+ Requires-Dist: pycodestyle==2.11.0; extra == "dev"
68
+ Requires-Dist: pylint==3.0.2; extra == "dev"
69
+ Requires-Dist: virtualenv==20.24.7; extra == "dev"
70
70
  Requires-Dist: xmltodict==0.13.0; extra == "dev"
71
- Requires-Dist: pytz==2023.3; extra == "dev"
71
+ Requires-Dist: pytz==2023.3.post1; extra == "dev"
72
72
  Requires-Dist: pydoc-markdown~=4.8.2; extra == "dev"
73
- Requires-Dist: sh~=2.0.4; extra == "dev"
73
+ Requires-Dist: sh~=2.0.6; extra == "dev"
@@ -13,4 +13,4 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- ALEMBIC_REVISION = '27e3a68927fb' # the current alembic head revision
16
+ ALEMBIC_REVISION = 'a08fa8de1545' # the current alembic head revision
@@ -17,7 +17,7 @@
17
17
  Interface for the requests abstraction layer
18
18
  """
19
19
 
20
- from typing import TYPE_CHECKING
20
+ from typing import TYPE_CHECKING, Optional
21
21
 
22
22
  from rucio.api import permission
23
23
  from rucio.common import exception
@@ -199,7 +199,6 @@ def list_requests(src_rses, dst_rses, states, issuer, vo='def', *, session: "Ses
199
199
  def list_requests_history(src_rses, dst_rses, states, issuer, vo='def', offset=None, limit=None, *, session: "Session"):
200
200
  """
201
201
  List all historical requests in a specific state from a source RSE to a destination RSE.
202
-
203
202
  :param src_rses: source RSEs.
204
203
  :param dst_rses: destination RSEs.
205
204
  :param states: list of request states.
@@ -218,3 +217,27 @@ def list_requests_history(src_rses, dst_rses, states, issuer, vo='def', offset=N
218
217
  for req in request.list_requests_history(src_rse_ids, dst_rse_ids, states, offset, limit, session=session):
219
218
  req = req.to_dict()
220
219
  yield api_update_return_dict(req, session=session)
220
+
221
+
222
+ @read_session
223
+ def get_request_metrics(src_rse: Optional[str], dst_rse: Optional[str], activity: Optional[str], issuer, vo='def', *, session: "Session"):
224
+ """
225
+ Get statistics of requests in a specific state grouped by source RSE, destination RSE, and activity.
226
+
227
+ :param src_rse: source RSE.
228
+ :param dst_rse: destination RSE.
229
+ :param activity: activity
230
+ :param issuer: Issuing account as a string.
231
+ :param session: The database session in use.
232
+ """
233
+ src_rse_id = None
234
+ if src_rse:
235
+ src_rse_id = get_rse_id(rse=src_rse, vo=vo, session=session)
236
+ dst_rse_id = None
237
+ if dst_rse:
238
+ dst_rse_id = get_rse_id(rse=dst_rse, vo=vo, session=session)
239
+ kwargs = {'issuer': issuer}
240
+ if not permission.has_permission(issuer=issuer, vo=vo, action='get_request_metrics', kwargs=kwargs, session=session):
241
+ raise exception.AccessDenied(f'{issuer} cannot get request statistics')
242
+
243
+ return request.get_request_metrics(dest_rse_id=dst_rse_id, src_rse_id=src_rse_id, activity=activity, session=session)
@@ -661,19 +661,6 @@ class DIDClient(BaseClient):
661
661
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
662
662
  raise exc_cls(exc_msg)
663
663
 
664
- def add_temporary_dids(self, dids):
665
- """
666
- Bulk add temporary data identifiers.
667
-
668
- :param dids: A list of dids.
669
- """
670
- url = build_url(choice(self.list_hosts), path='tmp_dids')
671
- r = self._send_request(url, type_='POST', data=dumps(dids))
672
- if r.status_code == codes.created:
673
- return True
674
- exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
675
- raise exc_cls(exc_msg)
676
-
677
664
  def list_archive_content(self, scope, name):
678
665
  """
679
666
  List archive contents.
@@ -368,7 +368,7 @@ class FilterEngine:
368
368
  # Infer what type key should be cast to from typecasting the value in the expression.
369
369
  try:
370
370
  if isinstance(value, int): # this could be bool or int (as bool subclass of int)
371
- if type(value) == bool:
371
+ if isinstance(value, bool):
372
372
  if is_in_json_column:
373
373
  expression = "({}->>'{}')::boolean {} {}".format(jsonb_column, key, POSTGRES_OP_MAP[oper], str(value).lower())
374
374
  else:
@@ -473,7 +473,7 @@ class FilterEngine:
473
473
  # Infer what type key should be cast to from typecasting the value in the expression.
474
474
  try:
475
475
  if isinstance(value, int): # this could be bool or int (as bool subclass of int)
476
- if type(value) == bool:
476
+ if isinstance(value, bool):
477
477
  expression = oper(json_column[key].as_boolean(), value)
478
478
  else:
479
479
  expression = oper(json_column[key].as_float(), value) # cast as float, not integer, to avoid potentially losing precision in key
@@ -13,15 +13,18 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ import hashlib
16
17
  import json
17
18
  import logging
18
19
  import random
19
20
  import subprocess
20
21
  import traceback
21
22
  from datetime import datetime, timedelta
22
- from typing import Any, TYPE_CHECKING, Optional
23
- from urllib.parse import urlparse, parse_qs
23
+ from typing import Any, Final, TYPE_CHECKING, Optional
24
+ from urllib.parse import urljoin, urlparse, parse_qs
24
25
 
26
+ import requests
27
+ from dogpile.cache.api import NoValue
25
28
  from jwkest.jws import JWS
26
29
  from jwkest.jwt import JWT
27
30
  from math import floor
@@ -36,6 +39,7 @@ from sqlalchemy import delete, select, update
36
39
  from sqlalchemy.sql.expression import true
37
40
 
38
41
  from rucio.common import types
42
+ from rucio.common.cache import make_region_memcached
39
43
  from rucio.common.config import config_get, config_get_int
40
44
  from rucio.common.exception import (CannotAuthenticate, CannotAuthorize,
41
45
  RucioException)
@@ -52,7 +56,12 @@ from rucio.db.sqla.session import read_session, transactional_session
52
56
  if TYPE_CHECKING:
53
57
  from sqlalchemy.orm import Session
54
58
 
59
+ # The WLCG Common JWT Profile dictates that the lifetime of access and ID tokens
60
+ # should range from five minutes to six hours.
61
+ TOKEN_MIN_LIFETIME: Final = int(timedelta(minutes=5).total_seconds())
62
+ TOKEN_MAX_LIFETIME: Final = int(timedelta(hours=6).total_seconds())
55
63
 
64
+ REGION: Final = make_region_memcached(expiration_time=TOKEN_MAX_LIFETIME)
56
65
  METRICS = MetricManager(module=__name__)
57
66
 
58
67
  # worokaround for a bug in pyoidc (as of Dec 2019)
@@ -75,6 +84,78 @@ LEEWAY_SECS = 120
75
84
  # --> check 'profile' info (requested profile scope)
76
85
 
77
86
 
87
+ @METRICS.time_it
88
+ def _token_cache_get(
89
+ key: str,
90
+ min_lifetime: int = TOKEN_MIN_LIFETIME,
91
+ ) -> Optional[str]:
92
+ """Retrieve a token from the cache.
93
+
94
+ Return ``None`` if the cache backend did not return a value, the value is
95
+ not a valid JWT, or the token has a remaining lifetime less than
96
+ ``min_lifetime`` seconds.
97
+ """
98
+ value = REGION.get(key)
99
+ if isinstance(value, NoValue):
100
+ METRICS.counter('token_cache.miss').inc()
101
+ return None
102
+
103
+ try:
104
+ assert isinstance(value, str)
105
+ payload = JWT().unpack(value).payload()
106
+ except Exception:
107
+ METRICS.counter('token_cache.invalid').inc()
108
+ return None
109
+
110
+ now = datetime.utcnow().timestamp()
111
+ expiration = payload.get('exp', 0) # type: ignore
112
+ if now + min_lifetime > expiration:
113
+ METRICS.counter('token_cache.expired').inc()
114
+ return None
115
+
116
+ METRICS.counter('token_cache.hit').inc()
117
+ return value
118
+
119
+
120
+ def _token_cache_set(key: str, value: str) -> None:
121
+ """Store a token in the cache."""
122
+ REGION.set(key, value)
123
+
124
+
125
+ def request_token(audience: str, scope: str, use_cache: bool = True) -> Optional[str]:
126
+ """Request a token from the provider.
127
+
128
+ Return ``None`` if the configuration was not loaded properly or the request
129
+ was unsuccessful.
130
+ """
131
+ if not all([OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_PROVIDER_ENDPOINT]):
132
+ if OIDC_CONFIGURATION_RUN or not __load_oidc_configuration():
133
+ return None
134
+
135
+ key = hashlib.md5(f'audience={audience};scope={scope}'.encode()).hexdigest()
136
+
137
+ if use_cache and (token := _token_cache_get(key)):
138
+ return token
139
+
140
+ try:
141
+ response = requests.post(url=OIDC_PROVIDER_ENDPOINT,
142
+ auth=(OIDC_CLIENT_ID, OIDC_CLIENT_SECRET),
143
+ data={'grant_type': 'client_credentials',
144
+ 'audience': audience,
145
+ 'scope': scope})
146
+ response.raise_for_status()
147
+ payload = response.json()
148
+ token = payload['access_token']
149
+ except Exception:
150
+ logging.debug('Failed to procure a token', exc_info=True)
151
+ return None
152
+
153
+ if use_cache:
154
+ _token_cache_set(key, token)
155
+
156
+ return token
157
+
158
+
78
159
  def __get_rucio_oidc_clients(keytimeout: int = 43200) -> tuple[dict, dict]:
79
160
  """
80
161
  Creates a Rucio OIDC Client instances per Identity Provider (IdP)
@@ -125,6 +206,11 @@ def __get_rucio_oidc_clients(keytimeout: int = 43200) -> tuple[dict, dict]:
125
206
  # global variables to represent the IdP clients
126
207
  OIDC_CLIENTS = {}
127
208
  OIDC_ADMIN_CLIENTS = {}
209
+ # New-style token support.
210
+ OIDC_CLIENT_ID = ''
211
+ OIDC_CLIENT_SECRET = ''
212
+ OIDC_PROVIDER_ENDPOINT = ''
213
+ OIDC_CONFIGURATION_RUN = False
128
214
 
129
215
 
130
216
  def __initialize_oidc_clients() -> None:
@@ -143,8 +229,31 @@ def __initialize_oidc_clients() -> None:
143
229
  pass
144
230
 
145
231
 
146
- # try loading OIDC clients uppon module import
147
- __initialize_oidc_clients()
232
+ def __load_oidc_configuration() -> bool:
233
+ """Load the configuration for the new-style token support."""
234
+ global OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_PROVIDER_ENDPOINT, OIDC_CONFIGURATION_RUN
235
+
236
+ OIDC_CONFIGURATION_RUN = True
237
+
238
+ if not IDPSECRETS:
239
+ logging.error('Configuration option "idpsecrets" in section "oidc" is not set')
240
+ return False
241
+ if not ADMIN_ISSUER_ID:
242
+ logging.error('Configuration option "admin_issuer" in section "oidc" is not set')
243
+ return False
244
+
245
+ try:
246
+ with open(IDPSECRETS) as f:
247
+ data = json.load(f)
248
+ OIDC_CLIENT_ID = data[ADMIN_ISSUER_ID]['client_id']
249
+ OIDC_CLIENT_SECRET = data[ADMIN_ISSUER_ID]['client_secret']
250
+ OIDC_PROVIDER_ENDPOINT = urljoin(data[ADMIN_ISSUER_ID]['issuer'], 'token')
251
+ except Exception:
252
+ logging.error('Failed to parse configuration file "%s"', IDPSECRETS,
253
+ exc_info=True)
254
+ return False
255
+ else:
256
+ return True
148
257
 
149
258
 
150
259
  def __get_init_oidc_client(token_object: models.Token = None, token_type: str = None, **kwargs) -> dict[Any, Any]:
@@ -87,6 +87,7 @@ def has_permission(issuer, action, kwargs, *, session: "Optional[Session]" = Non
87
87
  'set_rse_usage': perm_set_rse_usage,
88
88
  'set_rse_limits': perm_set_rse_limits,
89
89
  'get_request_by_did': perm_get_request_by_did,
90
+ 'get_request_metrics': perm_get_request_metrics,
90
91
  'cancel_request': perm_cancel_request,
91
92
  'get_next': perm_get_next,
92
93
  'set_local_account_limit': perm_set_local_account_limit,
@@ -940,6 +941,18 @@ def perm_get_request_by_did(issuer, kwargs, *, session: "Optional[Session]" = No
940
941
  return True
941
942
 
942
943
 
944
+ def perm_get_request_metrics(issuer, kwargs, *, session: "Optional[Session]" = None):
945
+ """
946
+ Checks if an account can get the request stats
947
+
948
+ :param issuer: Account identifier which issues the command.
949
+ :param kwargs: List of arguments for the action.
950
+ :param session: The DB session to use
951
+ :returns: True if account is allowed, otherwise False
952
+ """
953
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
954
+
955
+
943
956
  def perm_cancel_request(issuer, kwargs, *, session: "Optional[Session]" = None):
944
957
  """
945
958
  Checks if an account can cancel a request.
@@ -0,0 +1,148 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright European Organization for Nuclear Research (CERN) since 2012
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import importlib
17
+ import os
18
+ from configparser import NoOptionError, NoSectionError
19
+ from typing import Any, Callable, Dict, TypeVar, Type
20
+
21
+ from rucio.common import config
22
+ from rucio.common.exception import InvalidAlgorithmName
23
+ from rucio.common.utils import check_policy_package_version
24
+ from rucio.core.vo import list_vos
25
+
26
+
27
+ PolicyPackageAlgorithmsT = TypeVar('PolicyPackageAlgorithmsT', bound='PolicyPackageAlgorithms')
28
+
29
+
30
+ class PolicyPackageAlgorithms():
31
+ """
32
+ Base class for Rucio Policy Package Algorithms
33
+
34
+ ALGORITHMS is of type Dict[str, Dict[str. Callable[..., Any]]]
35
+ where the key is the algorithm type and the value is a dictionary of algorithm names and their callables
36
+ """
37
+ _ALGORITHMS: Dict[str, Dict[str, Callable[..., Any]]] = {}
38
+ _loaded_policy_modules = False
39
+
40
+ def __init__(self) -> None:
41
+ if not self._loaded_policy_modules:
42
+ self._register_all_policy_package_algorithms()
43
+ self._loaded_policy_modules = True
44
+
45
+ @classmethod
46
+ def _get_one_algorithm(cls: Type[PolicyPackageAlgorithmsT], algorithm_type: str, name: str) -> Callable[..., Any]:
47
+ """
48
+ Get the algorithm from the dictionary of algorithms
49
+ """
50
+ return cls._ALGORITHMS[algorithm_type][name]
51
+
52
+ @classmethod
53
+ def _get_algorithms(cls: Type[PolicyPackageAlgorithmsT], algorithm_type: str) -> Dict[str, Callable[..., Any]]:
54
+ """
55
+ Get the dictionary of algorithms for a given type
56
+ """
57
+ return cls._ALGORITHMS[algorithm_type]
58
+
59
+ @classmethod
60
+ def _register(
61
+ cls: Type[PolicyPackageAlgorithmsT],
62
+ algorithm_type: str, algorithm_dict: Dict[str, Callable[..., Any]]) -> None:
63
+ """
64
+ Provided a dictionary of callable function,
65
+ and the associated algorithm type,
66
+ register it as one of the valid algorithms.
67
+ """
68
+ if algorithm_type in cls._ALGORITHMS:
69
+ cls._ALGORITHMS[algorithm_type].update(algorithm_dict)
70
+ else:
71
+ cls._ALGORITHMS[algorithm_type] = algorithm_dict
72
+
73
+ @classmethod
74
+ def _supports(cls: Type[PolicyPackageAlgorithmsT], algorithm_type: str, name: str) -> bool:
75
+ """
76
+ Check if a algorithm is supported by the plugin
77
+ """
78
+ return name in cls._ALGORITHMS.get(algorithm_type, {})
79
+
80
+ @classmethod
81
+ def _register_all_policy_package_algorithms(cls: Type[PolicyPackageAlgorithmsT]) -> None:
82
+ '''
83
+ Loads all the algorithms of a given type from the policy package(s) and registers them
84
+ :param algorithm_type: the type of algorithm to register (e.g. 'surl', 'lfn2pfn')
85
+ :param dictionary: the dictionary to register them in
86
+ :param vo: the name of the relevant VO (None for single VO)
87
+ '''
88
+ try:
89
+ multivo = config.config_get_bool('common', 'multi_vo')
90
+ except (NoOptionError, NoSectionError):
91
+ multivo = False
92
+ if not multivo:
93
+ # single policy package
94
+ cls._try_importing_policy()
95
+ else:
96
+ # determine whether on client or server
97
+ client = False
98
+ if 'RUCIO_CLIENT_MODE' not in os.environ:
99
+ if not config.config_has_section('database') and config.config_has_section('client'):
100
+ client = True
101
+ else:
102
+ if os.environ['RUCIO_CLIENT_MODE']:
103
+ client = True
104
+
105
+ # on client, only register algorithms for selected VO
106
+ if client:
107
+ if 'RUCIO_VO' in os.environ:
108
+ vo = os.environ['RUCIO_VO']
109
+ else:
110
+ try:
111
+ vo = str(config.config_get('client', 'vo'))
112
+ except (NoOptionError, NoSectionError):
113
+ vo = 'def'
114
+ cls._try_importing_policy(vo)
115
+ # on server, list all VOs and register their algorithms
116
+ else:
117
+ # policy package per VO
118
+ vos = list_vos()
119
+ for vo in vos:
120
+ cls._try_importing_policy(vo['vo'])
121
+
122
+ @classmethod
123
+ def _try_importing_policy(cls: Type[PolicyPackageAlgorithmsT], vo: str = "") -> None:
124
+ try:
125
+ env_name = 'RUCIO_POLICY_PACKAGE' + ('' if not vo else '_' + vo.upper())
126
+ package = getattr(os.environ, env_name, "")
127
+ if not package:
128
+ package = str(config.config_get('policy', 'package' + ('' if not vo else '-' + vo)))
129
+
130
+ check_policy_package_version(package)
131
+ module = importlib.import_module(package)
132
+
133
+ if hasattr(module, 'get_algorithms'):
134
+ all_algorithms = module.get_algorithms()
135
+
136
+ # check that the names are correctly prefixed for multi-VO
137
+ if vo:
138
+ for _, algorithms in all_algorithms.items():
139
+ for k in algorithms.keys():
140
+ if not k.lower().startswith(vo.lower()):
141
+ raise InvalidAlgorithmName(k, vo)
142
+
143
+ # Updates the dictionary with the algorithms from the policy package
144
+ for algorithm_type, algorithm_dict in all_algorithms.items():
145
+ cls._register(algorithm_type, algorithm_dict)
146
+
147
+ except (NoOptionError, NoSectionError, ImportError):
148
+ pass