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,27 +12,40 @@
13
12
  # See the License for the specific language governing permissions and
14
13
  # limitations under the License.
15
14
 
15
+ from collections.abc import Iterable, Iterator, Mapping, Sequence
16
16
  from copy import deepcopy
17
- from typing import TYPE_CHECKING
17
+ from typing import TYPE_CHECKING, Any, Optional
18
18
 
19
- import rucio.api.permission
19
+ import rucio.gateway.permission
20
20
  from rucio.common.constants import RESERVED_KEYS
21
- from rucio.common.exception import RucioException
21
+ from rucio.common.exception import AccessDenied, InvalidObject, RucioException
22
22
  from rucio.common.schema import validate_schema
23
23
  from rucio.common.types import InternalAccount, InternalScope
24
- from rucio.common.utils import api_update_return_dict
25
- from rucio.core import did, naming_convention, meta as meta_core
24
+ from rucio.common.utils import gateway_update_return_dict
25
+ from rucio.core import did, naming_convention
26
+ from rucio.core import meta_conventions as meta_convention_core
26
27
  from rucio.core.rse import get_rse_id
27
28
  from rucio.db.sqla.constants import DIDType
28
29
  from rucio.db.sqla.session import read_session, stream_session, transactional_session
29
30
 
30
31
  if TYPE_CHECKING:
31
- from typing import Any, Optional
32
32
  from sqlalchemy.orm import Session
33
33
 
34
34
 
35
35
  @stream_session
36
- def list_dids(scope, filters, did_type='collection', ignore_case=False, limit=None, offset=None, long=False, recursive=False, vo='def', *, session: "Session"):
36
+ def list_dids(
37
+ scope: str,
38
+ filters: Mapping[Any, Any],
39
+ did_type: str = 'collection',
40
+ ignore_case: bool = False,
41
+ limit: Optional[int] = None,
42
+ offset: Optional[int] = None,
43
+ long: bool = False,
44
+ recursive: bool = False,
45
+ vo: str = 'def',
46
+ *,
47
+ session: "Session"
48
+ ) -> Iterator[dict[str, Any]]:
37
49
  """
38
50
  List dids in a scope.
39
51
 
@@ -48,7 +60,7 @@ def list_dids(scope, filters, did_type='collection', ignore_case=False, limit=No
48
60
  :param vo: The VO to act on.
49
61
  :param session: The database session in use.
50
62
  """
51
- scope = InternalScope(scope, vo=vo)
63
+ internal_scope = InternalScope(scope, vo=vo)
52
64
 
53
65
  # replace account and scope in filters with internal representation
54
66
  for or_group in filters:
@@ -57,15 +69,30 @@ def list_dids(scope, filters, did_type='collection', ignore_case=False, limit=No
57
69
  if 'scope' in or_group:
58
70
  or_group['account'] = InternalScope(or_group['scope'], vo=vo)
59
71
 
60
- result = did.list_dids(scope=scope, filters=filters, did_type=did_type, ignore_case=ignore_case,
72
+ result = did.list_dids(scope=internal_scope, filters=filters, did_type=did_type, ignore_case=ignore_case,
61
73
  limit=limit, offset=offset, long=long, recursive=recursive, session=session)
62
74
 
63
75
  for d in result:
64
- yield api_update_return_dict(d, session=session)
76
+ yield gateway_update_return_dict(d, session=session)
65
77
 
66
78
 
67
79
  @transactional_session
68
- def add_did(scope, name, did_type, issuer, account=None, statuses={}, meta={}, rules=[], lifetime=None, dids=[], rse=None, vo='def', *, session: "Session"):
80
+ def add_did(
81
+ scope: str,
82
+ name: str,
83
+ did_type: str,
84
+ issuer: str,
85
+ account: Optional[str] = None,
86
+ statuses: Optional[dict[str, str]] = None,
87
+ meta: Optional[dict[str, str]] = None,
88
+ rules: Optional[Sequence[dict[str, Any]]] = None,
89
+ lifetime: Optional[str] = None,
90
+ dids: Optional[Sequence[dict[str, Any]]] = None,
91
+ rse: Optional[str] = None,
92
+ vo: str = 'def',
93
+ *,
94
+ session: "Session"
95
+ ) -> None:
69
96
  """
70
97
  Add data did.
71
98
 
@@ -83,18 +110,21 @@ def add_did(scope, name, did_type, issuer, account=None, statuses={}, meta={}, r
83
110
  :param vo: The VO to act on.
84
111
  :param session: The database session in use.
85
112
  """
113
+ statuses = statuses or {}
114
+ meta = meta or {}
115
+ rules = rules or []
116
+ dids = dids or []
86
117
  v_did = {'name': name, 'type': did_type.upper(), 'scope': scope}
87
118
  validate_schema(name='did', obj=v_did, vo=vo)
88
119
  validate_schema(name='dids', obj=dids, vo=vo)
89
120
  validate_schema(name='rse', obj=rse, vo=vo)
90
121
  kwargs = {'scope': scope, 'name': name, 'type': did_type, 'issuer': issuer, 'account': account, 'statuses': statuses, 'meta': meta, 'rules': rules, 'lifetime': lifetime}
91
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='add_did', kwargs=kwargs, session=session):
92
- raise rucio.common.exception.AccessDenied('Account %s can not add data identifier to scope %s' % (issuer, scope))
122
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='add_did', kwargs=kwargs, session=session):
123
+ raise AccessDenied('Account %s can not add data identifier to scope %s' % (issuer, scope))
93
124
 
94
- if account is not None:
95
- account = InternalAccount(account, vo=vo)
96
- issuer = InternalAccount(issuer, vo=vo)
97
- scope = InternalScope(scope, vo=vo)
125
+ owner_account = None if account is None else InternalAccount(account, vo=vo)
126
+ issuer_account = InternalAccount(issuer, vo=vo)
127
+ internal_scope = InternalScope(scope, vo=vo)
98
128
  for d in dids:
