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
@@ -0,0 +1,152 @@
1
+ # Copyright European Organization for Nuclear Research (CERN) since 2012
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import json
16
+ import sys
17
+ from typing import TYPE_CHECKING, Any, Optional, TypeVar
18
+
19
+ from rucio.common.config import config_get_int
20
+ from rucio.common.exception import InvalidRequest
21
+ from rucio.common.plugins import PolicyPackageAlgorithms
22
+
23
+ if TYPE_CHECKING:
24
+ from collections.abc import Callable
25
+
26
+ FTS3TapeMetadataPluginType = TypeVar('FTS3TapeMetadataPluginType', bound='FTS3TapeMetadataPlugin')
27
+
28
+
29
+ class FTS3TapeMetadataPlugin(PolicyPackageAlgorithms):
30
+ """
31
+ Add a "archive_metadata" field to a file's transfer parameters.
32
+ Plugins are registered during initialization and called during a transfer with FTS3
33
+ """
34
+
35
+ ALGORITHM_NAME = "fts3_tape_metadata_plugins"
36
+ _INIT_FUNC_NAME = "fts3_plugins_init"
37
+ DEFAULT = "def"
38
+
39
+ def __init__(self, policy_algorithm: str) -> None:
40
+ """
41
+ :param policy_algorithm: policy algorithm identifier - choose from any of the policy package algorithms registered under the `fts3_tape_metadata_plugins` group.
42
+ """
43
+ super().__init__()
44
+ self.transfer_limit = config_get_int(
45
+ "transfers",
46
+ option="metadata_byte_limit",
47
+ raise_exception=False,
48
+ default=4096,
49
+ )
50
+
51
+ if not self._supports(self.ALGORITHM_NAME, policy_algorithm):
52
+ raise ValueError(f'Policy Algorithm {policy_algorithm} not found')
53
+
54
+ if self._supports(self._INIT_FUNC_NAME, policy_algorithm):
55
+ init_func = self._get_one_algorithm(self._INIT_FUNC_NAME, name=policy_algorithm)
56
+ init_func()
57
+
58
+ self.set_in_hints = self._get_one_algorithm(self.ALGORITHM_NAME, name=policy_algorithm)
59
+
60
+ @classmethod
61
+ def _module_init(cls: type[FTS3TapeMetadataPluginType]) -> None:
62
+ cls.register(cls.DEFAULT, func=lambda x: cls._default(cls, x)) # type: ignore
63
+
64
+ @classmethod
65
+ def register(cls: type[FTS3TapeMetadataPluginType], name: str, func: 'Callable', init_func: Optional['Callable'] = None) -> None:
66
+ """
67
+ Register a fts3 transfer plugin
68
+
69
+ :param name: name to register under
70
+ :param func: function called by the plugin
71
+ :param init_func: Initialization requirements for the plugin, defaults to None
72
+ """
73
+ super()._register(cls.ALGORITHM_NAME, algorithm_dict={name: func})
74
+ if init_func is not None:
75
+ super()._register(cls._INIT_FUNC_NAME, algorithm_dict={name: init_func})
76
+
77
+ @staticmethod
78
+ def _collocation(collocation_func: 'Callable', hints: dict[str, Any]) -> dict[str, dict]:
79
+ """
80
+ Wraps a 'collocation' style plugin for formatting
81
+
82
+ :param collocation_func: Function that defines the collocation rules
83
+ :param hints: kwargs utilized by the collocation rules
84
+ :return: Collocation hints produced by the collocation_func, wrapped
85
+ """
86
+ return {"collocation_hints": collocation_func(**hints)}
87
+
88
+ def _default(self, *hints: dict) -> dict:
89
+ return {}
90
+
91
+ def _verify_in_format(self, hint_dict: dict[str, Any]) -> None:
92
+ """Check the to-be-submitted file transfer params are both json encodable and under the size limit for transfer"""
93
+ try:
94
+ hints_json = json.dumps(hint_dict)
95
+ in_tranfer_limit = sys.getsizeof(hints_json) < self.transfer_limit
96
+
97
+ except TypeError as e:
98
+ raise InvalidRequest("Request malformed, cannot encode to JSON", e)
99
+
100
+ if not in_tranfer_limit:
101
+ raise InvalidRequest(
102
+ f"Request too large, decrease to less than {self.transfer_limit}"
103
+ )
104
+
105
+ def hints(self, hint_kwargs: dict) -> dict[str, Any]:
106
+ """
107
+ Produce "archive_metadata" hints for how a transfer should be executed by fts3.
108
+
109
+ :param hint_kwargs: Args passed forward to the plugin algorithm
110
+ :return: Archiving metadata in the format {archive_metadata: {<plugin produced hints>}}
111
+ """
112
+ hints = self.set_in_hints(hint_kwargs)
113
+ self._verify_in_format(hints)
114
+ return {"archive_metadata": hints}
115
+
116
+
117
+ class ActivityBasedTransferPriorityPlugin(FTS3TapeMetadataPlugin):
118
+ def __init__(self, policy_algorithm: str = 'activity') -> None:
119
+ self.register(
120
+ policy_algorithm,
121
+ func=lambda x: self._get_activity_priority(x),
122
+ init_func=self._init_default_priority)
123
+ super().__init__(policy_algorithm)
124
+
125
+ def _init_default_priority(self) -> None:
126
+ self.default_priority = config_get_int(
127
+ "tape_priority",
128
+ option="default",
129
+ raise_exception=False,
130
+ default=20,
131
+ )
132
+
133
+ def _get_activity_priority(self, activity_kwargs: dict[str, str]) -> dict[str, dict]:
134
+ """ Activity Hints - assign a priority based on activity"""
135
+ if "activity" in activity_kwargs:
136
+ activity = activity_kwargs["activity"]
137
+ else:
138
+ raise InvalidRequest("`activity` field not found in passed metadata")
139
+
140
+ priority = config_get_int(
141
+ "tape_priority",
142
+ option=activity,
143
+ raise_exception=False,
144
+ default=self.default_priority,
145
+ )
146
+
147
+ return {"scheduling_hints": {"priority": priority}}
148
+
149
+
150
+ # Register the policies
151
+ FTS3TapeMetadataPlugin._module_init()
152
+ ActivityBasedTransferPriorityPlugin()
@@ -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");
@@ -15,15 +14,17 @@
15
14
 
