rucio 32.3.0__tar.gz → 32.4.0__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 (582) hide show
  1. {rucio-32.3.0 → rucio-32.4.0}/PKG-INFO +1 -1
  2. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +20 -18
  3. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/webdav.py +1 -1
  4. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/fts3.py +62 -1
  5. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/vcsversion.py +3 -3
  6. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/dids.py +10 -1
  7. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/rses.py +6 -9
  8. {rucio-32.3.0 → rucio-32.4.0}/tests/test_api_external_representation.py +80 -70
  9. {rucio-32.3.0 → rucio-32.4.0}/tests/test_clients.py +1 -40
  10. {rucio-32.3.0 → rucio-32.4.0}/tests/test_conveyor.py +24 -3
  11. {rucio-32.3.0 → rucio-32.4.0}/tests/test_replica.py +11 -7
  12. {rucio-32.3.0 → rucio-32.4.0}/tests/test_replica_recoverer.py +24 -4
  13. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse.py +12 -15
  14. {rucio-32.3.0 → rucio-32.4.0}/tests/test_undertaker.py +8 -8
  15. {rucio-32.3.0 → rucio-32.4.0}/AUTHORS.rst +0 -0
  16. {rucio-32.3.0 → rucio-32.4.0}/ChangeLog +0 -0
  17. {rucio-32.3.0 → rucio-32.4.0}/LICENSE +0 -0
  18. {rucio-32.3.0 → rucio-32.4.0}/MANIFEST.in +0 -0
  19. {rucio-32.3.0 → rucio-32.4.0}/README.rst +0 -0
  20. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio +0 -0
  21. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-abacus-account +0 -0
  22. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-abacus-collection-replica +0 -0
  23. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-abacus-rse +0 -0
  24. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-admin +0 -0
  25. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-atropos +0 -0
  26. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-auditor +0 -0
  27. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-automatix +0 -0
  28. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-bb8 +0 -0
  29. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-c3po +0 -0
  30. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-cache-client +0 -0
  31. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-cache-consumer +0 -0
  32. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-finisher +0 -0
  33. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-poller +0 -0
  34. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-preparer +0 -0
  35. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-receiver +0 -0
  36. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-stager +0 -0
  37. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-submitter +0 -0
  38. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-throttler +0 -0
  39. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-dark-reaper +0 -0
  40. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-dumper +0 -0
  41. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-follower +0 -0
  42. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-hermes +0 -0
  43. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-judge-cleaner +0 -0
  44. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-judge-evaluator +0 -0
  45. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-judge-injector +0 -0
  46. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-judge-repairer +0 -0
  47. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-kronos +0 -0
  48. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-light-reaper +0 -0
  49. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-minos +0 -0
  50. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-minos-temporary-expiration +0 -0
  51. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-necromancer +0 -0
  52. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-oauth-manager +0 -0
  53. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-reaper +0 -0
  54. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-replica-recoverer +0 -0
  55. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-storage-consistency-actions +0 -0
  56. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-transmogrifier +0 -0
  57. {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-undertaker +0 -0
  58. {rucio-32.3.0 → rucio-32.4.0}/etc/alembic.ini.template +0 -0
  59. {rucio-32.3.0 → rucio-32.4.0}/etc/alembic_offline.ini.template +0 -0
  60. {rucio-32.3.0 → rucio-32.4.0}/etc/globus-config.yml.template +0 -0
  61. {rucio-32.3.0 → rucio-32.4.0}/etc/ldap.cfg.template +0 -0
  62. {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_approval_request.tmpl +0 -0
  63. {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
  64. {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_approved_user.tmpl +0 -0
  65. {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
  66. {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_denied_user.tmpl +0 -0
  67. {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
  68. {rucio-32.3.0 → rucio-32.4.0}/etc/rse-accounts.cfg.template +0 -0
  69. {rucio-32.3.0 → rucio-32.4.0}/etc/rucio.cfg.atlas.client.template +0 -0
  70. {rucio-32.3.0 → rucio-32.4.0}/etc/rucio.cfg.template +0 -0
  71. {rucio-32.3.0 → rucio-32.4.0}/etc/rucio_multi_vo.cfg.template +0 -0
  72. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/__init__.py +0 -0
  73. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/alembicrevision.py +0 -0
  74. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/__init__.py +0 -0
  75. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/account.py +0 -0
  76. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/account_limit.py +0 -0
  77. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/authentication.py +0 -0
  78. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/config.py +0 -0
  79. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/credential.py +0 -0
  80. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/did.py +0 -0
  81. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/dirac.py +0 -0
  82. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/exporter.py +0 -0
  83. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/heartbeat.py +0 -0
  84. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/identity.py +0 -0
  85. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/importer.py +0 -0
  86. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/lifetime_exception.py +0 -0
  87. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/lock.py +0 -0
  88. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/meta.py +0 -0
  89. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/permission.py +0 -0
  90. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/quarantined_replica.py +0 -0
  91. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/replica.py +0 -0
  92. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/request.py +0 -0
  93. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/rse.py +0 -0
  94. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/rule.py +0 -0
  95. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/scope.py +0 -0
  96. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/subscription.py +0 -0
  97. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/temporary_did.py +0 -0
  98. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/vo.py +0 -0
  99. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/__init__.py +0 -0
  100. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/accountclient.py +0 -0
  101. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/accountlimitclient.py +0 -0
  102. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/baseclient.py +0 -0
  103. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/client.py +0 -0
  104. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/configclient.py +0 -0
  105. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/credentialclient.py +0 -0
  106. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/didclient.py +0 -0
  107. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/diracclient.py +0 -0
  108. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/downloadclient.py +0 -0
  109. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/exportclient.py +0 -0
  110. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/fileclient.py +0 -0
  111. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/importclient.py +0 -0
  112. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/lifetimeclient.py +0 -0
  113. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/lockclient.py +0 -0
  114. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/metaclient.py +0 -0
  115. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/pingclient.py +0 -0
  116. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/replicaclient.py +0 -0
  117. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/requestclient.py +0 -0
  118. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/rseclient.py +0 -0
  119. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/ruleclient.py +0 -0
  120. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/scopeclient.py +0 -0
  121. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/subscriptionclient.py +0 -0
  122. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/touchclient.py +0 -0
  123. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/uploadclient.py +0 -0
  124. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/__init__.py +0 -0
  125. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/cache.py +0 -0
  126. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/config.py +0 -0
  127. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/constants.py +0 -0
  128. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/constraints.py +0 -0
  129. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/didtype.py +0 -0
  130. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/dumper/__init__.py +0 -0
  131. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/dumper/consistency.py +0 -0
  132. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/dumper/data_models.py +0 -0
  133. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/dumper/path_parsing.py +0 -0
  134. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/exception.py +0 -0
  135. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/extra.py +0 -0
  136. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/logging.py +0 -0
  137. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/pcache.py +0 -0
  138. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/policy.py +0 -0
  139. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/__init__.py +0 -0
  140. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/atlas.py +0 -0
  141. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/belleii.py +0 -0
  142. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/cms.py +0 -0
  143. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/domatpc.py +0 -0
  144. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/escape.py +0 -0
  145. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/generic.py +0 -0
  146. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
  147. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/icecube.py +0 -0
  148. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/lsst.py +0 -0
  149. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/stomp_utils.py +0 -0
  150. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/stopwatch.py +0 -0
  151. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/test_rucio_server.py +0 -0
  152. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/types.py +0 -0
  153. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/utils.py +0 -0
  154. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/__init__.py +0 -0
  155. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/account.py +0 -0
  156. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/account_counter.py +0 -0
  157. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/account_limit.py +0 -0
  158. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/authentication.py +0 -0
  159. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/config.py +0 -0
  160. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/credential.py +0 -0
  161. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did.py +0 -0
  162. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/__init__.py +0 -0
  163. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/did_column_meta.py +0 -0
  164. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +0 -0
  165. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/filter_engine.py +0 -0
  166. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/json_meta.py +0 -0
  167. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/mongo_meta.py +0 -0
  168. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/postgres_meta.py +0 -0
  169. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/dirac.py +0 -0
  170. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/distance.py +0 -0
  171. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/exporter.py +0 -0
  172. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/heartbeat.py +0 -0
  173. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/identity.py +0 -0
  174. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/importer.py +0 -0
  175. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/lifetime_exception.py +0 -0
  176. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/lock.py +0 -0
  177. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/message.py +0 -0
  178. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/meta.py +0 -0
  179. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/monitor.py +0 -0
  180. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/naming_convention.py +0 -0
  181. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/nongrid_trace.py +0 -0
  182. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/oidc.py +0 -0
  183. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/__init__.py +0 -0
  184. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/atlas.py +0 -0
  185. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/belleii.py +0 -0
  186. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/cms.py +0 -0
  187. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/escape.py +0 -0
  188. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/generic.py +0 -0
  189. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
  190. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/quarantined_replica.py +0 -0
  191. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/replica.py +0 -0
  192. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/replica_sorter.py +0 -0
  193. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/request.py +0 -0
  194. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rse.py +0 -0
  195. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rse_counter.py +0 -0
  196. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rse_expression_parser.py +0 -0
  197. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rse_selector.py +0 -0
  198. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rule.py +0 -0
  199. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rule_grouping.py +0 -0
  200. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/scope.py +0 -0
  201. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/subscription.py +0 -0
  202. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/temporary_did.py +0 -0
  203. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/topology.py +0 -0
  204. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/trace.py +0 -0
  205. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/transfer.py +0 -0
  206. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/vo.py +0 -0
  207. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/volatile_replica.py +0 -0
  208. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/__init__.py +0 -0
  209. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/abacus/__init__.py +0 -0
  210. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/abacus/account.py +0 -0
  211. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
  212. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/abacus/rse.py +0 -0
  213. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/atropos/__init__.py +0 -0
  214. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/atropos/atropos.py +0 -0
  215. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/auditor/__init__.py +0 -0
  216. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/auditor/hdfs.py +0 -0
  217. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
  218. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/automatix/__init__.py +0 -0
  219. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/automatix/automatix.py +0 -0
  220. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
  221. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/badreplicas/minos.py +0 -0
  222. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
  223. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
  224. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/bb8/__init__.py +0 -0
  225. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/bb8/bb8.py +0 -0
  226. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/bb8/common.py +0 -0
  227. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
  228. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
  229. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/__init__.py +0 -0
  230. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/algorithms/__init__.py +0 -0
  231. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/algorithms/simple.py +0 -0
  232. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/algorithms/t2_free_space.py +0 -0
  233. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +0 -0
  234. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +0 -0
  235. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/c3po.py +0 -0
  236. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/__init__.py +0 -0
  237. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/agis.py +0 -0
  238. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/free_space.py +0 -0
  239. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/jedi_did.py +0 -0
  240. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/mock_did.py +0 -0
  241. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/network_metrics.py +0 -0
  242. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/workload.py +0 -0
  243. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/__init__.py +0 -0
  244. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/dataset_cache.py +0 -0
  245. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/expiring_dataset_cache.py +0 -0
  246. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/expiring_list.py +0 -0
  247. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/popularity.py +0 -0
  248. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/timeseries.py +0 -0
  249. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/cache/__init__.py +0 -0
  250. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/cache/consumer.py +0 -0
  251. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/common.py +0 -0
  252. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/__init__.py +0 -0
  253. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/common.py +0 -0
  254. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/finisher.py +0 -0
  255. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/poller.py +0 -0
  256. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/preparer.py +0 -0
  257. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/receiver.py +0 -0
  258. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/stager.py +0 -0
  259. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/submitter.py +0 -0
  260. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/throttler.py +0 -0
  261. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/follower/__init__.py +0 -0
  262. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/follower/follower.py +0 -0
  263. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/hermes/__init__.py +0 -0
  264. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/hermes/hermes.py +0 -0
  265. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/judge/__init__.py +0 -0
  266. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/judge/cleaner.py +0 -0
  267. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/judge/evaluator.py +0 -0
  268. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/judge/injector.py +0 -0
  269. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/judge/repairer.py +0 -0
  270. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
  271. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
  272. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/reaper/__init__.py +0 -0
  273. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
  274. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/reaper/light_reaper.py +0 -0
  275. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/reaper/reaper.py +0 -0
  276. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
  277. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/storage/__init__.py +0 -0
  278. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
  279. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/storage/consistency/actions.py +0 -0
  280. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/tracer/__init__.py +0 -0
  281. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/tracer/kronos.py +0 -0
  282. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
  283. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
  284. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/undertaker/__init__.py +0 -0
  285. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
  286. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/__init__.py +0 -0
  287. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/__init__.py +0 -0
  288. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/constants.py +0 -0
  289. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
  290. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
  291. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -0
  292. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -0
  293. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
  294. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -0
  295. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
  296. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
  297. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
  298. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +0 -0
  299. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -0
  300. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -0
  301. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -0
  302. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -0
  303. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -0
  304. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
  305. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
  306. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -0
  307. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -0
  308. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
  309. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +0 -0
  310. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -0
  311. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -0
  312. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
  313. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +0 -0
  314. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -0
  315. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -0
  316. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -0
  317. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
  318. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -0
  319. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
  320. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -0
  321. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -0
  322. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
  323. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -0
  324. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
  325. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -0
  326. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +0 -0
  327. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -0
  328. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
  329. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -0
  330. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +0 -0
  331. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +0 -0
  332. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
  333. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
  334. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +0 -0
  335. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -0
  336. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
  337. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
  338. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
  339. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +0 -0
  340. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
  341. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -0
  342. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -0
  343. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -0
  344. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -0
  345. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -0
  346. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -0
  347. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
  348. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
  349. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
  350. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +0 -0
  351. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -0
  352. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -0
  353. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -0
  354. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
  355. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
  356. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -0
  357. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -0
  358. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
  359. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -0
  360. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -0
  361. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
  362. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -0
  363. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
  364. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +0 -0
  365. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
  366. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -0
  367. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -0
  368. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
  369. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +0 -0
  370. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -0
  371. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +0 -0
  372. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
  373. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -0
  374. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +0 -0
  375. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -0
  376. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +0 -0
  377. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
  378. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
  379. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
  380. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
  381. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +0 -0
  382. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -0
  383. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
  384. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -0
  385. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
  386. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
  387. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
  388. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -0
  389. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -0
  390. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
  391. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +0 -0
  392. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -0
  393. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +0 -0
  394. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
  395. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -0
  396. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +0 -0
  397. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +0 -0
  398. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
  399. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +0 -0
  400. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +0 -0
  401. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +0 -0
  402. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +0 -0
  403. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +0 -0
  404. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -0
  405. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
  406. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -0
  407. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
  408. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
  409. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
  410. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +0 -0
  411. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
  412. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -0
  413. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +0 -0
  414. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -0
  415. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/models.py +0 -0
  416. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/sautils.py +0 -0
  417. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/session.py +0 -0
  418. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/types.py +0 -0
  419. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/util.py +0 -0
  420. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/__init__.py +0 -0
  421. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/__init__.py +0 -0
  422. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/cache.py +0 -0
  423. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/dummy.py +0 -0
  424. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/gfal.py +0 -0
  425. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/globus.py +0 -0
  426. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/gsiftp.py +0 -0
  427. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
  428. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/mock.py +0 -0
  429. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
  430. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/posix.py +0 -0
  431. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/protocol.py +0 -0
  432. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/rclone.py +0 -0
  433. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/rfio.py +0 -0
  434. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/srm.py +0 -0
  435. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/ssh.py +0 -0
  436. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/storm.py +0 -0
  437. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/xrootd.py +0 -0
  438. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/rsemanager.py +0 -0
  439. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/tests/__init__.py +0 -0
  440. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/tests/common.py +0 -0
  441. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/tests/common_server.py +0 -0
  442. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/__init__.py +0 -0
  443. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/globus.py +0 -0
  444. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/globus_library.py +0 -0
  445. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/mock.py +0 -0
  446. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/transfertool.py +0 -0
  447. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/version.py +0 -0
  448. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/__init__.py +0 -0
  449. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/__init__.py +0 -0
  450. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
  451. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
  452. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
  453. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +0 -0
  454. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/accounts.py +0 -0
  455. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/archives.py +0 -0
  456. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/auth.py +0 -0
  457. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/common.py +0 -0
  458. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/config.py +0 -0
  459. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/credentials.py +0 -0
  460. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/dirac.py +0 -0
  461. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/export.py +0 -0
  462. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +0 -0
  463. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/identities.py +0 -0
  464. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/import.py +0 -0
  465. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +0 -0
  466. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/locks.py +0 -0
  467. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/main.py +0 -0
  468. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/meta.py +0 -0
  469. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/metrics.py +0 -0
  470. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +0 -0
  471. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/ping.py +0 -0
  472. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/redirect.py +0 -0
  473. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/replicas.py +0 -0
  474. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/requests.py +0 -0
  475. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/rules.py +0 -0
  476. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/scopes.py +0 -0
  477. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +0 -0
  478. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
  479. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
  480. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -0
  481. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/traces.py +0 -0
  482. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/vos.py +0 -0
  483. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/main.py +0 -0
  484. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/metrics.py +0 -0
  485. {rucio-32.3.0 → rucio-32.4.0}/lib/rucio.egg-info/SOURCES.txt +0 -0
  486. {rucio-32.3.0 → rucio-32.4.0}/pylintrc +0 -0
  487. {rucio-32.3.0 → rucio-32.4.0}/pyproject.toml +0 -0
  488. {rucio-32.3.0 → rucio-32.4.0}/requirements.txt +0 -0
  489. {rucio-32.3.0 → rucio-32.4.0}/setup.cfg +0 -0
  490. {rucio-32.3.0 → rucio-32.4.0}/setup.py +0 -0
  491. {rucio-32.3.0 → rucio-32.4.0}/setuputil.py +0 -0
  492. {rucio-32.3.0 → rucio-32.4.0}/tests/test_abacus_account.py +0 -0
  493. {rucio-32.3.0 → rucio-32.4.0}/tests/test_abacus_collection_replica.py +0 -0
  494. {rucio-32.3.0 → rucio-32.4.0}/tests/test_abacus_rse.py +0 -0
  495. {rucio-32.3.0 → rucio-32.4.0}/tests/test_account.py +0 -0
  496. {rucio-32.3.0 → rucio-32.4.0}/tests/test_account_limits.py +0 -0
  497. {rucio-32.3.0 → rucio-32.4.0}/tests/test_archive.py +0 -0
  498. {rucio-32.3.0 → rucio-32.4.0}/tests/test_auditor.py +0 -0
  499. {rucio-32.3.0 → rucio-32.4.0}/tests/test_auditor_hdfs.py +0 -0
  500. {rucio-32.3.0 → rucio-32.4.0}/tests/test_auditor_srmdumps.py +0 -0
  501. {rucio-32.3.0 → rucio-32.4.0}/tests/test_authentication.py +0 -0
  502. {rucio-32.3.0 → rucio-32.4.0}/tests/test_automatix.py +0 -0
  503. {rucio-32.3.0 → rucio-32.4.0}/tests/test_bad_replica.py +0 -0
  504. {rucio-32.3.0 → rucio-32.4.0}/tests/test_bb8.py +0 -0
  505. {rucio-32.3.0 → rucio-32.4.0}/tests/test_belleii.py +0 -0
  506. {rucio-32.3.0 → rucio-32.4.0}/tests/test_bin_rucio.py +0 -0
  507. {rucio-32.3.0 → rucio-32.4.0}/tests/test_boolean.py +0 -0
  508. {rucio-32.3.0 → rucio-32.4.0}/tests/test_common_types.py +0 -0
  509. {rucio-32.3.0 → rucio-32.4.0}/tests/test_config.py +0 -0
  510. {rucio-32.3.0 → rucio-32.4.0}/tests/test_conveyor_submitter.py +0 -0
  511. {rucio-32.3.0 → rucio-32.4.0}/tests/test_counter.py +0 -0
  512. {rucio-32.3.0 → rucio-32.4.0}/tests/test_credential.py +0 -0
  513. {rucio-32.3.0 → rucio-32.4.0}/tests/test_curl.py +0 -0
  514. {rucio-32.3.0 → rucio-32.4.0}/tests/test_daemons.py +0 -0
  515. {rucio-32.3.0 → rucio-32.4.0}/tests/test_dataset_replicas.py +0 -0
  516. {rucio-32.3.0 → rucio-32.4.0}/tests/test_db.py +0 -0
  517. {rucio-32.3.0 → rucio-32.4.0}/tests/test_did.py +0 -0
  518. {rucio-32.3.0 → rucio-32.4.0}/tests/test_did_meta_plugins.py +0 -0
  519. {rucio-32.3.0 → rucio-32.4.0}/tests/test_didtype.py +0 -0
  520. {rucio-32.3.0 → rucio-32.4.0}/tests/test_download.py +0 -0
  521. {rucio-32.3.0 → rucio-32.4.0}/tests/test_dumper.py +0 -0
  522. {rucio-32.3.0 → rucio-32.4.0}/tests/test_dumper_consistency.py +0 -0
  523. {rucio-32.3.0 → rucio-32.4.0}/tests/test_dumper_data_model.py +0 -0
  524. {rucio-32.3.0 → rucio-32.4.0}/tests/test_dumper_path_parsing.py +0 -0
  525. {rucio-32.3.0 → rucio-32.4.0}/tests/test_filter_engine.py +0 -0
  526. {rucio-32.3.0 → rucio-32.4.0}/tests/test_heartbeat.py +0 -0
  527. {rucio-32.3.0 → rucio-32.4.0}/tests/test_hermes.py +0 -0
  528. {rucio-32.3.0 → rucio-32.4.0}/tests/test_identity.py +0 -0
  529. {rucio-32.3.0 → rucio-32.4.0}/tests/test_impl_upload_download.py +0 -0
  530. {rucio-32.3.0 → rucio-32.4.0}/tests/test_import_export.py +0 -0
  531. {rucio-32.3.0 → rucio-32.4.0}/tests/test_judge_cleaner.py +0 -0
  532. {rucio-32.3.0 → rucio-32.4.0}/tests/test_judge_evaluator.py +0 -0
  533. {rucio-32.3.0 → rucio-32.4.0}/tests/test_judge_injector.py +0 -0
  534. {rucio-32.3.0 → rucio-32.4.0}/tests/test_judge_repairer.py +0 -0
  535. {rucio-32.3.0 → rucio-32.4.0}/tests/test_lifetime.py +0 -0
  536. {rucio-32.3.0 → rucio-32.4.0}/tests/test_message.py +0 -0
  537. {rucio-32.3.0 → rucio-32.4.0}/tests/test_meta.py +0 -0
  538. {rucio-32.3.0 → rucio-32.4.0}/tests/test_meta_did.py +0 -0
  539. {rucio-32.3.0 → rucio-32.4.0}/tests/test_module_import.py +0 -0
  540. {rucio-32.3.0 → rucio-32.4.0}/tests/test_monitor.py +0 -0
  541. {rucio-32.3.0 → rucio-32.4.0}/tests/test_multi_vo.py +0 -0
  542. {rucio-32.3.0 → rucio-32.4.0}/tests/test_naming_convention.py +0 -0
  543. {rucio-32.3.0 → rucio-32.4.0}/tests/test_oauthmanager.py +0 -0
  544. {rucio-32.3.0 → rucio-32.4.0}/tests/test_oidc.py +0 -0
  545. {rucio-32.3.0 → rucio-32.4.0}/tests/test_permission.py +0 -0
  546. {rucio-32.3.0 → rucio-32.4.0}/tests/test_pfns.py +0 -0
  547. {rucio-32.3.0 → rucio-32.4.0}/tests/test_ping.py +0 -0
  548. {rucio-32.3.0 → rucio-32.4.0}/tests/test_preparer.py +0 -0
  549. {rucio-32.3.0 → rucio-32.4.0}/tests/test_qos.py +0 -0
  550. {rucio-32.3.0 → rucio-32.4.0}/tests/test_quarantined_replica.py +0 -0
  551. {rucio-32.3.0 → rucio-32.4.0}/tests/test_reaper.py +0 -0
  552. {rucio-32.3.0 → rucio-32.4.0}/tests/test_redirect.py +0 -0
  553. {rucio-32.3.0 → rucio-32.4.0}/tests/test_replica_sorting.py +0 -0
  554. {rucio-32.3.0 → rucio-32.4.0}/tests/test_request.py +0 -0
  555. {rucio-32.3.0 → rucio-32.4.0}/tests/test_root_proxy.py +0 -0
  556. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_expression_parser.py +0 -0
  557. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_lfn2path.py +0 -0
  558. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_gfal2.py +0 -0
  559. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
  560. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_posix.py +0 -0
  561. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_rclone.py +0 -0
  562. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_rsync.py +0 -0
  563. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_srm.py +0 -0
  564. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_ssh.py +0 -0
  565. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_webdav.py +0 -0
  566. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_xrootd.py +0 -0
  567. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_selector.py +0 -0
  568. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rucio_server.py +0 -0
  569. {rucio-32.3.0 → rucio-32.4.0}/tests/test_rule.py +0 -0
  570. {rucio-32.3.0 → rucio-32.4.0}/tests/test_schema_cms.py +0 -0
  571. {rucio-32.3.0 → rucio-32.4.0}/tests/test_scope.py +0 -0
  572. {rucio-32.3.0 → rucio-32.4.0}/tests/test_subscription.py +0 -0
  573. {rucio-32.3.0 → rucio-32.4.0}/tests/test_temporary_did.py +0 -0
  574. {rucio-32.3.0 → rucio-32.4.0}/tests/test_throttler.py +0 -0
  575. {rucio-32.3.0 → rucio-32.4.0}/tests/test_tpc.py +0 -0
  576. {rucio-32.3.0 → rucio-32.4.0}/tests/test_trace.py +0 -0
  577. {rucio-32.3.0 → rucio-32.4.0}/tests/test_transfer.py +0 -0
  578. {rucio-32.3.0 → rucio-32.4.0}/tests/test_upload.py +0 -0
  579. {rucio-32.3.0 → rucio-32.4.0}/tests/test_utils.py +0 -0
  580. {rucio-32.3.0 → rucio-32.4.0}/tools/bootstrap.py +0 -0
  581. {rucio-32.3.0 → rucio-32.4.0}/tools/merge_rucio_configs.py +0 -0
  582. {rucio-32.3.0 → rucio-32.4.0}/tools/reset_database.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rucio
3
- Version: 32.3.0
3
+ Version: 32.4.0
4
4
  Summary: Rucio Package
5
5
  Home-page: https://rucio.cern.ch/
6
6
  Author: Rucio
@@ -367,28 +367,30 @@ def run_once(heartbeat_handler: Any, younger_than: int, nattempts: int, vos: Opt
367
367
  file_metadata_datatype = str(file_metadata["datatype"])
368
368
  file_metadata_scope = str(file_metadata["scope"])
369
369
  action = ""
370
- for policy in json_data:
371
- match_scope = False
372
- match_datatype = False
373
-
374
- if not policy.get("scope", []):
375
- match_scope = True
376
- for scope in policy.get("scope", []):
377
- if re.match(scope, file_metadata_scope):
370
+ if file_metadata_datatype:
371
+ # Some files don't have a datatype. They should be ignored.
372
+ for policy in json_data:
373
+ match_scope = False
374
+ match_datatype = False
375
+
376
+ if not policy.get("scope", []):
378
377
  match_scope = True
379
- break
378
+ for scope in policy.get("scope", []):
379
+ if re.match(scope, file_metadata_scope):
380
+ match_scope = True
381
+ break
380
382
 
381
- if not policy.get("datatype", []):
382
- match_datatype = True
383
- for datatype in policy.get("datatype", []):
384
- if re.match(datatype, file_metadata_datatype):
383
+ if not policy.get("datatype", []):
385
384
  match_datatype = True
386
- break
385
+ for datatype in policy.get("datatype", []):
386
+ if re.match(datatype, file_metadata_datatype):
387
+ match_datatype = True
388
+ break
387
389
 
388
- if match_scope and match_datatype:
389
- action = policy["action"]
390
- logger(logging.INFO, "The action that will be performed is %s", action)
391
- break
390
+ if match_scope and match_datatype:
391
+ action = policy["action"]
392
+ logger(logging.INFO, "The action that will be performed is %s", action)
393
+ break
392
394
 
393
395
  if not action:
394
396
  logger(logging.WARNING, "No recognised actions (ignore/declare bad) found in policy file (etc/suspicious_replica_recoverer.json). Replica will be ignored by default.")
@@ -483,7 +483,7 @@ class Default(protocol.RSEProtocol):
483
483
  :raises SourceNotFound: if the source file was not found on the referred storage.
484
484
  :raises RSEAccessDenied: in case of permission issue.
485
485
 
486
- :returns: a dict with two keys, filesize and adler32 of the file provided in path.
486
+ :returns: a dict with filesize of the file provided in path as a key.
487
487
  """
488
488
  headers = {'Depth': '1'}
489
489
  dict_ = {}
@@ -31,7 +31,7 @@ from requests.adapters import ReadTimeout
31
31
  from requests.packages.urllib3 import disable_warnings # pylint: disable=import-error
32
32
 
33
33
  from rucio.common.cache import make_region_memcached
34
- from rucio.common.config import config_get, config_get_bool
34
+ from rucio.common.config import config_get, config_get_bool, config_get_int
35
35
  from rucio.common.constants import FTS_JOB_TYPE, FTS_STATE, FTS_COMPLETE_STATE
36
36
  from rucio.common.exception import TransferToolTimeout, TransferToolWrongAnswer, DuplicateFileTransferSubmission
37
37
  from rucio.common.stopwatch import Stopwatch
@@ -104,6 +104,61 @@ PATH_CHECKSUM_VALIDATION_STRATEGY: dict[tuple[str, str], str] = {
104
104
  ('none', 'none'): 'none',
105
105
  }
106
106
 
107
+ _SCITAGS_NEXT_REFRESH = datetime.datetime.utcnow()
108
+ _SCITAGS_EXP_ID = None
109
+ _SCITAGS_ACTIVITY_IDS = {}
110
+
111
+
112
+ def _scitags_ids(logger: Callable[..., Any] = logging.log) -> "tuple[int | None, dict[str, int]]":
113
+ """
114
+ Re-fetch if needed and return the scitags ids
115
+ """
116
+ enabled = config_get_bool('packet-marking', 'enabled', default=False)
117
+ if not enabled:
118
+ return None, {}
119
+
120
+ now = datetime.datetime.utcnow()
121
+ global _SCITAGS_ACTIVITY_IDS
122
+ global _SCITAGS_EXP_ID
123
+ global _SCITAGS_NEXT_REFRESH
124
+ if _SCITAGS_NEXT_REFRESH < now:
125
+ exp_name = config_get('packet-marking', 'exp_name', default='')
126
+ fetch_url = config_get('packet-marking', 'fetch_url', default='https://www.scitags.org/api.json')
127
+ fetch_interval = config_get_int('packet-marking', 'fetch_interval', default=datetime.timedelta(hours=48).seconds)
128
+ fetch_timeout = config_get_int('packet-marking', 'fetch_timeout', default=5)
129
+
130
+ _SCITAGS_NEXT_REFRESH = now + datetime.timedelta(seconds=fetch_interval)
131
+
132
+ if exp_name:
133
+ had_exception = False
134
+ exp_id = None
135
+ activity_ids = {}
136
+ try:
137
+ result = requests.get(fetch_url, timeout=fetch_timeout)
138
+ if result and result.status_code == 200:
139
+ marks = result.json()
140
+ for experiment in marks.get('experiments', []):
141
+ if experiment.get('expName') == exp_name:
142
+ exp_id = experiment.get('expId')
143
+ for activity_dict in experiment.get('activities', []):
144
+ activity_name = activity_dict.get('activityName')
145
+ activity_id = activity_dict.get('activityId')
146
+ if activity_name and activity_id:
147
+ activity_ids[activity_name] = int(activity_id)
148
+ break
149
+ except (requests.exceptions.RequestException, TypeError, ValueError):
150
+ had_exception = True
151
+ logger(logging.WARNING, 'Failed to fetch the scitags markings', exc_info=True)
152
+
153
+ if had_exception:
154
+ # Retry quicker after fetch errors
155
+ _SCITAGS_NEXT_REFRESH = min(_SCITAGS_NEXT_REFRESH, now + datetime.timedelta(minutes=5))
156
+ else:
157
+ _SCITAGS_EXP_ID = exp_id
158
+ _SCITAGS_ACTIVITY_IDS = activity_ids
159
+
160
+ return _SCITAGS_EXP_ID, _SCITAGS_ACTIVITY_IDS
161
+
107
162
 
108
163
  def _pick_cert_file(vo: "Optional[str]") -> "Optional[str]":
109
164
  cert = None
@@ -791,6 +846,8 @@ class FTS3Transfertool(Transfertool):
791
846
  self.cert = None
792
847
  self.verify = True # True is the default setting of a requests.* method
793
848
 
849
+ self.scitags_exp_id, self.scitags_activity_ids = _scitags_ids(logger=logger)
850
+
794
851
  @classmethod
795
852
  def _pick_fts_servers(cls, source_rse: "RseData", dest_rse: "RseData"):
796
853
  """
@@ -882,6 +939,10 @@ class FTS3Transfertool(Transfertool):
882
939
  'selection_strategy': self.source_strategy if self.source_strategy else _configured_source_strategy(transfer.rws.activity, logger=self.logger),
883
940
  'activity': rws.activity
884
941
  }
942
+ if isinstance(self.scitags_exp_id, int):
943
+ activity_id = self.scitags_activity_ids.get(rws.activity)
944
+ if isinstance(activity_id, int):
945
+ t_file['metadata']['scitags_id'] = self.scitags_exp_id << 6 | activity_id
885
946
  return t_file
886
947
 
887
948
  def submit(self, transfers, job_params, timeout=None):
@@ -4,8 +4,8 @@ This file is automatically generated; Do not edit it. :)
4
4
  '''
5
5
  VERSION_INFO = {
6
6
  'final': True,
7
- 'version': '32.3.0',
7
+ 'version': '32.4.0',
8
8
  'branch_nick': 'release-32-LTS',
9
- 'revision_id': '7a033c118633c83dd7d588b4188b457f77f5dedc',
10
- 'revno': 12618
9
+ 'revision_id': 'b32edac1a7e6c5f13575c92112afaa9e4b7e31b8',
10
+ 'revno': 12629
11
11
  }
@@ -24,7 +24,7 @@ from rucio.api.did import add_did, add_dids, list_content, list_content_history,
24
24
  resurrect, get_users_following_did, remove_did_from_followed, add_did_to_followed, delete_metadata, \
25
25
  set_metadata_bulk, set_dids_metadata_bulk
26
26
  from rucio.api.rule import list_replication_rules, list_associated_replication_rules_for_file
27
- from rucio.common.exception import ScopeNotFound, DataIdentifierNotFound, DataIdentifierAlreadyExists, \
27
+ from rucio.common.exception import ScopeNotFound, DatabaseException, DataIdentifierNotFound, DataIdentifierAlreadyExists, \
28
28
  DuplicateContent, AccessDenied, KeyNotFound, Duplicate, InvalidValueForKey, UnsupportedStatus, \
29
29
  UnsupportedOperation, RSENotFound, RuleNotFound, InvalidMetadata, InvalidPath, FileAlreadyExists, InvalidObject, FileConsistencyMismatch
30
30
  from rucio.common.utils import render_json, APIEncoder
@@ -655,6 +655,15 @@ class DIDs(ErrorHandlingMethodView):
655
655
  return generate_http_error_flask(409, error)
656
656
  except AccessDenied as error:
657
657
  return generate_http_error_flask(401, error)
658
+ except DatabaseException as error:
659
+ if 'DELETED_DIDS_PK violated' in str(error):
660
+ return generate_http_error_flask(
661
+ status_code=406,
662
+ exc=error.__class__.__name__,
663
+ exc_msg=str('A deleted DID {} with scope {} is reused'.format(name, scope))
664
+ )
665
+ else:
666
+ return generate_http_error_flask(406, error)
658
667
 
659
668
  return 'Created', 201
660
669
 
@@ -43,15 +43,12 @@ class RSEs(ErrorHandlingMethodView):
43
43
  description: Lists all RSEs.
44
44
  tags:
45
45
  - Rucio Storage Elements
46
- requestBody:
47
- content:
48
- application/json:
49
- schema:
50
- type: object
51
- properties:
52
- expression:
53
- description: An RSE expression.
54
- type: string
46
+ parameters:
47
+ - name: expression
48
+ in: query
49
+ description: RSE expression to select RSEs.
50
+ schema:
51
+ type: string
55
52
  responses:
56
53
  200:
57
54
  description: OK
@@ -36,7 +36,6 @@ from rucio.api.subscription import add_subscription, list_subscriptions, list_su
36
36
  from rucio.common.config import config_get_bool
37
37
  from rucio.common.types import InternalScope
38
38
  from rucio.common.utils import api_update_return_dict, generate_uuid
39
- from rucio.core.rse import get_rse_id
40
39
  from rucio.core.vo import add_vo, vo_exists
41
40
  from rucio.daemons.abacus import rse as abacus_rse
42
41
  from rucio.daemons.judge import cleaner
@@ -93,34 +92,31 @@ class TestApiExternalRepresentation:
93
92
  @classmethod
94
93
  def setUpClass(cls):
95
94
  # Get test RSEs
96
- cls.rse_name = 'MOCK'
97
- cls.rse_id = get_rse_id(rse=cls.rse_name, vo=cls.vo)
98
- cls.rse2_name = 'MOCK2'
99
- cls.rse2_id = get_rse_id(rse=cls.rse2_name, vo=cls.vo)
100
-
101
95
  cls.rse3_name = rse_name_generator()
102
96
  cls.rse3_id = api_rse.add_rse(cls.rse3_name, 'root', vo=cls.vo2 if cls.vo2 else cls.vo)
103
97
  cls.rse4_name = rse_name_generator()
104
98
  cls.rse4_id = api_rse.add_rse(cls.rse4_name, 'root', vo=cls.vo2 if cls.vo2 else cls.vo)
105
99
  api_rse.add_distance(cls.rse3_name, cls.rse4_name, issuer='root', distance=3, vo=cls.vo2 or cls.vo)
106
100
 
107
- def test_api_update_return_dict(self, account, account_name, scope_name, scope):
101
+ def test_api_update_return_dict(self, rse_factory, account, account_name, scope_name, scope):
108
102
  """ API: Test the conversion of dictionaries to external representation """
103
+ rse1, rse1_id = rse_factory.make_rse()
104
+ rse2, rse2_id = rse_factory.make_rse()
109
105
  test_dict = {'account': account,
110
106
  'scope': scope,
111
- 'rse_expression': 'MOCK|MOCK2',
112
- 'rse_id': self.rse_id,
113
- 'src_rse_id': self.rse_id,
114
- 'source_rse_id': self.rse_id,
115
- 'dest_rse_id': self.rse_id,
116
- 'destination_rse_id': self.rse_id}
107
+ 'rse_expression': f'{rse1}|{rse2}',
108
+ 'rse_id': rse1_id,
109
+ 'src_rse_id': rse1_id,
110
+ 'source_rse_id': rse1_id,
111
+ 'dest_rse_id': rse1_id,
112
+ 'destination_rse_id': rse1_id}
117
113
  value = api_update_return_dict(test_dict)
118
- expected = {'account': account_name, 'scope': scope_name, 'rse_expression': 'MOCK|MOCK2',
119
- 'rse_id': self.rse_id, 'rse': self.rse_name,
120
- 'src_rse_id': self.rse_id, 'src_rse': self.rse_name,
121
- 'source_rse_id': self.rse_id, 'source_rse': self.rse_name,
122
- 'dest_rse_id': self.rse_id, 'dest_rse': self.rse_name,
123
- 'destination_rse_id': self.rse_id, 'destination_rse': self.rse_name}
114
+ expected = {'account': account_name, 'scope': scope_name, 'rse_expression': f'{rse1}|{rse2}',
115
+ 'rse_id': rse1_id, 'rse': rse1,
116
+ 'src_rse_id': rse1_id, 'src_rse': rse1,
117
+ 'source_rse_id': rse1_id, 'source_rse': rse1,
118
+ 'dest_rse_id': rse1_id, 'dest_rse': rse1,
119
+ 'destination_rse_id': rse1_id, 'destination_rse': rse1}
124
120
  assert value == expected
125
121
 
126
122
  def test_api_account(self, vo, vo2, account, account_name):
@@ -134,20 +130,22 @@ class TestApiExternalRepresentation:
134
130
  assert account.internal not in out
135
131
  assert '@' not in ' '.join(out)
136
132
 
137
- def test_api_account_limit(self, vo, vo2, account_name):
133
+ def test_api_account_limit(self, rse_factory, vo, vo2, account_name):
138
134
  """ ACCOUNT_LIMIT (API): Test external representation of account limits """
139
135
  # Add mock account limits
140
- rse_expr = '{}|{}'.format(self.rse_name, self.rse2_name)
141
- api_acc_lim.set_local_account_limit(account_name, self.rse_name, 10000, issuer='root', vo=vo)
136
+ rse1, rse1_id = rse_factory.make_rse()
137
+ rse2, rse2_id = rse_factory.make_rse()
138
+ rse_expr = f'{rse1}|{rse2}'
139
+ api_acc_lim.set_local_account_limit(account_name, rse1, 10000, issuer='root', vo=vo)
142
140
  api_acc_lim.set_global_account_limit(account_name, rse_expr, 20000, issuer='root', vo=vo)
143
141
 
144
142
  out = api_acc_lim.get_local_account_limits(account_name, vo=vo)
145
- assert self.rse_name in out
146
- assert self.rse_id not in out
143
+ assert rse1 in out
144
+ assert rse1_id not in out
147
145
 
148
- out = api_acc_lim.get_local_account_limit(account_name, self.rse_name, vo=vo)
149
- assert self.rse_name in out
150
- assert self.rse_id not in out
146
+ out = api_acc_lim.get_local_account_limit(account_name, rse1, vo=vo)
147
+ assert rse1 in out
148
+ assert rse1_id not in out
151
149
 
152
150
  out = api_acc_lim.get_global_account_limits(account_name, vo=vo)
153
151
  assert rse_expr in out
@@ -159,15 +157,15 @@ class TestApiExternalRepresentation:
159
157
  if vo2:
160
158
  assert 'vo={}&({})'.format(vo, rse_expr) not in out
161
159
 
162
- out = api_acc_lim.get_local_account_usage(account_name, self.rse_name, issuer='root', vo=vo)
160
+ out = api_acc_lim.get_local_account_usage(account_name, rse1, issuer='root', vo=vo)
163
161
  out = list(out)
164
162
  assert 0 != len(out)
165
- assert self.rse_id in [usage['rse_id'] for usage in out if 'rse_id' in usage]
163
+ assert rse1_id in [usage['rse_id'] for usage in out if 'rse_id' in usage]
166
164
  for usage in out:
167
165
  if 'rse_id' in usage:
168
166
  assert 'rse' in usage
169
- if usage['rse_id'] == self.rse_id:
170
- assert self.rse_name == usage["rse"]
167
+ if usage['rse_id'] == rse1_id:
168
+ assert rse1 == usage["rse"]
171
169
 
172
170
  out = api_acc_lim.get_global_account_usage(account_name, rse_expr, issuer='root', vo=vo)
173
171
  out = list(out)
@@ -205,9 +203,11 @@ class TestApiExternalRepresentation:
205
203
  for user in out:
206
204
  assert user['user'] == account_name
207
205
 
208
- def test_api_exporter(self, vo, vo2):
206
+ def test_api_exporter(self, vo, rse_factory, vo2):
209
207
  """ EXPORTER (API): Test external representation of exported data """
210
208
 
209
+ rse1, rse1_id = rse_factory.make_rse()
210
+ rse2, rse2_id = rse_factory.make_rse()
211
211
  out = export_data('root', vo=vo2 if vo2 else vo)
212
212
  rses = out['rses']
213
213
  assert self.rse3_name in rses
@@ -221,15 +221,15 @@ class TestApiExternalRepresentation:
221
221
 
222
222
  # check for interference from other VOs
223
223
  if vo2:
224
- assert self.rse_name not in rses
225
- assert self.rse_id not in rses
226
- assert self.rse2_name not in rses
227
- assert self.rse2_id not in rses
224
+ assert rse1 not in rses
225
+ assert rse1_id not in rses
226
+ assert rse2 not in rses
227
+ assert rse2_id not in rses
228
228
 
229
- assert self.rse_name not in distances
230
- assert self.rse_id not in distances
231
- assert self.rse2_name not in distances
232
- assert self.rse2_id not in distances
229
+ assert rse1 not in distances
230
+ assert rse1_id not in distances
231
+ assert rse2 not in distances
232
+ assert rse2_id not in distances
233
233
 
234
234
  def test_api_identity(self, vo, vo2, account, account_name):
235
235
  """ IDENTITY (API): Test external representation of identity accounts """
@@ -243,20 +243,26 @@ class TestApiExternalRepresentation:
243
243
  if vo2:
244
244
  assert account.internal not in out
245
245
 
246
- def test_api_replica(self, vo, vo2, account_name, scope_name, scope):
246
+ def test_api_replica(self, vo, rse_factory, vo2, account_name, scope_name, scope):
247
247
  """ REPLICA (API): Test external representation of replicas """
248
248
 
249
249
  did = did_name_generator('file')
250
250
  did_parent = did_name_generator('dataset')
251
- pfn = 'srm://mock2.com:8443/srm/managerv2?SFN=/rucio/tmpdisk/rucio_tests/%s/%s' % (scope_name, generate_uuid())
252
- add_replicas(self.rse2_name, files=[{'scope': scope_name, 'name': did, 'bytes': 100, 'pfn': pfn}], issuer='root', vo=vo)
251
+ rse2, rse2_id = rse_factory.make_rse(scheme='srm', protocol_impl='rucio.rse.protocols.gfal.Default', deterministic=False)
252
+ protocols = api_rse.get_rse_protocols(rse2, issuer='root', vo=vo)
253
+ pfn = 'srm://%s:%s/srm/managerv2?SFN=%s%s/%s' % (protocols['protocols'][0]['hostname'],
254
+ protocols['protocols'][0]['port'],
255
+ protocols['protocols'][0]['prefix'],
256
+ scope_name,
257
+ generate_uuid())
258
+ add_replicas(rse2, files=[{'scope': scope_name, 'name': did, 'bytes': 100, 'pfn': pfn}], issuer='root', vo=vo)
253
259
 
254
260
  add_did(scope_name, did_parent, 'dataset', issuer='root', account=account_name, vo=vo)
255
261
  attachment = {'scope': scope_name, 'name': did_parent,
256
262
  'dids': [{'scope': scope_name, 'name': did}]}
257
263
  attach_dids_to_dids([attachment], issuer='root', vo=vo)
258
264
 
259
- out = get_did_from_pfns([pfn], self.rse2_name, vo=vo)
265
+ out = get_did_from_pfns([pfn], rse2, vo=vo)
260
266
  out = list(out)
261
267
  assert 0 != len(out)
262
268
  did_found = False
@@ -281,15 +287,17 @@ class TestApiExternalRepresentation:
281
287
  assert scope.internal not in parent
282
288
  assert parents_found
283
289
 
284
- def test_api_request(self, vo, account_name, scope_name):
290
+ def test_api_request(self, vo, rse_factory, account_name, scope_name):
285
291
  """ REQUEST (API): Test external representation of requests """
286
292
 
293
+ rse1, rse1_id = rse_factory.make_rse()
294
+ rse2, rse2_id = rse_factory.make_rse()
287
295
  did = did_name_generator('dataset')
288
- add_did(scope_name, did, 'dataset', issuer='root', account=account_name, rse=self.rse_name, vo=vo)
296
+ add_did(scope_name, did, 'dataset', issuer='root', account=account_name, rse=rse1, vo=vo)
289
297
 
290
298
  requests = [{
291
- 'dest_rse_id': self.rse2_id,
292
- 'source_rse_id': self.rse_id,
299
+ 'dest_rse_id': rse2_id,
300
+ 'source_rse_id': rse1_id,
293
301
  'request_type': constants.RequestType.TRANSFER,
294
302
  'request_id': generate_uuid(),
295
303
  'name': did,
@@ -312,16 +320,16 @@ class TestApiExternalRepresentation:
312
320
  for r in reqs:
313
321
  assert r['scope'] == scope_name
314
322
  assert r['account'] == account_name
315
- assert r['source_rse'] == self.rse_name
316
- assert r['dest_rse'] == self.rse2_name
323
+ assert r['source_rse'] == rse1
324
+ assert r['dest_rse'] == rse2
317
325
 
318
- out = get_request_by_did(scope_name, did, self.rse2_name, issuer='root', vo=vo)
326
+ out = get_request_by_did(scope_name, did, rse2, issuer='root', vo=vo)
319
327
  assert out['scope'] == scope_name
320
328
  assert out['account'] == account_name
321
- assert out['dest_rse'] == self.rse2_name
322
- assert out['source_rse'] == self.rse_name
329
+ assert out['dest_rse'] == rse2
330
+ assert out['source_rse'] == rse1
323
331
 
324
- out = list_requests([self.rse_name], [self.rse2_name], [constants.RequestState.QUEUED], issuer='root', vo=vo)
332
+ out = list_requests([rse1], [rse2], [constants.RequestState.QUEUED], issuer='root', vo=vo)
325
333
  out = list(out)
326
334
  assert 0 != len(out)
327
335
  assert scope_name in [req['scope'] for req in out]
@@ -329,16 +337,18 @@ class TestApiExternalRepresentation:
329
337
  if req['scope'] == scope_name:
330
338
  assert req['scope'] == scope_name
331
339
  assert req['account'] == account_name
332
- assert req['dest_rse'] == self.rse2_name
333
- assert req['source_rse'] == self.rse_name
340
+ assert req['dest_rse'] == rse2
341
+ assert req['source_rse'] == rse1
334
342
 
335
343
  @pytest.mark.noparallel(reason='runs the reaper on a pre-defined rse, might interfere with other tests')
336
- def test_api_rse(self, vo, vo2, account, account_name, scope_name):
344
+ def test_api_rse(self, vo, rse_factory, vo2, account, account_name, scope_name):
337
345
  """ RSE (API): Test external representation of RSEs """
338
346
 
339
- out = api_rse.get_rse(self.rse_name, vo=vo)
340
- assert out['rse'] == self.rse_name
341
- assert out['id'] == self.rse_id
347
+ rse1, rse1_id = rse_factory.make_rse()
348
+ rse2, rse2_id = rse_factory.make_rse()
349
+ out = api_rse.get_rse(rse1, vo=vo)
350
+ assert out['rse'] == rse1
351
+ assert out['id'] == rse1_id
342
352
 
343
353
  out = api_rse.list_rses(vo=vo2 if vo2 else vo)
344
354
  out = list(out)
@@ -354,18 +364,18 @@ class TestApiExternalRepresentation:
354
364
  assert rse['rse'] == self.rse4_name
355
365
 
356
366
  key = "KEY_" + generate_uuid()
357
- api_rse.add_rse_attribute(self.rse_name, key, 1, issuer='root', vo=vo)
367
+ api_rse.add_rse_attribute(rse1, key, 1, issuer='root', vo=vo)
358
368
  out = api_rse.get_rses_with_attribute(key)
359
369
  out = list(out)
360
370
  assert 0 != len(out)
361
371
  for rse in out:
362
- assert rse['rse'] == self.rse_name
372
+ assert rse['rse'] == rse1
363
373
 
364
- out = api_rse.get_rse_protocols(self.rse_name, issuer='root', vo=vo)
365
- assert out['rse'] == self.rse_name
374
+ out = api_rse.get_rse_protocols(rse1, issuer='root', vo=vo)
375
+ assert out['rse'] == rse1
366
376
 
367
377
  # add some account and RSE counters
368
- rse_mock, rse_mock_id = self.rse_factory.make_mock_rse()
378
+ rse_mock, rse_mock_id = rse_factory.make_mock_rse()
369
379
  account_counter.del_counter(rse_id=rse_mock_id, account=account)
370
380
  account_counter.add_counter(rse_id=rse_mock_id, account=account)
371
381
  account_counter.increase(rse_id=rse_mock_id, account=account, files=1, bytes_=10)
@@ -393,11 +403,11 @@ class TestApiExternalRepresentation:
393
403
  reaper.run(once=True, include_rses=rse_mock, greedy=True)
394
404
  abacus_rse.run(once=True)
395
405
 
396
- out = api_rse.parse_rse_expression('%s|%s' % (self.rse_name, self.rse2_name), vo=vo)
397
- assert self.rse_name in out
398
- assert self.rse2_name in out
399
- assert self.rse_id not in out
400
- assert self.rse2_id not in out
406
+ out = api_rse.parse_rse_expression(f'{rse1}|{rse2}', vo=vo)
407
+ assert rse1 in out
408
+ assert rse2 in out
409
+ assert rse1_id not in out
410
+ assert rse2_id not in out
401
411
 
402
412
  def test_api_scope(self, vo, vo2, account_name, scope_name, scope):
403
413
  """ SCOPE (API): Test external representation of scopes """
@@ -15,10 +15,7 @@
15
15
 
16
16
  from datetime import datetime, timedelta
17
17
 
18
- from http.server import SimpleHTTPRequestHandler
19
- from http.server import HTTPServer
20
18
  from os import rename
21
- from threading import Thread
22
19
 
23
20
  import pytest
24
21
 
@@ -27,6 +24,7 @@ from rucio.client.client import Client
27
24
  from rucio.common.config import config_get, config_set
28
25
  from rucio.common.exception import CannotAuthenticate, ClientProtocolNotSupported, RucioException
29
26
  from rucio.common.utils import execute
27
+ from tests.mocks.mock_http_server import MockServer
30
28
 
31
29
 
32
30
  @pytest.fixture
@@ -37,43 +35,6 @@ def client_token_path_override(file_config_mock, function_scope_prefix, tmp_path
37
35
  config_set('client', 'auth_token_file_path', str(tmp_path / f'{function_scope_prefix}token'))
38
36
 
39
37
 
40
- class MockServer:
41
- """
42
- Start A simple http server in a separate thread to serve as MOCK for testing the client
43
- """
44
-
45
- class Handler(SimpleHTTPRequestHandler):
46
- def send_code_and_message(self, code, headers, message):
47
- """
48
- Helper which wraps the quite-low-level BaseHTTPRequestHandler primitives and is used to send reponses.
49
- """
50
- self.send_response(code)
51
- self.send_header("Content-type", "text/plain")
52
- for name, content in headers.items():
53
- self.send_header(name, content)
54
- self.end_headers()
55
- self.wfile.write(message.encode())
56
-
57
- def __init__(self, request_handler_cls):
58
- self.server = HTTPServer(('localhost', 0), request_handler_cls)
59
- self.thread = Thread(target=self.server.serve_forever)
60
- self.thread.daemon = True
61
-
62
- def __enter__(self):
63
- self.thread.start()
64
- return self
65
-
66
- def __exit__(self, exc_type, exc_val, exc_tb):
67
- self.server.shutdown()
68
- self.thread.join()
69
- self.server.server_close()
70
-
71
- @property
72
- def base_url(self):
73
- name, port = self.server.server_address
74
- return 'http://{}:{}'.format(name, port)
75
-
76
-
77
38
  @pytest.mark.usefixtures("client_token_path_override")
78
39
  class TestBaseClient:
79
40
  """ To test Clients"""
@@ -49,6 +49,7 @@ from rucio.db.sqla.session import read_session, transactional_session
49
49
  from rucio.tests.common import skip_rse_tests_with_accounts
50
50
  from rucio.transfertool.fts3 import FTS3Transfertool
51
51
  from tests.ruciopytest import NoParallelGroups
52
+ from tests.mocks.mock_http_server import MockServer
52
53
 
53
54
  MAX_POLL_WAIT_SECONDS = 60
54
55
  TEST_FTS_HOST = 'https://fts:8446'
@@ -118,6 +119,24 @@ def __get_source(request_id, src_rse_id, scope, name, *, session=None):
118
119
  .first()
119
120
 
120
121
 
122
+ @pytest.fixture
123
+ def scitags_mock(core_config_mock):
124
+ """Run a mock http server which always returns the content of scitags.json from test/inputs"""
125
+ from tests.inputs import SCITAGS_JSON
126
+ from pathlib import Path
127
+
128
+ class _SendScitagsJson(MockServer.Handler):
129
+ def do_GET(self):
130
+ file_content = Path(SCITAGS_JSON).read_text()
131
+ self.send_code_and_message(200, {'Content-Type': 'application/json'}, file_content)
132
+
133
+ with MockServer(_SendScitagsJson) as mock_server:
134
+ core_config.set('packet-marking', 'enabled', True)
135
+ core_config.set('packet-marking', 'fetch_url', mock_server.base_url)
136
+ core_config.set('packet-marking', 'exp_name', 'atlas')
137
+ yield mock_server
138
+
139
+
121
140
  @skip_rse_tests_with_accounts
122
141
  @pytest.mark.dirty(reason="leaves files in XRD containers")
123
142
  @pytest.mark.noparallel(groups=[NoParallelGroups.XRD, NoParallelGroups.SUBMITTER, NoParallelGroups.POLLER, NoParallelGroups.FINISHER])
@@ -528,7 +547,7 @@ def test_multihop_receiver_on_failure(vo, did_factory, replica_client, root_acco
528
547
  @pytest.mark.parametrize("caches_mock", [{"caches_to_mock": [
529
548
  'rucio.core.rse_expression_parser.REGION', # The list of multihop RSEs is retrieved by rse expression
530
549
  ]}], indirect=True)
531
- def test_multihop_receiver_on_success(vo, did_factory, root_account, caches_mock, metrics_mock):
550
+ def test_multihop_receiver_on_success(vo, did_factory, root_account, caches_mock, metrics_mock, scitags_mock):
532
551
  """
533
552
  Verify that the receiver correctly handles successful multihop jobs
534
553
  """
@@ -547,7 +566,7 @@ def test_multihop_receiver_on_success(vo, did_factory, root_account, caches_mock
547
566
 
548
567
  did = did_factory.upload_test_file(src_rse)
549
568
  rule_priority = 5
550
- rule_core.add_rule(dids=[did], account=root_account, copies=1, rse_expression=dst_rse, grouping='ALL', weight=None, lifetime=3600, locked=False, subscription_id=None, priority=rule_priority)
569
+ rule_core.add_rule(dids=[did], account=root_account, copies=1, rse_expression=dst_rse, grouping='ALL', weight=None, lifetime=3600, locked=False, subscription_id=None, priority=rule_priority, activity='test')
551
570
  submitter(once=True, rses=[{'id': rse_id} for rse_id in all_rses], group_bulk=2, partition_wait_time=0, transfertype='single', filter_transfertool=None)
552
571
 
553
572
  request = __wait_for_state_transition(dst_rse_id=jump_rse_id, run_poller=False, **did)
@@ -556,7 +575,9 @@ def test_multihop_receiver_on_success(vo, did_factory, root_account, caches_mock
556
575
  assert request['state'] == RequestState.DONE
557
576
 
558
577
  fts_response = FTS3Transfertool(external_host=TEST_FTS_HOST).bulk_query({request['external_id']: {request['id']: request}})
559
- assert fts_response[request['external_id']][request['id']].job_response['priority'] == rule_priority
578
+ fts_response = fts_response[request['external_id']][request['id']]
579
+ assert fts_response.job_response['priority'] == rule_priority
580
+ assert fts_response.file_response['file_metadata'].get('scitags_id') is not None
560
581
 
561
582
  # Two hops; both handled by receiver
562
583
  assert metrics_mock.get_sample_value('rucio_daemons_conveyor_receiver_update_request_state_total', labels={'updated': 'True'}) >= 2