rucio 32.8.6__py3-none-any.whl → 35.8.0__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (502) hide show
  1. rucio/__init__.py +0 -1
  2. rucio/alembicrevision.py +1 -2
  3. rucio/client/__init__.py +0 -1
  4. rucio/client/accountclient.py +45 -25
  5. rucio/client/accountlimitclient.py +37 -9
  6. rucio/client/baseclient.py +199 -154
  7. rucio/client/client.py +2 -3
  8. rucio/client/configclient.py +19 -6
  9. rucio/client/credentialclient.py +9 -4
  10. rucio/client/didclient.py +238 -63
  11. rucio/client/diracclient.py +13 -5
  12. rucio/client/downloadclient.py +162 -51
  13. rucio/client/exportclient.py +4 -4
  14. rucio/client/fileclient.py +3 -4
  15. rucio/client/importclient.py +4 -4
  16. rucio/client/lifetimeclient.py +21 -5
  17. rucio/client/lockclient.py +18 -8
  18. rucio/client/{metaclient.py → metaconventionsclient.py} +18 -15
  19. rucio/client/pingclient.py +0 -1
  20. rucio/client/replicaclient.py +15 -5
  21. rucio/client/requestclient.py +35 -19
  22. rucio/client/rseclient.py +133 -51
  23. rucio/client/ruleclient.py +29 -22
  24. rucio/client/scopeclient.py +8 -6
  25. rucio/client/subscriptionclient.py +47 -35
  26. rucio/client/touchclient.py +8 -4
  27. rucio/client/uploadclient.py +166 -82
  28. rucio/common/__init__.py +0 -1
  29. rucio/common/cache.py +4 -4
  30. rucio/common/config.py +52 -47
  31. rucio/common/constants.py +69 -2
  32. rucio/common/constraints.py +0 -1
  33. rucio/common/didtype.py +24 -22
  34. rucio/common/dumper/__init__.py +70 -41
  35. rucio/common/dumper/consistency.py +26 -22
  36. rucio/common/dumper/data_models.py +16 -23
  37. rucio/common/dumper/path_parsing.py +0 -1
  38. rucio/common/exception.py +281 -222
  39. rucio/common/extra.py +0 -1
  40. rucio/common/logging.py +54 -38
  41. rucio/common/pcache.py +122 -101
  42. rucio/common/plugins.py +153 -0
  43. rucio/common/policy.py +4 -4
  44. rucio/common/schema/__init__.py +17 -10
  45. rucio/common/schema/atlas.py +7 -5
  46. rucio/common/schema/belleii.py +7 -5
  47. rucio/common/schema/domatpc.py +7 -5
  48. rucio/common/schema/escape.py +7 -5
  49. rucio/common/schema/generic.py +8 -6
  50. rucio/common/schema/generic_multi_vo.py +7 -5
  51. rucio/common/schema/icecube.py +7 -5
  52. rucio/common/stomp_utils.py +0 -1
  53. rucio/common/stopwatch.py +0 -1
  54. rucio/common/test_rucio_server.py +2 -2
  55. rucio/common/types.py +262 -17
  56. rucio/common/utils.py +743 -451
  57. rucio/core/__init__.py +0 -1
  58. rucio/core/account.py +99 -29
  59. rucio/core/account_counter.py +89 -24
  60. rucio/core/account_limit.py +90 -24
  61. rucio/core/authentication.py +86 -29
  62. rucio/core/config.py +108 -38
  63. rucio/core/credential.py +14 -7
  64. rucio/core/did.py +680 -782
  65. rucio/core/did_meta_plugins/__init__.py +8 -6
  66. rucio/core/did_meta_plugins/did_column_meta.py +17 -12
  67. rucio/core/did_meta_plugins/did_meta_plugin_interface.py +60 -11
  68. rucio/core/did_meta_plugins/filter_engine.py +90 -50
  69. rucio/core/did_meta_plugins/json_meta.py +41 -16
  70. rucio/core/did_meta_plugins/mongo_meta.py +25 -8
  71. rucio/core/did_meta_plugins/postgres_meta.py +3 -4
  72. rucio/core/dirac.py +46 -17
  73. rucio/core/distance.py +66 -43
  74. rucio/core/exporter.py +5 -5
  75. rucio/core/heartbeat.py +181 -81
  76. rucio/core/identity.py +22 -12
  77. rucio/core/importer.py +23 -12
  78. rucio/core/lifetime_exception.py +32 -32
  79. rucio/core/lock.py +244 -142
  80. rucio/core/message.py +79 -38
  81. rucio/core/{meta.py → meta_conventions.py} +57 -44
  82. rucio/core/monitor.py +19 -13
  83. rucio/core/naming_convention.py +68 -27
  84. rucio/core/nongrid_trace.py +17 -5
  85. rucio/core/oidc.py +151 -29
  86. rucio/core/permission/__init__.py +18 -6
  87. rucio/core/permission/atlas.py +50 -35
  88. rucio/core/permission/belleii.py +6 -5
  89. rucio/core/permission/escape.py +8 -6
  90. rucio/core/permission/generic.py +82 -80
  91. rucio/core/permission/generic_multi_vo.py +9 -7
  92. rucio/core/quarantined_replica.py +91 -58
  93. rucio/core/replica.py +1303 -772
  94. rucio/core/replica_sorter.py +10 -12
  95. rucio/core/request.py +1133 -285
  96. rucio/core/rse.py +142 -102
  97. rucio/core/rse_counter.py +49 -18
  98. rucio/core/rse_expression_parser.py +6 -7
  99. rucio/core/rse_selector.py +41 -16
  100. rucio/core/rule.py +1538 -474
  101. rucio/core/rule_grouping.py +213 -68
  102. rucio/core/scope.py +50 -22
  103. rucio/core/subscription.py +92 -44
  104. rucio/core/topology.py +66 -24
  105. rucio/core/trace.py +42 -28
  106. rucio/core/transfer.py +543 -259
  107. rucio/core/vo.py +36 -18
  108. rucio/core/volatile_replica.py +59 -32
  109. rucio/daemons/__init__.py +0 -1
  110. rucio/daemons/abacus/__init__.py +0 -1
  111. rucio/daemons/abacus/account.py +29 -19
  112. rucio/daemons/abacus/collection_replica.py +21 -10
  113. rucio/daemons/abacus/rse.py +22 -12
  114. rucio/daemons/atropos/__init__.py +0 -1
  115. rucio/daemons/atropos/atropos.py +1 -2
  116. rucio/daemons/auditor/__init__.py +56 -28
  117. rucio/daemons/auditor/hdfs.py +17 -6
  118. rucio/daemons/auditor/srmdumps.py +116 -45
  119. rucio/daemons/automatix/__init__.py +0 -1
  120. rucio/daemons/automatix/automatix.py +30 -18
  121. rucio/daemons/badreplicas/__init__.py +0 -1
  122. rucio/daemons/badreplicas/minos.py +29 -18
  123. rucio/daemons/badreplicas/minos_temporary_expiration.py +5 -7
  124. rucio/daemons/badreplicas/necromancer.py +9 -13
  125. rucio/daemons/bb8/__init__.py +0 -1
  126. rucio/daemons/bb8/bb8.py +10 -13
  127. rucio/daemons/bb8/common.py +151 -154
  128. rucio/daemons/bb8/nuclei_background_rebalance.py +15 -9
  129. rucio/daemons/bb8/t2_background_rebalance.py +15 -8
  130. rucio/daemons/c3po/__init__.py +0 -1
  131. rucio/daemons/c3po/algorithms/__init__.py +0 -1
  132. rucio/daemons/c3po/algorithms/simple.py +8 -5
  133. rucio/daemons/c3po/algorithms/t2_free_space.py +10 -7
  134. rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +10 -7
  135. rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +30 -15
  136. rucio/daemons/c3po/c3po.py +81 -52
  137. rucio/daemons/c3po/collectors/__init__.py +0 -1
  138. rucio/daemons/c3po/collectors/agis.py +17 -17
  139. rucio/daemons/c3po/collectors/free_space.py +32 -13
  140. rucio/daemons/c3po/collectors/jedi_did.py +14 -5
  141. rucio/daemons/c3po/collectors/mock_did.py +11 -6
  142. rucio/daemons/c3po/collectors/network_metrics.py +12 -4
  143. rucio/daemons/c3po/collectors/workload.py +21 -19
  144. rucio/daemons/c3po/utils/__init__.py +0 -1
  145. rucio/daemons/c3po/utils/dataset_cache.py +15 -5
  146. rucio/daemons/c3po/utils/expiring_dataset_cache.py +16 -5
  147. rucio/daemons/c3po/utils/expiring_list.py +6 -7
  148. rucio/daemons/c3po/utils/popularity.py +5 -2
  149. rucio/daemons/c3po/utils/timeseries.py +25 -12
  150. rucio/daemons/cache/__init__.py +0 -1
  151. rucio/daemons/cache/consumer.py +21 -15
  152. rucio/daemons/common.py +42 -18
  153. rucio/daemons/conveyor/__init__.py +0 -1
  154. rucio/daemons/conveyor/common.py +69 -37
  155. rucio/daemons/conveyor/finisher.py +83 -46
  156. rucio/daemons/conveyor/poller.py +101 -69
  157. rucio/daemons/conveyor/preparer.py +35 -28
  158. rucio/daemons/conveyor/receiver.py +64 -21
  159. rucio/daemons/conveyor/stager.py +33 -28
  160. rucio/daemons/conveyor/submitter.py +71 -47
  161. rucio/daemons/conveyor/throttler.py +99 -35
  162. rucio/daemons/follower/__init__.py +0 -1
  163. rucio/daemons/follower/follower.py +12 -8
  164. rucio/daemons/hermes/__init__.py +0 -1
  165. rucio/daemons/hermes/hermes.py +57 -21
  166. rucio/daemons/judge/__init__.py +0 -1
  167. rucio/daemons/judge/cleaner.py +27 -17
  168. rucio/daemons/judge/evaluator.py +31 -18
  169. rucio/daemons/judge/injector.py +31 -23
  170. rucio/daemons/judge/repairer.py +28 -18
  171. rucio/daemons/oauthmanager/__init__.py +0 -1
  172. rucio/daemons/oauthmanager/oauthmanager.py +7 -8
  173. rucio/daemons/reaper/__init__.py +0 -1
  174. rucio/daemons/reaper/dark_reaper.py +15 -9
  175. rucio/daemons/reaper/reaper.py +109 -67
  176. rucio/daemons/replicarecoverer/__init__.py +0 -1
  177. rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +255 -116
  178. rucio/{api → daemons/rsedecommissioner}/__init__.py +0 -1
  179. rucio/daemons/rsedecommissioner/config.py +81 -0
  180. rucio/daemons/rsedecommissioner/profiles/__init__.py +24 -0
  181. rucio/daemons/rsedecommissioner/profiles/atlas.py +60 -0
  182. rucio/daemons/rsedecommissioner/profiles/generic.py +451 -0
  183. rucio/daemons/rsedecommissioner/profiles/types.py +92 -0
  184. rucio/daemons/rsedecommissioner/rse_decommissioner.py +280 -0
  185. rucio/daemons/storage/__init__.py +0 -1
  186. rucio/daemons/storage/consistency/__init__.py +0 -1
  187. rucio/daemons/storage/consistency/actions.py +152 -59
  188. rucio/daemons/tracer/__init__.py +0 -1
  189. rucio/daemons/tracer/kronos.py +47 -24
  190. rucio/daemons/transmogrifier/__init__.py +0 -1
  191. rucio/daemons/transmogrifier/transmogrifier.py +35 -26
  192. rucio/daemons/undertaker/__init__.py +0 -1
  193. rucio/daemons/undertaker/undertaker.py +10 -10
  194. rucio/db/__init__.py +0 -1
  195. rucio/db/sqla/__init__.py +16 -2
  196. rucio/db/sqla/constants.py +10 -1
  197. rucio/db/sqla/migrate_repo/__init__.py +0 -1
  198. rucio/db/sqla/migrate_repo/env.py +0 -1
  199. rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -1
  200. rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -3
  201. rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +1 -3
  202. rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -3
  203. rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +1 -3
  204. rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +1 -3
  205. rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -3
  206. rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +1 -4
  207. rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -1
  208. rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -2
  209. rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -1
  210. rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -1
  211. rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -2
  212. rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -1
  213. rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +1 -3
  214. rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -1
  215. rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -3
  216. rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -1
  217. rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +1 -2
  218. rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -1
  219. rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -3
  220. rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +1 -3
  221. rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +1 -4
  222. rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -2
  223. rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -3
  224. rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -3
  225. rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +1 -2
  226. rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -1
  227. rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -1
  228. rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -2
  229. rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -3
  230. rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +1 -3
  231. rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -2
  232. rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +1 -4
  233. rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -3
  234. rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +1 -4
  235. rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -1
  236. rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +1 -3
  237. rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -2
  238. rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +1 -3
  239. rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +1 -3
  240. rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +1 -2
  241. rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +1 -3
  242. rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +1 -3
  243. rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -2
  244. rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +1 -3
  245. rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +2 -3
  246. rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -3
  247. rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +1 -4
  248. rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -1
  249. rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -1
  250. rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -3
  251. rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -1
  252. rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -2
  253. rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -3
  254. rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -2
  255. rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +2 -4
  256. rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -2
  257. rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +1 -3
  258. rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +1 -4
  259. rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -3
  260. rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -3
  261. rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -2
  262. rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +1 -3
  263. rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -3
  264. rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +55 -0
  265. rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -2
  266. rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -2
  267. rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -3
  268. rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -3
  269. rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -3
  270. rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +1 -2
  271. rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -3
  272. rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +1 -3
  273. rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +1 -3
  274. rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +1 -2
  275. rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -3
  276. rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -3
  277. rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +1 -2
  278. rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +2 -4
  279. rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -1
  280. rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +1 -4
  281. rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -2
  282. rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -3
  283. rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +1 -2
  284. rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -3
  285. rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +1 -3
  286. rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -3
  287. rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -1
  288. rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +1 -2
  289. rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -2
  290. rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +55 -0
  291. rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +1 -3
  292. rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -2
  293. rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +1 -4
  294. rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -1
  295. rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -1
  296. rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +1 -3
  297. rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +1 -4
  298. rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -1
  299. rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +57 -0
  300. rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -3
  301. rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +41 -0
  302. rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +1 -2
  303. rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +1 -3
  304. rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -3
  305. rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +1 -5
  306. rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +1 -3
  307. rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -3
  308. rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +1 -3
  309. rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +1 -2
  310. rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -3
  311. rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +1 -4
  312. rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +1 -2
  313. rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +1 -4
  314. rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +1 -3
  315. rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +1 -4
  316. rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -2
  317. rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +1 -3
  318. rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -3
  319. rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +1 -3
  320. rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -1
  321. rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +1 -2
  322. rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +1 -3
  323. rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -2
  324. rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -1
  325. rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +1 -2
  326. rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -3
  327. rucio/db/sqla/models.py +122 -216
  328. rucio/db/sqla/sautils.py +12 -5
  329. rucio/db/sqla/session.py +71 -43
  330. rucio/db/sqla/types.py +3 -4
  331. rucio/db/sqla/util.py +91 -69
  332. rucio/gateway/__init__.py +13 -0
  333. rucio/{api → gateway}/account.py +119 -46
  334. rucio/{api → gateway}/account_limit.py +12 -13
  335. rucio/{api → gateway}/authentication.py +106 -33
  336. rucio/{api → gateway}/config.py +12 -13
  337. rucio/{api → gateway}/credential.py +15 -4
  338. rucio/{api → gateway}/did.py +384 -140
  339. rucio/{api → gateway}/dirac.py +16 -6
  340. rucio/{api → gateway}/exporter.py +3 -4
  341. rucio/{api → gateway}/heartbeat.py +17 -5
  342. rucio/{api → gateway}/identity.py +63 -19
  343. rucio/{api → gateway}/importer.py +3 -4
  344. rucio/{api → gateway}/lifetime_exception.py +35 -10
  345. rucio/{api → gateway}/lock.py +34 -12
  346. rucio/{api/meta.py → gateway/meta_conventions.py} +18 -16
  347. rucio/{api → gateway}/permission.py +4 -5
  348. rucio/{api → gateway}/quarantined_replica.py +13 -4
  349. rucio/{api → gateway}/replica.py +12 -11
  350. rucio/{api → gateway}/request.py +129 -28
  351. rucio/{api → gateway}/rse.py +11 -12
  352. rucio/{api → gateway}/rule.py +117 -35
  353. rucio/{api → gateway}/scope.py +24 -14
  354. rucio/{api → gateway}/subscription.py +65 -43
  355. rucio/{api → gateway}/vo.py +17 -7
  356. rucio/rse/__init__.py +3 -4
  357. rucio/rse/protocols/__init__.py +0 -1
  358. rucio/rse/protocols/bittorrent.py +184 -0
  359. rucio/rse/protocols/cache.py +1 -2
  360. rucio/rse/protocols/dummy.py +1 -2
  361. rucio/rse/protocols/gfal.py +12 -10
  362. rucio/rse/protocols/globus.py +7 -7
  363. rucio/rse/protocols/gsiftp.py +2 -3
  364. rucio/rse/protocols/http_cache.py +1 -2
  365. rucio/rse/protocols/mock.py +1 -2
  366. rucio/rse/protocols/ngarc.py +1 -2
  367. rucio/rse/protocols/posix.py +12 -13
  368. rucio/rse/protocols/protocol.py +116 -52
  369. rucio/rse/protocols/rclone.py +6 -7
  370. rucio/rse/protocols/rfio.py +4 -5
  371. rucio/rse/protocols/srm.py +9 -10
  372. rucio/rse/protocols/ssh.py +8 -9
  373. rucio/rse/protocols/storm.py +2 -3
  374. rucio/rse/protocols/webdav.py +17 -14
  375. rucio/rse/protocols/xrootd.py +23 -17
  376. rucio/rse/rsemanager.py +19 -7
  377. rucio/tests/__init__.py +0 -1
  378. rucio/tests/common.py +43 -17
  379. rucio/tests/common_server.py +3 -3
  380. rucio/transfertool/__init__.py +0 -1
  381. rucio/transfertool/bittorrent.py +199 -0
  382. rucio/transfertool/bittorrent_driver.py +52 -0
  383. rucio/transfertool/bittorrent_driver_qbittorrent.py +133 -0
  384. rucio/transfertool/fts3.py +250 -138
  385. rucio/transfertool/fts3_plugins.py +152 -0
  386. rucio/transfertool/globus.py +9 -8
  387. rucio/transfertool/globus_library.py +1 -2
  388. rucio/transfertool/mock.py +21 -12
  389. rucio/transfertool/transfertool.py +33 -24
  390. rucio/vcsversion.py +4 -4
  391. rucio/version.py +5 -13
  392. rucio/web/__init__.py +0 -1
  393. rucio/web/rest/__init__.py +0 -1
  394. rucio/web/rest/flaskapi/__init__.py +0 -1
  395. rucio/web/rest/flaskapi/authenticated_bp.py +0 -1
  396. rucio/web/rest/flaskapi/v1/__init__.py +0 -1
  397. rucio/web/rest/flaskapi/v1/accountlimits.py +15 -13
  398. rucio/web/rest/flaskapi/v1/accounts.py +49 -48
  399. rucio/web/rest/flaskapi/v1/archives.py +12 -10
  400. rucio/web/rest/flaskapi/v1/auth.py +146 -144
  401. rucio/web/rest/flaskapi/v1/common.py +82 -41
  402. rucio/web/rest/flaskapi/v1/config.py +5 -6
  403. rucio/web/rest/flaskapi/v1/credentials.py +7 -8
  404. rucio/web/rest/flaskapi/v1/dids.py +158 -28
  405. rucio/web/rest/flaskapi/v1/dirac.py +8 -8
  406. rucio/web/rest/flaskapi/v1/export.py +3 -5
  407. rucio/web/rest/flaskapi/v1/heartbeats.py +3 -5
  408. rucio/web/rest/flaskapi/v1/identities.py +3 -5
  409. rucio/web/rest/flaskapi/v1/import.py +3 -4
  410. rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +6 -9
  411. rucio/web/rest/flaskapi/v1/locks.py +2 -4
  412. rucio/web/rest/flaskapi/v1/main.py +10 -2
  413. rucio/web/rest/flaskapi/v1/{meta.py → meta_conventions.py} +26 -11
  414. rucio/web/rest/flaskapi/v1/metrics.py +1 -2
  415. rucio/web/rest/flaskapi/v1/nongrid_traces.py +4 -4
  416. rucio/web/rest/flaskapi/v1/ping.py +6 -7
  417. rucio/web/rest/flaskapi/v1/redirect.py +8 -9
  418. rucio/web/rest/flaskapi/v1/replicas.py +43 -19
  419. rucio/web/rest/flaskapi/v1/requests.py +178 -21
  420. rucio/web/rest/flaskapi/v1/rses.py +61 -26
  421. rucio/web/rest/flaskapi/v1/rules.py +48 -18
  422. rucio/web/rest/flaskapi/v1/scopes.py +3 -5
  423. rucio/web/rest/flaskapi/v1/subscriptions.py +22 -18
  424. rucio/web/rest/flaskapi/v1/traces.py +4 -4
  425. rucio/web/rest/flaskapi/v1/types.py +20 -0
  426. rucio/web/rest/flaskapi/v1/vos.py +3 -5
  427. rucio/web/rest/main.py +0 -1
  428. rucio/web/rest/metrics.py +0 -1
  429. rucio/web/rest/ping.py +27 -0
  430. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/ldap.cfg.template +1 -1
  431. rucio-35.8.0.data/data/rucio/requirements.server.txt +268 -0
  432. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/bootstrap.py +3 -3
  433. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/merge_rucio_configs.py +2 -5
  434. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/reset_database.py +3 -3
  435. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio +87 -85
  436. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-account +0 -1
  437. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-collection-replica +0 -1
  438. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-rse +0 -1
  439. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-admin +45 -32
  440. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-atropos +0 -1
  441. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-auditor +13 -7
  442. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-automatix +1 -2
  443. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-bb8 +0 -1
  444. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-c3po +0 -1
  445. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-client +2 -3
  446. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-consumer +0 -1
  447. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-finisher +1 -2
  448. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-poller +0 -1
  449. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-preparer +0 -1
  450. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-receiver +0 -1
  451. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-stager +0 -1
  452. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-submitter +2 -3
  453. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-throttler +0 -1
  454. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dark-reaper +0 -1
  455. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dumper +11 -10
  456. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-follower +0 -1
  457. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-hermes +0 -1
  458. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-cleaner +0 -1
  459. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-evaluator +2 -3
  460. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-injector +0 -1
  461. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-repairer +0 -1
  462. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-kronos +1 -3
  463. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos +0 -1
  464. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos-temporary-expiration +0 -1
  465. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-necromancer +1 -2
  466. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-oauth-manager +2 -3
  467. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-reaper +0 -1
  468. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-replica-recoverer +6 -7
  469. rucio-35.8.0.data/scripts/rucio-rse-decommissioner +66 -0
  470. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-storage-consistency-actions +0 -1
  471. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-transmogrifier +0 -1
  472. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-undertaker +1 -2
  473. rucio-35.8.0.dist-info/METADATA +72 -0
  474. rucio-35.8.0.dist-info/RECORD +493 -0
  475. {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/WHEEL +1 -1
  476. {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/AUTHORS.rst +3 -0
  477. rucio/api/temporary_did.py +0 -49
  478. rucio/common/schema/cms.py +0 -478
  479. rucio/common/schema/lsst.py +0 -423
  480. rucio/core/permission/cms.py +0 -1166
  481. rucio/core/temporary_did.py +0 -188
  482. rucio/daemons/reaper/light_reaper.py +0 -255
  483. rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -115
  484. rucio-32.8.6.data/data/rucio/requirements.txt +0 -55
  485. rucio-32.8.6.data/scripts/rucio-light-reaper +0 -53
  486. rucio-32.8.6.dist-info/METADATA +0 -83
  487. rucio-32.8.6.dist-info/RECORD +0 -481
  488. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic.ini.template +0 -0
  489. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
  490. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
  491. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
  492. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
  493. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
  494. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
  495. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
  496. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
  497. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
  498. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
  499. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.template +0 -0
  500. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
  501. {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/LICENSE +0 -0
  502. {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,11 +15,11 @@
16
15
  import os
17
16
  import sys
18
17
  import xml.etree.ElementTree as ET
19
- from typing import Optional
18
+ from dataclasses import dataclass
19
+ from typing import Any, Optional
20
20
  from urllib.parse import urlparse
21
21
 
22
22
  import requests
23
- from dataclasses import dataclass
24
23
  from requests.adapters import HTTPAdapter
25
24
  from urllib3.poolmanager import PoolManager
26
25
 
@@ -40,7 +39,7 @@ class TLSHTTPAdapter(HTTPAdapter):
40
39
  ca_cert_dir="/etc/grid-security/certificates")
41
40
 
42
41
 
43
- class UploadInChunks(object):
42
+ class UploadInChunks:
44
43
  '''
45
44
  Class to upload by chunks.
46
45
  '''
@@ -73,7 +72,7 @@ class UploadInChunks(object):
73
72
  return self.__totalsize
74
73
 
75
74
 
76
- class IterableToFileAdapter(object):
75
+ class IterableToFileAdapter:
77
76
  '''
78
77
  Class IterableToFileAdapter
79
78
  '''
@@ -134,7 +133,7 @@ class _PropfindResponse:
134
133
  """
135
134
 
136
135
  try:
137
- xml = ET.fromstring(document)
136
+ xml = ET.fromstring(document) # noqa: S314
138
137
  except ET.ParseError as ex:
139
138
  raise ValueError("Couldn't parse XML document") from ex
140
139
 
@@ -152,7 +151,7 @@ class Default(protocol.RSEProtocol):
152
151
 
153
152
  """ Implementing access to RSEs using the webDAV protocol."""
154
153
 
155
- def connect(self, credentials={}):
154
+ def connect(self, credentials: Optional[dict[str, Any]] = None) -> None:
156
155
  """ Establishes the actual connection to the referred RSE.
157
156
 
158
157
  :param credentials: Provides information to establish a connection
@@ -161,6 +160,7 @@ class Default(protocol.RSEProtocol):
161
160
 
162
161
  :raises RSEAccessDenied
163
162
  """
163
+ credentials = credentials or {}
164
164
  try:
165
165
  parse_url = urlparse(self.path2pfn(''))
166
166
  self.server = f'{parse_url.scheme}://{parse_url.netloc}'
@@ -185,12 +185,15 @@ class Default(protocol.RSEProtocol):
185
185
  # Trying to get the proxy from the default location
186
186
  proxy_path = '/tmp/x509up_u%s' % os.geteuid()
187
187
  if os.path.isfile(proxy_path):
188
- x509 = proxy_path
188
+ self.cert = (proxy_path, proxy_path)
189
189
  elif self.auth_token:
190
+ # If no proxy is found, we set the cert to None and use the auth_token
191
+ self.cert = None
190
192
  pass
191
193
  else:
192
194
  raise exception.RSEAccessDenied('X509_USER_PROXY is not set')
193
- self.cert = (x509, x509)
195
+ else:
196
+ self.cert = (x509, x509)
194
197
 
195
198
  try:
196
199
  self.timeout = credentials['timeout']
@@ -332,13 +335,13 @@ class Default(protocol.RSEProtocol):
332
335
  raise exception.RucioException(result.status_code, result.text)
333
336
  except requests.exceptions.ConnectionError as error:
334
337
  raise exception.ServiceUnavailable(error)
335
- except IOError as error:
338
+ except OSError as error:
336
339
  raise exception.SourceNotFound(error)
337
340
  except requests.exceptions.ConnectionError as error:
338
341
  raise exception.ServiceUnavailable(error)
339
342
  except requests.exceptions.ReadTimeout as error:
340
343
  raise exception.ServiceUnavailable(error)
341
- except IOError as error:
344
+ except OSError as error:
342
345
  raise exception.SourceNotFound(error)
343
346
 
344
347
  def rename(self, pfn, new_pfn):
@@ -479,7 +482,7 @@ class Default(protocol.RSEProtocol):
479
482
 
480
483
  :param path: path to file
481
484
 
482
- :raises ServiceUnavailable: if some generic error occured in the library.
485
+ :raises ServiceUnavailable: if some generic error occurred in the library.
483
486
  :raises SourceNotFound: if the source file was not found on the referred storage.
484
487
  :raises RSEAccessDenied: in case of permission issue.
485
488
 
@@ -528,13 +531,13 @@ class Default(protocol.RSEProtocol):
528
531
 
529
532
  :returns: a list with dict containing 'totalsize' and 'unusedsize'
530
533
 
531
- :raises ServiceUnavailable: if some generic error occured in the library.
534
+ :raises ServiceUnavailable: if some generic error occurred in the library.
532
535
  """
533
536
  endpoint_basepath = self.path2pfn('')
534
537
  headers = {'Depth': '0'}
535
538
 
536
539
  try:
537
- root = ET.fromstring(self.session.request('PROPFIND', endpoint_basepath, verify=False, headers=headers, cert=self.session.cert).text)
540
+ root = ET.fromstring(self.session.request('PROPFIND', endpoint_basepath, verify=False, headers=headers, cert=self.session.cert).text) # noqa: S314
538
541
  usedsize = root[0][1][0].find('{DAV:}quota-used-bytes').text
539
542
  try:
540
543
  unusedsize = root[0][1][0].find('{DAV:}quota-available-bytes').text
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,13 +16,20 @@ import logging
17
16
  import os
18
17
 
19
18
  from rucio.common import exception
20
- from rucio.common.utils import execute, PREFERRED_CHECKSUM
19
+ from rucio.common.utils import PREFERRED_CHECKSUM, execute
21
20
  from rucio.rse.protocols import protocol
22
21
 
23
22
 
24
23
  class Default(protocol.RSEProtocol):
25
24
  """ Implementing access to RSEs using the XRootD protocol using GSI authentication."""
26
25
 
26
+ @property
27
+ def _auth_env(self):
28
+ if self.auth_token:
29
+ return f"XrdSecPROTOCOL=ztn BEARER_TOKEN='{self.auth_token}'"
30
+ else:
31
+ return 'XrdSecPROTOCOL=gsi'
32
+
27
33
  def __init__(self, protocol_attr, rse_settings, logger=logging.log):
28
34
  """ Initializes the object with information about the referred RSE.
29
35
 
@@ -66,7 +72,7 @@ class Default(protocol.RSEProtocol):
66
72
  self.logger(logging.DEBUG, 'xrootd.exists: pfn: {}'.format(pfn))
67
73
  try:
68
74
  path = self.pfn2path(pfn)
69
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s stat %s' % (self.hostname, self.port, path)
75
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} stat {path}'
70
76
  self.logger(logging.DEBUG, 'xrootd.exists: cmd: {}'.format(cmd))
71
77
  status, out, err = execute(cmd)
72
78
  if status != 0:
@@ -82,11 +88,11 @@ class Default(protocol.RSEProtocol):
82
88
 
83
89
  :param path: path to file
84
90
 
85
- :raises ServiceUnavailable: if some generic error occured in the library.
91
+ :raises ServiceUnavailable: if some generic error occurred in the library.
86
92
 
87
93
  :returns: a dict with two keys, filesize and an element of GLOBALLY_SUPPORTED_CHECKSUMS.
88
94
  """
89
- self.logger(logging.DEBUG, 'xrootd.stat: path: {}'.format(path))
95
+ self.logger(logging.DEBUG, f'xrootd.stat: path: {path}')
90
96
  ret = {}
91
97
  chsum = None
92
98
  if path.startswith('root:'):
@@ -94,7 +100,7 @@ class Default(protocol.RSEProtocol):
94
100
 
95
101
  try:
96
102
  # xrdfs stat for getting filesize
97
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s stat %s' % (self.hostname, self.port, path)
103
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} stat {path}'
98
104
  self.logger(logging.DEBUG, 'xrootd.stat: filesize cmd: {}'.format(cmd))
99
105
  status_stat, out, err = execute(cmd)
100
106
  if status_stat == 0:
@@ -106,7 +112,7 @@ class Default(protocol.RSEProtocol):
106
112
  break
107
113
 
108
114
  # xrdfs query checksum for getting checksum
109
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s query checksum %s' % (self.hostname, self.port, path)
115
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} query checksum {path}'
110
116
  self.logger(logging.DEBUG, 'xrootd.stat: checksum cmd: {}'.format(cmd))
111
117
  status_query, out, err = execute(cmd)
112
118
  if status_query == 0:
@@ -160,7 +166,7 @@ class Default(protocol.RSEProtocol):
160
166
  if not prefix.endswith('/'):
161
167
  prefix = ''.join([prefix, '/'])
162
168
 
163
- lfns = [lfns] if type(lfns) == dict else lfns
169
+ lfns = [lfns] if isinstance(lfns, dict) else lfns
164
170
  for lfn in lfns:
165
171
  scope, name = lfn['scope'], lfn['name']
166
172
  if 'path' in lfn and lfn['path'] is not None:
@@ -183,7 +189,7 @@ class Default(protocol.RSEProtocol):
183
189
  try:
184
190
  # The query stats call is not implemented on some xroot doors.
185
191
  # Workaround: fail, if server does not reply within 10 seconds for static config query
186
- cmd = 'XrdSecPROTOCOL=gsi XRD_REQUESTTIMEOUT=10 xrdfs %s:%s query config %s:%s' % (self.hostname, self.port, self.hostname, self.port)
192
+ cmd = f'{self._auth_env} XRD_REQUESTTIMEOUT=10 xrdfs {self.hostname}:{self.port} query config {self.hostname}:{self.port}'
187
193
  self.logger(logging.DEBUG, 'xrootd.connect: cmd: {}'.format(cmd))
188
194
  status, out, err = execute(cmd)
189
195
  if status != 0:
@@ -206,7 +212,7 @@ class Default(protocol.RSEProtocol):
206
212
  """
207
213
  self.logger(logging.DEBUG, 'xrootd.get: pfn: {}'.format(pfn))
208
214
  try:
209
- cmd = 'XrdSecPROTOCOL=gsi xrdcp -f %s %s' % (pfn, dest)
215
+ cmd = f'{self._auth_env} xrdcp -f {pfn} {dest}'
210
216
  self.logger(logging.DEBUG, 'xrootd.get: cmd: {}'.format(cmd))
211
217
  status, out, err = execute(cmd)
212
218
  if status == 54:
@@ -226,7 +232,7 @@ class Default(protocol.RSEProtocol):
226
232
  :param transfer_timeout: Transfer timeout (in seconds) - dummy
227
233
 
228
234
  :raises DestinationNotAccessible: if the destination storage was not accessible.
229
- :raises ServiceUnavailable: if some generic error occured in the library.
235
+ :raises ServiceUnavailable: if some generic error occurred in the library.
230
236
  :raises SourceNotFound: if the source file was not found on the referred storage.
231
237
  """
232
238
  self.logger(logging.DEBUG, 'xrootd.put: filename: {} target: {}'.format(filename, target))
@@ -237,7 +243,7 @@ class Default(protocol.RSEProtocol):
237
243
  if not os.path.exists(source_url):
238
244
  raise exception.SourceNotFound()
239
245
  try:
240
- cmd = 'XrdSecPROTOCOL=gsi xrdcp -f %s %s' % (source_url, path)
246
+ cmd = f'{self._auth_env} xrdcp -f {source_url} {path}'
241
247
  self.logger(logging.DEBUG, 'xrootd.put: cmd: {}'.format(cmd))
242
248
  status, out, err = execute(cmd)
243
249
  if status != 0:
@@ -251,7 +257,7 @@ class Default(protocol.RSEProtocol):
251
257
 
252
258
  :param pfn: Physical file name
253
259
 
254
- :raises ServiceUnavailable: if some generic error occured in the library.
260
+ :raises ServiceUnavailable: if some generic error occurred in the library.
255
261
  :raises SourceNotFound: if the source file was not found on the referred storage.
256
262
  """
257
263
  self.logger(logging.DEBUG, 'xrootd.delete: pfn: {}'.format(pfn))
@@ -259,7 +265,7 @@ class Default(protocol.RSEProtocol):
259
265
  raise exception.SourceNotFound()
260
266
  try:
261
267
  path = self.pfn2path(pfn)
262
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s rm %s' % (self.hostname, self.port, path)
268
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} rm {path}'
263
269
  self.logger(logging.DEBUG, 'xrootd.delete: cmd: {}'.format(cmd))
264
270
  status, out, err = execute(cmd)
265
271
  if status != 0:
@@ -273,7 +279,7 @@ class Default(protocol.RSEProtocol):
273
279
  :param pfn: Current physical file name
274
280
  :param new_pfn New physical file name
275
281
  :raises DestinationNotAccessible: if the destination storage was not accessible.
276
- :raises ServiceUnavailable: if some generic error occured in the library.
282
+ :raises ServiceUnavailable: if some generic error occurred in the library.
277
283
  :raises SourceNotFound: if the source file was not found on the referred storage.
278
284
  """
279
285
  self.logger(logging.DEBUG, 'xrootd.rename: pfn: {}'.format(pfn))
@@ -283,10 +289,10 @@ class Default(protocol.RSEProtocol):
283
289
  path = self.pfn2path(pfn)
284
290
  new_path = self.pfn2path(new_pfn)
285
291
  new_dir = new_path[:new_path.rindex('/') + 1]
286
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s mkdir -p %s' % (self.hostname, self.port, new_dir)
292
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} mkdir -p {new_dir}'
287
293
  self.logger(logging.DEBUG, 'xrootd.stat: mkdir cmd: {}'.format(cmd))