16
15
  import logging
17
16
 
17
+ from rucio.common.constants import RseAttr
18
18
  from rucio.common.utils import chunks
19
19
  from rucio.db.sqla.constants import RequestState
20
- from rucio.transfertool.transfertool import Transfertool, TransferToolBuilder, TransferStatusReport
21
- from .globus_library import bulk_submit_xfer, submit_xfer, bulk_check_xfers
20
+ from rucio.transfertool.transfertool import TransferStatusReport, Transfertool, TransferToolBuilder
21
+
22
+ from .globus_library import bulk_check_xfers, bulk_submit_xfer, submit_xfer
22
23
 
23
24
 
24
25
  def bulk_group_transfers(transfer_paths, policy='single', group_bulk=200):
25
26
  """
26
- Group transfers in bulk based on certain criterias
27
+ Group transfers in bulk based on certain criteria
27
28
 
28
29
  :param transfer_paths: List of (potentially multihop) transfer paths to group. Each path is a list of single-hop transfers.
29
30
  :param policy: Policy to use to group.
@@ -82,7 +83,7 @@ class GlobusTransferTool(Transfertool):
82
83
  """
83
84
 
84
85
  external_name = 'globus'
85
- required_rse_attrs = ('globus_endpoint_id', )
86
+ required_rse_attrs = (RseAttr.GLOBUS_ENDPOINT_ID, )
86
87
 
87
88
  def __init__(self, external_host, logger=logging.log, group_bulk=200, group_policy='single'):
