rucio 35.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rucio might be problematic. Click here for more details.

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