99
129
  d['scope'] = InternalScope(d['scope'], vo=vo)
100
130
  for r in rules:
@@ -106,7 +136,7 @@ def add_did(scope, name, did_type, issuer, account=None, statuses={}, meta={}, r
106
136
 
107
137
  if did_type == 'DATASET':
108
138
  # naming_convention validation
109
- extra_meta = naming_convention.validate_name(scope=scope, name=name, did_type='D', session=session)
139
+ extra_meta = naming_convention.validate_name(scope=internal_scope, name=name, did_type='D', session=session)
110
140
 
111
141
  # merge extra_meta with meta
112
142
  for k in extra_meta or {}:
@@ -114,18 +144,24 @@ def add_did(scope, name, did_type, issuer, account=None, statuses={}, meta={}, r
114
144
  meta[k] = extra_meta[k]
115
145
  elif meta[k] != extra_meta[k]:
116
146
  print("Provided metadata %s doesn't match the naming convention: %s != %s" % (k, meta[k], extra_meta[k]))
117
- raise rucio.common.exception.InvalidObject("Provided metadata %s doesn't match the naming convention: %s != %s" % (k, meta[k], extra_meta[k]))
147
+ raise InvalidObject("Provided metadata %s doesn't match the naming convention: %s != %s" % (k, meta[k], extra_meta[k]))
118
148
 
119
149
  # Validate metadata
120
- meta_core.validate_meta(meta=meta, did_type=DIDType[did_type.upper()], session=session)
150
+ meta_convention_core.validate_meta(meta=meta, did_type=DIDType[did_type.upper()], session=session)
121
151
 
122
- return did.add_did(scope=scope, name=name, did_type=DIDType[did_type.upper()], account=account or issuer,
152
+ return did.add_did(scope=internal_scope, name=name, did_type=DIDType[did_type.upper()], account=owner_account or issuer_account,
123
153
  statuses=statuses, meta=meta, rules=rules, lifetime=lifetime,
124
154
  dids=dids, rse_id=rse_id, session=session)
125
155
 
126
156
 
127
157
  @transactional_session
128
- def add_dids(dids, issuer, vo='def', *, session: "Session"):
158
+ def add_dids(
159
+ dids: Sequence[dict[str, Any]],
160
+ issuer: str,
161
+ vo: str = 'def',
162
+ *,
163
+ session: "Session"
164
+ ) -> None:
129
165
  """
130
166
  Bulk Add did.
131
167
 
@@ -142,10 +178,10 @@ def add_dids(dids, issuer, vo='def', *, session: "Session"):
142
178
  d['rse_id'] = rse_id
143
179
 
144
180
  kwargs = {'issuer': issuer, 'dids': dids}
145
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='add_dids', kwargs=kwargs, session=session):
146
- raise rucio.common.exception.AccessDenied('Account %s can not bulk add data identifier' % (issuer))
181
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='add_dids', kwargs=kwargs, session=session):
182
+ raise AccessDenied('Account %s can not bulk add data identifier' % (issuer))
147
183
 
148
- issuer = InternalAccount(issuer, vo=vo)
184
+ issuer_account = InternalAccount(issuer, vo=vo)
149
185
  for d in dids:
150
186
  d['scope'] = InternalScope(d['scope'], vo=vo)
151
187
  if 'account' in d.keys():
@@ -153,11 +189,19 @@ def add_dids(dids, issuer, vo='def', *, session: "Session"):
153
189
  if 'dids' in d.keys():
154
190
  for child in d['dids']:
155
191
  child['scope'] = InternalScope(child['scope'], vo=vo)
156
- return did.add_dids(dids, account=issuer, session=session)
192
+ return did.add_dids(dids, account=issuer_account, session=session)
157
193
 
158
194
 
159
195
  @transactional_session
160
- def attach_dids(scope, name, attachment, issuer, vo='def', *, session: "Session"):
196
+ def attach_dids(
197
+ scope: str,
198
+ name: str,
199
+ attachment: dict[str, Any],
200
+ issuer: str,
201
+ vo='def',
202
+ *,
203
+ session: "Session"
204
+ ) -> None:
161
205
  """
162
206
  Append content to data did.
163
207
 
@@ -175,11 +219,11 @@ def attach_dids(scope, name, attachment, issuer, vo='def', *, session: "Session"
175
219
  attachment['rse_id'] = rse_id
176
220
 
177
221
  kwargs = {'scope': scope, 'name': name, 'attachment': attachment}
178
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='attach_dids', kwargs=kwargs, session=session):
179
- raise rucio.common.exception.AccessDenied('Account %s can not add data identifiers to %s:%s' % (issuer, scope, name))
222
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='attach_dids', kwargs=kwargs, session=session):
223
+ raise AccessDenied('Account %s can not add data identifiers to %s:%s' % (issuer, scope, name))
180
224
 
181
- scope = InternalScope(scope, vo=vo)
182
- issuer = InternalAccount(issuer, vo=vo)
225
+ internal_scope = InternalScope(scope, vo=vo)
226
+ issuer_account = InternalAccount(issuer, vo=vo)
183
227
  if 'account' in attachment.keys():
184
228
  attachment['account'] = InternalAccount(attachment['account'], vo=vo)
185
229
  for d in attachment['dids']:
@@ -188,17 +232,24 @@ def attach_dids(scope, name, attachment, issuer, vo='def', *, session: "Session"
188
232
  d['account'] = InternalAccount(d['account'], vo=vo)
189
233
 
190
234
  if rse_id is not None:
191
- dids = did.attach_dids(scope=scope, name=name, dids=attachment['dids'],
192
- account=attachment.get('account', issuer), rse_id=rse_id, session=session)
235
+ dids = did.attach_dids(scope=internal_scope, name=name, dids=attachment['dids'],
236
+ account=attachment.get('account', issuer_account), rse_id=rse_id, session=session)
193
237
  else:
194
- dids = did.attach_dids(scope=scope, name=name, dids=attachment['dids'],
195
- account=attachment.get('account', issuer), session=session)
238
+ dids = did.attach_dids(scope=internal_scope, name=name, dids=attachment['dids'],
239
+ account=attachment.get('account', issuer_account), session=session)
196
240
 
197
241
  return dids
198
242
 
199
243
 
200
244
  @transactional_session
201
- def attach_dids_to_dids(attachments, issuer, ignore_duplicate=False, vo='def', *, session: "Session"):
245
+ def attach_dids_to_dids(
246
+ attachments: Sequence[dict[str, Any]],
247
+ issuer: str,
248
+ ignore_duplicate: bool = False,
249
+ vo: str = 'def',
250
+ *,
251
+ session: "Session"
252
+ ) -> None:
202
253
  """
203
254
  Append content to dids.
204
255
 
@@ -217,10 +268,10 @@ def attach_dids_to_dids(attachments, issuer, ignore_duplicate=False, vo='def', *
217
268
  rse_id = get_rse_id(rse=a['rse'], vo=vo, session=session)
218
269
  a['rse_id'] = rse_id
219
270
 
220
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='attach_dids_to_dids', kwargs={'attachments': attachments}, session=session):
221
- raise rucio.common.exception.AccessDenied('Account %s can not add data identifiers' % (issuer))
271
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='attach_dids_to_dids', kwargs={'attachments': attachments}, session=session):
272
+ raise AccessDenied('Account %s can not add data identifiers' % (issuer))
222
273
 
223
- issuer = InternalAccount(issuer, vo=vo)
274
+ issuer_account = InternalAccount(issuer, vo=vo)
224
275
  for attachment in attachments:
225
276
  attachment['scope'] = InternalScope(attachment['scope'], vo=vo)
226
277
  for d in attachment['dids']:
@@ -228,12 +279,20 @@ def attach_dids_to_dids(attachments, issuer, ignore_duplicate=False, vo='def', *
228
279
  if 'account' in d.keys():
229
280
  d['account'] = InternalAccount(d['account'], vo=vo)
230
281
 
231
- return did.attach_dids_to_dids(attachments=attachments, account=issuer,
282
+ return did.attach_dids_to_dids(attachments=attachments, account=issuer_account,
232
283
  ignore_duplicate=ignore_duplicate, session=session)
233
284
 
234
285
 
235
286
  @transactional_session
236
- def detach_dids(scope, name, dids, issuer, vo='def', *, session: "Session"):
287
+ def detach_dids(
288
+ scope: str,
289
+ name: str,
290
+ dids: Sequence[dict[str, Any]],
291
+ issuer: str,
292
+ vo: str = 'def',
293
+ *,
294
+ session: "Session"
295
+ ) -> None:
237
296
  """
238
297
  Detach data identifier
239
298
 
@@ -245,18 +304,26 @@ def detach_dids(scope, name, dids, issuer, vo='def', *, session: "Session"):
245
304
  :param session: The database session in use.
246
305
  """
247
306
  kwargs = {'scope': scope, 'name': name, 'dids': dids, 'issuer': issuer}
248
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='detach_dids', kwargs=kwargs, session=session):
249
- raise rucio.common.exception.AccessDenied('Account %s can not detach data identifiers from %s:%s' % (issuer, scope, name))
307
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='detach_dids', kwargs=kwargs, session=session):
308
+ raise AccessDenied('Account %s can not detach data identifiers from %s:%s' % (issuer, scope, name))
250
309
 
251
- scope = InternalScope(scope, vo=vo)
310
+ internal_scope = InternalScope(scope, vo=vo)
252
311
  for d in dids:
253
312
  d['scope'] = InternalScope(d['scope'], vo=vo)
254
313
 
255
- return did.detach_dids(scope=scope, name=name, dids=dids, session=session)
314
+ return did.detach_dids(scope=internal_scope, name=name, dids=dids, session=session)
256
315
 
257
316
 
258
317
  @stream_session
259
- def list_new_dids(did_type=None, thread=None, total_threads=None, chunk_size=1000, vo='def', *, session: "Session"):
318
+ def list_new_dids(
319
+ did_type: Optional[str] = None,
320
+ thread: Optional[int] = None,
321
+ total_threads: Optional[int] = None,
322
+ chunk_size: int = 1000,
323
+ vo: str = 'def',
324
+ *,
325
+ session: "Session"
326
+ ) -> Iterator[dict[str, Any]]:
260
327
  """
261
328
  List recent identifiers.
262
329
 
@@ -270,11 +337,17 @@ def list_new_dids(did_type=None, thread=None, total_threads=None, chunk_size=100
270
337
  dids = did.list_new_dids(did_type=did_type and DIDType[did_type.upper()], thread=thread, total_threads=total_threads, chunk_size=chunk_size, session=session)
271
338
  for d in dids:
272
339
  if d['scope'].vo == vo:
273
- yield api_update_return_dict(d, session=session)
340
+ yield gateway_update_return_dict(d, session=session)
274
341
 
275
342
 
276
343
  @transactional_session
277
- def set_new_dids(dids, new_flag=True, vo='def', *, session: "Session"):
344
+ def set_new_dids(
345
+ dids: Sequence[dict[str, Any]],
346
+ new_flag: bool = True,
347
+ vo: str = 'def',
348
+ *,
349
+ session: "Session"
350
+ ) -> bool:
278
351
  """
279
352
  Set/reset the flag new
280
353
 
@@ -291,7 +364,13 @@ def set_new_dids(dids, new_flag=True, vo='def', *, session: "Session"):
291
364
 
292
365
 
293
366
  @stream_session
294
- def list_content(scope, name, vo='def', *, session: "Session"):
367
+ def list_content(
368
+ scope: str,
369
+ name: str,
370
+ vo: str = 'def',
371
+ *,
372
+ session: "Session"
373
+ ) -> Iterator[dict[str, Any]]:
295
374
  """
296
375
  List data identifier contents.
297
376
 
@@ -301,15 +380,21 @@ def list_content(scope, name, vo='def', *, session: "Session"):
301
380
  :param session: The database session in use.
302
381
  """
303
382
 
304
- scope = InternalScope(scope, vo=vo)
383
+ internal_scope = InternalScope(scope, vo=vo)
305
384
 
306
- dids = did.list_content(scope=scope, name=name, session=session)
385
+ dids = did.list_content(scope=internal_scope, name=name, session=session)
307
386
  for d in dids:
308
- yield api_update_return_dict(d, session=session)
387
+ yield gateway_update_return_dict(d, session=session)
309
388
 
310
389
 
311
390
  @stream_session
312
- def list_content_history(scope, name, vo='def', *, session: "Session"):
391
+ def list_content_history(
392
+ scope: str,
393
+ name: str,
394
+ vo='def',
395
+ *,
396
+ session: "Session"
397
+ ) -> Iterator[dict[str, Any]]:
313
398
  """
314
399
  List data identifier contents history.
315
400
 
@@ -319,16 +404,47 @@ def list_content_history(scope, name, vo='def', *, session: "Session"):
319
404
  :param session: The database session in use.
320
405
  """
321
406
 
322
- scope = InternalScope(scope, vo=vo)
407
+ internal_scope = InternalScope(scope, vo=vo)
323
408
 
324
- dids = did.list_content_history(scope=scope, name=name, session=session)
409
+ dids = did.list_content_history(scope=internal_scope, name=name, session=session)
325
410
 
326
411
  for d in dids:
327
- yield api_update_return_dict(d, session=session)
412
+ yield gateway_update_return_dict(d, session=session)
328
413
 
329
414
 
330
415
  @stream_session
331
- def list_files(scope, name, long, vo='def', *, session: "Session"):
416
+ def bulk_list_files(
417
+ dids: Iterable[dict[str, Any]],
418
+ long: bool = False,
419
+ vo: str = 'def',
420
+ *,
421
+ session: "Session"
422
+ ) -> Iterator[dict[str, Any]]:
423
+ """
424
+ List file contents of a list of data identifiers.
425
+
426
+ :param dids: A list of DIDs.
427
+ :param long: A boolean to choose if more metadata are returned or not.
428
+ :param vo: The VO to act on.
429
+ :param session: The database session in use.
430
+ """
431
+
432
+ for did_ in dids:
433
+ did_['scope'] = InternalScope(did_['scope'], vo=vo)
434
+
435
+ for file_ in did.bulk_list_files(dids=dids, long=long, session=session):
436
+ yield gateway_update_return_dict(file_, session=session)
437
+
438
+
439
+ @stream_session
440
+ def list_files(
441
+ scope: str,
442
+ name: str,
443
+ long: bool,
444
+ vo: str = 'def',
445
+ *,
446
+ session: "Session"
447
+ ) -> Iterator[dict[str, Any]]:
332
448
  """
333
449
  List data identifier file contents.
334
450
 
@@ -339,16 +455,23 @@ def list_files(scope, name, long, vo='def', *, session: "Session"):
339
455
  :param session: The database session in use.
340
456
  """
341
457
 
342
- scope = InternalScope(scope, vo=vo)
458
+ internal_scope = InternalScope(scope, vo=vo)
343
459
 
344
- dids = did.list_files(scope=scope, name=name, long=long, session=session)
460
+ dids = did.list_files(scope=internal_scope, name=name, long=long, session=session)
345
461
 
346
462
  for d in dids:
347
- yield api_update_return_dict(d, session=session)
463
+ yield gateway_update_return_dict(d, session=session)
348
464
 
349
465
 
350
466
  @stream_session
351
- def scope_list(scope, name=None, recursive=False, vo='def', *, session: "Session"):
467
+ def scope_list(
468
+ scope: str,
469
+ name: Optional[str] = None,
470
+ recursive: bool = False,
471
+ vo: str = 'def',
472
+ *,
473
+ session: "Session"
474
+ ) -> Iterator[dict[str, Any]]:
352
475
  """
353
476
  List data identifiers in a scope.
354
477
 
@@ -359,9 +482,9 @@ def scope_list(scope, name=None, recursive=False, vo='def', *, session: "Session
359
482
  :param session: The database session in use.
360
483
  """
361
484
 
362
- scope = InternalScope(scope, vo=vo)
485
+ internal_scope = InternalScope(scope, vo=vo)
363
486
 
364
- dids = did.scope_list(scope, name=name, recursive=recursive, session=session)
487
+ dids = did.scope_list(internal_scope, name=name, recursive=recursive, session=session)
365
488
 
366
489
  for d in dids:
367
490
  ret_did = deepcopy(d)
@@ -372,7 +495,7 @@ def scope_list(scope, name=None, recursive=False, vo='def', *, session: "Session
372
495
 
373
496
 
374
497
  @read_session
375
- def get_did(scope: str, name: str, dynamic_depth: "Optional[DIDType]" = None, vo: str = 'def', *, session: "Session") -> "dict[str, Any]":
498
+ def get_did(scope: str, name: str, dynamic_depth: Optional[DIDType] = None, vo: str = 'def', *, session: "Session") -> "dict[str, Any]":
376
499
  """
377
500
  Retrieve a single data did.
378
501
 
@@ -386,14 +509,24 @@ def get_did(scope: str, name: str, dynamic_depth: "Optional[DIDType]" = None, vo
386
509
  :param session: The database session in use.
387
510
  """
388
511
 
389
- scope = InternalScope(scope, vo=vo)
512
+ internal_scope = InternalScope(scope, vo=vo)
390
513
 
391
- d = did.get_did(scope=scope, name=name, dynamic_depth=dynamic_depth, session=session)
392
- return api_update_return_dict(d, session=session)
514
+ d = did.get_did(scope=internal_scope, name=name, dynamic_depth=dynamic_depth, session=session)
515
+ return gateway_update_return_dict(d, session=session)
393
516
 
394
517
 
395
518
  @transactional_session
396
- def set_metadata(scope, name, key, value, issuer, recursive=False, vo='def', *, session: "Session"):
519
+ def set_metadata(
520
+ scope: str,
521
+ name: str,
522
+ key: str,
523
+ value: Any,
524
+ issuer: str,
525
+ recursive: bool = False,
526
+ vo: str = 'def',
527
+ *,
528
+ session: "Session"
529
+ ) -> None:
397
530
  """
398
531
  Add metadata to data did.
399
532
 
@@ -409,17 +542,26 @@ def set_metadata(scope, name, key, value, issuer, recursive=False, vo='def', *,
409
542
  kwargs = {'scope': scope, 'name': name, 'key': key, 'value': value, 'issuer': issuer}
410
543
 
411
544
  if key in RESERVED_KEYS:
412
- raise rucio.common.exception.AccessDenied('Account %s can not change this metadata value to data identifier %s:%s' % (issuer, scope, name))
545
+ raise AccessDenied('Account %s can not change this metadata value to data identifier %s:%s' % (issuer, scope, name))
413
546
 
414
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='set_metadata', kwargs=kwargs, session=session):
415
- raise rucio.common.exception.AccessDenied('Account %s can not add metadata to data identifier %s:%s' % (issuer, scope, name))
547
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='set_metadata', kwargs=kwargs, session=session):
548
+ raise AccessDenied('Account %s can not add metadata to data identifier %s:%s' % (issuer, scope, name))
416
549
 
417
- scope = InternalScope(scope, vo=vo)
418
- return did.set_metadata(scope=scope, name=name, key=key, value=value, recursive=recursive, session=session)
550
+ internal_scope = InternalScope(scope, vo=vo)
551
+ return did.set_metadata(scope=internal_scope, name=name, key=key, value=value, recursive=recursive, session=session)
419
552
 
420
553
 
421
554
  @transactional_session
422
- def set_metadata_bulk(scope, name, meta, issuer, recursive=False, vo='def', *, session: "Session"):
555
+ def set_metadata_bulk(
556
+ scope: str,
557
+ name: str,
558
+ meta: dict[str, Any],
559
+ issuer: str,
560
+ recursive: bool = False,
561
+ vo: str = 'def',
562
+ *,
563
+ session: "Session"
564
+ ) -> None:
423
565
  """
424
566
  Add metadata to data did.
425
567
 
@@ -435,17 +577,24 @@ def set_metadata_bulk(scope, name, meta, issuer, recursive=False, vo='def', *, s
435
577
 
436
578
  for key in meta:
437
579
  if key in RESERVED_KEYS:
438
- raise rucio.common.exception.AccessDenied('Account %s can not change the value of the metadata key %s to data identifier %s:%s' % (issuer, key, scope, name))
580
+ raise AccessDenied('Account %s can not change the value of the metadata key %s to data identifier %s:%s' % (issuer, key, scope, name))
439
581
 
440
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='set_metadata_bulk', kwargs=kwargs, session=session):
441
- raise rucio.common.exception.AccessDenied('Account %s can not add metadata to data identifier %s:%s' % (issuer, scope, name))
582
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='set_metadata_bulk', kwargs=kwargs, session=session):
583
+ raise AccessDenied('Account %s can not add metadata to data identifier %s:%s' % (issuer, scope, name))
442
584
 
443
- scope = InternalScope(scope, vo=vo)
444
- return did.set_metadata_bulk(scope=scope, name=name, meta=meta, recursive=recursive, session=session)
585
+ internal_scope = InternalScope(scope, vo=vo)
586
+ return did.set_metadata_bulk(scope=internal_scope, name=name, meta=meta, recursive=recursive, session=session)
445
587
 
446
588
 
447
589
  @transactional_session
448
- def set_dids_metadata_bulk(dids, issuer, recursive=False, vo='def', *, session: "Session"):
590
+ def set_dids_metadata_bulk(
591
+ dids: Iterable[dict[str, Any]],
592
+ issuer: str,
593
+ recursive: bool = False,
594
+ vo: str = 'def',
595
+ *,
596
+ session: "Session"
597
+ ) -> None:
449
598
  """
450
599
  Add metadata to a list of data identifiers.
451
600
 
@@ -458,19 +607,26 @@ def set_dids_metadata_bulk(dids, issuer, recursive=False, vo='def', *, session:
458
607
 
459
608
  for entry in dids:
460
609
  kwargs = {'scope': entry['scope'], 'name': entry['name'], 'meta': entry['meta'], 'issuer': issuer}
461
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='set_metadata_bulk', kwargs=kwargs, session=session):
462
- raise rucio.common.exception.AccessDenied('Account %s can not add metadata to data identifier %s:%s' % (issuer, entry['scope'], entry['name']))
610
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='set_metadata_bulk', kwargs=kwargs, session=session):
611
+ raise AccessDenied('Account %s can not add metadata to data identifier %s:%s' % (issuer, entry['scope'], entry['name']))
463
612
  entry['scope'] = InternalScope(entry['scope'], vo=vo)
464
613
  meta = entry['meta']
465
614
  for key in meta:
466
615
  if key in RESERVED_KEYS:
467
- raise rucio.common.exception.AccessDenied('Account %s can not change the value of the metadata key %s to data identifier %s:%s' % (issuer, key, entry['scope'], entry['name']))
616
+ raise AccessDenied('Account %s can not change the value of the metadata key %s to data identifier %s:%s' % (issuer, key, entry['scope'], entry['name']))
468
617
 
469
618
  return did.set_dids_metadata_bulk(dids=dids, recursive=recursive, session=session)
470
619
 
471
620
 
472
621
  @read_session
473
- def get_metadata(scope, name, plugin='DID_COLUMN', vo='def', *, session: "Session"):
622
+ def get_metadata(
623
+ scope: str,
624
+ name: str,
625
+ plugin: str = 'DID_COLUMN',
626
+ vo: str = 'def',
627
+ *,
628
+ session: "Session"
629
+ ) -> dict[str, Any]:
474
630
  """
475
631
  Get data identifier metadata
476
632
 
@@ -480,14 +636,20 @@ def get_metadata(scope, name, plugin='DID_COLUMN', vo='def', *, session: "Sessio
480
636
  :param session: The database session in use.
481
637
  """
482
638
 
483
- scope = InternalScope(scope, vo=vo)
639
+ internal_scope = InternalScope(scope, vo=vo)
484
640
 
485
- d = did.get_metadata(scope=scope, name=name, plugin=plugin, session=session)
486
- return api_update_return_dict(d, session=session)
641
+ d = did.get_metadata(scope=internal_scope, name=name, plugin=plugin, session=session)
642
+ return gateway_update_return_dict(d, session=session)
487
643
 
488
644
 
489
645
  @stream_session
490
- def get_metadata_bulk(dids, inherit=False, vo='def', *, session: "Session"):
646
+ def get_metadata_bulk(
647
+ dids: Iterable[dict[str, Any]],
648
+ inherit: bool = False,
649
+ vo: str = 'def',
650
+ *,
651
+ session: "Session"
652
+ ) -> Iterator[dict[str, Any]]:
491
653
  """
492
654
  Get metadata for a list of dids
493
655
  :param dids: A list of dids.
@@ -501,11 +663,18 @@ def get_metadata_bulk(dids, inherit=False, vo='def', *, session: "Session"):
501
663
  entry['scope'] = InternalScope(entry['scope'], vo=vo)
502
664
  meta = did.get_metadata_bulk(dids, inherit=inherit, session=session)
503
665
  for met in meta:
504
- yield api_update_return_dict(met, session=session)
666
+ yield gateway_update_return_dict(met, session=session)
505
667
 
506
668
 
507
669
  @transactional_session
508
- def delete_metadata(scope, name, key, vo='def', *, session: "Session"):
670
+ def delete_metadata(
671
+ scope: str,
672
+ name: str,
673
+ key: str,
674
+ vo: str = 'def',
675
+ *,
676
+ session: "Session"
677
+ ) -> None:
509
678
  """
510
679
  Delete a key from the metadata column
511
680
 
@@ -516,12 +685,20 @@ def delete_metadata(scope, name, key, vo='def', *, session: "Session"):
516
685
  :param session: The database session in use.
517
686
  """
518
687
 
519
- scope = InternalScope(scope, vo=vo)
520
- return did.delete_metadata(scope=scope, name=name, key=key, session=session)
688
+ internal_scope = InternalScope(scope, vo=vo)
689
+ return did.delete_metadata(scope=internal_scope, name=name, key=key, session=session)
521
690
 
522
691
 
523
692
  @transactional_session
524
- def set_status(scope, name, issuer, vo='def', *, session: "Session", **kwargs):
693
+ def set_status(
694
+ scope: str,
695
+ name: str,
696
+ issuer: str,
697
+ vo: str = 'def',
698
+ *,
699
+ session: "Session",
700
+ **kwargs
701
+ ) -> None:
525
702
  """
526
703
  Set data identifier status
527
704
 
@@ -533,16 +710,21 @@ def set_status(scope, name, issuer, vo='def', *, session: "Session", **kwargs):
533
710
  :param session: The database session in use.
534
711
  """
535
712
 
536
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='set_status', kwargs={'scope': scope, 'name': name, 'issuer': issuer}, session=session):
537
- raise rucio.common.exception.AccessDenied('Account %s can not set status on data identifier %s:%s' % (issuer, scope, name))
713
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='set_status', kwargs={'scope': scope, 'name': name, 'issuer': issuer}, session=session):
714
+ raise AccessDenied('Account %s can not set status on data identifier %s:%s' % (issuer, scope, name))
538
715
 
539
- scope = InternalScope(scope, vo=vo)
716
+ internal_scope = InternalScope(scope, vo=vo)
540
717
 
541
- return did.set_status(scope=scope, name=name, session=session, **kwargs)
718
+ return did.set_status(scope=internal_scope, name=name, session=session, **kwargs)
542
719
 
543
720
 
544
721
  @stream_session
545
- def get_dataset_by_guid(guid, vo='def', *, session: "Session"):
722
+ def get_dataset_by_guid(
723
+ guid: str,
724
+ vo: str = 'def',
725
+ *,
726
+ session: "Session"
727
+ ) -> Iterator[dict[str, Any]]:
546
728
  """
547
729
  Get the parent datasets for a given GUID.
548
730
  :param guid: The GUID.
@@ -556,11 +738,17 @@ def get_dataset_by_guid(guid, vo='def', *, session: "Session"):
556
738
  for d in dids:
557
739
  if d['scope'].vo != vo:
558
740
  raise RucioException('GUID unavailable on VO {}'.format(vo))
559
- yield api_update_return_dict(d, session=session)
741
+ yield gateway_update_return_dict(d, session=session)
560
742
 
561
743
 
562
744
  @stream_session
563
- def list_parent_dids(scope, name, vo='def', *, session: "Session"):
745
+ def list_parent_dids(
746
+ scope: str,
747
+ name: str,
748
+ vo: str = 'def',
749
+ *,
750
+ session: "Session"
751
+ ) -> Iterator[dict[str, Any]]:
564
752
  """
565
753
  List parent datasets and containers of a did.
566
754
 
@@ -570,16 +758,26 @@ def list_parent_dids(scope, name, vo='def', *, session: "Session"):
570
758
  :param session: The database session in use.
571
759
  """
572
760
 
573
- scope = InternalScope(scope, vo=vo)
761
+ internal_scope = InternalScope(scope, vo=vo)
574
762
 
575
- dids = did.list_parent_dids(scope=scope, name=name, session=session)
763
+ dids = did.list_parent_dids(scope=internal_scope, name=name, session=session)
576
764
 
577
765
  for d in dids:
578
- yield api_update_return_dict(d, session=session)
766
+ yield gateway_update_return_dict(d, session=session)
579
767
 
580
768
 
581
769
  @transactional_session
582
- def create_did_sample(input_scope, input_name, output_scope, output_name, issuer, nbfiles, vo='def', *, session: "Session"):
770
+ def create_did_sample(
771
+ input_scope: str,
772
+ input_name: str,
773
+ output_scope: str,
774
+ output_name: str,
775
+ issuer: str,
776
+ nbfiles: str,
777
+ vo: str = 'def',
778
+ *,
779
+ session: "Session"
780
+ ):
583
781
  """
584
782
  Create a sample from an input collection.
585
783
 
@@ -594,20 +792,26 @@ def create_did_sample(input_scope, input_name, output_scope, output_name, issuer
594
792
  :param session: The database session in use.
595
793
  """
596
794
  kwargs = {'issuer': issuer, 'scope': output_scope}
597
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='create_did_sample', kwargs=kwargs, session=session):
598
- raise rucio.common.exception.AccessDenied('Account %s can not bulk add data identifier' % (issuer))
795
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='create_did_sample', kwargs=kwargs, session=session):
796
+ raise AccessDenied('Account %s can not bulk add data identifier' % (issuer))
599
797
 
600
- input_scope = InternalScope(input_scope, vo=vo)
601
- output_scope = InternalScope(output_scope, vo=vo)
798
+ input_internal_scope = InternalScope(input_scope, vo=vo)
799
+ output_internal_scope = InternalScope(output_scope, vo=vo)
602
800
 
603
- issuer = InternalAccount(issuer, vo=vo)
801
+ issuer_account = InternalAccount(issuer, vo=vo)
604
802
 
605
- return did.create_did_sample(input_scope=input_scope, input_name=input_name, output_scope=output_scope, output_name=output_name,
606
- account=issuer, nbfiles=nbfiles, session=session)
803
+ return did.create_did_sample(input_scope=input_internal_scope, input_name=input_name, output_scope=output_internal_scope, output_name=output_name,
804
+ account=issuer_account, nbfiles=nbfiles, session=session)
607
805
 
608
806
 
609
807
  @transactional_session
610
- def resurrect(dids, issuer, vo='def', *, session: "Session"):
808
+ def resurrect(
809
+ dids: Iterable[dict[str, Any]],
810
+ issuer: str,
811
+ vo: str = 'def',
812
+ *,
813
+ session: "Session"
814
+ ) -> None:
611
815
  """
612
816
  Resurrect DIDs.
613
817
 
@@ -617,8 +821,8 @@ def resurrect(dids, issuer, vo='def', *, session: "Session"):
617
821
  :param session: The database session in use.
618
822
  """
619
823
  kwargs = {'issuer': issuer}
620
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='resurrect', kwargs=kwargs, session=session):
621
- raise rucio.common.exception.AccessDenied('Account %s can not resurrect data identifiers' % (issuer))
824
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='resurrect', kwargs=kwargs, session=session):
825
+ raise AccessDenied('Account %s can not resurrect data identifiers' % (issuer))
622
826
  validate_schema(name='dids', obj=dids, vo=vo)