88
89
  """
@@ -154,15 +155,15 @@ class GlobusTransferTool(Transfertool):
154
155
  submitjob = [
155
156
  {
156
157
  # Some dict elements are not needed by globus transfertool, but are accessed by further common fts/globus code
157
- 'sources': [s[1] for s in transfer.legacy_sources],
158
+ 'sources': [transfer.source_url(s) for s in transfer.sources],
158
159
  'destinations': [transfer.dest_url],
159
160
  'metadata': {
160
161
  'src_rse': transfer.src.rse.name,
161
162
  'dst_rse': transfer.dst.rse.name,
162
163
  'scope': str(transfer.rws.scope),
163
164
  'name': transfer.rws.name,
164
- 'source_globus_endpoint_id': transfer.src.rse.attributes['globus_endpoint_id'],
165
- 'dest_globus_endpoint_id': transfer.dst.rse.attributes['globus_endpoint_id'],
165
+ 'source_globus_endpoint_id': transfer.src.rse.attributes[RseAttr.GLOBUS_ENDPOINT_ID],
166
+ 'dest_globus_endpoint_id': transfer.dst.rse.attributes[RseAttr.GLOBUS_ENDPOINT_ID],
166
167
  'filesize': transfer.rws.byte_count,
167
168
  },
168
169
  }
@@ -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");
@@ -24,8 +23,8 @@ from rucio.core.monitor import MetricManager
24
23
  EXTRA_MODULES = import_extras(['globus_sdk'])
25
24
 
26
25
  if EXTRA_MODULES['globus_sdk']:
27
- from globus_sdk import NativeAppAuthClient, RefreshTokenAuthorizer, TransferClient, TransferData, DeleteData # pylint: disable=import-error
28
26
  import yaml # pylint: disable=import-error
27
+ from globus_sdk import DeleteData, NativeAppAuthClient, RefreshTokenAuthorizer, TransferClient, TransferData # pylint: disable=import-error
29
28
 
30
29
  METRICS = MetricManager(module=__name__)
31
30
 
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,12 +15,17 @@
16
15
  import itertools
17
16
  import logging
18
17
  import uuid
19
- from typing import TYPE_CHECKING, Any, Optional, Sequence
18
+ from collections.abc import Sequence
19
+ from typing import TYPE_CHECKING, Any, Optional
20
20
 
21
21
  from rucio.db.sqla.constants import RequestState
22
- from rucio.transfertool.transfertool import Transfertool, TransferToolBuilder, TransferStatusReport
22
+ from rucio.transfertool.transfertool import TransferStatusReport, Transfertool, TransferToolBuilder
23
23
 
24
24
  if TYPE_CHECKING:
25
+ from collections.abc import Iterable, Mapping
26
+
27
+ from rucio.common.types import LoggerFunction
28
+ from rucio.core.request import DirectTransfer
25
29
  from rucio.db.sqla.session import Session
26
30
 
27
31
 
@@ -37,10 +41,10 @@ class MockTransferStatusReport(TransferStatusReport):
37
41
  self.state = RequestState.DONE
38
42
  self.external_id = external_id
39
43
 
40
- def initialize(self, session: "Session", logger=logging.log):
44
+ def initialize(self, session: "Session", logger: "LoggerFunction" = logging.log) -> None:
41
45
  pass
42
46
 
43
- def get_monitor_msg_fields(self, session: "Session", logger=logging.log):
47
+ def get_monitor_msg_fields(self, session: "Session", logger: "LoggerFunction" = logging.log) -> dict[str, Any]:
44
48
  return {}
45
49
 
46
50
 
@@ -53,29 +57,34 @@ class MockTransfertool(Transfertool):
53
57
 
54
58
  external_name = 'mock'
55
59
  required_rse_attrs = ()
60
+ supported_schemes = {'mock', 'file'}
56
61
 
57
- def __init__(self, external_host: str, logger=logging.log):
62
+ def __init__(self, external_host: str, logger: "LoggerFunction" = logging.log):
58
63
  super(MockTransfertool, self).__init__(external_host, logger)
59
64
 
60
65
  @classmethod
61
- def submission_builder_for_path(cls, transfer_path, logger=logging.log):
66
+ def submission_builder_for_path(
67
+ cls,
68
+ transfer_path: list["DirectTransfer"],
69
+ logger: "LoggerFunction" = logging.log
70
+ ) -> tuple[list["DirectTransfer"], "TransferToolBuilder"]:
62
71
  return transfer_path, TransferToolBuilder(cls, external_host='Mock Transfertool')
63
72
 
64
- def group_into_submit_jobs(self, transfers):
73
+ def group_into_submit_jobs(self, transfers: "Iterable[list[DirectTransfer]]") -> list[dict[str, Any]]:
65
74
  return [{'transfers': list(itertools.chain.from_iterable(transfers)), 'job_params': {}}]
66
75
 
67
- def submit(self, files, job_params, timeout=None):
76
+ def submit(self, transfers: "Iterable[DirectTransfer]", job_params: dict[str, str], timeout: Optional[int] = None) -> str:
68
77
  return str(uuid.uuid1())
69
78
 
70
- def bulk_query(self, requests_by_eid: dict[str, dict[str, dict[str, Any]]], timeout: Optional[float] = None):
79
+ def bulk_query(self, requests_by_eid: "Mapping[str, Mapping[str, Any]]", timeout: Optional[int] = None) -> dict[str, dict[str, MockTransferStatusReport]]:
71
80
  response = {}
72
81
  for transfer_id, requests in requests_by_eid.items():
73
82
  for request_id in requests:
74
83
  response.setdefault(transfer_id, {})[request_id] = MockTransferStatusReport(request_id, transfer_id)
75
84
  return response
76
85
 
77
- def cancel(self, transfer_ids: Sequence[str], timeout: Optional[float] = None):
86
+ def cancel(self, transfer_ids: Sequence[str], timeout: Optional[int] = None) -> bool:
78
87
  return True
79
88
 
80
- def update_priority(self, transfer_id: str, priority: int, timeout: Optional[float] = None):
89
+ def update_priority(self, transfer_id: str, priority: int, timeout: Optional[int] = None) -> bool:
81
90
  return True
@@ -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");
@@ -15,15 +14,22 @@
15
14
 
16
15
  import logging
17
16
  from abc import ABCMeta, abstractmethod
18
- from typing import TYPE_CHECKING
17
+ from typing import TYPE_CHECKING, Any, Optional
19
18
 
19
+ from rucio.common.constants import SUPPORTED_PROTOCOLS
20
20
  from rucio.core.request import get_request
21
21
 
22
22
  if TYPE_CHECKING:
23
+ from collections.abc import Iterable, Mapping, Sequence
24
+
25
+ from sqlalchemy.orm import Session
26
+
27
+ from rucio.common.types import LoggerFunction
28
+ from rucio.core.request import DirectTransfer
23
29
  from rucio.core.rse import RseData
24
30
 
25
31
 
26
- class TransferToolBuilder(object):
32
+ class TransferToolBuilder:
27
33
  """
