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