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,1076 @@
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.common.config import config_get
20
+ from rucio.common.types import InternalScope, InternalAccount
21
+ from rucio.core.account import has_account_attribute, list_account_attributes
22
+ from rucio.core.did import get_metadata
23
+ from rucio.core.identity import exist_identity_account
24
+ from rucio.core.lifetime_exception import list_exceptions
25
+ from rucio.core.rse import list_rse_attributes
26
+ from rucio.core.rse_expression_parser import parse_expression
27
+ from rucio.core.rule import get_rule
28
+ from rucio.db.sqla.constants import IdentityType
29
+
30
+ if TYPE_CHECKING:
31
+ from typing import Optional
32
+ from sqlalchemy.orm import Session
33
+
34
+
35
+ def has_permission(issuer: "InternalAccount", action: str, kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
36
+ """
37
+ Checks if an account has the specified permission to
38
+ execute an action with parameters.
39
+
40
+ :param issuer: Account identifier which issues the command..
41
+ :param action: The action(API call) called by the account.
42
+ :param kwargs: List of arguments for the action.
43
+ :param session: The DB session to use
44
+ :returns: True if account is allowed, otherwise False
45
+ """
46
+ perm = {'add_account': perm_add_account,
47
+ 'del_account': perm_del_account,
48
+ 'update_account': perm_update_account,
49
+ 'add_rule': perm_add_rule,
50
+ 'add_subscription': perm_add_subscription,
51
+ 'add_scope': perm_add_scope,
52
+ 'add_rse': perm_add_rse,
53
+ 'update_rse': perm_update_rse,
54
+ 'add_protocol': perm_add_protocol,
55
+ 'del_protocol': perm_del_protocol,
56
+ 'update_protocol': perm_update_protocol,
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_metadata_bulk': perm_set_metadata_bulk,
85
+ 'set_status': perm_set_status,
86
+ 'queue_requests': perm_queue_requests,
87
+ 'set_rse_usage': perm_set_rse_usage,
88
+ 'set_rse_limits': perm_set_rse_limits,
89
+ 'get_request_by_did': perm_get_request_by_did,
90
+ 'cancel_request': perm_cancel_request,
91
+ 'get_next': perm_get_next,
92
+ 'set_local_account_limit': perm_set_local_account_limit,
93
+ 'set_global_account_limit': perm_set_global_account_limit,
94
+ 'delete_local_account_limit': perm_delete_local_account_limit,
95
+ 'delete_global_account_limit': perm_delete_global_account_limit,
96
+ 'config_sections': perm_config,
97
+ 'config_add_section': perm_config,
98
+ 'config_has_section': perm_config,
99
+ 'config_options': perm_config,
100
+ 'config_has_option': perm_config,
101
+ 'config_get': perm_config,
102
+ 'config_items': perm_config,
103
+ 'config_set': perm_config,
104
+ 'config_remove_section': perm_config,
105
+ 'config_remove_option': perm_config,
106
+ 'get_local_account_usage': perm_get_local_account_usage,
107
+ 'get_global_account_usage': perm_get_global_account_usage,
108
+ 'add_attribute': perm_add_account_attribute,
109
+ 'del_attribute': perm_del_account_attribute,
110
+ 'list_heartbeats': perm_list_heartbeats,
111
+ 'resurrect': perm_resurrect,
112
+ 'update_lifetime_exceptions': perm_update_lifetime_exceptions,
113
+ 'get_auth_token_ssh': perm_get_auth_token_ssh,
114
+ 'get_signed_url': perm_get_signed_url,
115
+ 'add_bad_pfns': perm_add_bad_pfns,
116
+ 'del_account_identity': perm_del_account_identity,
117
+ 'del_identity': perm_del_identity,
118
+ 'remove_did_from_followed': perm_remove_did_from_followed,
119
+ 'remove_dids_from_followed': perm_remove_dids_from_followed}
120
+
121
+ return perm.get(action, perm_default)(issuer=issuer, kwargs=kwargs, session=session)
122
+
123
+
124
+ def _is_root(issuer):
125
+ return issuer.external == 'root'
126
+
127
+
128
+ def _perm_country(issuer: "InternalAccount", rses: list, roles: list, *, session: "Optional[Session]" = None) -> bool:
129
+ admin_in_country = []
130
+ for kv in list_account_attributes(account=issuer, session=session):
131
+ if kv['key'].startswith('country-') and kv['value'] == 'admin':
132
+ admin_in_country.append(kv['key'].partition('-')[2])
133
+ if admin_in_country:
134
+ for rse in rses:
135
+ if list_rse_attributes(rse_id=rse['id'], session=session).get('country') in admin_in_country:
136
+ return True
137
+ return False
138
+
139
+
140
+ def perm_default(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
141
+ """
142
+ Default permission.
143
+
144
+ :param issuer: Account identifier which issues the command.
145
+ :param kwargs: List of arguments for the action.
146
+ :param session: The DB session to use
147
+ :returns: True if account is allowed, otherwise False
148
+ """
149
+ return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
150
+
151
+
152
+ def perm_add_rse(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
153
+ """
154
+ Checks if an account can add a RSE.
155
+
156
+ :param issuer: Account identifier which issues the command.
157
+ :param kwargs: List of arguments for the action.
158
+ :param session: The DB session to use
159
+ :returns: True if account is allowed, otherwise False
160
+ """
161
+ return perm_default(issuer, kwargs, session=session)\
162
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)
163
+
164
+
165
+ def perm_update_rse(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
166
+ """
167
+ Checks if an account can update a RSE.
168
+
169
+ :param issuer: Account identifier which issues the command.
170
+ :param kwargs: List of arguments for the action.
171
+ :param session: The DB session to use
172
+ :returns: True if account is allowed, otherwise False
173
+ """
174
+ return perm_default(issuer, kwargs, session=session)\
175
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)
176
+
177
+
178
+ def perm_add_rule(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
179
+ """
180
+ Checks if an account can add a replication rule.
181
+
182
+ :param issuer: Account identifier which issues the command.
183
+ :param kwargs: List of arguments for the action.
184
+ :param session: The DB session to use
185
+ :returns: True if account is allowed, otherwise False
186
+ """
187
+ restricted_scopes = config_get('permission', 'restricted_scopes', raise_exception=False, default=[], session=session)
188
+ # TODO change to config_get_list
189
+ if kwargs['account'] == issuer:
190
+ if kwargs.get('scope') and restricted_scopes and kwargs['scope'] in restricted_scopes:
191
+ return False
192
+ if kwargs.get('dids'):
193
+ for did in kwargs['dids']:
194
+ if restricted_scopes and did['scope'] in restricted_scopes:
195
+ return False
196
+ return True
197
+ return perm_default(issuer, kwargs, session=session) or has_account_attribute(account=issuer, key='rule_admin', session=session)
198
+
199
+
200
+ def perm_add_subscription(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
201
+ """
202
+ Checks if an account can add a subscription.
203
+
204
+ :param issuer: Account identifier which issues the command.
205
+ :param kwargs: List of arguments for the action.
206
+ :param session: The DB session to use
207
+ :returns: True if account is allowed, otherwise False
208
+ """
209
+ return perm_default(issuer, kwargs, session=session)\
210
+ or has_account_attribute(account=issuer, key='subscription_admin', session=session)
211
+
212
+
213
+ def perm_add_rse_attribute(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
214
+ """
215
+ Checks if an account can add a RSE attribute.
216
+
217
+ :param issuer: Account identifier which issues the command.
218
+ :param kwargs: List of arguments for the action.
219
+ :param session: The DB session to use
220
+ :returns: True if account is allowed, otherwise False
221
+ """
222
+ return perm_default(issuer, kwargs, session=session)\
223
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)
224
+
225
+
226
+ def perm_del_rse_attribute(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
227
+ """
228
+ Checks if an account can delete a RSE attribute.
229
+
230
+ :param issuer: Account identifier which issues the command.
231
+ :param kwargs: List of arguments for the action.
232
+ :param session: The DB session to use
233
+ :returns: True if account is allowed, otherwise False
234
+ """
235
+ return perm_default(issuer, kwargs, session=session)\
236
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)
237
+
238
+
239
+ def perm_del_rse(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
240
+ """
241
+ Checks if an account can delete a RSE.
242
+
243
+ :param issuer: Account identifier which issues the command.
244
+ :param kwargs: List of arguments for the action.
245
+ :param session: The DB session to use
246
+ :returns: True if account is allowed, otherwise False
247
+ """
248
+ return perm_default(issuer, kwargs, session=session)\
249
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)
250
+
251
+
252
+ def perm_add_account(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
253
+ """
254
+ Checks if an account can add an account.
255
+
256
+ :param issuer: Account identifier which issues the command.
257
+ :param kwargs: List of arguments for the action.
258
+ :param session: The DB session to use
259
+ :returns: True if account is allowed, otherwise False
260
+ """
261
+ return perm_default(issuer, kwargs, session=session)\
262
+ or has_account_attribute(account=issuer, key='account_admin', session=session)
263
+
264
+
265
+ def perm_del_account(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
266
+ """
267
+ Checks if an account can del an account.
268
+
269
+ :param issuer: Account identifier which issues the command.
270
+ :param kwargs: List of arguments for the action.
271
+ :param session: The DB session to use
272
+ :returns: True if account is allowed, otherwise False
273
+ """
274
+ return perm_default(issuer, kwargs, session=session)\
275
+ or has_account_attribute(account=issuer, key='account_admin', session=session)
276
+
277
+
278
+ def perm_update_account(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
279
+ """
280
+ Checks if an account can update an account.
281
+
282
+ :param issuer: Account identifier which issues the command.
283
+ :param kwargs: List of arguments for the action.
284
+ :param session: The DB session to use
285
+ :returns: True if account is allowed, otherwise False
286
+ """
287
+ return perm_default(issuer, kwargs, session=session)\
288
+ or has_account_attribute(account=issuer, key='account_admin', session=session)
289
+
290
+
291
+ def perm_add_scope(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
292
+ """
293
+ Checks if an account can add a scope to an account.
294
+
295
+ :param issuer: Account identifier which issues the command.
296
+ :param kwargs: List of arguments for the action.
297
+ :param session: The DB session to use
298
+ :returns: True if account is allowed, otherwise False
299
+ """
300
+ return perm_default(issuer, kwargs, session=session)\
301
+ or has_account_attribute(account=issuer, key='scope_admin', session=session)
302
+
303
+
304
+ def perm_get_auth_token_user_pass(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
305
+ """
306
+ Checks if a user can request a token with user_pass for an account.
307
+
308
+ :param issuer: Account identifier which issues the command.
309
+ :param kwargs: List of arguments for the action.
310
+ :param session: The DB session to use
311
+ :returns: True if account is allowed, otherwise False
312
+ """
313
+ if exist_identity_account(identity=kwargs['username'], type_=IdentityType.USERPASS, account=kwargs['account'], session=session):
314
+ return True
315
+ return False
316
+
317
+
318
+ def perm_get_auth_token_gss(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
319
+ """
320
+ Checks if a user can request a token with user_pass for an account.
321
+
322
+ :param issuer: Account identifier which issues the command.
323
+ :param kwargs: List of arguments for the action.
324
+ :param session: The DB session to use
325
+ :returns: True if account is allowed, otherwise False
326
+ """
327
+ if exist_identity_account(identity=kwargs['gsscred'], type_=IdentityType.GSS, account=kwargs['account'], session=session):
328
+ return True
329
+ return False
330
+
331
+
332
+ def perm_get_auth_token_x509(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
333
+ """
334
+ Checks if a user can request a token with user_pass for an account.
335
+
336
+ :param issuer: Account identifier which issues the command.
337
+ :param kwargs: List of arguments for the action.
338
+ :param session: The DB session to use
339
+ :returns: True if account is allowed, otherwise False
340
+ """
341
+ if exist_identity_account(identity=kwargs['dn'], type_=IdentityType.X509, account=kwargs['account'], session=session):
342
+ return True
343
+ return False
344
+
345
+
346
+ def perm_get_auth_token_saml(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
347
+ """
348
+ Checks if a user can request a token with user_pass for an account.
349
+
350
+ :param issuer: Account identifier which issues the command.
351
+ :param kwargs: List of arguments for the action.
352
+ :param session: The DB session to use
353
+ :returns: True if account is allowed, otherwise False
354
+ """
355
+ if exist_identity_account(identity=kwargs['saml_nameid'], type_=IdentityType.SAML, account=kwargs['account'], session=session):
356
+ return True
357
+ return False
358
+
359
+
360
+ def perm_add_account_identity(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
361
+ """
362
+ Checks if an account can add an identity to an account.
363
+
364
+ :param issuer: Account identifier which issues the command.
365
+ :param kwargs: List of arguments for the action.
366
+ :param session: The DB session to use
367
+ :returns: True if account is allowed, otherwise False
368
+ """
369
+ return perm_default(issuer, kwargs, session=session)\
370
+ or has_account_attribute(account=issuer, key='account_admin', session=session)
371
+
372
+
373
+ def perm_del_account_identity(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
374
+ """
375
+ Checks if an account can delete an identity to an account.
376
+
377
+ :param issuer: Account identifier which issues the command.
378
+ :param kwargs: List of arguments for the action.
379
+ :param session: The DB session to use
380
+ :returns: True if account is allowed, otherwise False
381
+ """
382
+ return perm_default(issuer, kwargs, session=session)\
383
+ or has_account_attribute(account=issuer, key='account_admin', session=session)
384
+
385
+
386
+ def perm_del_identity(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
387
+ """
388
+ Checks if an account can delete an identity.
389
+
390
+ :param issuer: Account identifier which issues the command.
391
+ :param kwargs: List of arguments for the action.
392
+ :param session: The DB session to use
393
+ :returns: True if account is allowed, otherwise False
394
+ """
395
+ return perm_default(issuer, kwargs, session=session)\
396
+ or has_account_attribute(account=issuer, key='account_admin', session=session)
397
+
398
+
399
+ def perm_add_did(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
400
+ """
401
+ Checks if an account can add an data identifier to a scope.
402
+
403
+ :param issuer: Account identifier which issues the command.
404
+ :param kwargs: List of arguments for the action.
405
+ :param session: The DB session to use
406
+ :returns: True if account is allowed, otherwise False
407
+ """
408
+ # Check the accounts of the issued rules
409
+ for rule in kwargs.get('rules', []):
410
+ kwargs_rule = rule
411
+ if 'scope' not in kwargs_rule:
412
+ if kwargs['scope'] and not isinstance(kwargs['scope'], str):
413
+ kwargs_rule['scope'] = kwargs['scope'].external
414
+ else:
415
+ kwargs_rule['scope'] = kwargs['scope']
416
+ if not perm_add_rule(issuer, kwargs=kwargs_rule, session=session):
417
+ return False
418
+
419
+ scope = kwargs['scope']
420
+ if isinstance(kwargs['scope'], str):
421
+ scope = InternalScope(kwargs['scope'])
422
+ return perm_default(issuer, kwargs, session=session)\
423
+ or has_account_attribute(account=issuer, key='did_admin', session=session)\
424
+ or has_account_attribute(account=issuer, key='production_account', session=session)\
425
+ or rucio.core.scope.is_scope_owner(scope=scope, account=issuer, session=session)\
426
+ or (kwargs.get('name', False) and kwargs['name'].startswith('/belle/scout'))
427
+
428
+
429
+ def perm_add_dids(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
430
+ """
431
+ Checks if an account can bulk add data identifiers.
432
+
433
+ :param issuer: Account identifier which issues the command.
434
+ :param kwargs: List of arguments for the action.
435
+ :param session: The DB session to use
436
+ :returns: True if account is allowed, otherwise False
437
+ """
438
+ # Check the accounts of the issued rules
439
+ for did in kwargs['dids']:
440
+ if not perm_add_did(issuer, kwargs=did, session=session):
441
+ return False
442
+ return True
443
+
444
+
445
+ def perm_attach_dids(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
446
+ """
447
+ Checks if an account can append an data identifier to the other data identifier.
448
+
449
+ :param issuer: Account identifier which issues the command.
450
+ :param kwargs: List of arguments for the action.
451
+ :param session: The DB session to use
452
+ :returns: True if account is allowed, otherwise False
453
+ """
454
+ return perm_default(issuer, kwargs, session=session)\
455
+ or has_account_attribute(account=issuer, key='did_admin', session=session)\
456
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)
457
+
458
+
459
+ def perm_attach_dids_to_dids(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
460
+ """
461
+ Checks if an account can append an data identifier to the other data identifier.
462
+
463
+ :param issuer: Account identifier which issues the command.
464
+ :param kwargs: List of arguments for the action.
465
+ :param session: The DB session to use
466
+ :returns: True if account is allowed, otherwise False
467
+ """
468
+ if perm_default(issuer, kwargs, session=session) or has_account_attribute(account=issuer, key='did_admin', session=session):
469
+ return True
470
+ else:
471
+ attachments = kwargs['attachments']
472
+ scopes = [did['scope'] for did in attachments]
473
+ scopes = list(set(scopes))
474
+ for scope in scopes:
475
+ if not rucio.core.scope.is_scope_owner(scope, issuer, session=session):
476
+ return False
477
+ return True
478
+
479
+
480
+ def perm_create_did_sample(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
481
+ """
482
+ Checks if an account can create a sample of a data identifier collection.
483
+
484
+ :param issuer: Account identifier which issues the command.
485
+ :param kwargs: List of arguments for the action.
486
+ :param session: The DB session to use
487
+ :returns: True if account is allowed, otherwise False
488
+ """
489
+ return perm_default(issuer, kwargs, session=session)\
490
+ or has_account_attribute(account=issuer, key='did_admin', session=session)\
491
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)\
492
+ or kwargs['scope'].external == 'mock'
493
+
494
+
495
+ def perm_del_rule(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
496
+ """
497
+ Checks if an issuer can delete a replication rule.
498
+
499
+ :param issuer: Account identifier which issues the command.
500
+ :param kwargs: List of arguments for the action.
501
+ :param session: The DB session to use
502
+ :returns: True if account is allowed to call the API call, otherwise False
503
+ """
504
+ rule = get_rule(rule_id=kwargs['rule_id'], session=session)
505
+ rses = parse_expression(rule['rse_expression'], filter_={'vo': issuer.vo}, session=session)
506
+ # Check if user is a country admin
507
+ if _perm_country(issuer=issuer, rses=rses, roles=['admin', ], session=session):
508
+ return True
509
+
510
+ # DELETERS can delete the rule
511
+ for rse in rses:
512
+ rse_attr = list_rse_attributes(rse_id=rse['id'], session=session)
513
+ if rse_attr.get('rule_deleters'):
514
+ if issuer.external in rse_attr.get('rule_deleters').split(','):
515
+ return True
516
+ return perm_default(issuer, kwargs, session=session)\
517
+ or has_account_attribute(account=issuer, key='rule_admin', session=session)\
518
+ or get_rule(kwargs['rule_id'], session=session)['account'] == issuer
519
+
520
+
521
+ def perm_update_rule(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
522
+ """
523
+ Checks if an issuer can update a replication rule.
524
+
525
+ :param issuer: Account identifier which issues the command.
526
+ :param kwargs: List of arguments for the action.
527
+ :param session: The DB session to use
528
+ :returns: True if account is allowed to call the API call, otherwise False
529
+ """
530
+ return perm_default(issuer, kwargs, session=session)\
531
+ or has_account_attribute(account=issuer, key='rule_admin', session=session)\
532
+ or (kwargs.get('rule_id', False) and get_rule(kwargs['rule_id'], session=session)['account'] == issuer)
533
+
534
+
535
+ def perm_approve_rule(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
536
+ """
537
+ Checks if an issuer can approve a replication rule.
538
+
539
+ :param issuer: Account identifier which issues the command.
540
+ :param kwargs: List of arguments for the action.
541
+ :param session: The DB session to use
542
+ :returns: True if account is allowed to call the API call, otherwise False
543
+ """
544
+ return perm_default(issuer, kwargs, session=session)\
545
+ or has_account_attribute(account=issuer, key='rule_admin', session=session)
546
+
547
+
548
+ def perm_reduce_rule(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
549
+ """
550
+ Checks if an issuer can reduce a replication rule.
551
+
552
+ :param issuer: Account identifier which issues the command.
553
+ :param kwargs: List of arguments for the action.
554
+ :param session: The DB session to use
555
+ :returns: True if account is allowed to call the API call, otherwise False
556
+ """
557
+ return perm_default(issuer, kwargs, session=session)\
558
+ or has_account_attribute(account=issuer, key='rule_admin', session=session)
559
+
560
+
561
+ def perm_move_rule(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
562
+ """
563
+ Checks if an issuer can move a replication rule.
564
+
565
+ :param issuer: Account identifier which issues the command.
566
+ :param kwargs: List of arguments for the action.
567
+ :param session: The DB session to use
568
+ :returns: True if account is allowed to call the API call, otherwise False
569
+ """
570
+ return perm_default(issuer, kwargs, session=session)\
571
+ or has_account_attribute(account=issuer, key='rule_admin', session=session)\
572
+ or get_rule(kwargs['rule_id'], session=session)['account'] == issuer
573
+
574
+
575
+ def perm_update_subscription(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
576
+ """
577
+ Checks if an account can update a subscription.
578
+
579
+ :param issuer: Account identifier which issues the command.
580
+ :param kwargs: List of arguments for the action.
581
+ :param session: The DB session to use
582
+ :returns: True if account is allowed, otherwise False
583
+ """
584
+ return perm_default(issuer, kwargs, session=session)\
585
+ or has_account_attribute(account=issuer, key='subscription_admin', session=session)
586
+
587
+
588
+ def perm_detach_dids(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
589
+ """
590
+ Checks if an account can detach an data identifier from the other data identifier.
591
+
592
+ :param issuer: Account identifier which issues the command.
593
+ :param kwargs: List of arguments for the action.
594
+ :param session: The DB session to use
595
+ :returns: True if account is allowed, otherwise False
596
+ """
597
+ return perm_default(issuer, kwargs, session=session)\
598
+ or has_account_attribute(account=issuer, key='did_admin', session=session)\
599
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)
600
+
601
+
602
+ def perm_set_metadata_bulk(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
603
+ """
604
+ Checks if an account can set a metadata on a data identifier.
605
+
606
+ :param issuer: Account identifier which issues the command.
607
+ :param kwargs: List of arguments for the action.
608
+ :param session: The DB session to use
609
+ :returns: True if account is allowed, otherwise False
610
+ """
611
+ meta = get_metadata(kwargs['scope'], kwargs['name'], session=session)
612
+ return perm_default(issuer, kwargs, session=session)\
613
+ or has_account_attribute(account=issuer, key='did_admin', session=session)\
614
+ or meta.get('account', '') == issuer\
615
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)
616
+
617
+
618
+ def perm_set_metadata(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
619
+ """
620
+ Checks if an account can set a metadata on a data identifier.
621
+
622
+ :param issuer: Account identifier which issues the command.
623
+ :param kwargs: List of arguments for the action.
624
+ :param session: The DB session to use
625
+ :returns: True if account is allowed, otherwise False
626
+ """
627
+ meta = get_metadata(kwargs['scope'], kwargs['name'], session=session)
628
+ return perm_default(issuer, kwargs, session=session)\
629
+ or has_account_attribute(account=issuer, key='did_admin', session=session)\
630
+ or meta.get('account', '') == issuer\
631
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)
632
+
633
+
634
+ def perm_set_status(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
635
+ """
636
+ Checks if an account can set status on an data identifier.
637
+
638
+ :param issuer: Account identifier which issues the command.
639
+ :param kwargs: List of arguments for the action.
640
+ :param session: The DB session to use
641
+ :returns: True if account is allowed, otherwise False
642
+ """
643
+ meta = get_metadata(kwargs['scope'], kwargs['name'], session=session)
644
+ return perm_default(issuer, kwargs, session=session)\
645
+ or has_account_attribute(account=issuer, key='did_admin', session=session)\
646
+ or meta.get('account', '') == issuer\
647
+ or rucio.core.scope.is_scope_owner(scope=kwargs['scope'], account=issuer, session=session)
648
+
649
+
650
+ def perm_add_protocol(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
651
+ """
652
+ Checks if an account can add a protocol to an RSE.
653
+
654
+ :param issuer: Account identifier which issues the command.
655
+ :param kwargs: List of arguments for the action.
656
+ :param session: The DB session to use
657
+ :returns: True if account is allowed, otherwise False
658
+ """
659
+ return perm_default(issuer, kwargs, session=session)\
660
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)
661
+
662
+
663
+ def perm_del_protocol(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
664
+ """
665
+ Checks if an account can delete protocols from an RSE.
666
+
667
+ :param issuer: Account identifier which issues the command.
668
+ :param kwargs: List of arguments for the action.
669
+ :param session: The DB session to use
670
+ :returns: True if account is allowed, otherwise False
671
+ """
672
+ return perm_default(issuer, kwargs, session=session)\
673
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)
674
+
675
+
676
+ def perm_update_protocol(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
677
+ """
678
+ Checks if an account can update protocols of an RSE.
679
+
680
+ :param issuer: Account identifier which issues the command.
681
+ :param kwargs: List of arguments for the action.
682
+ :param session: The DB session to use
683
+ :returns: True if account is allowed, otherwise False
684
+ """
685
+ return perm_default(issuer, kwargs, session=session)\
686
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)
687
+
688
+
689
+ def perm_declare_bad_file_replicas(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
690
+ """
691
+ Checks if an account can declare bad file replicas.
692
+
693
+ :param issuer: Account identifier which issues the command.
694
+ :param kwargs: List of arguments for the action.
695
+ :param session: The DB session to use
696
+ :returns: True if account is allowed, otherwise False
697
+ """
698
+ return perm_default(issuer, kwargs, session=session)
699
+
700
+
701
+ def perm_declare_suspicious_file_replicas(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
702
+ """
703
+ Checks if an account can declare suspicious file replicas.
704
+
705
+ :param issuer: Account identifier which issues the command.
706
+ :param kwargs: List of arguments for the action.
707
+ :param session: The DB session to use
708
+ :returns: True if account is allowed, otherwise False
709
+ """
710
+ return True
711
+
712
+
713
+ def perm_add_replicas(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
714
+ """
715
+ Checks if an account can add replicas.
716
+
717
+ :param issuer: Account identifier which issues the command.
718
+ :param kwargs: List of arguments for the action.
719
+ :param session: The DB session to use
720
+ :returns: True if account is allowed, otherwise False
721
+ """
722
+ rses = [{'id': kwargs['rse_id']}]
723
+ if str(kwargs.get('rse', '')).endswith('LOCAL-SE')\
724
+ and _perm_country(issuer=issuer, rses=rses, roles=['admin', 'user'], session=session):
725
+ return True
726
+ return str(kwargs.get('rse', '')).endswith('TMP-SE')\
727
+ or perm_default(issuer, kwargs, session=session)
728
+
729
+
730
+ def perm_skip_availability_check(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
731
+ """
732
+ Checks if an account can skip the availabity check to add/delete file replicas.
733
+
734
+ :param issuer: Account identifier which issues the command.
735
+ :param kwargs: List of arguments for the action.
736
+ :param session: The DB session to use
737
+ :returns: True if account is allowed, otherwise False
738
+ """
739
+ return perm_default(issuer, kwargs, session=session)
740
+
741
+
742
+ def perm_delete_replicas(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
743
+ """
744
+ Checks if an account can delete replicas.
745
+
746
+ :param issuer: Account identifier which issues the command.
747
+ :param kwargs: List of arguments for the action.
748
+ :param session: The DB session to use
749
+ :returns: True if account is allowed, otherwise False
750
+ """
751
+ return False
752
+
753
+
754
+ def perm_update_replicas_states(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
755
+ """
756
+ Checks if an account can delete replicas.
757
+
758
+ :param issuer: Account identifier which issues the command.
759
+ :param kwargs: List of arguments for the action.
760
+ :param session: The DB session to use
761
+ :returns: True if account is allowed, otherwise False
762
+ """
763
+ return perm_default(issuer, kwargs, session=session)
764
+
765
+
766
+ def perm_queue_requests(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
767
+ """
768
+ Checks if an account can submit transfer or deletion requests on destination RSEs for data identifiers.
769
+
770
+ :param issuer: Account identifier which issues the command.
771
+ :param kwargs: List of arguments for the action.
772
+ :param session: The DB session to use
773
+ :returns: True if account is allowed, otherwise False
774
+ """
775
+ return _is_root(issuer)
776
+
777
+
778
+ def perm_query_request(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
779
+ """
780
+ Checks if an account can query a request.
781
+
782
+ :param issuer: Account identifier which issues the command.
783
+ :param kwargs: List of arguments for the action.
784
+ :param session: The DB session to use
785
+ :returns: True if account is allowed, otherwise False
786
+ """
787
+ return _is_root(issuer)
788
+
789
+
790
+ def perm_get_request_by_did(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
791
+ """
792
+ Checks if an account can get a request by DID.
793
+
794
+ :param issuer: Account identifier which issues the command.
795
+ :param kwargs: List of arguments for the action.
796
+ :param session: The DB session to use
797
+ :returns: True if account is allowed, otherwise False
798
+ """
799
+ return True
800
+
801
+
802
+ def perm_cancel_request(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
803
+ """
804
+ Checks if an account can cancel a request.
805
+
806
+ :param issuer: Account identifier which issues the command.
807
+ :param kwargs: List of arguments for the action.
808
+ :param session: The DB session to use
809
+ :returns: True if account is allowed, otherwise False
810
+ """
811
+ return _is_root(issuer)
812
+
813
+
814
+ def perm_get_next(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
815
+ """
816
+ Checks if an account can retrieve the next request matching the request type and state.
817
+
818
+ :param issuer: Account identifier which issues the command.
819
+ :param kwargs: List of arguments for the action.
820
+ :param session: The DB session to use
821
+ :returns: True if account is allowed, otherwise False
822
+ """
823
+ return _is_root(issuer)
824
+
825
+
826
+ def perm_set_rse_usage(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
827
+ """
828
+ Checks if an account can set RSE usage information.
829
+
830
+ :param issuer: Account identifier which issues the command.
831
+ :param kwargs: List of arguments for the action.
832
+ :param session: The DB session to use
833
+ :returns: True if account is allowed to call the API call, otherwise False
834
+ """
835
+ return perm_default(issuer, kwargs, session=session)\
836
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)
837
+
838
+
839
+ def perm_set_rse_limits(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
840
+ """
841
+ Checks if an account can set RSE limits.
842
+
843
+ :param issuer: Account identifier which issues the command.
844
+ :param kwargs: List of arguments for the action.
845
+ :param session: The DB session to use
846
+ :returns: True if account is allowed to call the API call, otherwise False
847
+ """
848
+ return perm_default(issuer, kwargs, session=session)\
849
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)
850
+
851
+
852
+ def perm_set_local_account_limit(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
853
+ """
854
+ Checks if an account can set an account limit.
855
+
856
+ :param account: Account identifier which issues the command.
857
+ :param kwargs: List of arguments for the action.
858
+ :param session: The DB session to use
859
+ :returns: True if account is allowed, otherwise False
860
+ """
861
+ rses = [{'id': kwargs['rse_id']}]
862
+ if _perm_country(issuer=issuer, rses=rses, roles=['admin', ], session=session):
863
+ return True
864
+ return perm_default(issuer, kwargs, session=session)\
865
+ or (has_account_attribute(account=issuer, key='rse_admin', session=session) and has_account_attribute(account=issuer, key='account_admin', session=session))
866
+
867
+
868
+ def perm_set_global_account_limit(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
869
+ """
870
+ Checks if an account can set a global account limit.
871
+
872
+ :param account: Account identifier which issues the command.
873
+ :param kwargs: List of arguments for the action.
874
+ :param session: The DB session to use
875
+ :returns: True if account is allowed, otherwise False
876
+ """
877
+ return perm_default(issuer, kwargs, session=session)\
878
+ or (has_account_attribute(account=issuer, key='rse_admin', session=session) and has_account_attribute(account=issuer, key='account_admin', session=session))
879
+
880
+
881
+ def perm_delete_local_account_limit(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
882
+ """
883
+ Checks if an account can delete an account limit.
884
+
885
+ :param account: Account identifier which issues the command.
886
+ :param kwargs: List of arguments for the action.
887
+ :param session: The DB session to use
888
+ :returns: True if account is allowed, otherwise False
889
+ """
890
+ return perm_default(issuer, kwargs, session=session)\
891
+ or (has_account_attribute(account=issuer, key='rse_admin', session=session) and has_account_attribute(account=issuer, key='account_admin', session=session))
892
+
893
+
894
+ def perm_delete_global_account_limit(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
895
+ """
896
+ Checks if an account can delete a global account limit.
897
+
898
+ :param issuer: Account identifier which issues the command.
899
+ :param kwargs: List of arguments for the action.
900
+ :param session: The DB session to use
901
+ :returns: True if account is allowed, otherwise False
902
+ """
903
+ return perm_default(issuer, kwargs, session=session)\
904
+ or (has_account_attribute(account=issuer, key='rse_admin', session=session) and has_account_attribute(account=issuer, key='account_admin', session=session))
905
+
906
+
907
+ def perm_config(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
908
+ """
909
+ Checks if an account can read/write the configuration.
910
+
911
+ :param issuer: Account identifier which issues the command.
912
+ :param kwargs: List of arguments for the action.
913
+ :param session: The DB session to use
914
+ :returns: True if account is allowed to call the API call, otherwise False
915
+ """
916
+ return perm_default(issuer, kwargs, session=session)\
917
+ or has_account_attribute(account=issuer, key='config_admin', session=session)
918
+
919
+
920
+ def perm_get_local_account_usage(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
921
+ """
922
+ Checks if an account can get the account usage of an account.
923
+
924
+ :param issuer: Account identifier which issues the command.
925
+ :param kwargs: List of arguments for the action.
926
+ :param session: The DB session to use
927
+ :returns: True if account is allowed, otherwise False
928
+ """
929
+ return perm_default(issuer, kwargs, session=session)\
930
+ or kwargs.get('account') == issuer\
931
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)\
932
+ or has_account_attribute(account=issuer, key='account_admin', session=session)
933
+
934
+
935
+ def perm_get_global_account_usage(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
936
+ """
937
+ Checks if an account can get the account usage of an account.
938
+
939
+ :param issuer: Account identifier which issues the command.
940
+ :param kwargs: List of arguments for the action.
941
+ :param session: The DB session to use
942
+ :returns: True if account is allowed, otherwise False
943
+ """
944
+ return perm_default(issuer, kwargs, session=session)\
945
+ or kwargs.get('account') == issuer\
946
+ or has_account_attribute(account=issuer, key='rse_admin', session=session)\
947
+ or has_account_attribute(account=issuer, key='account_admin', session=session)
948
+
949
+
950
+ def perm_add_account_attribute(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
951
+ """
952
+ Checks if an account can add attributes to accounts.
953
+
954
+ :param issuer: Account identifier which issues the command.
955
+ :param kwargs: List of arguments for the action.
956
+ :param session: The DB session to use
957
+ :returns: True if account is allowed to call the API call, otherwise False
958
+ """
959
+ return perm_default(issuer, kwargs, session=session)\
960
+ or has_account_attribute(account=issuer, key='account_admin', session=session)
961
+
962
+
963
+ def perm_del_account_attribute(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
964
+ """
965
+ Checks if an account can add attributes to accounts.
966
+
967
+ :param issuer: Account identifier which issues the command.
968
+ :param kwargs: List of arguments for the action.
969
+ :param session: The DB session to use
970
+ :returns: True if account is allowed to call the API call, otherwise False
971
+ """
972
+ return perm_default(issuer, kwargs, session=session)\
973
+ or has_account_attribute(account=issuer, key='account_admin', session=session)
974
+
975
+
976
+ def perm_list_heartbeats(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
977
+ """
978
+ Checks if an account can list heartbeats.
979
+
980
+ :param issuer: Account identifier which issues the command.
981
+ :param kwargs: List of arguments for the action.
982
+ :param session: The DB session to use
983
+ :returns: True if account is allowed to call the API call, otherwise False
984
+ """
985
+ return perm_default(issuer, kwargs, session=session)
986
+
987
+
988
+ def perm_resurrect(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
989
+ """
990
+ Checks if an account can resurrect DIDS.
991
+
992
+ :param issuer: Account identifier which issues the command.
993
+ :param kwargs: List of arguments for the action.
994
+ :param session: The DB session to use
995
+ :returns: True if account is allowed to call the API call, otherwise False
996
+ """
997
+ return perm_default(issuer, kwargs, session=session)
998
+
999
+
1000
+ def perm_update_lifetime_exceptions(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
1001
+ """
1002
+ Checks if an account can approve/reject Lifetime Model exceptions.
1003
+
1004
+ :param issuer: Account identifier which issues the command.
1005
+ :param kwargs: List of arguments for the action.
1006
+ :param session: The DB session to use
1007
+ :returns: True if account is allowed to call the API call, otherwise False
1008
+ """
1009
+ if kwargs['vo'] is not None:
1010
+ exceptions = next(list_exceptions(exception_id=kwargs['exception_id'], states=False, session=session))
1011
+ if exceptions['scope'].vo != kwargs['vo']:
1012
+ return False
1013
+ return perm_default(issuer, kwargs, session=session)
1014
+
1015
+
1016
+ def perm_get_auth_token_ssh(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
1017
+ """
1018
+ Checks if an account can request an ssh token.
1019
+
1020
+ :param issuer: Account identifier which issues the command.
1021
+ :param kwargs: List of arguments for the action.
1022
+ :param session: The DB session to use
1023
+ :returns: True if account is allowed to call the API call, otherwise False
1024
+ """
1025
+ return True
1026
+
1027
+
1028
+ def perm_get_signed_url(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
1029
+ """
1030
+ Checks if an account can request a signed URL.
1031
+
1032
+ :param issuer: Account identifier which issues the command.
1033
+ :param kwargs: List of arguments for the action.
1034
+ :param session: The DB session to use
1035
+ :returns: True if account is allowed to call the API call, otherwise False
1036
+ """
1037
+ return perm_default(issuer, kwargs, session=session)\
1038
+ or has_account_attribute(account=issuer, key='sign-gcs', session=session)
1039
+
1040
+
1041
+ def perm_add_bad_pfns(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
1042
+ """
1043
+ Checks if an account can declare bad PFNs.
1044
+
1045
+ :param issuer: Account identifier which issues the command.
1046
+ :param kwargs: List of arguments for the action.
1047
+ :param session: The DB session to use
1048
+ :returns: True if account is allowed, otherwise False
1049
+ """
1050
+ return perm_default(issuer, kwargs, session=session)
1051
+
1052
+
1053
+ def perm_remove_did_from_followed(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
1054
+ """
1055
+ Checks if an account can remove did from followed table.
1056
+
1057
+ :param issuer: Account identifier which issues the command.
1058
+ :param kwargs: List of arguments for the action.
1059
+ :param session: The DB session to use
1060
+ :returns: True if account is allowed, otherwise False
1061
+ """
1062
+ return perm_default(issuer, kwargs, session=session)\
1063
+ or kwargs['account'] == issuer
1064
+
1065
+
1066
+ def perm_remove_dids_from_followed(issuer: "InternalAccount", kwargs: dict, *, session: "Optional[Session]" = None) -> bool:
1067
+ """
1068
+ Checks if an account can bulk remove dids from followed table.
1069
+
1070
+ :param issuer: Account identifier which issues the command.
1071
+ :param kwargs: List of arguments for the action.
1072
+ :param session: The DB session to use
1073
+ :returns: True if account is allowed, otherwise False
1074
+ """
1075
+ return perm_default(issuer, kwargs, session=session)\
1076
+ or kwargs['account'] == issuer