28
34
  Builder for Transfertool objects.
29
35
  Stores the parameters needed to create the Transfertool object of the given type/class.
@@ -31,7 +37,7 @@ class TransferToolBuilder(object):
31
37
  Implements __hash__ and __eq__ to allow using it as key in dictionaries and group transfers
32
38
  by common transfertool.
33
39
  """
34
- def __init__(self, transfertool_class, **kwargs):
40
+ def __init__(self, transfertool_class: type["Transfertool"], **kwargs):
35
41
  self.transfertool_class = transfertool_class
36
42
  self.fixed_kwargs = frozenset(kwargs.items())
37
43
 
@@ -44,13 +50,13 @@ class TransferToolBuilder(object):
44
50
  def __eq__(self, other):
45
51
  return self.__class__ == other.__class__ and self.__dict__ == other.__dict__
46
52
 
47
- def make_transfertool(self, **additional_kwargs):
53
+ def make_transfertool(self, **additional_kwargs) -> "Transfertool":
48
54
  all_kwargs = dict(self.fixed_kwargs)
49
55
  all_kwargs.update(additional_kwargs)
50
56
  return self.transfertool_class(**all_kwargs)
51
57
 
52
58
 
53
- class TransferStatusReport(object, metaclass=ABCMeta):
59
+ class TransferStatusReport(metaclass=ABCMeta):
54
60
  """
55
61
  Allows to compute the changes which have to be applied to the database
56
62
  to reflect the current status reported by the external transfertool into
@@ -61,34 +67,34 @@ class TransferStatusReport(object, metaclass=ABCMeta):
61
67
  'state',
62
68
  ]
63
69
 
64
- def __init__(self, request_id, request=None):
70
+ def __init__(self, request_id: str, request: Optional[dict[str, Any]] = None):
65
71
  self.request_id = request_id
66
72
  self.__request = request # Optional: DB request. If provided, saves us a database call to fetch it by request_id
67
73
  self.__initialized = False
68
74
 
69
- # Supported db fields bellow
75
+ # Supported db fields below
70
76
  self.state = None
