rucio 32.8.6__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 (481) hide show
  1. rucio/__init__.py +18 -0
  2. rucio/alembicrevision.py +16 -0
  3. rucio/api/__init__.py +14 -0
  4. rucio/api/account.py +266 -0
  5. rucio/api/account_limit.py +287 -0
  6. rucio/api/authentication.py +302 -0
  7. rucio/api/config.py +218 -0
  8. rucio/api/credential.py +60 -0
  9. rucio/api/did.py +726 -0
  10. rucio/api/dirac.py +71 -0
  11. rucio/api/exporter.py +60 -0
  12. rucio/api/heartbeat.py +62 -0
  13. rucio/api/identity.py +160 -0
  14. rucio/api/importer.py +46 -0
  15. rucio/api/lifetime_exception.py +95 -0
  16. rucio/api/lock.py +131 -0
  17. rucio/api/meta.py +85 -0
  18. rucio/api/permission.py +72 -0
  19. rucio/api/quarantined_replica.py +69 -0
  20. rucio/api/replica.py +528 -0
  21. rucio/api/request.py +220 -0
  22. rucio/api/rse.py +601 -0
  23. rucio/api/rule.py +335 -0
  24. rucio/api/scope.py +89 -0
  25. rucio/api/subscription.py +255 -0
  26. rucio/api/temporary_did.py +49 -0
  27. rucio/api/vo.py +112 -0
  28. rucio/client/__init__.py +16 -0
  29. rucio/client/accountclient.py +413 -0
  30. rucio/client/accountlimitclient.py +155 -0
  31. rucio/client/baseclient.py +929 -0
  32. rucio/client/client.py +77 -0
  33. rucio/client/configclient.py +113 -0
  34. rucio/client/credentialclient.py +54 -0
  35. rucio/client/didclient.py +691 -0
  36. rucio/client/diracclient.py +48 -0
  37. rucio/client/downloadclient.py +1674 -0
  38. rucio/client/exportclient.py +44 -0
  39. rucio/client/fileclient.py +51 -0
  40. rucio/client/importclient.py +42 -0
  41. rucio/client/lifetimeclient.py +74 -0
  42. rucio/client/lockclient.py +99 -0
  43. rucio/client/metaclient.py +137 -0
  44. rucio/client/pingclient.py +45 -0
  45. rucio/client/replicaclient.py +444 -0
  46. rucio/client/requestclient.py +109 -0
  47. rucio/client/rseclient.py +664 -0
  48. rucio/client/ruleclient.py +287 -0
  49. rucio/client/scopeclient.py +88 -0
  50. rucio/client/subscriptionclient.py +161 -0
  51. rucio/client/touchclient.py +78 -0
  52. rucio/client/uploadclient.py +871 -0
  53. rucio/common/__init__.py +14 -0
  54. rucio/common/cache.py +74 -0
  55. rucio/common/config.py +796 -0
  56. rucio/common/constants.py +92 -0
  57. rucio/common/constraints.py +18 -0
  58. rucio/common/didtype.py +187 -0
  59. rucio/common/dumper/__init__.py +306 -0
  60. rucio/common/dumper/consistency.py +449 -0
  61. rucio/common/dumper/data_models.py +325 -0
  62. rucio/common/dumper/path_parsing.py +65 -0
  63. rucio/common/exception.py +1092 -0
  64. rucio/common/extra.py +37 -0
  65. rucio/common/logging.py +404 -0
  66. rucio/common/pcache.py +1387 -0
  67. rucio/common/policy.py +84 -0
  68. rucio/common/schema/__init__.py +143 -0
  69. rucio/common/schema/atlas.py +411 -0
  70. rucio/common/schema/belleii.py +406 -0
  71. rucio/common/schema/cms.py +478 -0
  72. rucio/common/schema/domatpc.py +399 -0
  73. rucio/common/schema/escape.py +424 -0
  74. rucio/common/schema/generic.py +431 -0
  75. rucio/common/schema/generic_multi_vo.py +410 -0
  76. rucio/common/schema/icecube.py +404 -0
  77. rucio/common/schema/lsst.py +423 -0
  78. rucio/common/stomp_utils.py +160 -0
  79. rucio/common/stopwatch.py +56 -0
  80. rucio/common/test_rucio_server.py +148 -0
  81. rucio/common/types.py +158 -0
  82. rucio/common/utils.py +1946 -0
  83. rucio/core/__init__.py +14 -0
  84. rucio/core/account.py +426 -0
  85. rucio/core/account_counter.py +171 -0
  86. rucio/core/account_limit.py +357 -0
  87. rucio/core/authentication.py +563 -0
  88. rucio/core/config.py +386 -0
  89. rucio/core/credential.py +218 -0
  90. rucio/core/did.py +3102 -0
  91. rucio/core/did_meta_plugins/__init__.py +250 -0
  92. rucio/core/did_meta_plugins/did_column_meta.py +326 -0
  93. rucio/core/did_meta_plugins/did_meta_plugin_interface.py +116 -0
  94. rucio/core/did_meta_plugins/filter_engine.py +573 -0
  95. rucio/core/did_meta_plugins/json_meta.py +215 -0
  96. rucio/core/did_meta_plugins/mongo_meta.py +199 -0
  97. rucio/core/did_meta_plugins/postgres_meta.py +317 -0
  98. rucio/core/dirac.py +208 -0
  99. rucio/core/distance.py +164 -0
  100. rucio/core/exporter.py +59 -0
  101. rucio/core/heartbeat.py +263 -0
  102. rucio/core/identity.py +290 -0
  103. rucio/core/importer.py +248 -0
  104. rucio/core/lifetime_exception.py +377 -0
  105. rucio/core/lock.py +474 -0
  106. rucio/core/message.py +241 -0
  107. rucio/core/meta.py +190 -0
  108. rucio/core/monitor.py +441 -0
  109. rucio/core/naming_convention.py +154 -0
  110. rucio/core/nongrid_trace.py +124 -0
  111. rucio/core/oidc.py +1339 -0
  112. rucio/core/permission/__init__.py +107 -0
  113. rucio/core/permission/atlas.py +1333 -0
  114. rucio/core/permission/belleii.py +1076 -0
  115. rucio/core/permission/cms.py +1166 -0
  116. rucio/core/permission/escape.py +1076 -0
  117. rucio/core/permission/generic.py +1128 -0
  118. rucio/core/permission/generic_multi_vo.py +1148 -0
  119. rucio/core/quarantined_replica.py +190 -0
  120. rucio/core/replica.py +3627 -0
  121. rucio/core/replica_sorter.py +368 -0
  122. rucio/core/request.py +2241 -0
  123. rucio/core/rse.py +1835 -0
  124. rucio/core/rse_counter.py +155 -0
  125. rucio/core/rse_expression_parser.py +460 -0
  126. rucio/core/rse_selector.py +277 -0
  127. rucio/core/rule.py +3419 -0
  128. rucio/core/rule_grouping.py +1473 -0
  129. rucio/core/scope.py +152 -0
  130. rucio/core/subscription.py +316 -0
  131. rucio/core/temporary_did.py +188 -0
  132. rucio/core/topology.py +448 -0
  133. rucio/core/trace.py +361 -0
  134. rucio/core/transfer.py +1233 -0
  135. rucio/core/vo.py +151 -0
  136. rucio/core/volatile_replica.py +123 -0
  137. rucio/daemons/__init__.py +14 -0
  138. rucio/daemons/abacus/__init__.py +14 -0
  139. rucio/daemons/abacus/account.py +106 -0
  140. rucio/daemons/abacus/collection_replica.py +113 -0
  141. rucio/daemons/abacus/rse.py +107 -0
  142. rucio/daemons/atropos/__init__.py +14 -0
  143. rucio/daemons/atropos/atropos.py +243 -0
  144. rucio/daemons/auditor/__init__.py +261 -0
  145. rucio/daemons/auditor/hdfs.py +86 -0
  146. rucio/daemons/auditor/srmdumps.py +284 -0
  147. rucio/daemons/automatix/__init__.py +14 -0
  148. rucio/daemons/automatix/automatix.py +281 -0
  149. rucio/daemons/badreplicas/__init__.py +14 -0
  150. rucio/daemons/badreplicas/minos.py +311 -0
  151. rucio/daemons/badreplicas/minos_temporary_expiration.py +173 -0
  152. rucio/daemons/badreplicas/necromancer.py +200 -0
  153. rucio/daemons/bb8/__init__.py +14 -0
  154. rucio/daemons/bb8/bb8.py +356 -0
  155. rucio/daemons/bb8/common.py +762 -0
  156. rucio/daemons/bb8/nuclei_background_rebalance.py +147 -0
  157. rucio/daemons/bb8/t2_background_rebalance.py +146 -0
  158. rucio/daemons/c3po/__init__.py +14 -0
  159. rucio/daemons/c3po/algorithms/__init__.py +14 -0
  160. rucio/daemons/c3po/algorithms/simple.py +131 -0
  161. rucio/daemons/c3po/algorithms/t2_free_space.py +125 -0
  162. rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +127 -0
  163. rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +279 -0
  164. rucio/daemons/c3po/c3po.py +342 -0
  165. rucio/daemons/c3po/collectors/__init__.py +14 -0
  166. rucio/daemons/c3po/collectors/agis.py +108 -0
  167. rucio/daemons/c3po/collectors/free_space.py +62 -0
  168. rucio/daemons/c3po/collectors/jedi_did.py +48 -0
  169. rucio/daemons/c3po/collectors/mock_did.py +46 -0
  170. rucio/daemons/c3po/collectors/network_metrics.py +63 -0
  171. rucio/daemons/c3po/collectors/workload.py +110 -0
  172. rucio/daemons/c3po/utils/__init__.py +14 -0
  173. rucio/daemons/c3po/utils/dataset_cache.py +40 -0
  174. rucio/daemons/c3po/utils/expiring_dataset_cache.py +45 -0
  175. rucio/daemons/c3po/utils/expiring_list.py +63 -0
  176. rucio/daemons/c3po/utils/popularity.py +82 -0
  177. rucio/daemons/c3po/utils/timeseries.py +76 -0
  178. rucio/daemons/cache/__init__.py +14 -0
  179. rucio/daemons/cache/consumer.py +191 -0
  180. rucio/daemons/common.py +391 -0
  181. rucio/daemons/conveyor/__init__.py +14 -0
  182. rucio/daemons/conveyor/common.py +530 -0
  183. rucio/daemons/conveyor/finisher.py +492 -0
  184. rucio/daemons/conveyor/poller.py +372 -0
  185. rucio/daemons/conveyor/preparer.py +198 -0
  186. rucio/daemons/conveyor/receiver.py +206 -0
  187. rucio/daemons/conveyor/stager.py +127 -0
  188. rucio/daemons/conveyor/submitter.py +379 -0
  189. rucio/daemons/conveyor/throttler.py +468 -0
  190. rucio/daemons/follower/__init__.py +14 -0
  191. rucio/daemons/follower/follower.py +97 -0
  192. rucio/daemons/hermes/__init__.py +14 -0
  193. rucio/daemons/hermes/hermes.py +738 -0
  194. rucio/daemons/judge/__init__.py +14 -0
  195. rucio/daemons/judge/cleaner.py +149 -0
  196. rucio/daemons/judge/evaluator.py +172 -0
  197. rucio/daemons/judge/injector.py +154 -0
  198. rucio/daemons/judge/repairer.py +144 -0
  199. rucio/daemons/oauthmanager/__init__.py +14 -0
  200. rucio/daemons/oauthmanager/oauthmanager.py +199 -0
  201. rucio/daemons/reaper/__init__.py +14 -0
  202. rucio/daemons/reaper/dark_reaper.py +272 -0
  203. rucio/daemons/reaper/light_reaper.py +255 -0
  204. rucio/daemons/reaper/reaper.py +701 -0
  205. rucio/daemons/replicarecoverer/__init__.py +14 -0
  206. rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +487 -0
  207. rucio/daemons/storage/__init__.py +14 -0
  208. rucio/daemons/storage/consistency/__init__.py +14 -0
  209. rucio/daemons/storage/consistency/actions.py +753 -0
  210. rucio/daemons/tracer/__init__.py +14 -0
  211. rucio/daemons/tracer/kronos.py +513 -0
  212. rucio/daemons/transmogrifier/__init__.py +14 -0
  213. rucio/daemons/transmogrifier/transmogrifier.py +753 -0
  214. rucio/daemons/undertaker/__init__.py +14 -0
  215. rucio/daemons/undertaker/undertaker.py +137 -0
  216. rucio/db/__init__.py +14 -0
  217. rucio/db/sqla/__init__.py +38 -0
  218. rucio/db/sqla/constants.py +192 -0
  219. rucio/db/sqla/migrate_repo/__init__.py +14 -0
  220. rucio/db/sqla/migrate_repo/env.py +111 -0
  221. rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +71 -0
  222. rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +50 -0
  223. rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +61 -0
  224. rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +46 -0
  225. rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +93 -0
  226. rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +78 -0
  227. rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +46 -0
  228. rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +53 -0
  229. rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +69 -0
  230. rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +42 -0
  231. rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +46 -0
  232. rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +61 -0
  233. rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +42 -0
  234. rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +141 -0
  235. rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +75 -0
  236. rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +75 -0
  237. rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +46 -0
  238. rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +51 -0
  239. rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +135 -0
  240. rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +65 -0
  241. rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +42 -0
  242. rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +66 -0
  243. rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +54 -0
  244. rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +43 -0
  245. rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +46 -0
  246. rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +47 -0
  247. rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +54 -0
  248. rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +39 -0
  249. rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +48 -0
  250. rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +47 -0
  251. rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +48 -0
  252. rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +59 -0
  253. rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +47 -0
  254. rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +72 -0
  255. rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +46 -0
  256. rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +45 -0
  257. rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +48 -0
  258. rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +48 -0
  259. rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +42 -0
  260. rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +69 -0
  261. rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +46 -0
  262. rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +78 -0
  263. rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +62 -0
  264. rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +74 -0
  265. rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +44 -0
  266. rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +67 -0
  267. rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +134 -0
  268. rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +58 -0
  269. rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +79 -0
  270. rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +61 -0
  271. rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +45 -0
  272. rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +46 -0
  273. rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +65 -0
  274. rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +42 -0
  275. rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +46 -0
  276. rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +46 -0
  277. rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +80 -0
  278. rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +43 -0
  279. rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +61 -0
  280. rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +47 -0
  281. rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +46 -0
  282. rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +52 -0
  283. rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +42 -0
  284. rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +65 -0
  285. rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +46 -0
  286. rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +47 -0
  287. rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +45 -0
  288. rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +46 -0
  289. rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +48 -0
  290. rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +50 -0
  291. rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +59 -0
  292. rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +48 -0
  293. rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +108 -0
  294. rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +57 -0
  295. rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +51 -0
  296. rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +50 -0
  297. rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +46 -0
  298. rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +42 -0
  299. rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +93 -0
  300. rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +73 -0
  301. rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +52 -0
  302. rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +45 -0
  303. rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +46 -0
  304. rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +54 -0
  305. rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +48 -0
  306. rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +70 -0
  307. rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +48 -0
  308. rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +95 -0
  309. rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +55 -0
  310. rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +74 -0
  311. rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +78 -0
  312. rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +49 -0
  313. rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +124 -0
  314. rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +60 -0
  315. rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +53 -0
  316. rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +56 -0
  317. rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +67 -0
  318. rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +50 -0
  319. rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +46 -0
  320. rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +92 -0
  321. rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +42 -0
  322. rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +46 -0
  323. rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +147 -0
  324. rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +78 -0
  325. rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +53 -0
  326. rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +74 -0
  327. rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +56 -0
  328. rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +46 -0
  329. rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +68 -0
  330. rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +48 -0
  331. rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +149 -0
  332. rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +106 -0
  333. rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +47 -0
  334. rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +45 -0
  335. rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +105 -0
  336. rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +52 -0
  337. rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +106 -0
  338. rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +30 -0
  339. rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +75 -0
  340. rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +49 -0
  341. rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +45 -0
  342. rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +38 -0
  343. rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +44 -0
  344. rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +46 -0
  345. rucio/db/sqla/models.py +1834 -0
  346. rucio/db/sqla/sautils.py +48 -0
  347. rucio/db/sqla/session.py +470 -0
  348. rucio/db/sqla/types.py +207 -0
  349. rucio/db/sqla/util.py +521 -0
  350. rucio/rse/__init__.py +97 -0
  351. rucio/rse/protocols/__init__.py +14 -0
  352. rucio/rse/protocols/cache.py +123 -0
  353. rucio/rse/protocols/dummy.py +112 -0
  354. rucio/rse/protocols/gfal.py +701 -0
  355. rucio/rse/protocols/globus.py +243 -0
  356. rucio/rse/protocols/gsiftp.py +93 -0
  357. rucio/rse/protocols/http_cache.py +83 -0
  358. rucio/rse/protocols/mock.py +124 -0
  359. rucio/rse/protocols/ngarc.py +210 -0
  360. rucio/rse/protocols/posix.py +251 -0
  361. rucio/rse/protocols/protocol.py +530 -0
  362. rucio/rse/protocols/rclone.py +365 -0
  363. rucio/rse/protocols/rfio.py +137 -0
  364. rucio/rse/protocols/srm.py +339 -0
  365. rucio/rse/protocols/ssh.py +414 -0
  366. rucio/rse/protocols/storm.py +207 -0
  367. rucio/rse/protocols/webdav.py +547 -0
  368. rucio/rse/protocols/xrootd.py +295 -0
  369. rucio/rse/rsemanager.py +752 -0
  370. rucio/tests/__init__.py +14 -0
  371. rucio/tests/common.py +244 -0
  372. rucio/tests/common_server.py +132 -0
  373. rucio/transfertool/__init__.py +14 -0
  374. rucio/transfertool/fts3.py +1484 -0
  375. rucio/transfertool/globus.py +200 -0
  376. rucio/transfertool/globus_library.py +182 -0
  377. rucio/transfertool/mock.py +81 -0
  378. rucio/transfertool/transfertool.py +212 -0
  379. rucio/vcsversion.py +11 -0
  380. rucio/version.py +46 -0
  381. rucio/web/__init__.py +14 -0
  382. rucio/web/rest/__init__.py +14 -0
  383. rucio/web/rest/flaskapi/__init__.py +14 -0
  384. rucio/web/rest/flaskapi/authenticated_bp.py +28 -0
  385. rucio/web/rest/flaskapi/v1/__init__.py +14 -0
  386. rucio/web/rest/flaskapi/v1/accountlimits.py +234 -0
  387. rucio/web/rest/flaskapi/v1/accounts.py +1088 -0
  388. rucio/web/rest/flaskapi/v1/archives.py +100 -0
  389. rucio/web/rest/flaskapi/v1/auth.py +1642 -0
  390. rucio/web/rest/flaskapi/v1/common.py +385 -0
  391. rucio/web/rest/flaskapi/v1/config.py +305 -0
  392. rucio/web/rest/flaskapi/v1/credentials.py +213 -0
  393. rucio/web/rest/flaskapi/v1/dids.py +2204 -0
  394. rucio/web/rest/flaskapi/v1/dirac.py +116 -0
  395. rucio/web/rest/flaskapi/v1/export.py +77 -0
  396. rucio/web/rest/flaskapi/v1/heartbeats.py +129 -0
  397. rucio/web/rest/flaskapi/v1/identities.py +263 -0
  398. rucio/web/rest/flaskapi/v1/import.py +133 -0
  399. rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +315 -0
  400. rucio/web/rest/flaskapi/v1/locks.py +360 -0
  401. rucio/web/rest/flaskapi/v1/main.py +83 -0
  402. rucio/web/rest/flaskapi/v1/meta.py +226 -0
  403. rucio/web/rest/flaskapi/v1/metrics.py +37 -0
  404. rucio/web/rest/flaskapi/v1/nongrid_traces.py +97 -0
  405. rucio/web/rest/flaskapi/v1/ping.py +89 -0
  406. rucio/web/rest/flaskapi/v1/redirect.py +366 -0
  407. rucio/web/rest/flaskapi/v1/replicas.py +1866 -0
  408. rucio/web/rest/flaskapi/v1/requests.py +841 -0
  409. rucio/web/rest/flaskapi/v1/rses.py +2204 -0
  410. rucio/web/rest/flaskapi/v1/rules.py +824 -0
  411. rucio/web/rest/flaskapi/v1/scopes.py +161 -0
  412. rucio/web/rest/flaskapi/v1/subscriptions.py +646 -0
  413. rucio/web/rest/flaskapi/v1/templates/auth_crash.html +80 -0
  414. rucio/web/rest/flaskapi/v1/templates/auth_granted.html +82 -0
  415. rucio/web/rest/flaskapi/v1/tmp_dids.py +115 -0
  416. rucio/web/rest/flaskapi/v1/traces.py +100 -0
  417. rucio/web/rest/flaskapi/v1/vos.py +280 -0
  418. rucio/web/rest/main.py +19 -0
  419. rucio/web/rest/metrics.py +28 -0
  420. rucio-32.8.6.data/data/rucio/etc/alembic.ini.template +71 -0
  421. rucio-32.8.6.data/data/rucio/etc/alembic_offline.ini.template +74 -0
  422. rucio-32.8.6.data/data/rucio/etc/globus-config.yml.template +5 -0
  423. rucio-32.8.6.data/data/rucio/etc/ldap.cfg.template +30 -0
  424. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approval_request.tmpl +38 -0
  425. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +4 -0
  426. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approved_user.tmpl +17 -0
  427. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +6 -0
  428. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_denied_user.tmpl +17 -0
  429. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +19 -0
  430. rucio-32.8.6.data/data/rucio/etc/rse-accounts.cfg.template +25 -0
  431. rucio-32.8.6.data/data/rucio/etc/rucio.cfg.atlas.client.template +42 -0
  432. rucio-32.8.6.data/data/rucio/etc/rucio.cfg.template +257 -0
  433. rucio-32.8.6.data/data/rucio/etc/rucio_multi_vo.cfg.template +234 -0
  434. rucio-32.8.6.data/data/rucio/requirements.txt +55 -0
  435. rucio-32.8.6.data/data/rucio/tools/bootstrap.py +34 -0
  436. rucio-32.8.6.data/data/rucio/tools/merge_rucio_configs.py +147 -0
  437. rucio-32.8.6.data/data/rucio/tools/reset_database.py +40 -0
  438. rucio-32.8.6.data/scripts/rucio +2540 -0
  439. rucio-32.8.6.data/scripts/rucio-abacus-account +75 -0
  440. rucio-32.8.6.data/scripts/rucio-abacus-collection-replica +47 -0
  441. rucio-32.8.6.data/scripts/rucio-abacus-rse +79 -0
  442. rucio-32.8.6.data/scripts/rucio-admin +2434 -0
  443. rucio-32.8.6.data/scripts/rucio-atropos +61 -0
  444. rucio-32.8.6.data/scripts/rucio-auditor +199 -0
  445. rucio-32.8.6.data/scripts/rucio-automatix +51 -0
  446. rucio-32.8.6.data/scripts/rucio-bb8 +58 -0
  447. rucio-32.8.6.data/scripts/rucio-c3po +86 -0
  448. rucio-32.8.6.data/scripts/rucio-cache-client +135 -0
  449. rucio-32.8.6.data/scripts/rucio-cache-consumer +43 -0
  450. rucio-32.8.6.data/scripts/rucio-conveyor-finisher +59 -0
  451. rucio-32.8.6.data/scripts/rucio-conveyor-poller +67 -0
  452. rucio-32.8.6.data/scripts/rucio-conveyor-preparer +38 -0
  453. rucio-32.8.6.data/scripts/rucio-conveyor-receiver +44 -0
  454. rucio-32.8.6.data/scripts/rucio-conveyor-stager +77 -0
  455. rucio-32.8.6.data/scripts/rucio-conveyor-submitter +140 -0
  456. rucio-32.8.6.data/scripts/rucio-conveyor-throttler +105 -0
  457. rucio-32.8.6.data/scripts/rucio-dark-reaper +54 -0
  458. rucio-32.8.6.data/scripts/rucio-dumper +159 -0
  459. rucio-32.8.6.data/scripts/rucio-follower +45 -0
  460. rucio-32.8.6.data/scripts/rucio-hermes +55 -0
  461. rucio-32.8.6.data/scripts/rucio-judge-cleaner +90 -0
  462. rucio-32.8.6.data/scripts/rucio-judge-evaluator +138 -0
  463. rucio-32.8.6.data/scripts/rucio-judge-injector +45 -0
  464. rucio-32.8.6.data/scripts/rucio-judge-repairer +45 -0
  465. rucio-32.8.6.data/scripts/rucio-kronos +45 -0
  466. rucio-32.8.6.data/scripts/rucio-light-reaper +53 -0
  467. rucio-32.8.6.data/scripts/rucio-minos +54 -0
  468. rucio-32.8.6.data/scripts/rucio-minos-temporary-expiration +51 -0
  469. rucio-32.8.6.data/scripts/rucio-necromancer +121 -0
  470. rucio-32.8.6.data/scripts/rucio-oauth-manager +64 -0
  471. rucio-32.8.6.data/scripts/rucio-reaper +84 -0
  472. rucio-32.8.6.data/scripts/rucio-replica-recoverer +249 -0
  473. rucio-32.8.6.data/scripts/rucio-storage-consistency-actions +75 -0
  474. rucio-32.8.6.data/scripts/rucio-transmogrifier +78 -0
  475. rucio-32.8.6.data/scripts/rucio-undertaker +77 -0
  476. rucio-32.8.6.dist-info/METADATA +83 -0
  477. rucio-32.8.6.dist-info/RECORD +481 -0
  478. rucio-32.8.6.dist-info/WHEEL +5 -0
  479. rucio-32.8.6.dist-info/licenses/AUTHORS.rst +94 -0
  480. rucio-32.8.6.dist-info/licenses/LICENSE +201 -0
  481. rucio-32.8.6.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1166 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright European Organization for Nuclear Research (CERN) since 2012
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from typing import TYPE_CHECKING
17
+
18
+ import rucio.core.scope
19
+ from rucio.core.account import has_account_attribute
20
+ from rucio.core.identity import exist_identity_account
21
+ from rucio.core.permission.generic import perm_get_global_account_usage
22
+ from rucio.core.rse import list_rse_attributes
23
+ from rucio.core.rse_expression_parser import parse_expression
24
+ from rucio.core.rule import get_rule
25
+ from rucio.db.sqla.constants import IdentityType
26
+
27
+ if TYPE_CHECKING:
28
+ from typing import Optional
29
+ from sqlalchemy.orm import Session
30
+ from rucio.common.types import InternalAccount
31
+
32
+
33
+ def has_permission(issuer, action, kwargs, *, session: "Optional[Session]" = None):
34
+ """
35
+ Checks if an account has the specified permission to
36
+ execute an action with parameters.
37
+
38
+ :param issuer: Account identifier which issues the command..
39
+ :param action: The action(API call) called by the account.
40
+ :param kwargs: List of arguments for the action.
41
+ :param session: The DB session to use
42
+ :returns: True if account is allowed, otherwise False
43
+ """
44
+ perm = {'add_account': perm_add_account,
45
+ 'del_account': perm_del_account,
46
+ 'update_account': perm_update_account,
47
+ 'add_rule': perm_add_rule,
48
+ 'add_subscription': perm_add_subscription,
49
+ 'add_scope': perm_add_scope,
50
+ 'add_rse': perm_add_rse,
51
+ 'update_rse': perm_update_rse,
52
+ 'add_protocol': perm_add_protocol,
53
+ 'del_protocol': perm_del_protocol,
54
+ 'update_protocol': perm_update_protocol,
55
+ 'add_qos_policy': perm_add_qos_policy,
56
+ 'delete_qos_policy': perm_delete_qos_policy,
57
+ 'declare_bad_file_replicas': perm_declare_bad_file_replicas,
58
+ 'declare_suspicious_file_replicas': perm_declare_suspicious_file_replicas,
59
+ 'add_replicas': perm_add_replicas,
60
+ 'delete_replicas': perm_delete_replicas,
61
+ 'skip_availability_check': perm_skip_availability_check,
62
+ 'update_replicas_states': perm_update_replicas_states,
63
+ 'add_rse_attribute': perm_add_rse_attribute,
64
+ 'del_rse_attribute': perm_del_rse_attribute,
65
+ 'del_rse': perm_del_rse,
66
+ 'del_rule': perm_del_rule,
67
+ 'update_rule': perm_update_rule,
68
+ 'approve_rule': perm_approve_rule,
69
+ 'update_subscription': perm_update_subscription,
70
+ 'reduce_rule': perm_reduce_rule,
71
+ 'move_rule': perm_move_rule,
72
+ 'get_auth_token_user_pass': perm_get_auth_token_user_pass,
73
+ 'get_auth_token_gss': perm_get_auth_token_gss,
74
+ 'get_auth_token_x509': perm_get_auth_token_x509,
75
+ 'get_auth_token_saml': perm_get_auth_token_saml,
76
+ 'add_account_identity': perm_add_account_identity,
77
+ 'add_did': perm_add_did,
78
+ 'add_dids': perm_add_dids,
79
+ 'attach_dids': perm_attach_dids,
80
+ 'detach_dids': perm_detach_dids,
81
+ 'attach_dids_to_dids': perm_attach_dids_to_dids,
82
+ 'create_did_sample': perm_create_did_sample,
83
+ 'set_metadata': perm_set_metadata,
84
+ 'set_status': perm_set_status,
85
+ 'queue_requests': perm_queue_requests,
86
+ 'set_rse_usage': perm_set_rse_usage,
87
+ 'set_rse_limits': perm_set_rse_limits,
88
+ 'get_request_by_did': perm_get_request_by_did,
89
+ 'cancel_request': perm_cancel_request,
90
+ 'get_next': perm_get_next,
91
+ 'set_local_account_limit': perm_set_local_account_limit,
92
+ 'set_global_account_limit': perm_set_global_account_limit,
93
+ 'delete_local_account_limit': perm_delete_local_account_limit,
94
+ 'delete_global_account_limit': perm_delete_global_account_limit,
95
+ 'config_sections': perm_config,
96
+ 'config_add_section': perm_config,
97
+ 'config_has_section': perm_config,
98
+ 'config_options': perm_config,
99
+ 'config_has_option': perm_config,
100
+ 'config_get': perm_config,
101
+ 'config_items': perm_config,
102
+ 'config_set': perm_config,
103
+ 'config_remove_section': perm_config,
104
+ 'config_remove_option': perm_config,
105
+ 'get_local_account_usage': perm_get_local_account_usage,
106
+ 'get_global_account_usage': perm_get_global_account_usage,
107
+ 'add_attribute': perm_add_account_attribute,
108
+ 'del_attribute': perm_del_account_attribute,
109
+ 'list_heartbeats': perm_list_heartbeats,
110
+ 'resurrect': perm_resurrect,
111
+ 'update_lifetime_exceptions': perm_update_lifetime_exceptions,
112
+ 'get_auth_token_ssh': perm_get_auth_token_ssh,
113
+ 'get_signed_url': perm_get_signed_url,
114
+ 'add_bad_pfns': perm_add_bad_pfns,
115
+ 'del_account_identity': perm_del_account_identity,
116
+ 'del_identity': perm_del_identity,
117
+ 'remove_did_from_followed': perm_remove_did_from_followed,
118
+ 'remove_dids_from_followed': perm_remove_dids_from_followed,
119
+ 'add_vo': perm_add_vo,
120
+ 'list_vos': perm_list_vos,
121
+ 'recover_vo_root_identity': perm_recover_vo_root_identity,
122
+ 'update_vo': perm_update_vo,
123
+ 'access_rule_vo': perm_access_rule_vo}
124
+
125
+ return perm.get(action, perm_default)(issuer=issuer, kwargs=kwargs, session=session)
126
+
127
+
128
+ def _is_root(issuer):
129
+ return issuer.external == 'root'
130
+
131
+
132
+ def perm_default(issuer, kwargs, *, session: "Optional[Session]" = None):
133
+ """
134
+ Default permission.
135
+
136
+ :param issuer: Account identifier which issues the command.
137
+ :param kwargs: List of arguments for the action.
138
+ :param session: The DB session to use
139
+ :returns: True if account is allowed, otherwise False
140
+ """
141
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
142
+
143
+
144
+ def perm_add_rse(issuer, kwargs, *, session: "Optional[Session]" = None):
145
+ """
146
+ Checks if an account can add a RSE.
147
+
148
+ :param issuer: Account identifier which issues the command.
149
+ :param kwargs: List of arguments for the action.
150
+ :param session: The DB session to use
151
+ :returns: True if account is allowed, otherwise False
152
+ """
153
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
154
+
155
+
156
+ def perm_update_rse(issuer, kwargs, *, session: "Optional[Session]" = None):
157
+ """
158
+ Checks if an account can update a RSE.
159
+
160
+ :param issuer: Account identifier which issues the command.
161
+ :param kwargs: List of arguments for the action.
162
+ :param session: The DB session to use
163
+ :returns: True if account is allowed, otherwise False
164
+ """
165
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
166
+
167
+
168
+ def perm_add_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
169
+ """
170
+ Checks if an account can add a replication rule.
171
+
172
+ :param issuer: Account identifier which issues the command.
173
+ :param kwargs: List of arguments for the action.
174
+ :param session: The DB session to use
175
+ :returns: True if account is allowed, otherwise False
176
+ """
177
+
178
+ rses = parse_expression(kwargs['rse_expression'], filter_={'vo': issuer.vo}, session=session)
179
+
180
+ # Keep while sync is running so it can make rules on all RSEs
181
+ if _is_root(issuer) and repr(kwargs['account']).startswith('sync_'):
182
+ return True
183
+
184
+ if isinstance(repr(issuer), str) and repr(issuer).startswith('sync_'): # noqa
185
+ return True
186
+
187
+ # Anyone can use _Temp RSEs if a lifetime is set and under a month
188
+ all_temp = True
189
+ for rse in rses:
190
+ rse_attr = list_rse_attributes(rse_id=rse['id'], session=session)
191
+ rse_type = rse_attr.get('cms_type', None)
192
+ if rse_type not in ['temp']:
193
+ all_temp = False
194
+
195
+ if all_temp and kwargs['lifetime'] is not None and kwargs['lifetime'] < 31 * 24 * 60 * 60:
196
+ return True
197
+
198
+ if kwargs['account'] == issuer and not kwargs['locked']:
199
+ return True
200
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
201
+ return True
202
+ return False
203
+
204
+
205
+ def perm_add_subscription(issuer, kwargs, *, session: "Optional[Session]" = None):
206
+ """
207
+ Checks if an account can add a subscription.
208
+
209
+ :param issuer: Account identifier which issues the command.
210
+ :param kwargs: List of arguments for the action.
211
+ :param session: The DB session to use
212
+ :returns: True if account is allowed, otherwise False
213
+ """
214
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
215
+ return True
216
+ return False
217
+
218
+
219
+ def perm_add_rse_attribute(issuer, kwargs, *, session: "Optional[Session]" = None):
220
+ """
221
+ Checks if an account can add a RSE attribute.
222
+
223
+ :param issuer: Account identifier which issues the command.
224
+ :param kwargs: List of arguments for the action.
225
+ :param session: The DB session to use
226
+ :returns: True if account is allowed, otherwise False
227
+ """
228
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
229
+ return True
230
+ return False
231
+
232
+
233
+ def perm_del_rse_attribute(issuer, kwargs, *, session: "Optional[Session]" = None):
234
+ """
235
+ Checks if an account can delete a RSE attribute.
236
+
237
+ :param issuer: Account identifier which issues the command.
238
+ :param kwargs: List of arguments for the action.
239
+ :param session: The DB session to use
240
+ :returns: True if account is allowed, otherwise False
241
+ """
242
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
243
+ return True
244
+ return False
245
+
246
+
247
+ def perm_del_rse(issuer, kwargs, *, session: "Optional[Session]" = None):
248
+ """
249
+ Checks if an account can delete a RSE.
250
+
251
+ :param issuer: Account identifier which issues the command.
252
+ :param kwargs: List of arguments for the action.
253
+ :param session: The DB session to use
254
+ :returns: True if account is allowed, otherwise False
255
+ """
256
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
257
+
258
+
259
+ def perm_add_account(issuer, kwargs, *, session: "Optional[Session]" = None):
260
+ """
261
+ Checks if an account can add an account.
262
+
263
+ :param issuer: Account identifier which issues the command.
264
+ :param kwargs: List of arguments for the action.
265
+ :param session: The DB session to use
266
+ :returns: True if account is allowed, otherwise False
267
+ """
268
+ return _is_root(issuer)
269
+
270
+
271
+ def perm_del_account(issuer, kwargs, *, session: "Optional[Session]" = None):
272
+ """
273
+ Checks if an account can del an account.
274
+
275
+ :param issuer: Account identifier which issues the command.
276
+ :param kwargs: List of arguments for the action.
277
+ :param session: The DB session to use
278
+ :returns: True if account is allowed, otherwise False
279
+ """
280
+ return _is_root(issuer)
281
+
282
+
283
+ def perm_update_account(issuer, kwargs, *, session: "Optional[Session]" = None):
284
+ """
285
+ Checks if an account can update an account.
286
+
287
+ :param issuer: Account identifier which issues the command.
288
+ :param kwargs: List of arguments for the action.
289
+ :param session: The DB session to use
290
+ :returns: True if account is allowed, otherwise False
291
+ """
292
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
293
+
294
+
295
+ def perm_add_scope(issuer, kwargs, *, session: "Optional[Session]" = None):
296
+ """
297
+ Checks if an account can add a scop to a account.
298
+
299
+ :param issuer: Account identifier which issues the command.
300
+ :param kwargs: List of arguments for the action.
301
+ :param session: The DB session to use
302
+ :returns: True if account is allowed, otherwise False
303
+ """
304
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
305
+
306
+
307
+ def perm_get_auth_token_user_pass(issuer, kwargs, *, session: "Optional[Session]" = None):
308
+ """
309
+ Checks if a user can request a token with user_pass for an account.
310
+
311
+ :param issuer: Account identifier which issues the command.
312
+ :param kwargs: List of arguments for the action.
313
+ :param session: The DB session to use
314
+ :returns: True if account is allowed, otherwise False
315
+ """
316
+ if exist_identity_account(identity=kwargs['username'], type_=IdentityType.USERPASS, account=kwargs['account'], session=session):
317
+ return True
318
+ return False
319
+
320
+
321
+ def perm_get_auth_token_gss(issuer, kwargs, *, session: "Optional[Session]" = None):
322
+ """
323
+ Checks if a user can request a token with user_pass for an account.
324
+
325
+ :param issuer: Account identifier which issues the command.
326
+ :param kwargs: List of arguments for the action.
327
+ :param session: The DB session to use
328
+ :returns: True if account is allowed, otherwise False
329
+ """
330
+ if exist_identity_account(identity=kwargs['gsscred'], type_=IdentityType.GSS, account=kwargs['account'], session=session):
331
+ return True
332
+ return False
333
+
334
+
335
+ def perm_get_auth_token_x509(issuer, kwargs, *, session: "Optional[Session]" = None):
336
+ """
337
+ Checks if a user can request a token with user_pass for an account.
338
+
339
+ :param issuer: Account identifier which issues the command.
340
+ :param kwargs: List of arguments for the action.
341
+ :param session: The DB session to use
342
+ :returns: True if account is allowed, otherwise False
343
+ """
344
+ if exist_identity_account(identity=kwargs['dn'], type_=IdentityType.X509, account=kwargs['account'], session=session):
345
+ return True
346
+ return False
347
+
348
+
349
+ def perm_get_auth_token_saml(issuer, kwargs, *, session: "Optional[Session]" = None):
350
+ """
351
+ Checks if a user can request a token with user_pass for an account.
352
+
353
+ :param issuer: Account identifier which issues the command.
354
+ :param kwargs: List of arguments for the action.
355
+ :param session: The DB session to use
356
+ :returns: True if account is allowed, otherwise False
357
+ """
358
+ if exist_identity_account(identity=kwargs['saml_nameid'], type_=IdentityType.SAML, account=kwargs['account'], session=session):
359
+ return True
360
+ return False
361
+
362
+
363
+ def perm_add_account_identity(issuer, kwargs, *, session: "Optional[Session]" = None):
364
+ """
365
+ Checks if an account can add an identity to an account.
366
+
367
+ :param issuer: Account identifier which issues the command.
368
+ :param kwargs: List of arguments for the action.
369
+ :param session: The DB session to use
370
+ :returns: True if account is allowed, otherwise False
371
+ """
372
+
373
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
374
+
375
+
376
+ def perm_del_account_identity(issuer, kwargs, *, session: "Optional[Session]" = None):
377
+ """
378
+ Checks if an account can delete an identity to an account.
379
+
380
+ :param issuer: Account identifier which issues the command.
381
+ :param kwargs: List of arguments for the action.
382
+ :param session: The DB session to use
383
+ :returns: True if account is allowed, otherwise False
384
+ """
385
+
386
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
387
+
388
+
389
+ def perm_del_identity(issuer, kwargs, *, session: "Optional[Session]" = None):
390
+ """
391
+ Checks if an account can delete an identity.
392
+
393
+ :param issuer: Account identifier which issues the command.
394
+ :param kwargs: List of arguments for the action.
395
+ :param session: The DB session to use
396
+ :returns: True if account is allowed, otherwise False
397
+ """
398
+
399
+ return _is_root(issuer) or issuer.external in kwargs.get('accounts')
400
+
401
+
402
+ def perm_add_did(issuer, kwargs, *, session: "Optional[Session]" = None):
403
+ """
404
+ Checks if an account can add an data identifier to a scope.
405
+
406
+ :param issuer: Account identifier which issues the command.
407
+ :param kwargs: List of arguments for the action.
408
+ :param session: The DB session to use
409
+ :returns: True if account is allowed, otherwise False
410
+ """
411
+ # Check the accounts of the issued rules
412
+ if not _is_root(issuer) and not has_account_attribute(account=issuer, key='admin', session=session):
413
+ for rule in kwargs.get('rules', []):
414
+ if rule['account'] != issuer:
415
+ return False
416
+
417
+ if kwargs['scope'].external != 'cms':
418
+ if kwargs['type'] == 'DATASET':
419
+ if '/USER#' not in kwargs['name']:
420
+ return False
421
+ elif kwargs['type'] == 'CONTAINER':
422
+ if not kwargs['name'].endswith('/USER'):
423
+ return False
424
+
425
+ return (_is_root(issuer)
426
+ or has_account_attribute(account=issuer, key='admin', session=session) # NOQA: W503
427
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session) # NOQA: W503
428
+ or kwargs['scope'].external == 'mock') # NOQA: W503
429
+
430
+
431
+ def perm_add_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
432
+ """
433
+ Checks if an account can bulk add data identifiers.
434
+
435
+ :param issuer: Account identifier which issues the command.
436
+ :param kwargs: List of arguments for the action.
437
+ :param session: The DB session to use
438
+ :returns: True if account is allowed, otherwise False
439
+ """
440
+ # Check the accounts of the issued rules
441
+ if not _is_root(issuer) and not has_account_attribute(account=issuer, key='admin', session=session):
442
+ for did in kwargs['dids']:
443
+ for rule in did.get('rules', []):
444
+ if rule['account'] != issuer:
445
+ return False
446
+
447
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
448
+
449
+
450
+ def perm_attach_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
451
+ """
452
+ Checks if an account can append an data identifier to the other data identifier.
453
+
454
+ :param issuer: Account identifier which issues the command.
455
+ :param kwargs: List of arguments for the action.
456
+ :param session: The DB session to use
457
+ :returns: True if account is allowed, otherwise False
458
+ """
459
+ return (_is_root(issuer)
460
+ or has_account_attribute(account=issuer, key='admin', session=session) # NOQA: W503
461
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session) # NOQA: W503
462
+ or kwargs['scope'].external == 'mock') # NOQA: W503
463
+
464
+
465
+ def perm_attach_dids_to_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
466
+ """
467
+ Checks if an account can append an data identifier to the other data identifier.
468
+
469
+ :param issuer: Account identifier which issues the command.
470
+ :param kwargs: List of arguments for the action.
471
+ :param session: The DB session to use
472
+ :returns: True if account is allowed, otherwise False
473
+ """
474
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
475
+ return True
476
+ else:
477
+ attachments = kwargs['attachments']
478
+ scopes = [did['scope'] for did in attachments]
479
+ scopes = list(set(scopes))
480
+ for scope in scopes:
481
+ if not rucio.core.scope.is_scope_owner(scope, issuer, session=session):
482
+ return False
483
+ return True
484
+
485
+
486
+ def perm_create_did_sample(issuer, kwargs, *, session: "Optional[Session]" = None):
487
+ """
488
+ Checks if an account can create a sample of a data identifier collection.
489
+
490
+ :param issuer: Account identifier which issues the command.
491
+ :param kwargs: List of arguments for the action.
492
+ :param session: The DB session to use
493
+ :returns: True if account is allowed, otherwise False
494
+ """
495
+ return issuer == ('root'
496
+ or has_account_attribute(account=issuer, key='admin', session=session) # NOQA: W503
497
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session) # NOQA: W503
498
+ or kwargs['scope'].external == 'mock') # NOQA: W503
499
+
500
+
501
+ def perm_del_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
502
+ """
503
+ Checks if an issuer can delete a replication rule.
504
+
505
+ :param issuer: Account identifier which issues the command.
506
+ :param kwargs: List of arguments for the action.
507
+ :param session: The DB session to use
508
+ :returns: True if account is allowed to call the API call, otherwise False
509
+ """
510
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
511
+ return True
512
+ if get_rule(kwargs['rule_id'])['account'] == issuer:
513
+ return True
514
+
515
+ return False
516
+
517
+
518
+ def perm_update_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
519
+ """
520
+ Checks if an issuer can update a replication rule.
521
+
522
+ :param issuer: Account identifier which issues the command.
523
+ :param kwargs: List of arguments for the action.
524
+ :param session: The DB session to use
525
+ :returns: True if account is allowed to call the API call, otherwise False
526
+ """
527
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
528
+ return True
529
+ return False
530
+
531
+
532
+ def perm_approve_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
533
+ """
534
+ Checks if an issuer can approve a replication rule.
535
+
536
+ :param issuer: Account identifier which issues the command.
537
+ :param kwargs: List of arguments for the action.
538
+ :param session: The DB session to use
539
+ :returns: True if account is allowed to call the API call, otherwise False
540
+ """
541
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
542
+ return True
543
+
544
+ rule = get_rule(rule_id=kwargs['rule_id'])
545
+ rses = parse_expression(rule['rse_expression'], filter_={'vo': issuer.vo}, session=session)
546
+
547
+ # Those in rule_approvers can approve the rule
548
+ for rse in rses:
549
+ rse_attr = list_rse_attributes(rse_id=rse['id'], session=session)
550
+ rule_approvers = rse_attr.get('rule_approvers', None)
551
+ if rule_approvers and issuer.external in rule_approvers.split(','):
552
+ return True
553
+
554
+ return False
555
+
556
+
557
+ def perm_reduce_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
558
+ """
559
+ Checks if an issuer can reduce a replication rule.
560
+
561
+ :param issuer: Account identifier which issues the command.
562
+ :param kwargs: List of arguments for the action.
563
+ :param session: The DB session to use
564
+ :returns: True if account is allowed to call the API call, otherwise False
565
+ """
566
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
567
+ return True
568
+ return False
569
+
570
+
571
+ def perm_move_rule(issuer, kwargs, *, session: "Optional[Session]" = None):
572
+ """
573
+ Checks if an issuer can move a replication rule.
574
+
575
+ :param issuer: Account identifier which issues the command.
576
+ :param kwargs: List of arguments for the action.
577
+ :param session: The DB session to use
578
+ :returns: True if account is allowed to call the API call, otherwise False
579
+ """
580
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
581
+ return True
582
+ return False
583
+
584
+
585
+ def perm_update_subscription(issuer, kwargs, *, session: "Optional[Session]" = None):
586
+ """
587
+ Checks if an account can update a subscription.
588
+
589
+ :param issuer: Account identifier which issues the command.
590
+ :param kwargs: List of arguments for the action.
591
+ :param session: The DB session to use
592
+ :returns: True if account is allowed, otherwise False
593
+ """
594
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
595
+ return True
596
+
597
+ return False
598
+
599
+
600
+ def perm_detach_dids(issuer, kwargs, *, session: "Optional[Session]" = None):
601
+ """
602
+ Checks if an account can detach an data identifier from the other data identifier.
603
+
604
+ :param issuer: Account identifier which issues the command.
605
+ :param kwargs: List of arguments for the action.
606
+ :param session: The DB session to use
607
+ :returns: True if account is allowed, otherwise False
608
+ """
609
+ return perm_attach_dids(issuer, kwargs, session=session)
610
+
611
+
612
+ def perm_set_metadata(issuer, kwargs, *, session: "Optional[Session]" = None):
613
+ """
614
+ Checks if an account can set a metadata on a data identifier.
615
+
616
+ :param issuer: Account identifier which issues the command.
617
+ :param kwargs: List of arguments for the action.
618
+ :param session: The DB session to use
619
+ :returns: True if account is allowed, otherwise False
620
+ """
621
+ return (_is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
622
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)) # NOQA: W503
623
+
624
+
625
+ def perm_set_status(issuer, kwargs, *, session: "Optional[Session]" = None):
626
+ """
627
+ Checks if an account can set status on an data identifier.
628
+
629
+ :param issuer: Account identifier which issues the command.
630
+ :param kwargs: List of arguments for the action.
631
+ :param session: The DB session to use
632
+ :returns: True if account is allowed, otherwise False
633
+ """
634
+ if kwargs.get('open', False):
635
+ if not _is_root(issuer) and not has_account_attribute(account=issuer, key='admin', session=session):
636
+ return False
637
+
638
+ return (_is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
639
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)) # NOQA: W503
640
+
641
+
642
+ def perm_add_protocol(issuer, kwargs, *, session: "Optional[Session]" = None):
643
+ """
644
+ Checks if an account can add a protocol to an RSE.
645
+
646
+ :param issuer: Account identifier which issues the command.
647
+ :param kwargs: List of arguments for the action.
648
+ :param session: The DB session to use
649
+ :returns: True if account is allowed, otherwise False
650
+ """
651
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
652
+
653
+
654
+ def perm_del_protocol(issuer, kwargs, *, session: "Optional[Session]" = None):
655
+ """
656
+ Checks if an account can delete protocols from an RSE.
657
+
658
+ :param issuer: Account identifier which issues the command.
659
+ :param kwargs: List of arguments for the action.
660
+ :param session: The DB session to use
661
+ :returns: True if account is allowed, otherwise False
662
+ """
663
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
664
+
665
+
666
+ def perm_update_protocol(issuer, kwargs, *, session: "Optional[Session]" = None):
667
+ """
668
+ Checks if an account can update protocols of an RSE.
669
+
670
+ :param issuer: Account identifier which issues the command.
671
+ :param kwargs: List of arguments for the action.
672
+ :param session: The DB session to use
673
+ :returns: True if account is allowed, otherwise False
674
+ """
675
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
676
+
677
+
678
+ def perm_add_qos_policy(issuer, kwargs, *, session: "Optional[Session]" = None):
679
+ """
680
+ Checks if an account can add QoS policies to an RSE.
681
+
682
+ :param issuer: Account identifier which issues the command.
683
+ :param kwargs: List of arguments for the action.
684
+ :param session: The DB session to use
685
+ :returns: True if account is allowed, otherwise False
686
+ """
687
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
688
+
689
+
690
+ def perm_delete_qos_policy(issuer, kwargs, *, session: "Optional[Session]" = None):
691
+ """
692
+ Checks if an account can delete QoS policies from an RSE.
693
+
694
+ :param issuer: Account identifier which issues the command.
695
+ :param kwargs: List of arguments for the action.
696
+ :param session: The DB session to use
697
+ :returns: True if account is allowed, otherwise False
698
+ """
699
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
700
+
701
+
702
+ def perm_declare_bad_file_replicas(issuer, kwargs, *, session: "Optional[Session]" = None):
703
+ """
704
+ Checks if an account can declare bad file replicas.
705
+
706
+ :param issuer: Account identifier which issues the command.
707
+ :param kwargs: List of arguments for the action.
708
+ :param session: The DB session to use
709
+ :returns: True if account is allowed, otherwise False
710
+ """
711
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
712
+
713
+
714
+ def perm_declare_suspicious_file_replicas(issuer, kwargs, *, session: "Optional[Session]" = None):
715
+ """
716
+ Checks if an account can declare suspicious file replicas.
717
+
718
+ :param issuer: Account identifier which issues the command.
719
+ :param kwargs: List of arguments for the action.
720
+ :param session: The DB session to use
721
+ :returns: True if account is allowed, otherwise False
722
+ """
723
+ return True
724
+
725
+
726
+ def perm_add_replicas(issuer, kwargs, *, session: "Optional[Session]" = None):
727
+ """
728
+ Checks if an account can add replicas.
729
+
730
+ :param issuer: Account identifier which issues the command.
731
+ :param kwargs: List of arguments for the action.
732
+ :param session: The DB session to use
733
+ :returns: True if account is allowed, otherwise False
734
+ """
735
+
736
+ is_root = _is_root(issuer)
737
+ is_temp = str(kwargs.get('rse', '')).endswith('_Temp')
738
+ is_admin = has_account_attribute(account=issuer, key='admin', session=session)
739
+
740
+ return is_root or is_temp or is_admin
741
+
742
+
743
+ def perm_skip_availability_check(issuer, kwargs, *, session: "Optional[Session]" = None):
744
+ """
745
+ Checks if an account can skip the availabity check to add/delete file replicas.
746
+
747
+ :param issuer: Account identifier which issues the command.
748
+ :param kwargs: List of arguments for the action.
749
+ :param session: The DB session to use
750
+ :returns: True if account is allowed, otherwise False
751
+ """
752
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
753
+
754
+
755
+ def perm_delete_replicas(issuer, kwargs, *, session: "Optional[Session]" = None):
756
+ """
757
+ Checks if an account can delete replicas.
758
+
759
+ :param issuer: Account identifier which issues the command.
760
+ :param kwargs: List of arguments for the action.
761
+ :param session: The DB session to use
762
+ :returns: True if account is allowed, otherwise False
763
+ """
764
+
765
+ # FIXME: Remove after the transition is over?
766
+
767
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
768
+
769
+
770
+ def perm_update_replicas_states(issuer, kwargs, *, session: "Optional[Session]" = None):
771
+ """
772
+ Checks if an account can delete replicas.
773
+
774
+ :param issuer: Account identifier which issues the command.
775
+ :param kwargs: List of arguments for the action.
776
+ :param session: The DB session to use
777
+ :returns: True if account is allowed, otherwise False
778
+ """
779
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
780
+
781
+
782
+ def perm_queue_requests(issuer, kwargs, *, session: "Optional[Session]" = None):
783
+ """
784
+ Checks if an account can submit transfer or deletion requests on destination RSEs for data identifiers.
785
+
786
+ :param issuer: Account identifier which issues the command.
787
+ :param kwargs: List of arguments for the action.
788
+ :param session: The DB session to use
789
+ :returns: True if account is allowed, otherwise False
790
+ """
791
+ return _is_root(issuer)
792
+
793
+
794
+ def perm_get_request_by_did(issuer, kwargs, *, session: "Optional[Session]" = None):
795
+ """
796
+ Checks if an account can get a request by DID.
797
+
798
+ :param issuer: Account identifier which issues the command.
799
+ :param kwargs: List of arguments for the action.
800
+ :param session: The DB session to use
801
+ :returns: True if account is allowed, otherwise False
802
+ """
803
+ return True
804
+
805
+
806
+ def perm_cancel_request(issuer, kwargs, *, session: "Optional[Session]" = None):
807
+ """
808
+ Checks if an account can cancel a request.
809
+
810
+ :param issuer: Account identifier which issues the command.
811
+ :param kwargs: List of arguments for the action.
812
+ :param session: The DB session to use
813
+ :returns: True if account is allowed, otherwise False
814
+ """
815
+ return _is_root(issuer)
816
+
817
+
818
+ def perm_get_next(issuer, kwargs, *, session: "Optional[Session]" = None):
819
+ """
820
+ Checks if an account can retrieve the next request matching the request type and state.
821
+
822
+ :param issuer: Account identifier which issues the command.
823
+ :param kwargs: List of arguments for the action.
824
+ :param session: The DB session to use
825
+ :returns: True if account is allowed, otherwise False
826
+ """
827
+ return _is_root(issuer)
828
+
829
+
830
+ def perm_set_rse_usage(issuer, kwargs, *, session: "Optional[Session]" = None):
831
+ """
832
+ Checks if an account can set RSE usage information.
833
+
834
+ :param issuer: Account identifier which issues the command.
835
+ :param kwargs: List of arguments for the action.
836
+ :param session: The DB session to use
837
+ :returns: True if account is allowed to call the API call, otherwise False
838
+ """
839
+ return _is_root(issuer)
840
+
841
+
842
+ def perm_set_rse_limits(issuer, kwargs, *, session: "Optional[Session]" = None):
843
+ """
844
+ Checks if an account can set RSE limits.
845
+
846
+ :param issuer: Account identifier which issues the command.
847
+ :param kwargs: List of arguments for the action.
848
+ :param session: The DB session to use
849
+ :returns: True if account is allowed to call the API call, otherwise False
850
+ """
851
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
852
+
853
+
854
+ def perm_set_local_account_limit(issuer, kwargs, *, session: "Optional[Session]" = None):
855
+ """
856
+ Checks if an account can set an account limit.
857
+
858
+ :param issuer: Account identifier which issues the command.
859
+ :param kwargs: List of arguments for the action.
860
+ :param session: The DB session to use
861
+ :returns: True if account is allowed, otherwise False
862
+ """
863
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
864
+ return True
865
+ # # Check if user is a country admin
866
+ # admin_in_country = []
867
+ # from rucio.core.account import has_account_attribute, list_account_attributes
868
+ # for kv in list_account_attributes(account=issuer, session=session):
869
+ # if kv['key'].startswith('country-') and kv['value'] == 'admin':
870
+ # admin_in_country.append(kv['key'].partition('-')[2])
871
+ # if admin_in_country and list_rse_attributes(rse_id=kwargs['rse_id'], session=session).get('country') in admin_in_country:
872
+ # return True
873
+
874
+ # Those listed as quota approvers can add to quotas
875
+ rse_attr = list_rse_attributes(rse_id=kwargs['rse_id'], session=session)
876
+ quota_approvers = rse_attr.get('quota_approvers', None)
877
+ if quota_approvers and issuer.external in quota_approvers.split(','):
878
+ return True
879
+
880
+ return False
881
+
882
+
883
+ def perm_set_global_account_limit(issuer, kwargs, *, session: "Optional[Session]" = None):
884
+ """
885
+ Checks if an account can set a global account limit.
886
+
887
+ :param account: Account identifier which issues the command.
888
+ :param kwargs: List of arguments for the action.
889
+ :param session: The DB session to use
890
+ :returns: True if account is allowed, otherwise False
891
+ """
892
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
893
+ return True
894
+ # # Check if user is a country admin
895
+ # admin_in_country = set()
896
+ # for kv in list_account_attributes(account=issuer, session=session):
897
+ # if kv['key'].startswith('country-') and kv['value'] == 'admin':
898
+ # admin_in_country.add(kv['key'].partition('-')[2])
899
+ # resolved_rse_countries = {list_rse_attributes(rse_id=rse['rse_id'], session=session).get('country')
900
+ # for rse in parse_expression(kwargs['rse_expression'], filter={'vo': issuer.vo}, session=session)}
901
+ # if resolved_rse_countries.issubset(admin_in_country):
902
+ # return True
903
+ return False
904
+
905
+
906
+ def perm_delete_global_account_limit(issuer, kwargs, *, session: "Optional[Session]" = None):
907
+ """
908
+ Checks if an account can delete a global account limit.
909
+
910
+ :param issuer: Account identifier which issues the command.
911
+ :param kwargs: List of arguments for the action.
912
+ :param session: The DB session to use
913
+ :returns: True if account is allowed, otherwise False
914
+ """
915
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
916
+ return True
917
+ # # Check if user is a country admin
918
+ # admin_in_country = set()
919
+ # for kv in list_account_attributes(account=issuer, session=session):
920
+ # if kv['key'].startswith('country-') and kv['value'] == 'admin':
921
+ # admin_in_country.add(kv['key'].partition('-')[2])
922
+ # if admin_in_country:
923
+ # resolved_rse_countries = {list_rse_attributes(rse_id=rse['rse_id'], session=session).get('country')
924
+ # for rse in parse_expression(kwargs['rse_expression'], filter={'vo': issuer.vo}, session=session)}
925
+ # if resolved_rse_countries.issubset(admin_in_country):
926
+ # return True
927
+ return False
928
+
929
+
930
+ def perm_delete_local_account_limit(issuer, kwargs, *, session: "Optional[Session]" = None):
931
+ """
932
+ Checks if an account can delete an account limit.
933
+
934
+ :param issuer: Account identifier which issues the command.
935
+ :param kwargs: List of arguments for the action.
936
+ :param session: The DB session to use
937
+ :returns: True if account is allowed, otherwise False
938
+ """
939
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
940
+ return True
941
+ # # Check if user is a country admin
942
+ # admin_in_country = []
943
+ # for kv in list_account_attributes(account=issuer, session=session):
944
+ # if kv['key'].startswith('country-') and kv['value'] == 'admin':
945
+ # admin_in_country.append(kv['key'].partition('-')[2])
946
+ # if admin_in_country and list_rse_attributes(rse_id=kwargs['rse_id'], session=session).get('country') in admin_in_country:
947
+ # return True
948
+
949
+ rse_attr = list_rse_attributes(rse_id=kwargs['rse_id'], session=session)
950
+ quota_approvers = rse_attr.get('quota_approvers', None)
951
+ if quota_approvers and issuer.external in quota_approvers.split(','):
952
+ return True
953
+
954
+ return False
955
+
956
+
957
+ def perm_config(issuer, kwargs, *, session: "Optional[Session]" = None):
958
+ """
959
+ Checks if an account can read/write the configuration.
960
+
961
+ :param issuer: Account identifier which issues the command.
962
+ :param kwargs: List of arguments for the action.
963
+ :param session: The DB session to use
964
+ :returns: True if account is allowed to call the API call, otherwise False
965
+ """
966
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
967
+
968
+
969
+ def perm_get_local_account_usage(issuer, kwargs, *, session: "Optional[Session]" = None):
970
+ """
971
+ Checks if an account can get the account usage of an account.
972
+
973
+ :param issuer: Account identifier which issues the command.
974
+ :param kwargs: List of arguments for the action.
975
+ :param session: The DB session to use
976
+ :returns: True if account is allowed, otherwise False
977
+ """
978
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session) or kwargs.get('account') == issuer:
979
+ return True
980
+ # # Check if user is a country admin
981
+ # for kv in list_account_attributes(account=issuer, session=session):
982
+ # if kv['key'].startswith('country-') and kv['value'] == 'admin':
983
+ # return True
984
+ return False
985
+
986
+
987
+ def perm_add_account_attribute(issuer, kwargs, *, session: "Optional[Session]" = None):
988
+ """
989
+ Checks if an account can add attributes to accounts.
990
+
991
+ :param issuer: Account identifier which issues the command.
992
+ :param kwargs: List of arguments for the action.
993
+ :param session: The DB session to use
994
+ :returns: True if account is allowed to call the API call, otherwise False
995
+ """
996
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
997
+
998
+
999
+ def perm_del_account_attribute(issuer, kwargs, *, session: "Optional[Session]" = None):
1000
+ """
1001
+ Checks if an account can add attributes to accounts.
1002
+
1003
+ :param issuer: Account identifier which issues the command.
1004
+ :param kwargs: List of arguments for the action.
1005
+ :param session: The DB session to use
1006
+ :returns: True if account is allowed to call the API call, otherwise False
1007
+ """
1008
+ return perm_add_account_attribute(issuer, kwargs, session=session)
1009
+
1010
+
1011
+ def perm_list_heartbeats(issuer, kwargs, *, session: "Optional[Session]" = None):
1012
+ """
1013
+ Checks if an account can list heartbeats.
1014
+
1015
+ :param issuer: Account identifier which issues the command.
1016
+ :param kwargs: List of arguments for the action.
1017
+ :param session: The DB session to use
1018
+ :returns: True if account is allowed to call the API call, otherwise False
1019
+ """
1020
+ return _is_root(issuer)
1021
+
1022
+
1023
+ def perm_resurrect(issuer, kwargs, *, session: "Optional[Session]" = None):
1024
+ """
1025
+ Checks if an account can resurrect DIDS.
1026
+
1027
+ :param issuer: Account identifier which issues the command.
1028
+ :param kwargs: List of arguments for the action.
1029
+ :param session: The DB session to use
1030
+ :returns: True if account is allowed to call the API call, otherwise False
1031
+ """
1032
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
1033
+
1034
+
1035
+ def perm_update_lifetime_exceptions(issuer, kwargs, *, session: "Optional[Session]" = None):
1036
+ """
1037
+ Checks if an account can approve/reject Lifetime Model exceptions.
1038
+
1039
+ :param issuer: Account identifier which issues the command.
1040
+ :param kwargs: List of arguments for the action.
1041
+ :param session: The DB session to use
1042
+ :returns: True if account is allowed to call the API call, otherwise False
1043
+ """
1044
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
1045
+
1046
+
1047
+ def perm_get_auth_token_ssh(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
1048
+ """
1049
+ Checks if an account can request an ssh token.
1050
+
1051
+ :param issuer: Account identifier which issues the command.
1052
+ :param kwargs: List of arguments for the action.
1053
+ :param session: The DB session to use
1054
+ :returns: True if account is allowed to call the API call, otherwise False
1055
+ """
1056
+ return True
1057
+
1058
+
1059
+ def perm_get_signed_url(issuer, kwargs, *, session: "Optional[Session]" = None):
1060
+ """
1061
+ Checks if an account can request a signed URL.
1062
+
1063
+ :param issuer: Account identifier which issues the command.
1064
+ :param session: The DB session to use
1065
+ :returns: True if account is allowed to call the API call, otherwise False
1066
+ """
1067
+ return _is_root(issuer)
1068
+
1069
+
1070
+ def perm_add_bad_pfns(issuer, kwargs, *, session: "Optional[Session]" = None):
1071
+ """
1072
+ Checks if an account can declare bad PFNs.
1073
+
1074
+ :param issuer: Account identifier which issues the command.
1075
+ :param kwargs: List of arguments for the action.
1076
+ :param session: The DB session to use
1077
+ :returns: True if account is allowed, otherwise False
1078
+ """
1079
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
1080
+
1081
+
1082
+ def perm_remove_did_from_followed(issuer, kwargs, *, session: "Optional[Session]" = None):
1083
+ """
1084
+ Checks if an account can remove did from followed table.
1085
+
1086
+ :param issuer: Account identifier which issues the command.
1087
+ :param kwargs: List of arguments for the action.
1088
+ :param session: The DB session to use
1089
+ :returns: True if account is allowed, otherwise False
1090
+ """
1091
+ return (_is_root(issuer)
1092
+ or has_account_attribute(account=issuer, key='admin', session=session) # NOQA: W503
1093
+ or kwargs['account'] == issuer # NOQA: W503
1094
+ or kwargs['scope'].external == 'mock') # NOQA: W503
1095
+
1096
+
1097
+ def perm_remove_dids_from_followed(issuer, kwargs, *, session: "Optional[Session]" = None):
1098
+ """
1099
+ Checks if an account can bulk remove dids from followed table.
1100
+
1101
+ :param issuer: Account identifier which issues the command.
1102
+ :param kwargs: List of arguments for the action.
1103
+ :param session: The DB session to use
1104
+ :returns: True if account is allowed, otherwise False
1105
+ """
1106
+ if _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session):
1107
+ return True
1108
+ if not kwargs['account'] == issuer:
1109
+ return False
1110
+ return True
1111
+
1112
+
1113
+ def perm_add_vo(issuer, kwargs, *, session: "Optional[Session]" = None):
1114
+ """
1115
+ Checks if an account can add a VO.
1116
+ :param issuer: Account identifier which issues the command.
1117
+ :param kwargs: List of arguments for the action.
1118
+ :param session: The DB session to use
1119
+ :returns: True if account is allowed, otherwise False
1120
+ """
1121
+ return (issuer.internal == 'super_root')
1122
+
1123
+
1124
+ def perm_list_vos(issuer, kwargs, *, session: "Optional[Session]" = None):
1125
+ """
1126
+ Checks if an account can list a VO.
1127
+ :param issuer: Account identifier which issues the command.
1128
+ :param kwargs: List of arguments for the action.
1129
+ :param session: The DB session to use
1130
+ :param session: The DB session to use
1131
+ :returns: True if account is allowed, otherwise False
1132
+ """
1133
+ return (issuer.internal == 'super_root')
1134
+
1135
+
1136
+ def perm_recover_vo_root_identity(issuer, kwargs, *, session: "Optional[Session]" = None):
1137
+ """
1138
+ Checks if an account can recover identities for VOs.
1139
+ :param issuer: Account identifier which issues the command.
1140
+ :param kwargs: List of arguments for the action.
1141
+ :param session: The DB session to use
1142
+ :returns: True if account is allowed, otherwise False
1143
+ """
1144
+ return (issuer.internal == 'super_root')
1145
+
1146
+
1147
+ def perm_update_vo(issuer, kwargs, *, session: "Optional[Session]" = None):
1148
+ """
1149
+ Checks if an account can update a VO.
1150
+ :param issuer: Account identifier which issues the command.
1151
+ :param kwargs: List of arguments for the action.
1152
+ :param session: The DB session to use
1153
+ :returns: True if account is allowed, otherwise False
1154
+ """
1155
+ return (issuer.internal == 'super_root')
1156
+
1157
+
1158
+ def perm_access_rule_vo(issuer, kwargs, *, session: "Optional[Session]" = None):
1159
+ """
1160
+ Checks if we're at the same VO as the rule_id's
1161
+ :param issuer: Account identifier which issues the command.
1162
+ :param kwargs: List of arguments for the action.
1163
+ :param session: The DB session to use
1164
+ :returns: True if account is allowed, otherwise False
1165
+ """
1166
+ return get_rule(kwargs['rule_id'])['scope'].vo == issuer.vo