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");
@@ -13,23 +12,25 @@
13
12
  # See the License for the specific language governing permissions and
14
13
  # limitations under the License.
15
14
 
16
- from typing import Any, TYPE_CHECKING
15
+ from typing import TYPE_CHECKING, Any, Literal, Optional
17
16
 
18
- from rucio.api.permission import has_permission
19
17
  from rucio.common.config import config_get_bool
20
18
  from rucio.common.exception import AccessDenied
21
19
  from rucio.common.schema import validate_schema
22
20
  from rucio.common.types import InternalAccount, InternalScope
23
- from rucio.common.utils import api_update_return_dict
21
+ from rucio.common.utils import gateway_update_return_dict
24
22
  from rucio.core import rule
25
23
  from rucio.db.sqla.session import read_session, stream_session, transactional_session
24
+ from rucio.gateway.permission import has_permission
26
25
 
27
26
  if TYPE_CHECKING:
27
+ from collections.abc import Iterator, Sequence
28
+
28
29
  from sqlalchemy.orm import Session
29
30
 
30
31
 
31
32
  @read_session
32
- def is_multi_vo(*, session: "Session"):
33
+ def is_multi_vo(*, session: "Session") -> bool:
33
34
  """
34
35
  Check whether this instance is configured for multi-VO
35
36
  returns: Boolean True if running in multi-VO
@@ -38,9 +39,33 @@ def is_multi_vo(*, session: "Session"):
38
39
 
39
40
 
40
41
  @transactional_session
41
- def add_replication_rule(dids, copies, rse_expression, weight, lifetime, grouping, account, locked, subscription_id, source_replica_expression,
42
- activity, notify, purge_replicas, ignore_availability, comment, ask_approval, asynchronous, delay_injection, priority,
43
- split_container, meta, issuer, vo='def', *, session: "Session"):
42
+ def add_replication_rule(
43
+ dids: "Sequence[dict[str, str]]",
44
+ copies: int,
45
+ rse_expression: str,
46
+ weight: Optional[str],
47
+ lifetime: Optional[int],
48
+ grouping: Literal['ALL', 'DATASET', 'NONE'],
49
+ account: str,
50
+ locked: bool,
51
+ subscription_id: Optional[str],
52
+ source_replica_expression: Optional[str],
53
+ activity: Optional[str],
54
+ notify: Optional[Literal['Y', 'N', 'C', 'P']],
55
+ purge_replicas: bool,
56
+ ignore_availability: bool,
57
+ comment: Optional[str],
58
+ ask_approval: bool,
59
+ asynchronous: bool,
60
+ delay_injection: Optional[int],
61
+ priority: int,
62
+ split_container: bool,
63
+ meta: Optional[dict[str, Any]],
64
+ issuer: str,
65
+ vo: str = 'def',
66
+ *,
67
+ session: "Session"
68
+ ) -> list[str]:
44
69
  """
45
70
  Adds a replication rule.
46
71
 