71
77
 
72
78
  @abstractmethod
73
- def initialize(self, session, logger=logging.log):
79
+ def initialize(self, session: "Session", logger: "LoggerFunction" = logging.log) -> None:
74
80
  """
75
81
  Initialize all fields from self.supported_update_fields
76
82
  """
77
83
  pass
78
84
 
79
85
  @abstractmethod
80
- def get_monitor_msg_fields(self, session, logger=logging.log):
86
+ def get_monitor_msg_fields(self, session: "Session", logger: "LoggerFunction" = logging.log) -> dict[str, Any]:
81
87
  """
82
88
  Return the fields which will be included in the message sent to hermes.
83
89
  """
84
90
  pass
85
91
 
86
- def ensure_initialized(self, session, logger=logging.log):
92
+ def ensure_initialized(self, session: "Session", logger: "LoggerFunction" = logging.log) -> None:
87
93
  if not self.__initialized:
88
94
  self.initialize(session, logger)
89
95
  self.__initialized = True
90
96
 
91
- def request(self, session):
97
+ def request(self, session: "Session") -> Optional[dict[str, Any]]:
92
98
  """
93
99
  Fetch the request by request_id if needed.
94
100
  """
@@ -96,7 +102,7 @@ class TransferStatusReport(object, metaclass=ABCMeta):
96
102
  self.__request = get_request(self.request_id, session=session)
97
103
  return self.__request
98
104
 
99
- def get_db_fields_to_update(self, session, logger=logging.log):
105
+ def get_db_fields_to_update(self, session: "Session", logger: "LoggerFunction" = logging.log) -> dict[str, Any]:
100
106
  """
101
107
  Returns the fields which have to be updated in the request
102
108
  """
@@ -110,15 +116,16 @@ class TransferStatusReport(object, metaclass=ABCMeta):
110
116
  return updates
111
117
 
112
118
 
113
- class Transfertool(object, metaclass=ABCMeta):
119
+ class Transfertool(metaclass=ABCMeta):
114
120
  """
115
121
  Interface definition of the Rucio transfertool
116
122
  """
117
123
 
118
124
  external_name = ''
119
- required_rse_attrs = ('globus_endpoint_id', )
125
+ required_rse_attrs = ()
126
+ supported_schemes = set(SUPPORTED_PROTOCOLS).difference(('magnet', ))
120
127
 
121
- def __init__(self, external_host, logger=logging.log):
128
+ def __init__(self, external_host: str, logger: "LoggerFunction" = logging.log):
122
129
  """
123
130
  Initializes the transfertool
124
131
 
@@ -132,7 +139,7 @@ class Transfertool(object, metaclass=ABCMeta):
132
139
  return self.external_host if self.external_host is not None else self.__class__.__name__
133
140
 
134
141
  @classmethod
135
- def can_perform_transfer(cls, source_rse: "RseData", dest_rse: "RseData"):
142
+ def can_perform_transfer(cls, source_rse: "RseData", dest_rse: "RseData") -> bool:
136
143
  """
137
144
  Return True if this transfertool is able to perform a transfer between the given source and destination rses
138
145
  """
@@ -144,12 +151,13 @@ class Transfertool(object, metaclass=ABCMeta):
144
151
  return False
145
152
 
146
153
  @classmethod
147
- def submission_builder_for_path(cls, transfer_path, logger=logging.log):
154
+ @abstractmethod
155
+ def submission_builder_for_path(cls, transfer_path: list["DirectTransfer"], logger: "LoggerFunction" = logging.log) -> tuple[list["DirectTransfer"], Optional["TransferToolBuilder"]]:
148
156
  """
149
157
  Analyze the transfer path. If this transfertool class can submit the given transfers, return
150
158
  a TransferToolBuilder instance capable to build transfertool objects configured for this
151
159
  particular submission.
152
- :param transfer_path: List of DirectTransferDefinitions
160
+ :param transfer_path: List of DirectTransfer
153
161
  :param logger: logger instance
154
162
  :return: a tuple: a sub-path starting at the first node from transfer_path, and a TransfertoolBuilder instance
155
163
  capable to submit this sub-path. Returns ([], None) if submission is impossible.
@@ -157,7 +165,8 @@ class Transfertool(object, metaclass=ABCMeta):
157
165
  pass