623
827
 
624
828
  for d in dids:
@@ -628,7 +832,13 @@ def resurrect(dids, issuer, vo='def', *, session: "Session"):
628
832
 
629
833
 
630
834
  @stream_session
631
- def list_archive_content(scope, name, vo='def', *, session: "Session"):
835
+ def list_archive_content(
836
+ scope: str,
837
+ name: str,
838
+ vo: str = 'def',
839
+ *,
840
+ session: "Session"
841
+ ) -> Iterator[dict[str, Any]]:
632
842
  """
633
843
  List archive contents.
634
844
 
@@ -638,15 +848,22 @@ def list_archive_content(scope, name, vo='def', *, session: "Session"):
638
848
  :param session: The database session in use.
639
849
  """
640
850
 
641
- scope = InternalScope(scope, vo=vo)
851
+ internal_scope = InternalScope(scope, vo=vo)
642
852
 
643
- dids = did.list_archive_content(scope=scope, name=name, session=session)
853
+ dids = did.list_archive_content(scope=internal_scope, name=name, session=session)
644
854
  for d in dids:
645
- yield api_update_return_dict(d, session=session)
855
+ yield gateway_update_return_dict(d, session=session)
646
856
 
647
857
 
648
858
  @transactional_session
649
- def add_did_to_followed(scope, name, account, *, session: "Session", vo='def'):
859
+ def add_did_to_followed(
860
+ scope: str,
861
+ name: str,
862
+ account: str,
863
+ *,
864
+ session: "Session",
865
+ vo: str = 'def'
866
+ ) -> None:
650
867
  """
651
868
  Mark a did as followed by the given account
652
869
 
@@ -655,13 +872,19 @@ def add_did_to_followed(scope, name, account, *, session: "Session", vo='def'):
655
872
  :param account: The account owner.
656
873
  :param session: The database session in use.
657
874
  """