@@ -89,12 +114,11 @@ def add_replication_rule(dids, copies, rse_expression, weight, lifetime, groupin
89
114
  if not has_permission(issuer=issuer, vo=vo, action='add_rule', kwargs=kwargs, session=session):
90
115
  raise AccessDenied('Account %s can not add replication rule' % (issuer))
91
116
 
92
- account = InternalAccount(account, vo=vo)
93
- for d in dids:
94
- d['scope'] = InternalScope(d['scope'], vo=vo)
117
+ account_internal = InternalAccount(account, vo=vo)
118
+ dids_with_internal_scope = [{'name': d['name'], 'scope': InternalScope(d['scope'], vo=vo)} for d in dids]
95
119
 
96
- return rule.add_rule(account=account,
97
- dids=dids,
120
+ return rule.add_rule(account=account_internal,
121
+ dids=dids_with_internal_scope,
98
122
  copies=copies,
99
123
  rse_expression=rse_expression,
100
124
  grouping=grouping,
@@ -118,7 +142,7 @@ def add_replication_rule(dids, copies, rse_expression, weight, lifetime, groupin
118
142
 
119
143
 
120
144
  @read_session
121
- def get_replication_rule(rule_id, issuer, vo='def', *, session: "Session"):
145
+ def get_replication_rule(rule_id: str, issuer: str, vo: str = 'def', *, session: "Session") -> dict[str, Any]:
122
146
  """
123
147
  Get replication rule by it's id.
124
148
 
@@ -131,11 +155,16 @@ def get_replication_rule(rule_id, issuer, vo='def', *, session: "Session"):
131
155
  if is_multi_vo(session=session) and not has_permission(issuer=issuer, vo=vo, action='access_rule_vo', kwargs=kwargs, session=session):
132
156
  raise AccessDenied('Account %s can not access rules at other VOs.' % (issuer))
133
157
  result = rule.get_rule(rule_id, session=session)
134
- return api_update_return_dict(result, session=session)
158
+ return gateway_update_return_dict(result, session=session)
135
159
 
136
160
 
137
161
  @stream_session
138
- def list_replication_rules(filters={}, vo='def', *, session: "Session"):
162
+ def list_replication_rules(
163
+ filters: Optional[dict[str, Any]] = None,
164
+ vo: str = 'def',
165
+ *,
166
+ session: "Session"
167
+ ) -> "Iterator[dict[str, Any]]":
139
168
  """
140
169
  Lists replication rules based on a filter.
141
170
 
@@ -144,8 +173,7 @@ def list_replication_rules(filters={}, vo='def', *, session: "Session"):
144
173
  :param session: The database session in use.
145
174
  """
146
175
  # If filters is empty, create a new dict to avoid overwriting the function's default
147
- if not filters:
148
- filters = {}
176
+ filters = filters or {}
149
177
 
150
178
  if 'scope' in filters:
151
179
  scope = filters['scope']
@@ -161,11 +189,17 @@ def list_replication_rules(filters={}, vo='def', *, session: "Session"):
161
189
 
162
190
  rules = rule.list_rules(filters, session=session)
163
191
  for r in rules:
164
- yield api_update_return_dict(r, session=session)
192
+ yield gateway_update_return_dict(r, session=session)
165
193
 
166
194
 
167
195
  @read_session
168
- def list_replication_rule_history(rule_id, issuer, vo='def', *, session: "Session"):
196
+ def list_replication_rule_history(
197
+ rule_id: str,
198
+ issuer: str,
199
+ vo: str = 'def',
200
+ *,
201
+ session: "Session"
202
+ ) -> "Iterator[dict[str, Any]]":
169
203
  """
170
204
  Lists replication rule history..
171
205
 
@@ -181,7 +215,13 @@ def list_replication_rule_history(rule_id, issuer, vo='def', *, session: "Sessio
181
215
 
182
216
 
183
217
  @stream_session
184
- def list_replication_rule_full_history(scope, name, vo='def', *, session: "Session"):
218
+ def list_replication_rule_full_history(
219
+ scope: str,
220
+ name: str,
221
+ vo: str = 'def',
222
+ *,
223
+ session: "Session"
224
+ ) -> "Iterator[dict[str, Any]]":
185
225
  """
186
226
  List the rule history of a DID.
187
227
 
@@ -190,14 +230,20 @@ def list_replication_rule_full_history(scope, name, vo='def', *, session: "Sessi
190
230
  :param vo: The VO to act on.
191
231
  :param session: The database session in use.
192
232
  """
193
- scope = InternalScope(scope, vo=vo)
194
- rules = rule.list_rule_full_history(scope, name, session=session)
233
+ scope_internal = InternalScope(scope, vo=vo)
234
+ rules = rule.list_rule_full_history(scope_internal, name, session=session)
195
235
  for r in rules:
196
- yield api_update_return_dict(r, session=session)
236
+ yield gateway_update_return_dict(r, session=session)
197
237
 
198
238
 
199
239
  @stream_session
200
- def list_associated_replication_rules_for_file(scope, name, vo='def', *, session: "Session"):
240
+ def list_associated_replication_rules_for_file(
241
+ scope: str,
242
+ name: str,
243
+ vo: str = 'def',
244
+ *,
245
+ session: "Session"
246
+ ) -> "Iterator[dict[str, Any]]":
201
247
  """
202
248
  Lists associated replication rules by file.
203
249
 
@@ -206,14 +252,21 @@ def list_associated_replication_rules_for_file(scope, name, vo='def', *, session
206
252
  :param vo: The VO to act on.
207
253
  :param session: The database session in use.
208
254
  """
209
- scope = InternalScope(scope, vo=vo)
210
- rules = rule.list_associated_rules_for_file(scope=scope, name=name, session=session)
255
+ scope_internal = InternalScope(scope, vo=vo)
256
+ rules = rule.list_associated_rules_for_file(scope=scope_internal, name=name, session=session)
211
257
  for r in rules:
212
- yield api_update_return_dict(r, session=session)
258
+ yield gateway_update_return_dict(r, session=session)
213
259
 
214
260
 
215
261
  @transactional_session
216
- def delete_replication_rule(rule_id, purge_replicas, issuer, vo='def', *, session: "Session"):
262
+ def delete_replication_rule(
263
+ rule_id: str,
264
+ purge_replicas: Optional[bool],
265
+ issuer: str,
266
+ vo: str = 'def',
267
+ *,
268
+ session: "Session"
269
+ ) -> None:
217
270
  """
218
271
  Deletes a replication rule and all associated locks.
219
272
 
@@ -233,7 +286,14 @@ def delete_replication_rule(rule_id, purge_replicas, issuer, vo='def', *, sessio
233
286
 
234
287
 
235
288
  @transactional_session
236
- def update_replication_rule(rule_id: str, options: dict[str, Any], issuer: str, vo: str = 'def', *, session: "Session"):
289
+ def update_replication_rule(
290
+ rule_id: str,
291
+ options: dict[str, Any],
292
+ issuer: str,
293
+ vo: str = 'def',
294
+ *,
295
+ session: "Session"
296
+ ) -> None:
237
297
  """
238
298
  Update lock state of a replication rule.
239
299
 
@@ -265,7 +325,15 @@ def update_replication_rule(rule_id: str, options: dict[str, Any], issuer: str,
265
325
 
266
326
 
267
327
  @transactional_session
268
- def reduce_replication_rule(rule_id, copies, exclude_expression, issuer, vo='def', *, session: "Session"):
328
+ def reduce_replication_rule(
329
+ rule_id: str,
330
+ copies: int,
331
+ exclude_expression: Optional[str],
332
+ issuer: str,
333
+ vo: str = 'def',
334
+ *,
335
+ session: "Session"
336
+ ) -> str:
269
337
  """
270
338
  Reduce the number of copies for a rule by atomically replacing the rule.
271
339
 
@@ -287,7 +355,13 @@ def reduce_replication_rule(rule_id, copies, exclude_expression, issuer, vo='def
287
355
 
288
356
 
289
357
  @read_session
290
- def examine_replication_rule(rule_id, issuer, vo='def', *, session: "Session"):
358
+ def examine_replication_rule(
359
+ rule_id: str,
360
+ issuer: str,
361
+ vo: str = 'def',
362
+ *,
363
+ session: "Session"
364
+ ) -> dict[str, Any]:
291
365
  """
292
366
  Examine a replication rule.
293
367
 
@@ -300,14 +374,22 @@ def examine_replication_rule(rule_id, issuer, vo='def', *, session: "Session"):
300
374
  if is_multi_vo(session=session) and not has_permission(issuer=issuer, vo=vo, action='access_rule_vo', kwargs=kwargs, session=session):
301
375
  raise AccessDenied('Account %s can not access rules at other VOs.' % (issuer))
302
376
  result = rule.examine_rule(rule_id, session=session)
303
- result = api_update_return_dict(result, session=session)
377
+ result = gateway_update_return_dict(result, session=session)
304
378
  if 'transfers' in result:
305
- result['transfers'] = [api_update_return_dict(t, session=session) for t in result['transfers']]
379
+ result['transfers'] = [gateway_update_return_dict(t, session=session) for t in result['transfers']]
306
380
  return result
307
381
 
308
382
 
309
383
  @transactional_session
310
- def move_replication_rule(rule_id, rse_expression, override, issuer, vo='def', *, session: "Session"):
384
+ def move_replication_rule(
385
+ rule_id: str,
386
+ rse_expression: str,
387
+ override: dict[str, Any],
388
+ issuer: str,
389
+ vo: str = 'def',
390
+ *,
391
+ session: "Session"
392
+ ) -> str:
311
393
  """
312
394
  Move a replication rule to another RSE and, once done, delete the original one.
313
395
 
@@ -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");
@@ -13,10 +12,10 @@
13
12
  # See the License for the specific language governing permissions and
14
13
  # limitations under the License.
15
14
 
16
- from typing import TYPE_CHECKING
15
+ from typing import TYPE_CHECKING, Any, Optional
17
16
 
18
- import rucio.api.permission
19
17
  import rucio.common.exception
18
+ import rucio.gateway.permission
20
19
  from rucio.common.schema import validate_schema
21
20
  from rucio.common.types import InternalAccount, InternalScope
22
21
  from rucio.core import scope as core_scope
@@ -27,7 +26,7 @@ if TYPE_CHECKING:
27
26
 
28
27
 
29
28
  @read_session
30
- def list_scopes(filter_={}, vo='def', *, session: "Session"):
29
+ def list_scopes(filter_: Optional[dict[str, Any]] = None, vo: str = 'def', *, session: "Session") -> list[str]:
31
30
  """
32
31
  Lists all scopes.
33
32
 
@@ -38,8 +37,7 @@ def list_scopes(filter_={}, vo='def', *, session: "Session"):
38
37
  :returns: A list containing all scopes.
39
38
  """
40
39
  # If filter is empty, create a new dict to avoid overwriting the function's default
41
- if not filter_:
42
- filter_ = {}
40
+ filter_ = filter_ or {}
43
41
 
44
42
  if 'scope' in filter_:
45
43
  filter_['scope'] = InternalScope(scope=filter_['scope'], vo=vo)
@@ -49,7 +47,14 @@ def list_scopes(filter_={}, vo='def', *, session: "Session"):
49
47
 
50
48
 
51
49
  @transactional_session
52
- def add_scope(scope, account, issuer, vo='def', *, session: "Session"):
50
+ def add_scope(
51
+ scope: str,
52
+ account: str,
53
+ issuer: str,
54
+ vo: str = 'def',
55
+ *,
56
+ session: "Session"
57
+ ) -> None:
53
58
  """
54
59
  Creates a scope for an account.
55
60
 
@@ -63,17 +68,22 @@ def add_scope(scope, account, issuer, vo='def', *, session: "Session"):
63
68
  validate_schema(name='scope', obj=scope, vo=vo)
64
69
 
65
70
  kwargs = {'scope': scope, 'account': account}
66
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='add_scope', kwargs=kwargs, session=session):
71
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='add_scope', kwargs=kwargs, session=session):
67
72
  raise rucio.common.exception.AccessDenied('Account %s can not add scope' % (issuer))
68
73
 
69
- scope = InternalScope(scope, vo=vo)
70
- account = InternalAccount(account, vo=vo)
74
+ internal_scope = InternalScope(scope, vo=vo)
75
+ internal_account = InternalAccount(account, vo=vo)
71
76
 
72
- core_scope.add_scope(scope, account, session=session)
77
+ core_scope.add_scope(internal_scope, internal_account, session=session)
73
78
 
74
79
 
75
80
  @read_session
76
- def get_scopes(account, vo='def', *, session: "Session"):
81
+ def get_scopes(
82
+ account: str,
83
+ vo: str = 'def',
84
+ *,
85
+ session: "Session"
86
+ ) -> list[str]:
77
87
  """
78
88
  Gets a list of all scopes for an account.
79
89
 
@@ -84,6 +94,6 @@ def get_scopes(account, vo='def', *, session: "Session"):
84
94
  :returns: A list containing the names of all scopes for this account.
85
95
  """
86
96
 
87
- account = InternalAccount(account, vo=vo)
97
+ internal_account = InternalAccount(account, vo=vo)
88
98
 
89
- return [scope.external for scope in core_scope.get_scopes(account, session=session)]
99
+ return [scope.external for scope in core_scope.get_scopes(internal_account, session=session)]
@@ -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");
@@ -14,15 +13,16 @@
14
13
  # limitations under the License.
15
14
 
16
15
  from collections import namedtuple
16
+ from collections.abc import Iterator
17
17
  from json import dumps, loads
18
- from typing import TYPE_CHECKING
18
+ from typing import TYPE_CHECKING, Any, Literal, Optional, Union
19
19
 
20
- from rucio.api.permission import has_permission
21
- from rucio.common.exception import InvalidObject, AccessDenied
20
+ from rucio.common.exception import AccessDenied, InvalidObject
22
21
  from rucio.common.schema import validate_schema
23
22
  from rucio.common.types import InternalAccount, InternalScope
24
23
  from rucio.core import subscription
25
24
  from rucio.db.sqla.session import read_session, stream_session, transactional_session
25
+ from rucio.gateway.permission import has_permission
26
26
 
27
27
  if TYPE_CHECKING:
28
28
  from sqlalchemy.orm import Session
@@ -32,36 +32,38 @@ SubscriptionRuleState = namedtuple('SubscriptionRuleState', ['account', 'name',
32
32
 
33
33
 
34
34
  @transactional_session
35
- def add_subscription(name, account, filter_, replication_rules, comments, lifetime, retroactive, dry_run, priority=None, issuer=None, vo='def', *, session: "Session"):
35
+ def add_subscription(
36
+ name: str,
37
+ account: str,
38
+ filter_: dict[str, Any],
39
+ replication_rules: list[dict[str, Any]],
40
+ comments: str,
41
+ lifetime: Union[int, Literal[False]],
42
+ retroactive: bool,
43
+ dry_run: bool,
44
+ priority: Optional[int] = None,
45
+ issuer: Optional[str] = None,
46
+ vo: str = 'def',
47
+ *,
48
+ session: "Session"
49
+ ) -> str:
36
50
  """
37
51
  Adds a new subscription which will be verified against every new added file and dataset
38
52
 
39
53
  :param account: Account identifier
40
- :type account: String
41
54
  :param name: Name of the subscription
42
- :type: String
43
55
  :param filter_: Dictionary of attributes by which the input data should be filtered
44
56
  **Example**: ``{'dsn': 'data11_hi*.express_express.*,data11_hi*physics_MinBiasOverlay*', 'account': 'tzero'}``
45
- :type filter_: Dict
46
57
  :param replication_rules: Replication rules to be set : Dictionary with keys copies, rse_expression, weight, rse_expression
47
- :type replication_rules: Dict
48
58
  :param comments: Comments for the subscription
49
- :type comments: String
50
59
  :param lifetime: Subscription's lifetime (seconds); False if subscription has no lifetime
51
- :type lifetime: Integer or False
52
60
  :param retroactive: Flag to know if the subscription should be applied on previous data
53
- :type retroactive: Boolean
54
61
  :param dry_run: Just print the subscriptions actions without actually executing them (Useful if retroactive flag is set)
55
- :type dry_run: Boolean
56
62
  :param priority: The priority of the subscription
57
- :type priority: Integer
58
63
  :param issuer: The account issuing this operation.
59
- :type issuer: String
60
64
  :param vo: The VO to act on.
61
- :type vo: String
62
65
  :param session: The database session in use.
63
66
  :returns: subscription_id
64
- :rtype: String
65
67
  """
66
68
  if not has_permission(issuer=issuer, vo=vo, action='add_subscription', kwargs={'account': account}, session=session):
67
69
  raise AccessDenied('Account %s can not add subscription' % (issuer))
@@ -81,7 +83,7 @@ def add_subscription(name, account, filter_, replication_rules, comments, lifeti
81
83
  except ValueError as error:
82
84
  raise TypeError(error)
83
85
 
84
- account = InternalAccount(account, vo=vo)
86
+ internal_account = InternalAccount(account, vo=vo)
85
87
 
86
88
  keys = ['scope', 'account']
87
89
  types = [InternalScope, InternalAccount]
@@ -92,26 +94,29 @@ def add_subscription(name, account, filter_, replication_rules, comments, lifeti
92
94
  else:
93
95
  filter_[_key] = _type(filter_[_key], vo=vo).internal
94
96
 
95
- return subscription.add_subscription(name=name, account=account, filter_=dumps(filter_), replication_rules=dumps(replication_rules),
97
+ return subscription.add_subscription(name=name, account=internal_account, filter_=dumps(filter_), replication_rules=dumps(replication_rules),
96
98
  comments=comments, lifetime=lifetime, retroactive=retroactive, dry_run=dry_run, priority=priority,
97
99
  session=session)
98
100
 
99
101
 
100
102
  @transactional_session
101
- def update_subscription(name, account, metadata=None, issuer=None, vo='def', *, session: "Session"):
103
+ def update_subscription(
104
+ name: str,
105
+ account: str,
106
+ metadata: Optional[dict[str, Any]] = None,
107
+ issuer: Optional[str] = None,
108
+ vo: str = 'def',
109
+ *,
110
+ session: "Session"
111
+ ) -> None:
102
112
  """
103
113
  Updates a subscription
104
114
 
105
115
  :param name: Name of the subscription
106
- :type: String
107
116
  :param account: Account identifier
108
- :type account: String
109
117
  :param metadata: Dictionary of metadata to update. Supported keys : filter, replication_rules, comments, lifetime, retroactive, dry_run, priority, last_processed
110
- :type metadata: Dict
111
118
  :param issuer: The account issuing this operation.
112
- :type issuer: String
113
119
  :param vo: The VO to act on.
114
- :type vo: String
115
120
  :param session: The database session in use.
116
121
  :raises: SubscriptionNotFound if subscription is not found
117
122
  """
@@ -133,7 +138,7 @@ def update_subscription(name, account, metadata=None, issuer=None, vo='def', *,
133
138
  except ValueError as error:
134
139
  raise TypeError(error)
135
140
 
136
- account = InternalAccount(account, vo=vo)
141
+ internal_account = InternalAccount(account, vo=vo)
137
142
 
138
143
  if 'filter' in metadata and metadata['filter'] is not None:
139
144
  filter_ = metadata['filter']
@@ -147,35 +152,37 @@ def update_subscription(name, account, metadata=None, issuer=None, vo='def', *,
147
152
  else:
148
153
  filter_[_key] = _type(filter_[_key], vo=vo).internal
149
154
 
150
- return subscription.update_subscription(name=name, account=account, metadata=metadata, session=session)
155
+ return subscription.update_subscription(name=name, account=internal_account, metadata=metadata, session=session)
151
156
 
152
157
 
153
158
  @stream_session
154
- def list_subscriptions(name=None, account=None, state=None, vo='def', *, session: "Session"):
159
+ def list_subscriptions(
160
+ name: Optional[str] = None,
161
+ account: Optional[str] = None,
162
+ state: Optional[str] = None,
163
+ vo: str = 'def',
164
+ *,
165
+ session: "Session"
166
+ ) -> Iterator[dict[str, Any]]:
155
167
  """
156
168
  Returns a dictionary with the subscription information :
157
169
  Examples: ``{'status': 'INACTIVE/ACTIVE/BROKEN', 'last_modified_date': ...}``
158
170
 
159
171
  :param name: Name of the subscription
160
- :type: String
161
172
  :param account: Account identifier
162
- :type account: String
163
173
  :param state: Filter for subscription state
164
- :type state: String
165
174
  :param vo: The VO to act on.
166
- :type vo: String
167
175
  :param session: The database session in use.
168
176
  :returns: Dictionary containing subscription parameter
169
- :rtype: Dict
170
177
  :raises: exception.NotFound if subscription is not found
171
178
  """
172
179
 
173
180
  if account:
174
- account = InternalAccount(account, vo=vo)
181
+ internal_account = InternalAccount(account, vo=vo)
175
182
  else:
176
- account = InternalAccount('*', vo=vo)
183
+ internal_account = InternalAccount('*', vo=vo)
177
184
 
178
- subs = subscription.list_subscriptions(name, account, state, session=session)
185
+ subs = subscription.list_subscriptions(name, internal_account, state, session=session)
179
186
 
180
187
  for sub in subs:
181
188
  sub['account'] = sub['account'].external
@@ -192,7 +199,13 @@ def list_subscriptions(name=None, account=None, state=None, vo='def', *, session
192
199
 
193
200
 
194
201
  @stream_session
195
- def list_subscription_rule_states(name=None, account=None, vo='def', *, session: "Session"):
202
+ def list_subscription_rule_states(
203
+ name: Optional[str] = None,
204
+ account: Optional[str] = None,
205
+ vo: str = 'def',
206
+ *,
207
+ session: "Session"
208
+ ) -> Iterator[SubscriptionRuleState]:
196
209
  """Returns a list of with the number of rules per state for a subscription.
197
210
 
198
211
  :param name: Name of the subscription
@@ -202,10 +215,10 @@ def list_subscription_rule_states(name=None, account=None, vo='def', *, session:
202
215
  :returns: Sequence with SubscriptionRuleState named tuples (account, name, state, count)
203
216
  """
204
217
  if account is not None:
205
- account = InternalAccount(account, vo=vo)
218
+ internal_account = InternalAccount(account, vo=vo)
206
219
  else:
207
- account = InternalAccount('*', vo=vo)
208
- subs = subscription.list_subscription_rule_states(name, account, session=session)
220
+ internal_account = InternalAccount('*', vo=vo)
221
+ subs = subscription.list_subscription_rule_states(name, internal_account, session=session)
209
222
  for sub in subs:
210
223
  # sub is an immutable Row so return new named tuple with edited entries
211
224
  d = sub._asdict()
@@ -214,21 +227,30 @@ def list_subscription_rule_states(name=None, account=None, vo='def', *, session:
214
227
 
215
228
 
216
229
  @transactional_session
217
- def delete_subscription(subscription_id, vo='def', *, session: "Session"):
230
+ def delete_subscription(
231
+ subscription_id: str,
232
+ vo: str = 'def',
233
+ *,
234
+ session: "Session"
235
+ ) -> None:
218
236
  """
219
237
  Deletes a subscription
220
238
 
221
239
  :param subscription_id: Subscription identifier
222
240
  :param vo: The VO of the user issuing command
223
241
  :param session: The database session in use.
224
- :type subscription_id: String
225
242
  """
226
243
 
227
244
  raise NotImplementedError
228
245
 
229
246
 
230
247
  @read_session
231
- def get_subscription_by_id(subscription_id, vo='def', *, session: "Session"):
248
+ def get_subscription_by_id(
249
+ subscription_id: str,
250
+ vo: str = 'def',
251
+ *,
252
+ session: "Session"
253
+ ) -> dict[str, Any]:
232
254
  """
233
255
  Get a specific subscription by id.
234
256
 
@@ -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");
@@ -13,9 +12,8 @@
13
12
  # See the License for the specific language governing permissions and
14
13
  # limitations under the License.
15
14
 
16
- from typing import TYPE_CHECKING
15
+ from typing import TYPE_CHECKING, Any, Optional
17
16
 
18
- from rucio.api.permission import has_permission
19
17
  from rucio.common import exception
20
18
  from rucio.common.schema import validate_schema
21
19
  from rucio.common.types import InternalAccount
@@ -23,13 +21,14 @@ from rucio.core import identity
23
21
  from rucio.core import vo as vo_core
24
22
  from rucio.db.sqla.constants import IdentityType
25
23
  from rucio.db.sqla.session import read_session, transactional_session
24
+ from rucio.gateway.permission import has_permission
26
25
 
27
26
  if TYPE_CHECKING:
28
27
  from sqlalchemy.orm import Session
29
28
 
30
29
 
31
30
  @transactional_session
32
- def add_vo(new_vo, issuer, description=None, email=None, vo='def', *, session: "Session"):
31
+ def add_vo(new_vo: str, issuer: str, description: Optional[str] = None, email: Optional[str] = None, vo: str = 'def', *, session: "Session") -> None:
33
32
  '''
34
33
  Add a new VO.
35
34
 
@@ -52,7 +51,7 @@ def add_vo(new_vo, issuer, description=None, email=None, vo='def', *, session: "
52
51
 
53
52
 
54
53
  @read_session
55
- def list_vos(issuer, vo='def', *, session: "Session"):
54
+ def list_vos(issuer: str, vo: str = 'def', *, session: "Session") -> list[dict[str, Any]]:
56
55
  '''
57
56
  List the VOs.
58
57
 
@@ -68,7 +67,18 @@ def list_vos(issuer, vo='def', *, session: "Session"):
68
67
 
69
68
 
70
69
  @transactional_session
71
- def recover_vo_root_identity(root_vo, identity_key, id_type, email, issuer, default=False, password=None, vo='def', *, session: "Session"):
70
+ def recover_vo_root_identity(
71
+ root_vo: str,
72
+ identity_key: str,
73
+ id_type: str,
74
+ email: str,
75
+ issuer: str,
76
+ default: bool = False,
77
+ password: Optional[str] = None,
78
+ vo: str = 'def',
79
+ *,
80
+ session: "Session"
81
+ ) -> None:
72
82
  """
73
83
  Adds a membership association between identity and the root account for given VO.
74
84
 
@@ -94,7 +104,7 @@ def recover_vo_root_identity(root_vo, identity_key, id_type, email, issuer, defa
94
104
 
95
105
 
96
106
  @transactional_session
97
- def update_vo(updated_vo, parameters, issuer, vo='def', *, session: "Session"):
107
+ def update_vo(updated_vo: str, parameters: dict[str, Any], issuer: str, vo: str = 'def', *, session: "Session") -> None:
98
108
  """
99
109
  Update VO properties (email, description).
100
110