158
166
 
159
167
  @abstractmethod
160
- def group_into_submit_jobs(self, transfer_paths):
168
+ @abstractmethod
169
+ def group_into_submit_jobs(self, transfer_paths: "Iterable[list[DirectTransfer]]") -> list[dict[str, Any]]:
161
170
  """
162
171
  Takes an iterable over transfer paths, and create groups which can be submitted in one call to submit()
163
172
 
@@ -167,7 +176,7 @@ class Transfertool(object, metaclass=ABCMeta):
167
176
  pass
168
177
 
169
178
  @abstractmethod
170
- def submit(self, transfers, job_params, timeout=None):
179
+ def submit(self, transfers: "Iterable[DirectTransfer]", job_params: dict[str, str], timeout: Optional[int] = None) -> str:
171
180
  """
172
181
  Submit transfers to the transfertool.
173
182
 
@@ -179,7 +188,7 @@ class Transfertool(object, metaclass=ABCMeta):
179
188
  pass
180
189
 
181
190
  @abstractmethod
182
- def bulk_query(self, requests_by_eid, timeout=None) -> dict[str, dict[str, TransferStatusReport]]:
191
+ def bulk_query(self, requests_by_eid: "Mapping[str, Mapping[str, Any]]", timeout: Optional[int] = None) -> dict[str, dict[str, TransferStatusReport]]:
183
192
  """
184
193
  Query the status of a bulk of transfers in FTS3 via JSON.
185
194
 
@@ -189,7 +198,7 @@ class Transfertool(object, metaclass=ABCMeta):
189
198
  pass
190
199
 
191
200
  @abstractmethod
192
- def cancel(self, transfer_ids, timeout=None):
201
+ def cancel(self, transfer_ids: "Sequence[str]", timeout: Optional[int] = None) -> None:
193
202
  """
194
203
  Cancel transfers that have been submitted to the transfertool.
195
204
 
@@ -200,7 +209,7 @@ class Transfertool(object, metaclass=ABCMeta):
200
209
  pass
201
210
 
202
211
  @abstractmethod
203
- def update_priority(self, transfer_id, priority, timeout=None):
212
+ def update_priority(self, transfer_id: str, priority: int, timeout: Optional[int] = None) -> Any:
204
213
  """
205
214
  Update the priority of a transfer that has been submitted to the transfertool.
206
215
 
rucio/vcsversion.py CHANGED
@@ -4,8 +4,8 @@ This file is automatically generated; Do not edit it. :)
4
4
  '''
5
5
  VERSION_INFO = {
6
6
  'final': True,
7
- 'version': '32.8.6',
8
- 'branch_nick': 'release-32-LTS',
9
- 'revision_id': 'ce0d5e6a899547293697ca2d6b5f6d40467c9d8e',
10
- 'revno': 12667
7
+ 'version': '35.8.0',
8
+ 'branch_nick': 'release-35-LTS',
9
+ 'revision_id': '8a304950325b8afa9499d3acccb176ef7f93fd07',
10
+ 'revno': 13205
11
11
  }
rucio/version.py CHANGED
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,34 +12,27 @@
13
12
  # See the License for the specific language governing permissions and
14
13
  # limitations under the License.
15
14
 
16
- try:
17
- from rucio.vcsversion import VERSION_INFO
18
- except ImportError:
19
- VERSION_INFO = {'branch_nick': 'LOCALBRANCH', # NOQA
20
- 'revision_id': 'LOCALREVISION',
21
- 'version': 'VERSION',
22
- 'final': False,
23
- 'revno': 0}
15
+ from rucio.vcsversion import VERSION_INFO
24
16
 
25
17
  RUCIO_VERSION = [VERSION_INFO['version'], ]
26
18
  FINAL = VERSION_INFO['final'] # This becomes true at Release Candidate time
27
19
 
28
20
 
29
- def canonical_version_string():
21
+ def canonical_version_string() -> str:
30
22
  """ Get the canonical string """
31
23
  return '.'.join(filter(None, RUCIO_VERSION))
32
24
 
33
25
 
34
- def version_string():
26
+ def version_string() -> str:
35
27
  """ Get the version string """
36
28
  return canonical_version_string()
37
29
 
38
30
 
39
- def vcs_version_string():
31
+ def vcs_version_string() -> str:
40
32
  """ Get the VCS version string """
41
33
  return "%s:%s" % (VERSION_INFO['branch_nick'], VERSION_INFO['revision_id'])
42
34
 
43
35
 
44
- def version_string_with_vcs():
36
+ def version_string_with_vcs() -> str:
45
37
  """ Get the version string with VCS """
46
38
  return "%s-%s" % (canonical_version_string(), vcs_version_string())
rucio/web/__init__.py CHANGED
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -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");
@@ -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");
@@ -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");
@@ -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");
@@ -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,21 +12,24 @@
13
12
  # See the License for the specific language governing permissions and
14
13
  # limitations under the License.
15
14
 
15
+ from typing import TYPE_CHECKING
16
+
16
17
  from flask import Flask, request
17
18
 
18
- from rucio.api.account_limit import set_local_account_limit, delete_local_account_limit, set_global_account_limit, \
19
- delete_global_account_limit
20
- from rucio.common.exception import RSENotFound, AccessDenied, AccountNotFound
19
+ from rucio.common.exception import AccessDenied, AccountNotFound, RSENotFound
20
+ from rucio.gateway.account_limit import delete_global_account_limit, delete_local_account_limit, set_global_account_limit, set_local_account_limit
21
21
  from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
22
- from rucio.web.rest.flaskapi.v1.common import response_headers, ErrorHandlingMethodView, \
23
- generate_http_error_flask, json_parameters, param_get
22
+ from rucio.web.rest.flaskapi.v1.common import ErrorHandlingMethodView, generate_http_error_flask, json_parameters, param_get, response_headers
23
+
24
+ if TYPE_CHECKING:
25
+ from flask.typing import ResponseReturnValue
24
26
 
25
27
 
26
28
  class LocalAccountLimit(ErrorHandlingMethodView):
27
- def post(self, account, rse):
29
+ def post(self, account: str, rse: str) -> 'ResponseReturnValue':
28
30
  """
