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,10 +12,11 @@
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
17
16
 
18
17
  import rucio.core.scope
19
- from rucio.core.account import list_account_attributes, has_account_attribute
18
+ from rucio.common.constants import RseAttr
19
+ from rucio.core.account import has_account_attribute, list_account_attributes
20
20
  from rucio.core.identity import exist_identity_account
21
21
  from rucio.core.lifetime_exception import list_exceptions
22
22
  from rucio.core.rse import list_rse_attributes
@@ -25,11 +25,13 @@ from rucio.db.sqla.constants import IdentityType
25
25
 
26
26
  if TYPE_CHECKING:
27
27
  from typing import Optional
28
+
28
29
  from sqlalchemy.orm import Session
30
+
29
31
  from rucio.common.types import InternalAccount
30
32
 
31
33
 
32
- def has_permission(issuer, action, kwargs, *, session: "Optional[Session]" = None):
34
+ def has_permission(issuer: "InternalAccount", action: str, kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
33
35
  """
34
36
  Checks if an account has the specified permission to
35
37
  execute an action with parameters.
@@ -124,11 +126,11 @@ def has_permission(issuer, action, kwargs, *, session: "Optional[Session]" = Non
124
126
  return perm.get(action, perm_default)(issuer=issuer, kwargs=kwargs, session=session)
125
127
 
126
128
 
127
- def _is_root(issuer):
129
+ def _is_root(issuer) -> bool:
128
130
  return issuer.external == 'root'
129
131
 
130
132
 
131
- def perm_default(issuer, kwargs, *, session: "Optional[Session]" = None):
133
+ def perm_default(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
132
134
  """
133
135
  Default permission.
134
136
 
@@ -140,7 +142,7 @@ def perm_default(issuer, kwargs, *, session: "Optional[Session]" = None):
140
142
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
141
143
 
142
144
 
143
- def perm_add_rse(issuer, kwargs, *, session: "Optional[Session]" = None):
145
+ def perm_add_rse(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
144
146
  """
145
147
  Checks if an account can add a RSE.
146
148
 
@@ -152,7 +154,7 @@ def perm_add_rse(issuer, kwargs, *, session: "Optional[Session]" = None):
152
154
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
153
155
 
154
156
 
155
- def perm_update_rse(issuer, kwargs, *, session: "Optional[Session]" = None):
157
+ def perm_update_rse(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
156
158
  """
157
159
  Checks if an account can update a RSE.
158
160
 
@@ -164,7 +166,7 @@ def perm_update_rse(issuer, kwargs, *, session: "Optional[Session]" = None):
164
166
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
165
167
 
166
168
 
167
- def perm_add_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
169
+ def perm_add_rule(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
168
170
  """
169
171
  Checks if an account can add a replication rule.
170
172
 
@@ -180,7 +182,7 @@ def perm_add_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
180
182
  return False
181
183
 
182
184
 
183
- def perm_add_subscription(issuer, kwargs, *, session: "Optional[Session]" = None):
185
+ def perm_add_subscription(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
184
186
  """
185
187
  Checks if an account can add a subscription.
186
188
 
@@ -194,7 +196,7 @@ def perm_add_subscription(issuer, kwargs, *, session: "Optional[Session]" = None
194
196
  return False
195
197
 
196
198
 
197
- def perm_add_rse_attribute(issuer, kwargs, *, session: "Optional[Session]" = None):
199
+ def perm_add_rse_attribute(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
198
200
  """
199
201
  Checks if an account can add a RSE attribute.
200
202
 
@@ -208,7 +210,7 @@ def perm_add_rse_attribute(issuer, kwargs, *, session: "Optional[Session]" = Non
208
210
  return False
209
211
 
210
212
 
211
- def perm_del_rse_attribute(issuer, kwargs, *, session: "Optional[Session]" = None):
213
+ def perm_del_rse_attribute(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
212
214
  """
213
215
  Checks if an account can delete a RSE attribute.
214
216
 
@@ -222,7 +224,7 @@ def perm_del_rse_attribute(issuer, kwargs, *, session: "Optional[Session]" = Non
222
224
  return False
223
225
 
224
226
 
225
- def perm_del_rse(issuer, kwargs, *, session: "Optional[Session]" = None):
227
+ def perm_del_rse(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
226
228
  """
227
229
  Checks if an account can delete a RSE.
228
230
 
@@ -234,7 +236,7 @@ def perm_del_rse(issuer, kwargs, *, session: "Optional[Session]" = None):
234
236
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
235
237
 
236
238
 
237
- def perm_add_account(issuer, kwargs, *, session: "Optional[Session]" = None):
239
+ def perm_add_account(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
238
240
  """
239
241
  Checks if an account can add an account.
240
242
 
@@ -246,7 +248,7 @@ def perm_add_account(issuer, kwargs, *, session: "Optional[Session]" = None):
246
248
  return _is_root(issuer)
247
249
 
248
250
 
249
- def perm_del_account(issuer, kwargs, *, session: "Optional[Session]" = None):
251
+ def perm_del_account(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
250
252
  """
251
253
  Checks if an account can del an account.
252
254
 
@@ -258,7 +260,7 @@ def perm_del_account(issuer, kwargs, *, session: "Optional[Session]" = None):
258
260
  return _is_root(issuer)
259
261
 
260
262
 
261
- def perm_update_account(issuer, kwargs, *, session: "Optional[Session]" = None):
263
+ def perm_update_account(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
262
264
  """
263
265
  Checks if an account can update an account.
264
266
 
@@ -270,7 +272,7 @@ def perm_update_account(issuer, kwargs, *, session: "Optional[Session]" = None):
270
272
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
271
273
 
272
274
 
273
- def perm_add_scope(issuer, kwargs, *, session: "Optional[Session]" = None):
275
+ def perm_add_scope(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
274
276
  """
275
277
  Checks if an account can add a scop to a account.
276
278
 
@@ -282,7 +284,7 @@ def perm_add_scope(issuer, kwargs, *, session: "Optional[Session]" = None):
282
284
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
283
285
 
284
286
 
285
- def perm_get_auth_token_user_pass(issuer, kwargs, *, session: "Optional[Session]" = None):
287
+ def perm_get_auth_token_user_pass(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
286
288
  """
287
289
  Checks if a user can request a token with user_pass for an account.
288
290
 
@@ -296,7 +298,7 @@ def perm_get_auth_token_user_pass(issuer, kwargs, *, session: "Optional[Session]
296
298
  return False
297
299
 
298
300
 
299
- def perm_get_auth_token_gss(issuer, kwargs, *, session: "Optional[Session]" = None):
301
+ def perm_get_auth_token_gss(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
300
302
  """
301
303
  Checks if a user can request a token with user_pass for an account.
302
304
 
@@ -310,7 +312,7 @@ def perm_get_auth_token_gss(issuer, kwargs, *, session: "Optional[Session]" = No
310
312
  return False
311
313
 
312
314
 
313
- def perm_get_auth_token_x509(issuer, kwargs, *, session: "Optional[Session]" = None):
315
+ def perm_get_auth_token_x509(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
314
316
  """
315
317
  Checks if a user can request a token with user_pass for an account.
316
318
 
@@ -324,7 +326,7 @@ def perm_get_auth_token_x509(issuer, kwargs, *, session: "Optional[Session]" = N
324
326
  return False
325
327
 
326
328
 
327
- def perm_get_auth_token_saml(issuer, kwargs, *, session: "Optional[Session]" = None):
329
+ def perm_get_auth_token_saml(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
328
330
  """
329
331
  Checks if a user can request a token with user_pass for an account.
330
332
 
@@ -338,7 +340,7 @@ def perm_get_auth_token_saml(issuer, kwargs, *, session: "Optional[Session]" = N
338
340
  return False
339
341
 
340
342
 
341
- def perm_add_account_identity(issuer, kwargs, *, session: "Optional[Session]" = None):
343
+ def perm_add_account_identity(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
342
344
  """
343
345
  Checks if an account can add an identity to an account.
344
346
 
@@ -351,7 +353,7 @@ def perm_add_account_identity(issuer, kwargs, *, session: "Optional[Session]" =
351
353
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
352
354
 
353
355
 
354
- def perm_del_account_identity(issuer, kwargs, *, session: "Optional[Session]" = None):
356
+ def perm_del_account_identity(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
355
357
  """
356
358
  Checks if an account can delete an identity to an account.
357
359
 
@@ -364,7 +366,7 @@ def perm_del_account_identity(issuer, kwargs, *, session: "Optional[Session]" =
364
366
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
365
367
 
366
368
 
367
- def perm_del_identity(issuer, kwargs, *, session: "Optional[Session]" = None):
369
+ def perm_del_identity(issuer: "InternalAccount", kwargs, *, session: "Optional[Session]" = None) -> bool:
368
370
  """
369
371
  Checks if an account can delete an identity.
370
372
 
@@ -377,7 +379,7 @@ def perm_del_identity(issuer, kwargs, *, session: "Optional[Session]" = None):
377
379
  return _is_root(issuer) or issuer.external in kwargs.get('accounts')
378
380
 
379
381
 
380
- def perm_add_did(issuer, kwargs, *, session: "Optional[Session]" = None):
382
+ def perm_add_did(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
381
383
  """
382
384
  Checks if an account can add an data identifier to a scope.
383
385
 
@@ -398,7 +400,7 @@ def perm_add_did(issuer, kwargs, *, session: "Optional[Session]" = None):
398
400
  or kwargs['scope'].external == 'mock'
399
401
 
400
402
 
401
- def perm_add_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
403
+ def perm_add_dids(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
402
404
  """
403
405
  Checks if an account can bulk add data identifiers.
404
406
 
@@ -417,7 +419,7 @@ def perm_add_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
417
419
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
418
420
 
419
421
 
420
- def perm_attach_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
422
+ def perm_attach_dids(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
421
423
  """
422
424
  Checks if an account can append an data identifier to the other data identifier.
423
425
 
@@ -432,7 +434,7 @@ def perm_attach_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
432
434
  or kwargs['scope'].external == 'mock'
433
435
 
434
436
 
435
- def perm_attach_dids_to_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
437
+ def perm_attach_dids_to_dids(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
436
438
  """
437
439
  Checks if an account can append an data identifier to the other data identifier.
438
440
 
@@ -453,7 +455,7 @@ def perm_attach_dids_to_dids(issuer, kwargs, *, session: "Optional[Session]" = N
453
455
  return True
454
456
 
455
457
 
456
- def perm_create_did_sample(issuer, kwargs, *, session: "Optional[Session]" = None):
458
+ def perm_create_did_sample(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
457
459
  """
458
460
  Checks if an account can create a sample of a data identifier collection.
459
461
 
@@ -468,7 +470,7 @@ def perm_create_did_sample(issuer, kwargs, *, session: "Optional[Session]" = Non
468
470
  or kwargs['scope'].external == 'mock'
469
471
 
470
472
 
471
- def perm_del_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
473
+ def perm_del_rule(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
472
474
  """
473
475
  Checks if an issuer can delete a replication rule.
474
476
 
@@ -482,7 +484,7 @@ def perm_del_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
482
484
  return False
483
485
 
484
486
 
485
- def perm_update_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
487
+ def perm_update_rule(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
486
488
  """
487
489
  Checks if an issuer can update a replication rule.
488
490
 
@@ -496,7 +498,7 @@ def perm_update_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
496
498
  return False
497
499
 
498
500
 
499
- def perm_approve_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
501
+ def perm_approve_rule(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
500
502
  """
501
503
  Checks if an issuer can approve a replication rule.
502
504
 
@@ -510,7 +512,7 @@ def perm_approve_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
510
512
  return False
511
513
 
512
514
 
513
- def perm_reduce_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
515
+ def perm_reduce_rule(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
514
516
  """
515
517
  Checks if an issuer can reduce a replication rule.
516
518
 
@@ -524,7 +526,7 @@ def perm_reduce_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
524
526
  return False
525
527
 
526
528
 
527
- def perm_move_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
529
+ def perm_move_rule(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
528
530
  """
529
531
  Checks if an issuer can move a replication rule.
530
532
 
@@ -538,7 +540,7 @@ def perm_move_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
538
540
  return False
539
541
 
540
542
 
541
- def perm_update_subscription(issuer, kwargs, *, session: "Optional[Session]" = None):
543
+ def perm_update_subscription(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
542
544
  """
543
545
  Checks if an account can update a subscription.
544
546
 
@@ -553,7 +555,7 @@ def perm_update_subscription(issuer, kwargs, *, session: "Optional[Session]" = N
553
555
  return False
554
556
 
555
557
 
556
- def perm_detach_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
558
+ def perm_detach_dids(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
557
559
  """
558
560
  Checks if an account can detach an data identifier from the other data identifier.
559
561
 
@@ -565,7 +567,7 @@ def perm_detach_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
565
567
  return perm_attach_dids(issuer, kwargs, session=session)
566
568
 
567
569
 
568
- def perm_set_metadata_bulk(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
570
+ def perm_set_metadata_bulk(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
569
571
  """
570
572
  Checks if an account can set a metadata on a data identifier.
571
573
 
@@ -577,7 +579,7 @@ def perm_set_metadata_bulk(issuer: "InternalAccount", kwargs: dict, *, session:
577
579
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session) or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)
578
580
 
579
581
 
580
- def perm_set_metadata(issuer, kwargs, *, session: "Optional[Session]" = None):
582
+ def perm_set_metadata(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
581
583
  """
582
584
  Checks if an account can set a metadata on a data identifier.
583
585
 
@@ -589,7 +591,7 @@ def perm_set_metadata(issuer, kwargs, *, session: "Optional[Session]" = None):
589
591
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session) or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)
590
592
 
591
593
 
592
- def perm_set_status(issuer, kwargs, *, session: "Optional[Session]" = None):
594
+ def perm_set_status(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
593
595
  """
594
596
  Checks if an account can set status on an data identifier.
595
597
 
@@ -605,7 +607,7 @@ def perm_set_status(issuer, kwargs, *, session: "Optional[Session]" = None):
605
607
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session) or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)
606
608
 
607
609
 
608
- def perm_add_protocol(issuer, kwargs, *, session: "Optional[Session]" = None):
610
+ def perm_add_protocol(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
609
611
  """
610
612
  Checks if an account can add a protocol to an RSE.
611
613
 
@@ -617,7 +619,7 @@ def perm_add_protocol(issuer, kwargs, *, session: "Optional[Session]" = None):
617
619
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
618
620
 
619
621
 
620
- def perm_del_protocol(issuer, kwargs, *, session: "Optional[Session]" = None):
622
+ def perm_del_protocol(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
621
623
  """
622
624
  Checks if an account can delete protocols from an RSE.
623
625
 
@@ -629,7 +631,7 @@ def perm_del_protocol(issuer, kwargs, *, session: "Optional[Session]" = None):
629
631
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
630
632
 
631
633
 
632
- def perm_update_protocol(issuer, kwargs, *, session: "Optional[Session]" = None):
634
+ def perm_update_protocol(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
633
635
  """
634
636
  Checks if an account can update protocols of an RSE.
635
637
 
@@ -641,7 +643,7 @@ def perm_update_protocol(issuer, kwargs, *, session: "Optional[Session]" = None)
641
643
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
642
644
 
643
645
 
644
- def perm_add_qos_policy(issuer, kwargs, *, session: "Optional[Session]" = None):
646
+ def perm_add_qos_policy(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
645
647
  """
646
648
  Checks if an account can add QoS policies to an RSE.
647
649
 
@@ -653,7 +655,7 @@ def perm_add_qos_policy(issuer, kwargs, *, session: "Optional[Session]" = None):
653
655
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
654
656
 
655
657
 
656
- def perm_delete_qos_policy(issuer, kwargs, *, session: "Optional[Session]" = None):
658
+ def perm_delete_qos_policy(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
657
659
  """
658
660
  Checks if an account can delete QoS policies from an RSE.
659
661
 
@@ -665,7 +667,7 @@ def perm_delete_qos_policy(issuer, kwargs, *, session: "Optional[Session]" = Non
665
667
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
666
668
 
667
669
 
668
- def perm_declare_bad_file_replicas(issuer, kwargs, *, session: "Optional[Session]" = None):
670
+ def perm_declare_bad_file_replicas(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
669
671
  """
670
672
  Checks if an account can declare bad file replicas.
671
673
 
@@ -677,7 +679,7 @@ def perm_declare_bad_file_replicas(issuer, kwargs, *, session: "Optional[Session
677
679
  return _is_root(issuer)
678
680
 
679
681
 
680
- def perm_declare_suspicious_file_replicas(issuer, kwargs, *, session: "Optional[Session]" = None):
682
+ def perm_declare_suspicious_file_replicas(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
681
683
  """
682
684
  Checks if an account can declare suspicious file replicas.
683
685
 
@@ -689,7 +691,7 @@ def perm_declare_suspicious_file_replicas(issuer, kwargs, *, session: "Optional[
689
691
  return True
690
692
 
691
693
 
692
- def perm_add_replicas(issuer, kwargs, *, session: "Optional[Session]" = None):
694
+ def perm_add_replicas(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
693
695
  """
694
696
  Checks if an account can add replicas.
695
697
 
@@ -706,7 +708,7 @@ def perm_add_replicas(issuer, kwargs, *, session: "Optional[Session]" = None):
706
708
  or has_account_attribute(account=issuer, key='admin', session=session)
707
709
 
708
710
 
709
- def perm_skip_availability_check(issuer, kwargs, *, session: "Optional[Session]" = None):
711
+ def perm_skip_availability_check(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
710
712
  """
711
713
  Checks if an account can skip the availabity check to add/delete file replicas.
712
714
 
@@ -718,7 +720,7 @@ def perm_skip_availability_check(issuer, kwargs, *, session: "Optional[Session]"
718
720
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
719
721
 
720
722
 
721
- def perm_delete_replicas(issuer, kwargs, *, session: "Optional[Session]" = None):
723
+ def perm_delete_replicas(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
722
724
  """
723
725
  Checks if an account can delete replicas.
724
726
 
@@ -730,7 +732,7 @@ def perm_delete_replicas(issuer, kwargs, *, session: "Optional[Session]" = None)
730
732
  return False
731
733
 
732
734
 
733
- def perm_update_replicas_states(issuer, kwargs, *, session: "Optional[Session]" = None):
735
+ def perm_update_replicas_states(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
734
736
  """
735
737
  Checks if an account can delete replicas.
736
738
 
@@ -742,7 +744,7 @@ def perm_update_replicas_states(issuer, kwargs, *, session: "Optional[Session]"
742
744
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
743
745
 
744
746
 
745
- def perm_queue_requests(issuer, kwargs, *, session: "Optional[Session]" = None):
747
+ def perm_queue_requests(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
746
748
  """
747
749
  Checks if an account can submit transfer or deletion requests on destination RSEs for data identifiers.
748
750
 
@@ -754,7 +756,7 @@ def perm_queue_requests(issuer, kwargs, *, session: "Optional[Session]" = None):
754
756
  return _is_root(issuer)
755
757
 
756
758
 
757
- def perm_list_requests(issuer, kwargs, *, session: "Optional[Session]" = None):
759
+ def perm_list_requests(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
758
760
  """
759
761
  Checks if an account can list requests.
760
762
 
@@ -766,7 +768,7 @@ def perm_list_requests(issuer, kwargs, *, session: "Optional[Session]" = None):
766
768
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
767
769
 
768
770
 
769
- def perm_list_requests_history(issuer, kwargs, *, session: "Optional[Session]" = None):
771
+ def perm_list_requests_history(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
770
772
  """
771
773
  Checks if an account can list historical requests.
772
774
 
@@ -778,7 +780,7 @@ def perm_list_requests_history(issuer, kwargs, *, session: "Optional[Session]" =
778
780
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
779
781
 
780
782
 
781
- def perm_get_request_by_did(issuer, kwargs, *, session: "Optional[Session]" = None):
783
+ def perm_get_request_by_did(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
782
784
  """
783
785
  Checks if an account can get a request by DID.
784
786
 
@@ -790,7 +792,7 @@ def perm_get_request_by_did(issuer, kwargs, *, session: "Optional[Session]" = No
790
792
  return True
791
793
 
792
794
 
793
- def perm_get_request_history_by_did(issuer, kwargs, *, session: "Optional[Session]" = None):
795
+ def perm_get_request_history_by_did(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
794
796
  """
795
797
  Checks if an account can get a historical request by DID.
796
798
 
@@ -802,7 +804,7 @@ def perm_get_request_history_by_did(issuer, kwargs, *, session: "Optional[Sessio
802
804
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
803
805
 
804
806
 
805
- def perm_cancel_request(issuer, kwargs, *, session: "Optional[Session]" = None):
807
+ def perm_cancel_request(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
806
808
  """
807
809
  Checks if an account can cancel a request.
808
810
 
@@ -814,7 +816,7 @@ def perm_cancel_request(issuer, kwargs, *, session: "Optional[Session]" = None):
814
816
  return _is_root(issuer)
815
817
 
816
818
 
817
- def perm_get_next(issuer, kwargs, *, session: "Optional[Session]" = None):
819
+ def perm_get_next(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
818
820
  """
819
821
  Checks if an account can retrieve the next request matching the request type and state.
820
822
 
@@ -826,7 +828,7 @@ def perm_get_next(issuer, kwargs, *, session: "Optional[Session]" = None):
826
828
  return _is_root(issuer)
827
829
 
828
830
 
829
- def perm_set_rse_usage(issuer, kwargs, *, session: "Optional[Session]" = None):
831
+ def perm_set_rse_usage(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
830
832
  """
831
833
  Checks if an account can set RSE usage information.
832
834
 
@@ -838,7 +840,7 @@ def perm_set_rse_usage(issuer, kwargs, *, session: "Optional[Session]" = None):
838
840
  return _is_root(issuer)
839
841
 
840
842
 
841
- def perm_set_rse_limits(issuer, kwargs, *, session: "Optional[Session]" = None):
843
+ def perm_set_rse_limits(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
842
844
  """
843
845
  Checks if an account can set RSE limits.
844
846
 
@@ -850,7 +852,7 @@ def perm_set_rse_limits(issuer, kwargs, *, session: "Optional[Session]" = None):
850
852
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
851
853
 
852
854
 
853
- def perm_set_local_account_limit(issuer, kwargs, *, session: "Optional[Session]" = None):
855
+ def perm_set_local_account_limit(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
854
856
  """
855
857
  Checks if an account can set an account limit.
856
858
 
@@ -866,12 +868,12 @@ def perm_set_local_account_limit(issuer, kwargs, *, session: "Optional[Session]"
866
868
  for kv in list_account_attributes(account=issuer, session=session):
867
869
  if kv['key'].startswith('country-') and kv['value'] == 'admin':
868
870
  admin_in_country.append(kv['key'].partition('-')[2])
869
- if admin_in_country and list_rse_attributes(rse_id=kwargs['rse_id'], session=session).get('country') in admin_in_country:
871
+ if admin_in_country and list_rse_attributes(rse_id=kwargs['rse_id'], session=session).get(RseAttr.COUNTRY) in admin_in_country:
870
872
  return True
871
873
  return False
872
874
 
873
875
 
874
- def perm_set_global_account_limit(issuer, kwargs, *, session: "Optional[Session]" = None):
876
+ def perm_set_global_account_limit(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
875
877
  """
876
878
  Checks if an account can set a global account limit.
877
879
 
@@ -887,14 +889,14 @@ def perm_set_global_account_limit(issuer, kwargs, *, session: "Optional[Session]
887
889
  for kv in list_account_attributes(account=issuer, session=session):
888
890
  if kv['key'].startswith('country-') and kv['value'] == 'admin':
889
891
  admin_in_country.add(kv['key'].partition('-')[2])
890
- resolved_rse_countries = {list_rse_attributes(rse_id=rse['rse_id'], session=session).get('country')
892
+ resolved_rse_countries = {list_rse_attributes(rse_id=rse['rse_id'], session=session).get(RseAttr.COUNTRY)
891
893
  for rse in parse_expression(kwargs['rse_expression'], filter_={'vo': issuer.vo}, session=session)}
892
894
  if resolved_rse_countries.issubset(admin_in_country):
893
895
  return True
894
896
  return False
895
897
 
896
898
 
897
- def perm_delete_local_account_limit(issuer, kwargs, *, session: "Optional[Session]" = None):
899
+ def perm_delete_local_account_limit(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
898
900
  """
899
901
  Checks if an account can delete an account limit.
900
902
 
@@ -910,12 +912,12 @@ def perm_delete_local_account_limit(issuer, kwargs, *, session: "Optional[Sessio
910
912
  for kv in list_account_attributes(account=issuer, session=session):
911
913
  if kv['key'].startswith('country-') and kv['value'] == 'admin':
912
914
  admin_in_country.append(kv['key'].partition('-')[2])
913
- if admin_in_country and list_rse_attributes(rse_id=kwargs['rse_id'], session=session).get('country') in admin_in_country:
915
+ if admin_in_country and list_rse_attributes(rse_id=kwargs['rse_id'], session=session).get(RseAttr.COUNTRY) in admin_in_country:
914
916
  return True
915
917
  return False
916
918
 
917
919
 
918
- def perm_delete_global_account_limit(issuer, kwargs, *, session: "Optional[Session]" = None):
920
+ def perm_delete_global_account_limit(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
919
921
  """
920
922
  Checks if an account can delete a global account limit.
921
923
 
@@ -932,14 +934,14 @@ def perm_delete_global_account_limit(issuer, kwargs, *, session: "Optional[Sessi
932
934
  if kv['key'].startswith('country-') and kv['value'] == 'admin':
933
935
  admin_in_country.add(kv['key'].partition('-')[2])
934
936
  if admin_in_country:
935
- resolved_rse_countries = {list_rse_attributes(rse_id=rse['rse_id'], session=session).get('country')
937
+ resolved_rse_countries = {list_rse_attributes(rse_id=rse['rse_id'], session=session).get(RseAttr.COUNTRY)
936
938
  for rse in parse_expression(kwargs['rse_expression'], filter_={'vo': issuer.vo}, session=session)}
937
939
  if resolved_rse_countries.issubset(admin_in_country):
938
940
  return True
939
941
  return False
940
942
 
941
943
 
942
- def perm_config(issuer, kwargs, *, session: "Optional[Session]" = None):
944
+ def perm_config(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
943
945
  """
944
946
  Checks if an account can read/write the configuration.
945
947
 
@@ -951,7 +953,7 @@ def perm_config(issuer, kwargs, *, session: "Optional[Session]" = None):
951
953
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
952
954
 
953
955
 
954
- def perm_get_local_account_usage(issuer, kwargs, *, session: "Optional[Session]" = None):
956
+ def perm_get_local_account_usage(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
955
957
  """
956
958
  Checks if an account can get the account usage of an account.
957
959
 
@@ -969,7 +971,7 @@ def perm_get_local_account_usage(issuer, kwargs, *, session: "Optional[Session]"
969
971
  return False
970
972
 
971
973
 
972
- def perm_get_global_account_usage(issuer, kwargs, *, session: "Optional[Session]" = None):
974
+ def perm_get_global_account_usage(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
973
975
  """
974
976
  Checks if an account can get the account usage of an account.
975
977
 
@@ -988,7 +990,7 @@ def perm_get_global_account_usage(issuer, kwargs, *, session: "Optional[Session]
988
990
  return False
989
991
 
990
992
 
991
- def perm_add_account_attribute(issuer, kwargs, *, session: "Optional[Session]" = None):
993
+ def perm_add_account_attribute(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
992
994
  """
993
995
  Checks if an account can add attributes to accounts.
994
996
 
@@ -1000,7 +1002,7 @@ def perm_add_account_attribute(issuer, kwargs, *, session: "Optional[Session]" =
1000
1002
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
1001
1003
 
1002
1004
 
1003
- def perm_del_account_attribute(issuer, kwargs, *, session: "Optional[Session]" = None):
1005
+ def perm_del_account_attribute(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
1004
1006
  """
1005
1007
  Checks if an account can add attributes to accounts.
1006
1008
 
@@ -1012,7 +1014,7 @@ def perm_del_account_attribute(issuer, kwargs, *, session: "Optional[Session]" =
1012
1014
  return perm_add_account_attribute(issuer, kwargs, session=session)
1013
1015
 
1014
1016
 
1015
- def perm_list_heartbeats(issuer, kwargs, *, session: "Optional[Session]" = None):
1017
+ def perm_list_heartbeats(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
1016
1018
  """
1017
1019
  Checks if an account can list heartbeats.
1018
1020
 
@@ -1024,7 +1026,7 @@ def perm_list_heartbeats(issuer, kwargs, *, session: "Optional[Session]" = None)
1024
1026
  return _is_root(issuer)
1025
1027
 
1026
1028
 
1027
- def perm_resurrect(issuer, kwargs, *, session: "Optional[Session]" = None):
1029
+ def perm_resurrect(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
1028
1030
  """
1029
1031
  Checks if an account can resurrect DIDS.
1030
1032
 
@@ -1036,7 +1038,7 @@ def perm_resurrect(issuer, kwargs, *, session: "Optional[Session]" = None):
1036
1038
  return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
1037
1039
 
1038
1040
 
1039
- def perm_update_lifetime_exceptions(issuer, kwargs, *, session: "Optional[Session]" = None):
1041
+ def perm_update_lifetime_exceptions(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
1040
1042
  """
1041
1043
  Checks if an account can approve/reject Lifetime Model exceptions.
1042
1044
 
@@ -1062,7 +1064,7 @@ def perm_get_auth_token_ssh(issuer: "InternalAccount", kwargs: dict, *, session:
1062
1064
  return True
1063
1065
 
1064
1066
 
1065
- def perm_get_signed_url(issuer, kwargs, *, session: "Optional[Session]" = None):
1067
+ def perm_get_signed_url(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
1066
1068
  """
1067
1069
  Checks if an account can request a signed URL.
1068
1070
 
@@ -1073,7 +1075,7 @@ def perm_get_signed_url(issuer, kwargs, *, session: "Optional[Session]" = None):
1073
1075
  return _is_root(issuer)
1074
1076
 
1075
1077
 
1076
- def perm_add_bad_pfns(issuer, kwargs, *, session: "Optional[Session]" = None):
1078
+ def perm_add_bad_pfns(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
1077
1079
  """
1078
1080
  Checks if an account can declare bad PFNs.
1079
1081
 
@@ -1085,7 +1087,7 @@ def perm_add_bad_pfns(issuer, kwargs, *, session: "Optional[Session]" = None):
1085
1087
  return _is_root(issuer)
1086
1088
 
1087
1089
 
1088
- def perm_remove_did_from_followed(issuer, kwargs, *, session: "Optional[Session]" = None):
1090
+ def perm_remove_did_from_followed(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
1089
1091
  """
1090
1092
  Checks if an account can remove did from followed table.
1091
1093
 
@@ -1100,7 +1102,7 @@ def perm_remove_did_from_followed(issuer, kwargs, *, session: "Optional[Session]
1100
1102
  or kwargs['scope'].external == 'mock'
1101
1103
 
1102
1104
 
1103
- def perm_remove_dids_from_followed(issuer, kwargs, *, session: "Optional[Session]" = None):
1105
+ def perm_remove_dids_from_followed(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
1104
1106
  """
1105
1107
  Checks if an account can bulk remove dids from followed table.
1106
1108
 
@@ -1116,7 +1118,7 @@ def perm_remove_dids_from_followed(issuer, kwargs, *, session: "Optional[Session
1116
1118
  return True
1117
1119
 
1118
1120
 
1119
- def perm_export(issuer, kwargs, *, session: "Optional[Session]" = None):
1121
+ def perm_export(issuer: "InternalAccount", kwargs: dict[str, Any], *, session: "Optional[Session]" = None) -> bool:
1120
1122
  """
1121
1123
  Checks if an account can export the RSE info.
1122
1124