658
- scope = InternalScope(scope, vo=vo)
659
- account = InternalAccount(account, vo=vo)
660
- return did.add_did_to_followed(scope=scope, name=name, account=account, session=session)
875
+ internal_scope = InternalScope(scope, vo=vo)
876
+ internal_account = InternalAccount(account, vo=vo)
877
+ return did.add_did_to_followed(scope=internal_scope, name=name, account=internal_account, session=session)
661
878
 
662
879
 
663
880
  @transactional_session
664
- def add_dids_to_followed(dids, account, *, session: "Session", vo='def'):
881
+ def add_dids_to_followed(
882
+ dids: Iterable[Mapping[str, Any]],
883
+ account: str,
884
+ *,
885
+ session: "Session",
886
+ vo: str = 'def'
887
+ ) -> None:
665
888
  """
666
889
  Bulk mark datasets as followed
667
890
 
@@ -669,12 +892,18 @@ def add_dids_to_followed(dids, account, *, session: "Session", vo='def'):
669
892
  :param account: The account owner.
670
893
  :param session: The database session in use.
671
894
  """
672
- account = InternalAccount(account, vo=vo)
673
- return did.add_dids_to_followed(dids=dids, account=account, session=session)
895
+ internal_account = InternalAccount(account, vo=vo)
896
+ return did.add_dids_to_followed(dids=dids, account=internal_account, session=session)
674
897
 