288
294
  status, out, err = execute(cmd)
289
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s mv %s %s' % (self.hostname, self.port, path, new_path)
295
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} mv {path} {new_path}'
290
296
  self.logger(logging.DEBUG, 'xrootd.stat: rename cmd: {}'.format(cmd))
291
297
  status, out, err = execute(cmd)
292
298
  if status != 0:
rucio/rse/rsemanager.py CHANGED
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,15 +15,28 @@
16
15
  import copy
17
16
  import logging
18
17
  import random
18
+ from collections.abc import Callable
19
19
  from time import sleep
20
20
  from urllib.parse import urlparse
21
21
 
22
- from rucio.common import exception, utils, constants
23
- from rucio.common import types
22
+ from rucio.common import constants, exception, types, utils
24
23
  from rucio.common.config import config_get_int
24
+ from rucio.common.constants import RSE_SUPPORTED_PROTOCOL_OPERATIONS
25
25
  from rucio.common.constraints import STRING_TYPES
26
26
  from rucio.common.logging import formatted_logger
27
- from rucio.common.utils import make_valid_did, GLOBALLY_SUPPORTED_CHECKSUMS
27
+ from rucio.common.utils import GLOBALLY_SUPPORTED_CHECKSUMS, make_valid_did
28
+
29
+
30
+ def get_scope_protocol(vo: str = 'def') -> Callable:
31
+ """
32
+ Returns the callable protocol to translate the pfn to a name/scope pair
33
+
34
+ :returns:
35
+ Callable: Scope Parser function
36
+ """
37
+ from rucio.rse.protocols.protocol import RSEDeterministicScopeTranslation
38
+ translation = RSEDeterministicScopeTranslation(vo=vo)
39
+ return translation.parser
28
40
 
