rucio 32.8.6__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (481) hide show
  1. rucio/__init__.py +18 -0
  2. rucio/alembicrevision.py +16 -0
  3. rucio/api/__init__.py +14 -0
  4. rucio/api/account.py +266 -0
  5. rucio/api/account_limit.py +287 -0
  6. rucio/api/authentication.py +302 -0
  7. rucio/api/config.py +218 -0
  8. rucio/api/credential.py +60 -0
  9. rucio/api/did.py +726 -0
  10. rucio/api/dirac.py +71 -0
  11. rucio/api/exporter.py +60 -0
  12. rucio/api/heartbeat.py +62 -0
  13. rucio/api/identity.py +160 -0
  14. rucio/api/importer.py +46 -0
  15. rucio/api/lifetime_exception.py +95 -0
  16. rucio/api/lock.py +131 -0
  17. rucio/api/meta.py +85 -0
  18. rucio/api/permission.py +72 -0
  19. rucio/api/quarantined_replica.py +69 -0
  20. rucio/api/replica.py +528 -0
  21. rucio/api/request.py +220 -0
  22. rucio/api/rse.py +601 -0
  23. rucio/api/rule.py +335 -0
  24. rucio/api/scope.py +89 -0
  25. rucio/api/subscription.py +255 -0
  26. rucio/api/temporary_did.py +49 -0
  27. rucio/api/vo.py +112 -0
  28. rucio/client/__init__.py +16 -0
  29. rucio/client/accountclient.py +413 -0
  30. rucio/client/accountlimitclient.py +155 -0
  31. rucio/client/baseclient.py +929 -0
  32. rucio/client/client.py +77 -0
  33. rucio/client/configclient.py +113 -0
  34. rucio/client/credentialclient.py +54 -0
  35. rucio/client/didclient.py +691 -0
  36. rucio/client/diracclient.py +48 -0
  37. rucio/client/downloadclient.py +1674 -0
  38. rucio/client/exportclient.py +44 -0
  39. rucio/client/fileclient.py +51 -0
  40. rucio/client/importclient.py +42 -0
  41. rucio/client/lifetimeclient.py +74 -0
  42. rucio/client/lockclient.py +99 -0
  43. rucio/client/metaclient.py +137 -0
  44. rucio/client/pingclient.py +45 -0
  45. rucio/client/replicaclient.py +444 -0
  46. rucio/client/requestclient.py +109 -0
  47. rucio/client/rseclient.py +664 -0
  48. rucio/client/ruleclient.py +287 -0
  49. rucio/client/scopeclient.py +88 -0
  50. rucio/client/subscriptionclient.py +161 -0
  51. rucio/client/touchclient.py +78 -0
  52. rucio/client/uploadclient.py +871 -0
  53. rucio/common/__init__.py +14 -0
  54. rucio/common/cache.py +74 -0
  55. rucio/common/config.py +796 -0
  56. rucio/common/constants.py +92 -0
  57. rucio/common/constraints.py +18 -0
  58. rucio/common/didtype.py +187 -0
  59. rucio/common/dumper/__init__.py +306 -0
  60. rucio/common/dumper/consistency.py +449 -0
  61. rucio/common/dumper/data_models.py +325 -0
  62. rucio/common/dumper/path_parsing.py +65 -0
  63. rucio/common/exception.py +1092 -0
  64. rucio/common/extra.py +37 -0
  65. rucio/common/logging.py +404 -0
  66. rucio/common/pcache.py +1387 -0
  67. rucio/common/policy.py +84 -0
  68. rucio/common/schema/__init__.py +143 -0
  69. rucio/common/schema/atlas.py +411 -0
  70. rucio/common/schema/belleii.py +406 -0
  71. rucio/common/schema/cms.py +478 -0
  72. rucio/common/schema/domatpc.py +399 -0
  73. rucio/common/schema/escape.py +424 -0
  74. rucio/common/schema/generic.py +431 -0
  75. rucio/common/schema/generic_multi_vo.py +410 -0
  76. rucio/common/schema/icecube.py +404 -0
  77. rucio/common/schema/lsst.py +423 -0
  78. rucio/common/stomp_utils.py +160 -0
  79. rucio/common/stopwatch.py +56 -0
  80. rucio/common/test_rucio_server.py +148 -0
  81. rucio/common/types.py +158 -0
  82. rucio/common/utils.py +1946 -0
  83. rucio/core/__init__.py +14 -0
  84. rucio/core/account.py +426 -0
  85. rucio/core/account_counter.py +171 -0
  86. rucio/core/account_limit.py +357 -0
  87. rucio/core/authentication.py +563 -0
  88. rucio/core/config.py +386 -0
  89. rucio/core/credential.py +218 -0
  90. rucio/core/did.py +3102 -0
  91. rucio/core/did_meta_plugins/__init__.py +250 -0
  92. rucio/core/did_meta_plugins/did_column_meta.py +326 -0
  93. rucio/core/did_meta_plugins/did_meta_plugin_interface.py +116 -0
  94. rucio/core/did_meta_plugins/filter_engine.py +573 -0
  95. rucio/core/did_meta_plugins/json_meta.py +215 -0
  96. rucio/core/did_meta_plugins/mongo_meta.py +199 -0
  97. rucio/core/did_meta_plugins/postgres_meta.py +317 -0
  98. rucio/core/dirac.py +208 -0
  99. rucio/core/distance.py +164 -0
  100. rucio/core/exporter.py +59 -0
  101. rucio/core/heartbeat.py +263 -0
  102. rucio/core/identity.py +290 -0
  103. rucio/core/importer.py +248 -0
  104. rucio/core/lifetime_exception.py +377 -0
  105. rucio/core/lock.py +474 -0
  106. rucio/core/message.py +241 -0
  107. rucio/core/meta.py +190 -0
  108. rucio/core/monitor.py +441 -0
  109. rucio/core/naming_convention.py +154 -0
  110. rucio/core/nongrid_trace.py +124 -0
  111. rucio/core/oidc.py +1339 -0
  112. rucio/core/permission/__init__.py +107 -0
  113. rucio/core/permission/atlas.py +1333 -0
  114. rucio/core/permission/belleii.py +1076 -0
  115. rucio/core/permission/cms.py +1166 -0
  116. rucio/core/permission/escape.py +1076 -0
  117. rucio/core/permission/generic.py +1128 -0
  118. rucio/core/permission/generic_multi_vo.py +1148 -0
  119. rucio/core/quarantined_replica.py +190 -0
  120. rucio/core/replica.py +3627 -0
  121. rucio/core/replica_sorter.py +368 -0
  122. rucio/core/request.py +2241 -0
  123. rucio/core/rse.py +1835 -0
  124. rucio/core/rse_counter.py +155 -0
  125. rucio/core/rse_expression_parser.py +460 -0
  126. rucio/core/rse_selector.py +277 -0
  127. rucio/core/rule.py +3419 -0
  128. rucio/core/rule_grouping.py +1473 -0
  129. rucio/core/scope.py +152 -0
  130. rucio/core/subscription.py +316 -0
  131. rucio/core/temporary_did.py +188 -0
  132. rucio/core/topology.py +448 -0
  133. rucio/core/trace.py +361 -0
  134. rucio/core/transfer.py +1233 -0
  135. rucio/core/vo.py +151 -0
  136. rucio/core/volatile_replica.py +123 -0
  137. rucio/daemons/__init__.py +14 -0
  138. rucio/daemons/abacus/__init__.py +14 -0
  139. rucio/daemons/abacus/account.py +106 -0
  140. rucio/daemons/abacus/collection_replica.py +113 -0
  141. rucio/daemons/abacus/rse.py +107 -0
  142. rucio/daemons/atropos/__init__.py +14 -0
  143. rucio/daemons/atropos/atropos.py +243 -0
  144. rucio/daemons/auditor/__init__.py +261 -0
  145. rucio/daemons/auditor/hdfs.py +86 -0
  146. rucio/daemons/auditor/srmdumps.py +284 -0
  147. rucio/daemons/automatix/__init__.py +14 -0
  148. rucio/daemons/automatix/automatix.py +281 -0
  149. rucio/daemons/badreplicas/__init__.py +14 -0
  150. rucio/daemons/badreplicas/minos.py +311 -0
  151. rucio/daemons/badreplicas/minos_temporary_expiration.py +173 -0
  152. rucio/daemons/badreplicas/necromancer.py +200 -0
  153. rucio/daemons/bb8/__init__.py +14 -0
  154. rucio/daemons/bb8/bb8.py +356 -0
  155. rucio/daemons/bb8/common.py +762 -0
  156. rucio/daemons/bb8/nuclei_background_rebalance.py +147 -0
  157. rucio/daemons/bb8/t2_background_rebalance.py +146 -0
  158. rucio/daemons/c3po/__init__.py +14 -0
  159. rucio/daemons/c3po/algorithms/__init__.py +14 -0
  160. rucio/daemons/c3po/algorithms/simple.py +131 -0
  161. rucio/daemons/c3po/algorithms/t2_free_space.py +125 -0
  162. rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +127 -0
  163. rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +279 -0
  164. rucio/daemons/c3po/c3po.py +342 -0
  165. rucio/daemons/c3po/collectors/__init__.py +14 -0
  166. rucio/daemons/c3po/collectors/agis.py +108 -0
  167. rucio/daemons/c3po/collectors/free_space.py +62 -0
  168. rucio/daemons/c3po/collectors/jedi_did.py +48 -0
  169. rucio/daemons/c3po/collectors/mock_did.py +46 -0
  170. rucio/daemons/c3po/collectors/network_metrics.py +63 -0
  171. rucio/daemons/c3po/collectors/workload.py +110 -0
  172. rucio/daemons/c3po/utils/__init__.py +14 -0
  173. rucio/daemons/c3po/utils/dataset_cache.py +40 -0
  174. rucio/daemons/c3po/utils/expiring_dataset_cache.py +45 -0
  175. rucio/daemons/c3po/utils/expiring_list.py +63 -0
  176. rucio/daemons/c3po/utils/popularity.py +82 -0
  177. rucio/daemons/c3po/utils/timeseries.py +76 -0
  178. rucio/daemons/cache/__init__.py +14 -0
  179. rucio/daemons/cache/consumer.py +191 -0
  180. rucio/daemons/common.py +391 -0
  181. rucio/daemons/conveyor/__init__.py +14 -0
  182. rucio/daemons/conveyor/common.py +530 -0
  183. rucio/daemons/conveyor/finisher.py +492 -0
  184. rucio/daemons/conveyor/poller.py +372 -0
  185. rucio/daemons/conveyor/preparer.py +198 -0
  186. rucio/daemons/conveyor/receiver.py +206 -0
  187. rucio/daemons/conveyor/stager.py +127 -0
  188. rucio/daemons/conveyor/submitter.py +379 -0
  189. rucio/daemons/conveyor/throttler.py +468 -0
  190. rucio/daemons/follower/__init__.py +14 -0
  191. rucio/daemons/follower/follower.py +97 -0
  192. rucio/daemons/hermes/__init__.py +14 -0
  193. rucio/daemons/hermes/hermes.py +738 -0
  194. rucio/daemons/judge/__init__.py +14 -0
  195. rucio/daemons/judge/cleaner.py +149 -0
  196. rucio/daemons/judge/evaluator.py +172 -0
  197. rucio/daemons/judge/injector.py +154 -0
  198. rucio/daemons/judge/repairer.py +144 -0
  199. rucio/daemons/oauthmanager/__init__.py +14 -0
  200. rucio/daemons/oauthmanager/oauthmanager.py +199 -0
  201. rucio/daemons/reaper/__init__.py +14 -0
  202. rucio/daemons/reaper/dark_reaper.py +272 -0
  203. rucio/daemons/reaper/light_reaper.py +255 -0
  204. rucio/daemons/reaper/reaper.py +701 -0
  205. rucio/daemons/replicarecoverer/__init__.py +14 -0
  206. rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +487 -0
  207. rucio/daemons/storage/__init__.py +14 -0
  208. rucio/daemons/storage/consistency/__init__.py +14 -0
  209. rucio/daemons/storage/consistency/actions.py +753 -0
  210. rucio/daemons/tracer/__init__.py +14 -0
  211. rucio/daemons/tracer/kronos.py +513 -0
  212. rucio/daemons/transmogrifier/__init__.py +14 -0
  213. rucio/daemons/transmogrifier/transmogrifier.py +753 -0
  214. rucio/daemons/undertaker/__init__.py +14 -0
  215. rucio/daemons/undertaker/undertaker.py +137 -0
  216. rucio/db/__init__.py +14 -0
  217. rucio/db/sqla/__init__.py +38 -0
  218. rucio/db/sqla/constants.py +192 -0
  219. rucio/db/sqla/migrate_repo/__init__.py +14 -0
  220. rucio/db/sqla/migrate_repo/env.py +111 -0
  221. rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +71 -0
  222. rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +50 -0
  223. rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +61 -0
  224. rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +46 -0
  225. rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +93 -0
  226. rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +78 -0
  227. rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +46 -0
  228. rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +53 -0
  229. rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +69 -0
  230. rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +42 -0
  231. rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +46 -0
  232. rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +61 -0
  233. rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +42 -0
  234. rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +141 -0
  235. rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +75 -0
  236. rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +75 -0
  237. rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +46 -0
  238. rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +51 -0
  239. rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +135 -0
  240. rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +65 -0
  241. rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +42 -0
  242. rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +66 -0
  243. rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +54 -0
  244. rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +43 -0
  245. rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +46 -0
  246. rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +47 -0
  247. rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +54 -0
  248. rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +39 -0
  249. rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +48 -0
  250. rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +47 -0
  251. rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +48 -0
  252. rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +59 -0
  253. rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +47 -0
  254. rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +72 -0
  255. rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +46 -0
  256. rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +45 -0
  257. rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +48 -0
  258. rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +48 -0
  259. rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +42 -0
  260. rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +69 -0
  261. rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +46 -0
  262. rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +78 -0
  263. rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +62 -0
  264. rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +74 -0
  265. rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +44 -0
  266. rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +67 -0
  267. rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +134 -0
  268. rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +58 -0
  269. rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +79 -0
  270. rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +61 -0
  271. rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +45 -0
  272. rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +46 -0
  273. rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +65 -0
  274. rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +42 -0
  275. rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +46 -0
  276. rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +46 -0
  277. rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +80 -0
  278. rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +43 -0
  279. rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +61 -0
  280. rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +47 -0
  281. rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +46 -0
  282. rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +52 -0
  283. rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +42 -0
  284. rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +65 -0
  285. rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +46 -0
  286. rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +47 -0
  287. rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +45 -0
  288. rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +46 -0
  289. rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +48 -0
  290. rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +50 -0
  291. rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +59 -0
  292. rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +48 -0
  293. rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +108 -0
  294. rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +57 -0
  295. rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +51 -0
  296. rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +50 -0
  297. rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +46 -0
  298. rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +42 -0
  299. rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +93 -0
  300. rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +73 -0
  301. rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +52 -0
  302. rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +45 -0
  303. rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +46 -0
  304. rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +54 -0
  305. rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +48 -0
  306. rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +70 -0
  307. rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +48 -0
  308. rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +95 -0
  309. rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +55 -0
  310. rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +74 -0
  311. rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +78 -0
  312. rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +49 -0
  313. rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +124 -0
  314. rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +60 -0
  315. rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +53 -0
  316. rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +56 -0
  317. rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +67 -0
  318. rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +50 -0
  319. rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +46 -0
  320. rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +92 -0
  321. rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +42 -0
  322. rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +46 -0
  323. rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +147 -0
  324. rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +78 -0
  325. rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +53 -0
  326. rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +74 -0
  327. rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +56 -0
  328. rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +46 -0
  329. rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +68 -0
  330. rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +48 -0
  331. rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +149 -0
  332. rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +106 -0
  333. rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +47 -0
  334. rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +45 -0
  335. rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +105 -0
  336. rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +52 -0
  337. rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +106 -0
  338. rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +30 -0
  339. rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +75 -0
  340. rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +49 -0
  341. rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +45 -0
  342. rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +38 -0
  343. rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +44 -0
  344. rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +46 -0
  345. rucio/db/sqla/models.py +1834 -0
  346. rucio/db/sqla/sautils.py +48 -0
  347. rucio/db/sqla/session.py +470 -0
  348. rucio/db/sqla/types.py +207 -0
  349. rucio/db/sqla/util.py +521 -0
  350. rucio/rse/__init__.py +97 -0
  351. rucio/rse/protocols/__init__.py +14 -0
  352. rucio/rse/protocols/cache.py +123 -0
  353. rucio/rse/protocols/dummy.py +112 -0
  354. rucio/rse/protocols/gfal.py +701 -0
  355. rucio/rse/protocols/globus.py +243 -0
  356. rucio/rse/protocols/gsiftp.py +93 -0
  357. rucio/rse/protocols/http_cache.py +83 -0
  358. rucio/rse/protocols/mock.py +124 -0
  359. rucio/rse/protocols/ngarc.py +210 -0
  360. rucio/rse/protocols/posix.py +251 -0
  361. rucio/rse/protocols/protocol.py +530 -0
  362. rucio/rse/protocols/rclone.py +365 -0
  363. rucio/rse/protocols/rfio.py +137 -0
  364. rucio/rse/protocols/srm.py +339 -0
  365. rucio/rse/protocols/ssh.py +414 -0
  366. rucio/rse/protocols/storm.py +207 -0
  367. rucio/rse/protocols/webdav.py +547 -0
  368. rucio/rse/protocols/xrootd.py +295 -0
  369. rucio/rse/rsemanager.py +752 -0
  370. rucio/tests/__init__.py +14 -0
  371. rucio/tests/common.py +244 -0
  372. rucio/tests/common_server.py +132 -0
  373. rucio/transfertool/__init__.py +14 -0
  374. rucio/transfertool/fts3.py +1484 -0
  375. rucio/transfertool/globus.py +200 -0
  376. rucio/transfertool/globus_library.py +182 -0
  377. rucio/transfertool/mock.py +81 -0
  378. rucio/transfertool/transfertool.py +212 -0
  379. rucio/vcsversion.py +11 -0
  380. rucio/version.py +46 -0
  381. rucio/web/__init__.py +14 -0
  382. rucio/web/rest/__init__.py +14 -0
  383. rucio/web/rest/flaskapi/__init__.py +14 -0
  384. rucio/web/rest/flaskapi/authenticated_bp.py +28 -0
  385. rucio/web/rest/flaskapi/v1/__init__.py +14 -0
  386. rucio/web/rest/flaskapi/v1/accountlimits.py +234 -0
  387. rucio/web/rest/flaskapi/v1/accounts.py +1088 -0
  388. rucio/web/rest/flaskapi/v1/archives.py +100 -0
  389. rucio/web/rest/flaskapi/v1/auth.py +1642 -0
  390. rucio/web/rest/flaskapi/v1/common.py +385 -0
  391. rucio/web/rest/flaskapi/v1/config.py +305 -0
  392. rucio/web/rest/flaskapi/v1/credentials.py +213 -0
  393. rucio/web/rest/flaskapi/v1/dids.py +2204 -0
  394. rucio/web/rest/flaskapi/v1/dirac.py +116 -0
  395. rucio/web/rest/flaskapi/v1/export.py +77 -0
  396. rucio/web/rest/flaskapi/v1/heartbeats.py +129 -0
  397. rucio/web/rest/flaskapi/v1/identities.py +263 -0
  398. rucio/web/rest/flaskapi/v1/import.py +133 -0
  399. rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +315 -0
  400. rucio/web/rest/flaskapi/v1/locks.py +360 -0
  401. rucio/web/rest/flaskapi/v1/main.py +83 -0
  402. rucio/web/rest/flaskapi/v1/meta.py +226 -0
  403. rucio/web/rest/flaskapi/v1/metrics.py +37 -0
  404. rucio/web/rest/flaskapi/v1/nongrid_traces.py +97 -0
  405. rucio/web/rest/flaskapi/v1/ping.py +89 -0
  406. rucio/web/rest/flaskapi/v1/redirect.py +366 -0
  407. rucio/web/rest/flaskapi/v1/replicas.py +1866 -0
  408. rucio/web/rest/flaskapi/v1/requests.py +841 -0
  409. rucio/web/rest/flaskapi/v1/rses.py +2204 -0
  410. rucio/web/rest/flaskapi/v1/rules.py +824 -0
  411. rucio/web/rest/flaskapi/v1/scopes.py +161 -0
  412. rucio/web/rest/flaskapi/v1/subscriptions.py +646 -0
  413. rucio/web/rest/flaskapi/v1/templates/auth_crash.html +80 -0
  414. rucio/web/rest/flaskapi/v1/templates/auth_granted.html +82 -0
  415. rucio/web/rest/flaskapi/v1/tmp_dids.py +115 -0
  416. rucio/web/rest/flaskapi/v1/traces.py +100 -0
  417. rucio/web/rest/flaskapi/v1/vos.py +280 -0
  418. rucio/web/rest/main.py +19 -0
  419. rucio/web/rest/metrics.py +28 -0
  420. rucio-32.8.6.data/data/rucio/etc/alembic.ini.template +71 -0
  421. rucio-32.8.6.data/data/rucio/etc/alembic_offline.ini.template +74 -0
  422. rucio-32.8.6.data/data/rucio/etc/globus-config.yml.template +5 -0
  423. rucio-32.8.6.data/data/rucio/etc/ldap.cfg.template +30 -0
  424. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approval_request.tmpl +38 -0
  425. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +4 -0
  426. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approved_user.tmpl +17 -0
  427. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +6 -0
  428. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_denied_user.tmpl +17 -0
  429. rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +19 -0
  430. rucio-32.8.6.data/data/rucio/etc/rse-accounts.cfg.template +25 -0
  431. rucio-32.8.6.data/data/rucio/etc/rucio.cfg.atlas.client.template +42 -0
  432. rucio-32.8.6.data/data/rucio/etc/rucio.cfg.template +257 -0
  433. rucio-32.8.6.data/data/rucio/etc/rucio_multi_vo.cfg.template +234 -0
  434. rucio-32.8.6.data/data/rucio/requirements.txt +55 -0
  435. rucio-32.8.6.data/data/rucio/tools/bootstrap.py +34 -0
  436. rucio-32.8.6.data/data/rucio/tools/merge_rucio_configs.py +147 -0
  437. rucio-32.8.6.data/data/rucio/tools/reset_database.py +40 -0
  438. rucio-32.8.6.data/scripts/rucio +2540 -0
  439. rucio-32.8.6.data/scripts/rucio-abacus-account +75 -0
  440. rucio-32.8.6.data/scripts/rucio-abacus-collection-replica +47 -0
  441. rucio-32.8.6.data/scripts/rucio-abacus-rse +79 -0
  442. rucio-32.8.6.data/scripts/rucio-admin +2434 -0
  443. rucio-32.8.6.data/scripts/rucio-atropos +61 -0
  444. rucio-32.8.6.data/scripts/rucio-auditor +199 -0
  445. rucio-32.8.6.data/scripts/rucio-automatix +51 -0
  446. rucio-32.8.6.data/scripts/rucio-bb8 +58 -0
  447. rucio-32.8.6.data/scripts/rucio-c3po +86 -0
  448. rucio-32.8.6.data/scripts/rucio-cache-client +135 -0
  449. rucio-32.8.6.data/scripts/rucio-cache-consumer +43 -0
  450. rucio-32.8.6.data/scripts/rucio-conveyor-finisher +59 -0
  451. rucio-32.8.6.data/scripts/rucio-conveyor-poller +67 -0
  452. rucio-32.8.6.data/scripts/rucio-conveyor-preparer +38 -0
  453. rucio-32.8.6.data/scripts/rucio-conveyor-receiver +44 -0
  454. rucio-32.8.6.data/scripts/rucio-conveyor-stager +77 -0
  455. rucio-32.8.6.data/scripts/rucio-conveyor-submitter +140 -0
  456. rucio-32.8.6.data/scripts/rucio-conveyor-throttler +105 -0
  457. rucio-32.8.6.data/scripts/rucio-dark-reaper +54 -0
  458. rucio-32.8.6.data/scripts/rucio-dumper +159 -0
  459. rucio-32.8.6.data/scripts/rucio-follower +45 -0
  460. rucio-32.8.6.data/scripts/rucio-hermes +55 -0
  461. rucio-32.8.6.data/scripts/rucio-judge-cleaner +90 -0
  462. rucio-32.8.6.data/scripts/rucio-judge-evaluator +138 -0
  463. rucio-32.8.6.data/scripts/rucio-judge-injector +45 -0
  464. rucio-32.8.6.data/scripts/rucio-judge-repairer +45 -0
  465. rucio-32.8.6.data/scripts/rucio-kronos +45 -0
  466. rucio-32.8.6.data/scripts/rucio-light-reaper +53 -0
  467. rucio-32.8.6.data/scripts/rucio-minos +54 -0
  468. rucio-32.8.6.data/scripts/rucio-minos-temporary-expiration +51 -0
  469. rucio-32.8.6.data/scripts/rucio-necromancer +121 -0
  470. rucio-32.8.6.data/scripts/rucio-oauth-manager +64 -0
  471. rucio-32.8.6.data/scripts/rucio-reaper +84 -0
  472. rucio-32.8.6.data/scripts/rucio-replica-recoverer +249 -0
  473. rucio-32.8.6.data/scripts/rucio-storage-consistency-actions +75 -0
  474. rucio-32.8.6.data/scripts/rucio-transmogrifier +78 -0
  475. rucio-32.8.6.data/scripts/rucio-undertaker +77 -0
  476. rucio-32.8.6.dist-info/METADATA +83 -0
  477. rucio-32.8.6.dist-info/RECORD +481 -0
  478. rucio-32.8.6.dist-info/WHEEL +5 -0
  479. rucio-32.8.6.dist-info/licenses/AUTHORS.rst +94 -0
  480. rucio-32.8.6.dist-info/licenses/LICENSE +201 -0
  481. rucio-32.8.6.dist-info/top_level.txt +1 -0