675
898
 
676
899
  @stream_session
677
- def get_users_following_did(name, scope, *, session: "Session", vo='def'):
900
+ def get_users_following_did(
901
+ name: str,
902
+ scope: str,
903
+ *,
904
+ session: "Session",
905
+ vo: str = 'def'
906
+ ) -> Iterator[dict[str, str]]:
678
907
  """
679
908
  Return list of users following a did
680
909
 
@@ -682,15 +911,23 @@ def get_users_following_did(name, scope, *, session: "Session", vo='def'):
682
911
  :param name: The data identifier name.
683
912
  :param session: The database session in use.
684
913
  """
685
- scope = InternalScope(scope, vo=vo)
686
- users = did.get_users_following_did(name=name, scope=scope, session=session)
914
+ internal_scope = InternalScope(scope, vo=vo)
915
+ users = did.get_users_following_did(name=name, scope=internal_scope, session=session)
687
916
  for user in users:
688
917
  user['user'] = user['user'].external
689
918
  yield user
690
919
 
691
920
 
692
921
  @transactional_session
693
- def remove_did_from_followed(scope, name, account, issuer, *, session: "Session", vo='def'):
922
+ def remove_did_from_followed(
923
+ scope: str,
924
+ name: str,
925
+ account: str,
926
+ issuer: str,
927
+ *,
928
+ session: "Session",
929
+ vo: str = 'def'
930
+ ) -> None:
694
931
  """
695
932
  Mark a did as not followed
696
933
 
@@ -701,16 +938,23 @@ def remove_did_from_followed(scope, name, account, issuer, *, session: "Session"
701
938
  :param issuer: The issuer account
702
939
  """