29
31
  ---
30
- summary: Create or update a local accont limit
32
+ summary: Create or update a local account limit
31
33
  tags:
32
34
  - Account Limit
33
35
  parameters:
@@ -78,7 +80,7 @@ class LocalAccountLimit(ErrorHandlingMethodView):
78
80
 
79
81
  return 'Created', 201
80
82
 
81
- def delete(self, account, rse):
83
+ def delete(self, account: str, rse: str) -> 'ResponseReturnValue':
82
84
  """
83
85
  ---
84
86
  summary: Delete a local account limit
@@ -116,7 +118,7 @@ class LocalAccountLimit(ErrorHandlingMethodView):
116
118
 
117
119
 
118
120
  class GlobalAccountLimit(ErrorHandlingMethodView):
119
- def post(self, account, rse_expression):
121
+ def post(self, account: str, rse_expression: str) -> 'ResponseReturnValue':
120
122
  """
121
123
  ---
122
124
  summary: Create or update a global account limit
@@ -176,7 +178,7 @@ class GlobalAccountLimit(ErrorHandlingMethodView):
176
178
 
177
179
  return 'Created', 201
178
180
 
179
- def delete(self, account, rse_expression):
181
+ def delete(self, account: str, rse_expression: str) -> 'ResponseReturnValue':
180
182
  """
181
183
  ---
182
184
  summary: Delete a global account limit
@@ -213,7 +215,7 @@ class GlobalAccountLimit(ErrorHandlingMethodView):
213
215
  return '', 200
214
216
 
215
217
 
216
- def blueprint(with_doc=False):
218
+ def blueprint(with_doc: bool = False) -> AuthenticatedBlueprint:
217
219
  bp = AuthenticatedBlueprint('accountlimits', __name__, url_prefix='/accountlimits')
218
220
 
219
221
  local_account_limit_view = LocalAccountLimit.as_view('local_account_limit')
@@ -227,7 +229,7 @@ def blueprint(with_doc=False):
227
229
  return bp
228
230
 
229
231
 
230
- def make_doc():
232
+ def make_doc() -> Flask:
231
233
  """ Only used for sphinx documentation """
232
234
  doc_app = Flask(__name__)
233
235
  doc_app.register_blueprint(blueprint(with_doc=True))