@@ -0,0 +1,841 @@
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 json
17
+
18
+ import flask
19
+ from flask import Flask, Response
20
+
21
+ from rucio.api import request
22
+ from rucio.common.exception import RequestNotFound
23
+ from rucio.common.utils import APIEncoder, render_json
24
+ from rucio.core.rse import get_rses_with_attribute_value
25
+ from rucio.db.sqla.constants import RequestState
26
+ from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
27
+ from rucio.web.rest.flaskapi.v1.common import check_accept_header_wrapper_flask, parse_scope_name, try_stream, \
28
+ response_headers, generate_http_error_flask, ErrorHandlingMethodView
29
+
30
+
31
+ class RequestGet(ErrorHandlingMethodView):
32
+ """ REST API to get requests. """
33
+
34
+ @check_accept_header_wrapper_flask(['application/json'])
35
+ def get(self, scope_name, rse):
36
+ """
37
+ ---
38
+ summary: Get Request
39
+ description: Get a request for a given DID to a destinaion RSE.
40
+ tags:
41
+ - Requests
42
+ parameters:
43
+ - name: scope_name
44
+ in: path
45
+ description: Data identifier (scope)/(name).
46
+ schema:
47
+ type: string
48
+ style: simple
49
+ - name: rse
50
+ in: path
51
+ description: Destination rse.
52
+ schema:
53
+ type: string
54
+ style: simple
55
+ responses:
56
+ 200:
57
+ description: OK
58
+ content:
59
+ application/json:
60
+ schema:
61
+ description: The request associated with the DID and destination RSE.
62
+ type: object
63
+ properties:
64
+ id:
65
+ description: The id of the request.
66
+ type: string
67
+ request_type:
68
+ description: The request type.
69
+ type: string
70
+ enum: ["T", "U", "D", "I", "O"]
71
+ scope:
72
+ description: The scope of the transfer.
73
+ type: string
74
+ name:
75
+ description: The name of the transfer.
76
+ type: string
77
+ did_type:
78
+ description: The did type.
79
+ type: string
80
+ dest_rse_id:
81
+ description: The destination RSE id.
82
+ type: string
83
+ source_rse_id:
84
+ description: The source RSE id.
85
+ type: string
86
+ attributes:
87
+ description: All attributes associated with the request.
88
+ type: string
89
+ state:
90
+ description: The state of the request.
91
+ type: string
92
+ enum: ["Q", "G", "S", "F", "D", "L", "N", "O", "A", "M", "U", "W", "P"]
93
+ external_id:
94
+ description: External id of the request.
95
+ type: string
96
+ external_host:
97
+ description: External host of the request.
98
+ type: string
99
+ retry_count:
100
+ description: The numbers of attempted retires.
101
+ type: integer
102
+ err_msg:
103
+ description: An error message if one occured.
104
+ type: string
105
+ previous_attempt_id:
106
+ description: The id of the previous attempt.
107
+ type: string
108
+ rule_id:
109
+ description: The id of the associated replication rule.
110
+ type: string
111
+ activity:
112
+ description: The activity of the request.
113
+ type: string
114
+ bytes:
115
+ description: The size of the did in bytes.
116
+ type: integer
117
+ md5:
118
+ description: The md5 checksum of the did to transfer.
119
+ type: string
120
+ adler32:
121
+ description: The adler32 checksum of the did to transfer.
122
+ type: string
123
+ dest_url:
124
+ description: The destination url.
125
+ type: string
126
+ submitted_at:
127
+ description: The time the request got submitted.
128
+ type: string
129
+ started_at:
130
+ description: The time the request got started.
131
+ type: string
132
+ transferred_at:
133
+ description: The time the request got transfered.
134
+ type: string
135
+ estimated_at:
136
+ description: The time the request got estimated.
137
+ type: string
138
+ submitter_id:
139
+ description: The id of the submitter.
140
+ type: string
141
+ estimated_stated_at:
142
+ description: The estimation of the started at value.
143
+ type: string
144
+ estimated_transferred_at:
145
+ description: The estimation of the transfered at value.
146
+ type: string
147
+ staging_started_at:
148
+ description: The time the staging got started.
149
+ type: string
150
+ staging_finished_at:
151
+ description: The time the staging got finished.
152
+ type: string
153
+ account:
154
+ description: The account which issued the request.
155
+ type: string
156
+ requested_at:
157
+ description: The time the request got requested.
158
+ type: string
159
+ priority:
160
+ description: The priority of the request.
161
+ type: integer
162
+ transfertool:
163
+ description: The transfertool used.
164
+ type: string
165
+ source_rse:
166
+ description: The name of the source RSE.
167
+ type: string
168
+ dest_rse:
169
+ description: The name of the destination RSE.
170
+ type: string
171
+ 401:
172
+ description: Invalid Auth Token
173
+ 404:
174
+ description: Not found
175
+ 406:
176
+ description: Not acceptable
177
+ """
178
+ try:
179
+ scope, name = parse_scope_name(scope_name, flask.request.environ.get('vo'))
180
+ except ValueError as error:
181
+ return generate_http_error_flask(400, error)
182
+
183
+ try:
184
+ request_data = request.get_request_by_did(
185
+ scope=scope,
186
+ name=name,
187
+ rse=rse,
188
+ issuer=flask.request.environ.get('issuer'),
189
+ vo=flask.request.environ.get('vo'),
190
+ )
191
+ return Response(json.dumps(request_data, cls=APIEncoder), content_type='application/json')
192
+ except RequestNotFound as error:
193
+ return generate_http_error_flask(404, error.__class__.__name__, f'No request found for DID {scope}:{name} at RSE {rse}')
194
+
195
+
196
+ class RequestHistoryGet(ErrorHandlingMethodView):
197
+ """ REST API to get historical requests. """
198
+
199
+ @check_accept_header_wrapper_flask(['application/json'])
200
+ def get(self, scope_name, rse):
201
+ """
202
+ ---
203
+ summary: Get Historical Request
204
+ description: List a hostorical request for a given DID to a destination RSE.
205
+ tags:
206
+ - Requests
207
+ parameters:
208
+ - name: scope_name
209
+ in: path
210
+ description: Data identifier (scope)/(name).
211
+ schema:
212
+ type: string
213
+ style: simple
214
+ - name: rse
215
+ in: path
216
+ description: Destination rse.
217
+ schema:
218
+ type: string
219
+ style: simple
220
+ responses:
221
+ 200:
222
+ description: OK
223
+ content:
224
+ application/json:
225
+ schema:
226
+ description: The request associated with the DID and destination RSE.
227
+ type: object
228
+ properties:
229
+ id:
230
+ description: The id of the request.
231
+ type: string
232
+ request_type:
233
+ description: The request type.
234
+ type: string
235
+ enum: ["T", "U", "D", "I", "O"]
236
+ scope:
237
+ description: The scope of the transfer.
238
+ type: string
239
+ name:
240
+ description: The name of the transfer.
241
+ type: string
242
+ did_type:
243
+ description: The did type.
244
+ type: string
245
+ dest_rse_id:
246
+ description: The destination RSE id.
247
+ type: string
248
+ source_rse_id:
249
+ description: The source RSE id.
250
+ type: string
251
+ attributes:
252
+ description: All attributes associated with the request.
253
+ type: string
254
+ state:
255
+ description: The state of the request.
256
+ type: string
257
+ enum: ["Q", "G", "S", "F", "D", "L", "N", "O", "A", "M", "U", "W", "P"]
258
+ external_id:
259
+ description: External id of the request.
260
+ type: string
261
+ external_host:
262
+ description: External host of the request.
263
+ type: string
264
+ retry_count:
265
+ description: The numbers of attempted retires.
266
+ type: integer
267
+ err_msg:
268
+ description: An error message if one occured.
269
+ type: string
270
+ previous_attempt_id:
271
+ description: The id of the previous attempt.
272
+ type: string
273
+ rule_id:
274
+ description: The id of the associated replication rule.
275
+ type: string
276
+ activity:
277
+ description: The activity of the request.
278
+ type: string
279
+ bytes:
280
+ description: The size of the did in bytes.
281
+ type: integer
282
+ md5:
283
+ description: The md5 checksum of the did to transfer.
284
+ type: string
285
+ adler32:
286
+ description: The adler32 checksum of the did to transfer.
287
+ type: string
288
+ dest_url:
289
+ description: The destination url.
290
+ type: string
291
+ submitted_at:
292
+ description: The time the request got submitted.
293
+ type: string
294
+ started_at:
295
+ description: The time the request got started.
296
+ type: string
297
+ transferred_at:
298
+ description: The time the request got transfered.
299
+ type: string
300
+ estimated_at:
301
+ description: The time the request got estimated.
302
+ type: string
303
+ submitter_id:
304
+ description: The id of the submitter.
305
+ type: string
306
+ estimated_stated_at:
307
+ description: The estimation of the started at value.
308
+ type: string
309
+ estimated_transferred_at:
310
+ description: The estimation of the transfered at value.
311
+ type: string
312
+ staging_started_at:
313
+ description: The time the staging got started.
314
+ type: string
315
+ staging_finished_at:
316
+ description: The time the staging got finished.
317
+ type: string
318
+ account:
319
+ description: The account which issued the request.
320
+ type: string
321
+ requested_at:
322
+ description: The time the request got requested.
323
+ type: string
324
+ priority:
325
+ description: The priority of the request.
326
+ type: integer
327
+ transfertool:
328
+ description: The transfertool used.
329
+ type: string
330
+ source_rse:
331
+ description: The name of the source RSE.
332
+ type: string
333
+ dest_rse:
334
+ description: The name of the destination RSE.
335
+ type: string
336
+ 401:
337
+ description: Invalid Auth Token
338
+ 404:
339
+ description: Not found
340
+ 406:
341
+ description: Not acceptable
342
+ """
343
+ try:
344
+ scope, name = parse_scope_name(scope_name, flask.request.environ.get('vo'))
345
+ except ValueError as error:
346
+ return generate_http_error_flask(400, error)
347
+
348
+ try:
349
+ request_data = request.get_request_history_by_did(
350
+ scope=scope,
351
+ name=name,
352
+ rse=rse,
353
+ issuer=flask.request.environ.get('issuer'),
354
+ vo=flask.request.environ.get('vo'),
355
+ )
356
+ return Response(json.dumps(request_data, cls=APIEncoder), content_type='application/json')
357
+ except RequestNotFound as error:
358
+ return generate_http_error_flask(404, error.__class__.__name__, f'No request found for DID {scope}:{name} at RSE {rse}')
359
+
360
+
361
+ class RequestList(ErrorHandlingMethodView):
362
+ """ REST API to get requests. """
363
+
364
+ @check_accept_header_wrapper_flask(['application/x-json-stream'])
365
+ def get(self):
366
+ """
367
+ ---
368
+ summary: List Historic Requests
369
+ description: List requests for a given source and destination RSE or site.
370
+ tags:
371
+ - Requests
372
+ parameters:
373
+ - name: src_rse
374
+ in: query
375
+ description: The source rse.
376
+ schema:
377
+ type: array
378
+ items:
379
+ type: object
380
+ required:
381
+ - rse_id
382
+ properties:
383
+ rse_id:
384
+ description: The id of the rse.
385
+ type: string
386
+ - name: dest_rse
387
+ in: query
388
+ description: The destination rse.
389
+ schema:
390
+ type: array
391
+ items:
392
+ type: object
393
+ required:
394
+ - rse_id
395
+ properties:
396
+ rse_id:
397
+ description: The id of the rse.
398
+ type: string
399
+ - name: src_site
400
+ in: query
401
+ description: The source site.
402
+ schema:
403
+ type: string
404
+ - name: dest_site
405
+ in: query
406
+ description: The destination site.
407
+ schema:
408
+ type: string
409
+ - name: request_states
410
+ in: query
411
+ description: The accepted request states. Delimited by comma.
412
+ schema:
413
+ type: string
414
+ responses:
415
+ 200:
416
+ description: OK
417
+ content:
418
+ application/x-json-stream:
419
+ schema:
420
+ description: All requests matching the arguments. Seperated by the new line character.
421
+ type: array
422
+ items:
423
+ description: A request.
424
+ type: object
425
+ properties:
426
+ id:
427
+ description: The id of the request.
428
+ type: string
429
+ request_type:
430
+ description: The request type.
431
+ type: string
432
+ enum: ["T", "U", "D", "I", "O"]
433
+ scope:
434
+ description: The scope of the transfer.
435
+ type: string
436
+ name:
437
+ description: The name of the transfer.
438
+ type: string
439
+ did_type:
440
+ description: The did type.
441
+ type: string
442
+ dest_rse_id:
443
+ description: The destination RSE id.
444
+ type: string
445
+ source_rse_id:
446
+ description: The source RSE id.
447
+ type: string
448
+ attributes:
449
+ description: All attributes associated with the request.
450
+ type: string
451
+ state:
452
+ description: The state of the request.
453
+ type: string
454
+ enum: ["Q", "G", "S", "F", "D", "L", "N", "O", "A", "M", "U", "W", "P"]
455
+ external_id:
456
+ description: External id of the request.
457
+ type: string
458
+ external_host:
459
+ description: External host of the request.
460
+ type: string
461
+ retry_count:
462
+ description: The numbers of attempted retires.
463
+ type: integer
464
+ err_msg:
465
+ description: An error message if one occured.
466
+ type: string
467
+ previous_attempt_id:
468
+ description: The id of the previous attempt.
469
+ type: string
470
+ rule_id:
471
+ description: The id of the associated replication rule.
472
+ type: string
473
+ activity:
474
+ description: The activity of the request.
475
+ type: string
476
+ bytes:
477
+ description: The size of the did in bytes.
478
+ type: integer
479
+ md5:
480
+ description: The md5 checksum of the did to transfer.
481
+ type: string
482
+ adler32:
483
+ description: The adler32 checksum of the did to transfer.
484
+ type: string
485
+ dest_url:
486
+ description: The destination url.
487
+ type: string
488
+ submitted_at:
489
+ description: The time the request got submitted.
490
+ type: string
491
+ started_at:
492
+ description: The time the request got started.
493
+ type: string
494
+ transferred_at:
495
+ description: The time the request got transfered.
496
+ type: string
497
+ estimated_at:
498
+ description: The time the request got estimated.
499
+ type: string
500
+ submitter_id:
501
+ description: The id of the submitter.
502
+ type: string
503
+ estimated_stated_at:
504
+ description: The estimation of the started at value.
505
+ type: string
506
+ estimated_transferred_at:
507
+ description: The estimation of the transfered at value.
508
+ type: string
509
+ staging_started_at:
510
+ description: The time the staging got started.
511
+ type: string
512
+ staging_finished_at:
513
+ description: The time the staging got finished.
514
+ type: string
515
+ account:
516
+ description: The account which issued the request.
517
+ type: string
518
+ requested_at:
519
+ description: The time the request got requested.
520
+ type: string
521
+ priority:
522
+ description: The priority of the request.
523
+ type: integer
524
+ transfertool:
525
+ description: The transfertool used.
526
+ type: string
527
+ source_rse:
528
+ description: The name of the source RSE.
529
+ type: string
530
+ dest_rse:
531
+ description: The name of the destination RSE.
532
+ type: string
533
+ 401:
534
+ description: Invalid Auth Token
535
+ 404:
536
+ description: Not found
537
+ 406:
538
+ description: Not acceptable
539
+ """
540
+ src_rse = flask.request.args.get('src_rse', default=None)
541
+ dst_rse = flask.request.args.get('dst_rse', default=None)
542
+ src_site = flask.request.args.get('src_site', default=None)
543
+ dst_site = flask.request.args.get('dst_site', default=None)
544
+ request_states = flask.request.args.get('request_states', default=None)
545
+
546
+ if not request_states:
547
+ return generate_http_error_flask(400, 'MissingParameter', 'Request state is missing')
548
+ if src_rse and not dst_rse:
549
+ return generate_http_error_flask(400, 'MissingParameter', 'Destination RSE is missing')
550
+ elif dst_rse and not src_rse:
551
+ return generate_http_error_flask(400, 'MissingParameter', 'Source RSE is missing')
552
+ elif src_site and not dst_site:
553
+ return generate_http_error_flask(400, 'MissingParameter', 'Destination site is missing')
554
+ elif dst_site and not src_site:
555
+ return generate_http_error_flask(400, 'MissingParameter', 'Source site is missing')
556
+
557
+ try:
558
+ states = [RequestState(state) for state in request_states.split(',')]
559
+ except ValueError:
560
+ return generate_http_error_flask(400, 'Invalid', 'Request state value is invalid')
561
+
562
+ src_rses = []
563
+ dst_rses = []
564
+ if src_site:
565
+ src_rses = get_rses_with_attribute_value(key='site', value=src_site, vo=flask.request.environ.get('vo'))
566
+ if not src_rses:
567
+ return generate_http_error_flask(404, 'NotFound', f'Could not resolve site name {src_site} to RSE')
568
+ src_rses = [rse['rse_name'] for rse in src_rses]
569
+ dst_rses = get_rses_with_attribute_value(key='site', value=dst_site, vo=flask.request.environ.get('vo'))
570
+ if not dst_rses:
571
+ return generate_http_error_flask(404, 'NotFound', f'Could not resolve site name {dst_site} to RSE')
572
+ dst_rses = [rse['rse_name'] for rse in dst_rses]
573
+ else:
574
+ dst_rses = [dst_rse]
575
+ src_rses = [src_rse]
576
+
577
+ def generate(issuer, vo):
578
+ for result in request.list_requests(src_rses, dst_rses, states, issuer=issuer, vo=vo):
579
+ yield render_json(**result) + '\n'
580
+
581
+ return try_stream(generate(issuer=flask.request.environ.get('issuer'), vo=flask.request.environ.get('vo')))
582
+
583
+
584
+ class RequestHistoryList(ErrorHandlingMethodView):
585
+ """ REST API to get requests. """
586
+
587
+ @check_accept_header_wrapper_flask(['application/x-json-stream'])
588
+ def get(self):
589
+ """
590
+ ---
591
+ summary: List Historic Requests
592
+ description: List historical requests for a given source and destination RSE or site.
593
+ tags:
594
+ - Requests
595
+ parameters:
596
+ - name: src_rse
597
+ in: query
598
+ description: The source rse.
599
+ schema:
600
+ type: array
601
+ items:
602
+ type: object
603
+ required:
604
+ - rse_id
605
+ properties:
606
+ rse_id:
607
+ description: The id of the rse.
608
+ type: string
609
+ - name: dest_rse
610
+ in: query
611
+ description: The destination rse.
612
+ schema:
613
+ type: array
614
+ items:
615
+ type: object
616
+ required:
617
+ - rse_id
618
+ properties:
619
+ rse_id:
620
+ description: The id of the rse.
621
+ type: string
622
+ - name: src_site
623
+ in: query
624
+ description: The source site.
625
+ schema:
626
+ type: string
627
+ - name: dest_site
628
+ in: query
629
+ description: The destination site.
630
+ schema:
631
+ type: string
632
+ - name: request_states
633
+ in: query
634
+ description: The accepted request states. Delimited by comma.
635
+ schema:
636
+ type: string
637
+ - name: offset
638
+ in: query
639
+ description: The offset of the list.
640
+ schema:
641
+ type: integer
642
+ default: 0
643
+ - name: limit
644
+ in: query
645
+ description: The maximum number of items to return.
646
+ schema:
647
+ type: integer
648
+ default: 100
649
+ responses:
650
+ 200:
651
+ description: OK
652
+ content:
653
+ application/x-json-stream:
654
+ schema:
655
+ description: All requests matching the arguments. Seperated by a new line character.
656
+ type: array
657
+ items:
658
+ description: A request.
659
+ type: object
660
+ properties:
661
+ id:
662
+ description: The id of the request.
663
+ type: string
664
+ request_type:
665
+ description: The request type.
666
+ type: string
667
+ enum: ["T", "U", "D", "I", "O"]
668
+ scope:
669
+ description: The scope of the transfer.
670
+ type: string
671
+ name:
672
+ description: The name of the transfer.
673
+ type: string
674
+ did_type:
675
+ description: The did type.
676
+ type: string
677
+ dest_rse_id:
678
+ description: The destination RSE id.
679
+ type: string
680
+ source_rse_id:
681
+ description: The source RSE id.
682
+ type: string
683
+ attributes:
684
+ description: All attributes associated with the request.
685
+ type: string
686
+ state:
687
+ description: The state of the request.
688
+ type: string
689
+ enum: ["Q", "G", "S", "F", "D", "L", "N", "O", "A", "M", "U", "W", "P"]
690
+ external_id:
691
+ description: External id of the request.
692
+ type: string
693
+ external_host:
694
+ description: External host of the request.
695
+ type: string
696
+ retry_count:
697
+ description: The numbers of attempted retires.
698
+ type: integer
699
+ err_msg:
700
+ description: An error message if one occured.
701
+ type: string
702
+ previous_attempt_id:
703
+ description: The id of the previous attempt.
704
+ type: string
705
+ rule_id:
706
+ description: The id of the associated replication rule.
707
+ type: string
708
+ activity:
709
+ description: The activity of the request.
710
+ type: string
711
+ bytes:
712
+ description: The size of the did in bytes.
713
+ type: integer
714
+ md5:
715
+ description: The md5 checksum of the did to transfer.
716
+ type: string
717
+ adler32:
718
+ description: The adler32 checksum of the did to transfer.
719
+ type: string
720
+ dest_url:
721
+ description: The destination url.
722
+ type: string
723
+ submitted_at:
724
+ description: The time the request got submitted.
725
+ type: string
726
+ started_at:
727
+ description: The time the request got started.
728
+ type: string
729
+ transferred_at:
730
+ description: The time the request got transfered.
731
+ type: string
732
+ estimated_at:
733
+ description: The time the request got estimated.
734
+ type: string
735
+ submitter_id:
736
+ description: The id of the submitter.
737
+ type: string
738
+ estimated_stated_at:
739
+ description: The estimation of the started at value.
740
+ type: string
741
+ estimated_transferred_at:
742
+ description: The estimation of the transfered at value.
743
+ type: string
744
+ staging_started_at:
745
+ description: The time the staging got started.
746
+ type: string
747
+ staging_finished_at:
748
+ description: The time the staging got finished.
749
+ type: string
750
+ account:
751
+ description: The account which issued the request.
752
+ type: string
753
+ requested_at:
754
+ description: The time the request got requested.
755
+ type: string
756
+ priority:
757
+ description: The priority of the request.
758
+ type: integer
759
+ transfertool:
760
+ description: The transfertool used.
761
+ type: string
762
+ source_rse:
763
+ description: The name of the source RSE.
764
+ type: string
765
+ dest_rse:
766
+ description: The name of the destination RSE.
767
+ type: string
768
+ 401:
769
+ description: Invalid Auth Token
770
+ 404:
771
+ description: Not found
772
+ 406:
773
+ description: Not acceptable
774
+ """
775
+ src_rse = flask.request.args.get('src_rse', default=None)
776
+ dst_rse = flask.request.args.get('dst_rse', default=None)
777
+ src_site = flask.request.args.get('src_site', default=None)
778
+ dst_site = flask.request.args.get('dst_site', default=None)
779
+ request_states = flask.request.args.get('request_states', default=None)
780
+ offset = flask.request.args.get('offset', default=0)
781
+ limit = flask.request.args.get('limit', default=100)
782
+
783
+ if not request_states:
784
+ return generate_http_error_flask(400, 'MissingParameter', 'Request state is missing')
785
+ if src_rse and not dst_rse:
786
+ return generate_http_error_flask(400, 'MissingParameter', 'Destination RSE is missing')
787
+ elif dst_rse and not src_rse:
788
+ return generate_http_error_flask(400, 'MissingParameter', 'Source RSE is missing')
789
+ elif src_site and not dst_site:
790
+ return generate_http_error_flask(400, 'MissingParameter', 'Destination site is missing')
791
+ elif dst_site and not src_site:
792
+ return generate_http_error_flask(400, 'MissingParameter', 'Source site is missing')
793
+
794
+ try:
795
+ states = [RequestState(state) for state in request_states.split(',')]
796
+ except ValueError:
797
+ return generate_http_error_flask(400, 'Invalid', 'Request state value is invalid')
798
+
799
+ src_rses = []
800
+ dst_rses = []
801
+ if src_site:
802
+ src_rses = get_rses_with_attribute_value(key='site', value=src_site, vo=flask.request.environ.get('vo'))
803
+ if not src_rses:
804
+ return generate_http_error_flask(404, 'NotFound', f'Could not resolve site name {src_site} to RSE')
805
+ src_rses = [rse['rse_name'] for rse in src_rses]
806
+ dst_rses = get_rses_with_attribute_value(key='site', value=dst_site, vo=flask.request.environ.get('vo'))
807
+ if not dst_rses:
808
+ return generate_http_error_flask(404, 'NotFound', f'Could not resolve site name {dst_site} to RSE')
809
+ dst_rses = [rse['rse_name'] for rse in dst_rses]
810
+ else:
811
+ dst_rses = [dst_rse]
812
+ src_rses = [src_rse]
813
+
814
+ def generate(issuer, vo):
815
+ for result in request.list_requests_history(src_rses, dst_rses, states, issuer=issuer, vo=vo, offset=offset, limit=limit):
816
+ yield render_json(**result) + '\n'
817
+
818
+ return try_stream(generate(issuer=flask.request.environ.get('issuer'), vo=flask.request.environ.get('vo')))
819
+
820
+
821
+ def blueprint():
822
+ bp = AuthenticatedBlueprint('requests', __name__, url_prefix='/requests')
823
+
824
+ request_get_view = RequestGet.as_view('request_get')
825
+ bp.add_url_rule('/<path:scope_name>/<rse>', view_func=request_get_view, methods=['get', ])
826
+ request_history_get_view = RequestHistoryGet.as_view('request_history_get')
827
+ bp.add_url_rule('/history/<path:scope_name>/<rse>', view_func=request_history_get_view, methods=['get', ])
828
+ request_list_view = RequestList.as_view('request_list')
829
+ bp.add_url_rule('/list', view_func=request_list_view, methods=['get', ])
830
+ request_history_list_view = RequestHistoryList.as_view('request_history_list')
831
+ bp.add_url_rule('/history/list', view_func=request_history_list_view, methods=['get', ])
832
+
833
+ bp.after_request(response_headers)
834
+ return bp
835
+
836
+
837
+ def make_doc():
838
+ """ Only used for sphinx documentation """
839
+ doc_app = Flask(__name__)
840
+ doc_app.register_blueprint(blueprint())
841
+ return doc_app