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