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
rucio/api/dirac.py ADDED
@@ -0,0 +1,71 @@
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
+ from rucio.api.permission import has_permission
19
+ from rucio.api.scope import list_scopes
20
+ from rucio.common.exception import AccessDenied
21
+ from rucio.common.utils import extract_scope
22
+ from rucio.core import dirac
23
+ from rucio.core.rse import get_rse_id
24
+ from rucio.db.sqla.session import transactional_session
25
+
26
+ if TYPE_CHECKING:
27
+ from sqlalchemy.orm import Session
28
+
29
+
30
+ @transactional_session
31
+ def add_files(lfns, issuer, ignore_availability, vo='def', *, session: "Session"):
32
+ """
33
+ Bulk add files :
34
+ - Create the file and replica.
35
+ - If doesn't exist create the dataset containing the file as well as a rule on the dataset on ANY sites.
36
+ - Create all the ascendants of the dataset if they do not exist
37
+
38
+ :param lfns: List of lfn (dictionary {'lfn': <lfn>, 'rse': <rse>, 'bytes': <bytes>, 'adler32': <adler32>, 'guid': <guid>, 'pfn': <pfn>}
39
+ :param issuer: The issuer account.
40
+ :param ignore_availability: A boolean to ignore blocked sites.
41
+ :param vo: The VO to act on.
42
+ :param session: The database session in use.
43
+
44
+ """
45
+ scopes = list_scopes(vo=vo, session=session)
46
+ dids = []
47
+ rses = {}
48
+ for lfn in lfns:
49
+ scope, name = extract_scope(lfn['lfn'], scopes)
50
+ dids.append({'scope': scope, 'name': name})
51
+ rse = lfn['rse']
52
+ if rse not in rses:
53
+ rse_id = get_rse_id(rse=rse, vo=vo, session=session)
54
+ rses[rse] = rse_id
55
+ lfn['rse_id'] = rses[rse]
56
+
57
+ # Check if the issuer can add dids and use skip_availabitlity
58
+ for rse in rses:
59
+ rse_id = rses[rse]
60
+ kwargs = {'rse': rse, 'rse_id': rse_id}
61
+ if not has_permission(issuer=issuer, action='add_replicas', kwargs=kwargs, vo=vo, session=session):
62
+ raise AccessDenied('Account %s can not add file replicas on %s for VO %s' % (issuer, rse, vo))
63
+ if not has_permission(issuer=issuer, action='skip_availability_check', kwargs=kwargs, vo=vo, session=session):
64
+ ignore_availability = False
65
+
66
+ # Check if the issuer can add the files
67
+ kwargs = {'issuer': issuer, 'dids': dids}
68
+ if not has_permission(issuer=issuer, action='add_dids', kwargs=kwargs, vo=vo, session=session):
69
+ raise AccessDenied('Account %s can not bulk add data identifier for VO %s' % (issuer, vo))
70
+
71
+ dirac.add_files(lfns=lfns, account=issuer, ignore_availability=ignore_availability, vo=vo, session=session)
rucio/api/exporter.py ADDED
@@ -0,0 +1,60 @@
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
+ from rucio.api import permission
19
+ from rucio.common import exception
20
+ from rucio.core import exporter
21
+ from rucio.core.rse import get_rse_name
22
+ from rucio.db.sqla.session import read_session
23
+
24
+ if TYPE_CHECKING:
25
+ from sqlalchemy.orm import Session
26
+
27
+
28
+ @read_session
29
+ def export_data(issuer, distance=True, vo='def', *, session: "Session"):
30
+ """
31
+ Export data from Rucio.
32
+
33
+ :param issuer: the issuer.
34
+ :param distance: To enable the reporting of distance.
35
+ :param vo: the VO of the issuer.
36
+ :param session: The database session in use.
37
+ """
38
+ kwargs = {'issuer': issuer}
39
+ if not permission.has_permission(issuer=issuer, vo=vo, action='export', kwargs=kwargs, session=session):
40
+ raise exception.AccessDenied('Account %s can not export data' % issuer)
41
+
42
+ data = exporter.export_data(distance=distance, vo=vo, session=session)
43
+ rses = {}
44
+ distances = {}
45
+
46
+ for rse_id in data['rses']:
47
+ rse = data['rses'][rse_id]
48
+ rses[get_rse_name(rse_id=rse_id, session=session)] = rse
49
+ data['rses'] = rses
50
+
51
+ if distance:
52
+ for src_id in data['distances']:
53
+ dests = data['distances'][src_id]
54
+ src = get_rse_name(rse_id=src_id, session=session)
55
+ distances[src] = {}
56
+ for dest_id in dests:
57
+ dest = get_rse_name(rse_id=dest_id, session=session)
58
+ distances[src][dest] = dests[dest_id]
59
+ data['distances'] = distances
60
+ return data
rucio/api/heartbeat.py ADDED
@@ -0,0 +1,62 @@
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
+ from rucio.api import permission
19
+ from rucio.common import exception
20
+ from rucio.core import heartbeat
21
+ from rucio.db.sqla.session import read_session, transactional_session
22
+
23
+ if TYPE_CHECKING:
24
+ from sqlalchemy.orm import Session
25
+
26
+
27
+ @read_session
28
+ def list_heartbeats(issuer=None, vo='def', *, session: "Session"):
29
+ """
30
+ Return a list of tuples of all heartbeats.
31
+
32
+ :param issuer: The issuer account.
33
+ :param vo: the VO for the issuer.
34
+ :param session: The database session in use.
35
+ :returns: List of tuples [('Executable', 'Hostname', ...), ...]
36
+ """
37
+
38
+ kwargs = {'issuer': issuer}
39
+ if not permission.has_permission(issuer=issuer, vo=vo, action='list_heartbeats', kwargs=kwargs, session=session):
40
+ raise exception.AccessDenied('%s cannot list heartbeats' % issuer)
41
+ return heartbeat.list_heartbeats(session=session)
42
+
43
+
44
+ @transactional_session
45
+ def create_heartbeat(executable, hostname, pid, older_than, payload, thread=None, issuer=None, vo='def', *, session: "Session"):
46
+ """
47
+ Creates a heartbeat.
48
+ :param issuer: The issuer account.
49
+ :param vo: the VO for the issuer.
50
+ :param executable: Executable name as a string, e.g., conveyor-submitter.
51
+ :param hostname: Hostname as a string, e.g., rucio-daemon-prod-01.cern.ch.
52
+ :param pid: UNIX Process ID as a number, e.g., 1234.
53
+ :param thread: Python Thread Object.
54
+ :param older_than: Ignore specified heartbeats older than specified nr of seconds.
55
+ :param payload: Payload identifier which can be further used to identify the work a certain thread is executing.
56
+ :param session: The database session in use.
57
+
58
+ """
59
+ kwargs = {'issuer': issuer}
60
+ if not permission.has_permission(issuer=issuer, vo=vo, action='send_heartbeats', kwargs=kwargs, session=session):
61
+ raise exception.AccessDenied('%s cannot send heartbeats' % issuer)
62
+ heartbeat.live(executable=executable, hostname=hostname, pid=pid, thread=thread, older_than=older_than, payload=payload, session=session)
rucio/api/identity.py ADDED
@@ -0,0 +1,160 @@
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
+ """
17
+ Interface for identity abstraction layer
18
+ """
19
+
20
+ from typing import TYPE_CHECKING
21
+
22
+ from rucio.api import permission
23
+ from rucio.common import exception
24
+ from rucio.common.types import InternalAccount
25
+ from rucio.core import identity
26
+ from rucio.db.sqla.constants import IdentityType
27
+ from rucio.db.sqla.session import read_session, transactional_session
28
+
29
+ if TYPE_CHECKING:
30
+ from typing import Optional
31
+ from sqlalchemy.orm import Session
32
+
33
+
34
+ @transactional_session
35
+ def add_identity(identity_key, id_type, email, password=None, *, session: "Session"):
36
+ """
37
+ Creates a user identity.
38
+
39
+ :param identity_key: The identity key name. For example x509 DN, or a username.
40
+ :param id_type: The type of the authentication (x509, gss, userpass, ssh, saml)
41
+ :param email: The Email address associated with the identity.
42
+ :param password: If type==userpass, this sets the password.
43
+ :param session: The database session in use.
44
+ """
45
+ return identity.add_identity(identity_key, IdentityType[id_type.upper()], email, password=password, session=session)
46
+
47
+
48
+ @transactional_session
49
+ def del_identity(identity_key, id_type, issuer, vo='def', *, session: "Session"):
50
+ """
51
+ Deletes a user identity.
52
+ :param identity_key: The identity key name. For example x509 DN, or a username.
53
+ :param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
54
+ :param issuer: The issuer account.
55
+ :param vo: the VO of the issuer.
56
+ :param session: The database session in use.
57
+ """
58
+ id_type = IdentityType[id_type.upper()]
59
+ kwargs = {'accounts': identity.list_accounts_for_identity(identity_key, id_type, session=session)}
60
+ if not permission.has_permission(issuer=issuer, vo=vo, action='del_identity', kwargs=kwargs, session=session):
61
+ raise exception.AccessDenied('Account %s can not delete identity' % (issuer))
62
+
63
+ return identity.del_identity(identity_key, id_type, session=session)
64
+
65
+
66
+ @transactional_session
67
+ def add_account_identity(identity_key, id_type, account, email, issuer, default=False, password=None, vo='def', *, session: "Session"):
68
+ """
69
+ Adds a membership association between identity and account.
70
+
71
+ :param identity_key: The identity key name. For example x509 DN, or a username.
72
+ :param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
73
+ :param account: The account name.
74
+ :param email: The Email address associated with the identity.
75
+ :param issuer: The issuer account.
76
+ :param default: If True, the account should be used by default with the provided identity.
77
+ :param password: Password if id_type is userpass.
78
+ :param vo: the VO to act on.
79
+ :param session: The database session in use.
80
+ """
81
+ kwargs = {'identity': identity_key, 'type': id_type, 'account': account}
82
+ if not permission.has_permission(issuer=issuer, vo=vo, action='add_account_identity', kwargs=kwargs, session=session):
83
+ raise exception.AccessDenied('Account %s can not add account identity' % (issuer))
84
+
85
+ account = InternalAccount(account, vo=vo)
86
+
87
+ return identity.add_account_identity(identity=identity_key, type_=IdentityType[id_type.upper()], default=default,
88
+ email=email, account=account, password=password, session=session)
89
+
90
+
91
+ @read_session
92
+ def verify_identity(identity_key: str, id_type: str, password: "Optional[str]" = None, *, session: "Session") -> bool:
93
+ """
94
+ Verifies a user identity.
95
+ :param identity_key: The identity key name. For example x509 DN, or a username.
96
+ :param id_type: The type of the authentication (x509, gss, userpass, ssh, saml)
97
+ :param password: If type==userpass, verifies the identity_key, .
98
+ :param session: The database session in use.
99
+ """
100
+ return identity.verify_identity(identity_key, IdentityType[id_type.upper()], password=password, session=session)
101
+
102
+
103
+ @transactional_session
104
+ def del_account_identity(identity_key, id_type, account, issuer, vo='def', *, session: "Session"):
105
+ """
106
+ Removes a membership association between identity and account.
107
+
108
+ :param identity_key: The identity key name. For example x509 DN, or a username.
109
+ :param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
110
+ :param account: The account name.
111
+ :param issuer: The issuer account.
112
+ :param vo: the VO to act on.
113
+ :param session: The database session in use.
114
+ """
115
+ kwargs = {'account': account}
116
+ if not permission.has_permission(issuer=issuer, vo=vo, action='del_account_identity', kwargs=kwargs, session=session):
117
+ raise exception.AccessDenied('Account %s can not delete account identity' % (issuer))
118
+
119
+ account = InternalAccount(account, vo=vo)
120
+
121
+ return identity.del_account_identity(identity_key, IdentityType[id_type.upper()], account, session=session)
122
+
123
+
124
+ @read_session
125
+ def list_identities(*, session: "Session", **kwargs):
126
+ """
127
+ Returns a list of all enabled identities.
128
+
129
+ :param session: The database session in use.
130
+ returns: A list of all enabled identities.
131
+ """
132
+ return identity.list_identities(session=session, **kwargs)
133
+
134
+
135
+ @read_session
136
+ def get_default_account(identity_key, id_type, *, session: "Session"):
137
+ """
138
+ Returns the default account for this identity.
139
+
140
+ :param identity_key: The identity key name. For example x509 DN, or a username.
141
+ :param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
142
+ :param session: The database session in use.
143
+ """
144
+ account = identity.get_default_account(identity_key, IdentityType[id_type.upper()], session=session)
145
+ return account.external
146
+
147
+
148
+ @read_session
149
+ def list_accounts_for_identity(identity_key, id_type, *, session: "Session"):
150
+ """
151
+ Returns a list of all accounts for an identity.
152
+
153
+ :param identity: The identity key name. For example x509 DN, or a username.
154
+ :param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
155
+ :param session: The database session in use.
156
+
157
+ returns: A list of all accounts for the identity.
158
+ """
159
+ accounts = identity.list_accounts_for_identity(identity_key, IdentityType[id_type.upper()], session=session)
160
+ return [account.external for account in accounts]
rucio/api/importer.py ADDED
@@ -0,0 +1,46 @@
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
+ from rucio.api import permission
19
+ from rucio.common import exception
20
+ from rucio.common.schema import validate_schema
21
+ from rucio.common.types import InternalAccount
22
+ from rucio.core import importer
23
+ from rucio.db.sqla.session import transactional_session
24
+
25
+ if TYPE_CHECKING:
26
+ from sqlalchemy.orm import Session
27
+
28
+
29
+ @transactional_session
30
+ def import_data(data, issuer, vo='def', *, session: "Session"):
31
+ """
32
+ Import data to add/update/delete records in Rucio.
33
+
34
+ :param data: data to be imported.
35
+ :param issuer: the issuer.
36
+ :param vo: the VO of the issuer.
37
+ :param session: The database session in use.
38
+ """
39
+ kwargs = {'issuer': issuer}
40
+ validate_schema(name='import', obj=data, vo=vo)
41
+ if not permission.has_permission(issuer=issuer, vo=vo, action='import', kwargs=kwargs, session=session):
42
+ raise exception.AccessDenied('Account %s can not import data' % issuer)
43
+
44
+ for account in data.get('accounts', []):
45
+ account['account'] = InternalAccount(account['account'], vo=vo)
46
+ return importer.import_data(data, vo=vo, session=session)
@@ -0,0 +1,95 @@
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
+ from rucio.api import permission
19
+ from rucio.common import exception
20
+ from rucio.common.types import InternalAccount, InternalScope
21
+ from rucio.common.utils import api_update_return_dict
22
+ from rucio.core import lifetime_exception
23
+ from rucio.db.sqla.session import stream_session, transactional_session
24
+
25
+ if TYPE_CHECKING:
26
+ from sqlalchemy.orm import Session
27
+
28
+
29
+ @stream_session
30
+ def list_exceptions(exception_id=None, states=None, vo='def', *, session: "Session"):
31
+ """
32
+ List exceptions to Lifetime Model.
33
+
34
+ :param id: The id of the exception
35
+ :param states: The states to filter
36
+ :param vo: The VO to act on
37
+ :param session: The database session in use.
38
+ """
39
+
40
+ exceptions = lifetime_exception.list_exceptions(exception_id=exception_id, states=states, session=session)
41
+ for e in exceptions:
42
+ if vo == e['scope'].vo:
43
+ yield api_update_return_dict(e, session=session)
44
+
45
+
46
+ @transactional_session
47
+ def add_exception(dids, account, pattern, comments, expires_at, vo='def', *, session: "Session"):
48
+ """
49
+ Add exceptions to Lifetime Model.
50
+
51
+ :param dids: The list of dids
52
+ :param account: The account of the requester.
53
+ :param pattern: The account.
54
+ :param comments: The comments associated to the exception.
55
+ :param expires_at: The expiration date of the exception.
56
+ :param vo: The VO to act on.
57
+ :param session: The database session in use.
58
+
59
+ returns: The id of the exception.
60
+ """
61
+
62
+ account = InternalAccount(account, vo=vo)
63
+ for did in dids:
64
+ did['scope'] = InternalScope(did['scope'], vo=vo)
65
+ exceptions = lifetime_exception.add_exception(dids=dids, account=account, pattern=pattern, comments=comments, expires_at=expires_at, session=session)
66
+
67
+ for key in exceptions:
68
+ if key == 'exceptions':
69
+ for reqid in exceptions[key]:
70
+ for did in exceptions[key][reqid]:
71
+ did['scope'] = did['scope'].external
72
+ did['did_type'] = did['did_type'].name
73
+ else:
74
+ for did in exceptions[key]:
75
+ did['scope'] = did['scope'].external
76
+ did['did_type'] = did['did_type'].name
77
+
78
+ return exceptions
79
+
80
+
81
+ @transactional_session
82
+ def update_exception(exception_id, state, issuer, vo='def', *, session: "Session"):
83
+ """
84
+ Update exceptions state to Lifetime Model.
85
+
86
+ :param id: The id of the exception.
87
+ :param state: The states to filter.
88
+ :param issuer: The issuer account.
89
+ :param vo: The VO to act on.
90
+ :param session: The database session in use.
91
+ """
92
+ kwargs = {'exception_id': exception_id, 'vo': vo}
93
+ if not permission.has_permission(issuer=issuer, vo=vo, action='update_lifetime_exceptions', kwargs=kwargs, session=session):
94
+ raise exception.AccessDenied('Account %s can not update lifetime exceptions' % (issuer))
95
+ return lifetime_exception.update_exception(exception_id=exception_id, state=state, session=session)
rucio/api/lock.py ADDED
@@ -0,0 +1,131 @@
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
+ import logging
17
+ from typing import TYPE_CHECKING
18
+
19
+ from rucio.common.types import InternalScope
20
+ from rucio.common.utils import api_update_return_dict
21
+ from rucio.core import lock
22
+ from rucio.core.rse import get_rse_id
23
+ from rucio.db.sqla.constants import DIDType
24
+ from rucio.db.sqla.session import stream_session
25
+
26
+ if TYPE_CHECKING:
27
+ from sqlalchemy.orm import Session
28
+
29
+
30
+ LOGGER = logging.getLogger('lock')
31
+ LOGGER.setLevel(logging.DEBUG)
32
+
33
+
34
+ @stream_session
35
+ def get_dataset_locks(scope, name, vo='def', *, session: "Session"):
36
+ """
37
+ Get the dataset locks of a dataset.
38
+
39
+ :param scope: Scope of the dataset.
40
+ :param name: Name of the dataset.
41
+ :param vo: The VO to act on.
42
+ :param session: The database session in use.
43
+ :return: List of dicts {'rse_id': ..., 'state': ...}
44
+ """
45
+
46
+ scope = InternalScope(scope, vo=vo)
47
+
48
+ locks = lock.get_dataset_locks(scope=scope, name=name, session=session)
49
+
50
+ for lock_object in locks:
51
+ yield api_update_return_dict(lock_object, session=session)
52
+
53
+
54
+ @stream_session
55
+ def get_dataset_locks_bulk(dids, vo='def', *, session: "Session"):
56
+ """
57
+ Get the dataset locks for multiple datasets or containers.
58
+
59
+ :param dids: List of dataset or container DIDs as dictionaries {"scope":..., "name":..., "type":...}
60
+ "type" is optional. If present, will be either DIDType.DATASET or DIDType.CONTAINER,
61
+ or string "dataset" or "container"
62
+ :param vo: The VO to act on.
63
+ :param session: The database session in use.
64
+ :return: Generator of dicts describing found locks {'rse_id': ..., 'state': ...}. Duplicates are removed
65
+ """
66
+
67
+ if vo is None:
68
+ vo = "def"
69
+
70
+ dids_converted = []
71
+ for did_in in dids:
72
+ did = did_in.copy()
73
+ if isinstance(did.get("type"), str):
74
+ # convert DID type
75
+ try:
76
+ did["type"] = {
77
+ "dataset": DIDType.DATASET,
78
+ "container": DIDType.CONTAINER
79
+ }[did["type"]]
80
+ except KeyError:
81
+ raise ValueError("Unknown DID type %(type)s" % did)
82
+ if isinstance(did["scope"], str):
83
+ did["scope"] = InternalScope(did["scope"], vo=vo)
84
+ dids_converted.append(did)
85
+
86
+ seen = set()
87
+ for lock_info in lock.get_dataset_locks_bulk(dids_converted, session=session):
88
+ # filter duplicates - same scope, name, rse_id, rule_id
89
+ scope_str = str(lock_info["scope"])
90
+ key = (scope_str, lock_info["name"], lock_info["rse_id"], lock_info["rule_id"])
91
+ if key not in seen:
92
+ seen.add(key)
93
+ yield lock_info
94
+
95
+
96
+ @stream_session
97
+ def get_dataset_locks_by_rse(rse, vo='def', *, session: "Session"):
98
+ """
99
+ Get the dataset locks of an RSE.
100
+
101
+ :param rse: RSE name.
102
+ :param vo: The VO to act on.
103
+ :param session: The database session in use.
104
+ :return: List of dicts {'rse_id': ..., 'state': ...}
105
+ """
106
+
107
+ rse_id = get_rse_id(rse=rse, vo=vo, session=session)
108
+ locks = lock.get_dataset_locks_by_rse_id(rse_id=rse_id, session=session)
109
+
110
+ for lock_object in locks:
111
+ yield api_update_return_dict(lock_object, session=session)
112
+
113
+
114
+ @stream_session
115
+ def get_replica_locks_for_rule_id(rule_id, vo='def', *, session: "Session"):
116
+ """
117
+ Get the replica locks for a rule_id.
118
+
119
+ :param rule_id: Rule ID.
120
+ :param vo: The VO to act on.
121
+ :param session: The database session in use.
122
+ :return: List of dicts.
123
+ """
124
+
125
+ locks = lock.get_replica_locks_for_rule_id(rule_id=rule_id, session=session)
126
+
127
+ for lock_object in locks:
128
+ if lock_object['scope'].vo != vo: # rule is on a different VO, so don't return any locks
129
+ LOGGER.debug('rule id %s is not present on VO %s' % (rule_id, vo))
130
+ break
131
+ yield api_update_return_dict(lock_object, session=session)