29
41
 
30
42
  def get_rse_info(rse=None, vo='def', rse_id=None, session=None) -> types.RSESettingsDict:
@@ -118,7 +130,7 @@ def _get_possible_protocols(rse_settings: types.RSESettingsDict, operation, sche
118
130
 
119
131
 
120
132
  def get_protocols_ordered(rse_settings: types.RSESettingsDict, operation, scheme=None, domain='wan', impl=None):
121
- if operation not in utils.rse_supported_protocol_operations():
133
+ if operation not in RSE_SUPPORTED_PROTOCOL_OPERATIONS:
122
134
  raise exception.RSEOperationNotSupported('Operation %s is not supported' % operation)
123
135
 
124
136
  if domain and domain not in utils.rse_supported_protocol_domains():
@@ -130,7 +142,7 @@ def get_protocols_ordered(rse_settings: types.RSESettingsDict, operation, scheme
130
142
 
131
143
 
132
144
  def select_protocol(rse_settings: types.RSESettingsDict, operation, scheme=None, domain='wan'):
133
- if operation not in utils.rse_supported_protocol_operations():
145
+ if operation not in RSE_SUPPORTED_PROTOCOL_OPERATIONS:
134
146
  raise exception.RSEOperationNotSupported('Operation %s is not supported' % operation)
135
147
 
136
148
  if domain and domain not in utils.rse_supported_protocol_domains():
@@ -158,7 +170,7 @@ def create_protocol(rse_settings: types.RSESettingsDict, operation, scheme=None,
158
170
 
159
171
  # Verify feasibility of Protocol
160
172
  operation = operation.lower()
161
- if operation not in utils.rse_supported_protocol_operations():
173
+ if operation not in RSE_SUPPORTED_PROTOCOL_OPERATIONS:
162
174
  raise exception.RSEOperationNotSupported('Operation %s is not supported' % operation)
163
175
 
164
176
  if domain and domain not in utils.rse_supported_protocol_domains():
rucio/tests/__init__.py CHANGED
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
rucio/tests/common.py CHANGED
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,15 +18,19 @@ import json
19
18
  import os
20
19
  import tempfile
21
20
  from collections import namedtuple
21
+ from collections.abc import Callable, Iterable
22
+ from functools import wraps
23
+ from os import rename
22
24
  from random import choice, choices
23
- from string import ascii_uppercase, ascii_letters, digits
24
- from typing import Optional
25
+ from string import ascii_letters, ascii_uppercase, digits
26
+ from typing import Any, Optional
25
27
 
26
28
  import pytest
27
29
  import requests
28
30
 
29
31
  from rucio.common.config import config_get, config_get_bool, get_config_dirs
30
- from rucio.common.utils import generate_uuid as uuid, execute
32
+ from rucio.common.utils import execute
33
+ from rucio.common.utils import generate_uuid as uuid
31
34
 
32
35
  skip_rse_tests_with_accounts = pytest.mark.skipif(not any(os.path.exists(os.path.join(d, 'rse-accounts.cfg')) for d in get_config_dirs()),
33
36
  reason='fails if no rse-accounts.cfg found')
@@ -126,27 +129,27 @@ def rse_name_generator(size: int = 10) -> str:
126
129
 
127
130
  :returns: A random RSE name
128
131
  """
129
- return 'MOCK-' + ''.join(choice(ascii_uppercase) for x in range(size))
132
+ return 'MOCK-' + ''.join(choice(ascii_uppercase) for x in range(size)) # noqa: S311
130
133
 
131
134
 
132
- def rfc2253_dn_generator():
135
+ def rfc2253_dn_generator() -> str:
133
136
  """ Generate a random DN in RFC 2253 format.
134
137
 
135
138
  :returns: A random DN
136
139
  """
137
- random_cn = ''.join(choices(ascii_letters + digits, k=8))
138
- random_o = ''.join(choices(ascii_letters + digits, k=8))
139
- random_c = ''.join(choices(ascii_letters, k=2))
140
+ random_cn = ''.join(choices(ascii_letters + digits, k=8)) # noqa: S311
141
+ random_o = ''.join(choices(ascii_letters + digits, k=8)) # noqa: S311
142
+ random_c = ''.join(choices(ascii_letters, k=2)) # noqa: S311
140
143
  random_dn = "CN={}, O={}, C={}".format(random_cn, random_o, random_c)
141
144
  return random_dn
142
145
 
143
146
 
144
- def file_generator(size: int = 2, namelen: int = 10):
147
+ def file_generator(size: int = 2, namelen: int = 10) -> str:
145
148
  """ Create a bogus file and returns it's name.
146
149
  :param size: size in bytes
147
150
  :returns: The name of the generated file.
148
151
  """
149
- fn = '/tmp/file_' + ''.join(choice(ascii_uppercase) for x in range(namelen))
152
+ fn = '/tmp/file_' + ''.join(choice(ascii_uppercase) for x in range(namelen)) # noqa: S311
150
153
  execute('dd if=/dev/urandom of={0} count={1} bs=1'.format(fn, size))
151
154
  return fn
152
155
 
@@ -154,7 +157,7 @@ def file_generator(size: int = 2, namelen: int = 10):
154
157
  def make_temp_file(dir_: str, data: str) -> str:
155
158
  """
156
159
  Creates a temporal file and write `data` on it.
157
- :param data: String to be writen on the created file.
160
+ :param data: String to be written on the created file.
158
161
  :returns: Name of the temporal file.
159
162
  """
160
163
  fd, path = tempfile.mkstemp(dir=dir_)
@@ -199,11 +202,11 @@ def print_response(rest_response):
199
202
  print(text if text else '<no content>')
200
203
 
201
204
 
202
- def headers(*iterables):
205
+ def headers(*iterables: Iterable):
203
206
  return list(itertools.chain(*iterables))
204
207
 
205
208
 
206
- def loginhdr(account, username, password):
209
+ def loginhdr(account: str, username: str, password: str):
207
210
  yield 'X-Rucio-Account', str(account)
208
211
  yield 'X-Rucio-Username', str(username)
209
212
  yield 'X-Rucio-Password', str(password)
@@ -213,12 +216,12 @@ def auth(token):
213
216
  yield 'X-Rucio-Auth-Token', str(token)
214
217
 
215
218
 
216
- def vohdr(vo):
219
+ def vohdr(vo: str):
217
220
  if vo:
218
221
  yield 'X-Rucio-VO', str(vo)
219
222
 
220
223
 
221
- def hdrdict(dictionary):
224
+ def hdrdict(dictionary: dict):
222
225
  for key in dictionary:
223
226
  yield str(key), str(dictionary[key])
224
227
 
@@ -235,10 +238,33 @@ class Mime:
235
238
  BINARY = 'application/octet-stream'
236
239
 
237
240
 
238
- def load_test_conf_file(file_name):
241
+ def load_test_conf_file(file_name: str) -> dict[str, Any]:
239
242
  config_dir = next(filter(lambda d: os.path.exists(os.path.join(d, file_name)), get_config_dirs()))
240
243
  with open(os.path.join(config_dir, file_name)) as f:
241
244
  return json.load(f)
242
245
 
243
246
 
247
+ def remove_config(func: Callable) -> Callable:
248
+ @wraps(func)
249
+ def wrapper(*args, **kwargs):
250
+ for configfile in get_config_dirs():
251
+ # Rename the config to <config>.tmp
252
+ try:
253
+ rename(f"{configfile}rucio.cfg", f"{configfile}rucio.cfg.tmp")
254
+ except FileNotFoundError:
255
+ pass # When a test uses a os.env assigned conf, there's nothing stating the default location has something
256
+ try:
257
+ # Execute the test
258
+ func(*args, **kwargs)
259
+ finally:
260
+ # And put the config back
261
+ for configfile in get_config_dirs():
262
+ try:
263
+ rename(f"{configfile}rucio.cfg.tmp", f"{configfile}rucio.cfg")
264
+ except FileNotFoundError:
265
+ pass
266
+
267
+ return wrapper
268
+
269
+
244
270
  RSE_namedtuple = namedtuple('RSE_namedtuple', ['name', 'id'])
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +19,8 @@ from sqlalchemy.orm import aliased
20
19
  from rucio.core import config as core_config
21
20
  from rucio.core.vo import map_vo
22
21
  from rucio.db.sqla import models
23
- from rucio.db.sqla.session import transactional_session, get_session
22
+ from rucio.db.sqla.session import get_session, transactional_session
23
+
24
24
  from .common import get_long_vo
25
25
 
26
26
  # Functions containing server-only includes that can't be included in client tests
@@ -115,7 +115,7 @@ def cleanup_db_deps(model, select_rows_stmt, *, session=None):
115
115
 
116
116
 
117
117
  def reset_config_table():
118
- """ Clear the config table and install any default entires needed for the tests.
118
+ """ Clear the config table and install any default entries needed for the tests.
119
119
  """
120
120
  db_session = get_session()
121
121
  db_session.query(models.Config).delete()
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");