703
940
  kwargs = {'scope': scope, 'issuer': issuer}
704
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='remove_did_from_followed', kwargs=kwargs, session=session):
705
- raise rucio.common.exception.AccessDenied('Account %s can not remove data identifiers from followed table' % (issuer))
941
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='remove_did_from_followed', kwargs=kwargs, session=session):
942
+ raise AccessDenied('Account %s can not remove data identifiers from followed table' % (issuer))
706
943
 
707
- scope = InternalScope(scope, vo=vo)
708
- account = InternalAccount(account, vo=vo)
709
- return did.remove_did_from_followed(scope=scope, name=name, account=account, session=session)
944
+ internal_scope = InternalScope(scope, vo=vo)
945
+ internal_account = InternalAccount(account, vo=vo)
946
+ return did.remove_did_from_followed(scope=internal_scope, name=name, account=internal_account, session=session)
710
947
 
711
948
 
712
949
  @transactional_session
713
- def remove_dids_from_followed(dids, account, issuer, *, session: "Session", vo='def'):
950
+ def remove_dids_from_followed(
951
+ dids: Iterable[Mapping[str, Any]],
952
+ account: str,
953
+ issuer: str,
954
+ *,
955
+ session: "Session",
956
+ vo: str = 'def'
957
+ ) -> None:
714
958
  """
715
959
  Bulk mark datasets as not followed
716
960
 
@@ -719,8 +963,8 @@ def remove_dids_from_followed(dids, account, issuer, *, session: "Session", vo='
719
963
  :param session: The database session in use.
720
964
  """
721
965
  kwargs = {'dids': dids, 'issuer': issuer}
722
- if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='remove_dids_from_followed', kwargs=kwargs, session=session):
723
- raise rucio.common.exception.AccessDenied('Account %s can not bulk remove data identifiers from followed table' % (issuer))
966
+ if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='remove_dids_from_followed', kwargs=kwargs, session=session):
967
+ raise AccessDenied('Account %s can not bulk remove data identifiers from followed table' % (issuer))
724
968
 
725
- account = InternalAccount(account, vo=vo)
726
- return did.remove_dids_from_followed(dids=dids, account=account, session=session)
969
+ internal_account = InternalAccount(account, vo=vo)
970
+ return did.remove_dids_from_followed(dids=dids, account=internal_account, session=session)