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,1834 @@
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 uuid
17
+ from datetime import datetime, timedelta
18
+ from typing import Any, Optional, Union
19
+
20
+ from sqlalchemy import BigInteger, Boolean, DateTime, Enum, Float, Integer, SmallInteger, String, Text, event, UniqueConstraint, inspect
21
+ from sqlalchemy.engine import Engine
22
+ from sqlalchemy.ext.compiler import compiles
23
+ from sqlalchemy.ext.declarative import declared_attr
24
+ from sqlalchemy.orm import mapped_column, object_mapper, relationship, Mapped
25
+ from sqlalchemy.schema import Index, ForeignKeyConstraint, PrimaryKeyConstraint, CheckConstraint, Table
26
+ from sqlalchemy.sql import Delete
27
+ from sqlalchemy.types import LargeBinary
28
+
29
+ from rucio.common import utils
30
+ from rucio.common.schema import get_schema_value
31
+ from rucio.common.types import InternalAccount, InternalScope
32
+ from rucio.db.sqla.constants import (AccountStatus, AccountType, DIDAvailability, DIDType, DIDReEvaluation,
33
+ KeyType, IdentityType, LockState, RuleGrouping, BadFilesStatus,
34
+ RuleState, ReplicaState, RequestState, RequestType, RSEType,
35
+ ScopeStatus, SubscriptionState, RuleNotification, LifetimeExceptionsState,
36
+ BadPFNStatus, TransferLimitDirection)
37
+ from rucio.db.sqla.session import BASE, get_engine
38
+ from rucio.db.sqla.types import GUID, BooleanString, JSON
39
+ from rucio.db.sqla.types import InternalAccountString
40
+ from rucio.db.sqla.types import InternalScopeString
41
+
42
+
43
+ # SQLAlchemy defines the corresponding code behind TYPE_CHECKING
44
+ # https://github.com/sqlalchemy/sqlalchemy/blob/d9acd6223299c118464d30abfa483e26a536239d/lib/sqlalchemy/orm/base.py#L814
45
+ # And pylint/astroid don't have an option to evaluate this code
46
+ # https://github.com/pylint-dev/astroid/issues/1332
47
+ # So we get this error all over the place: `E1136: Value 'Mapped' is unsubscriptable (unsubscriptable-object)`
48
+ #
49
+ # pylint: disable=E1136
50
+
51
+
52
+ @compiles(Boolean, "oracle")
53
+ def compile_binary_oracle(type_, compiler, **kw):
54
+ return "NUMBER(1)"
55
+
56
+
57
+ @event.listens_for(Table, "before_create")
58
+ def _mysql_rename_type(target, connection, **kw):
59
+ if connection.dialect.name == 'mysql' and target.name == 'quarantined_replicas':
60
+ target.columns.path.type = String(255)
61
+
62
+
63
+ @event.listens_for(Table, "before_create")
64
+ def _psql_rename_type(target, connection, **kw):
65
+ if connection.dialect.name == 'postgresql' and target.name == 'account_map':
66
+ target.columns.identity_type.type.name = 'IDENTITIES_TYPE_CHK'
67
+
68
+
69
+ @event.listens_for(Table, "before_create")
70
+ def _oracle_json_constraint(target, connection, **kw):
71
+ if connection.dialect.name == 'oracle':
72
+ try:
73
+ oracle_version = int(connection.connection.version.split('.')[0])
74
+ except Exception:
75
+ return
76
+ if oracle_version >= 12:
77
+ if target.name == 'did_meta':
78
+ target.append_constraint(CheckConstraint('META IS JSON', 'ORACLE_META_JSON_CHK'))
79
+ if target.name == 'virtual_placements':
80
+ target.append_constraint(CheckConstraint('PLACEMENTS IS JSON', 'ORACLE_PLACEMENTS_JSON_CHK'))
81
+
82
+
83
+ @event.listens_for(Engine, "before_execute", retval=True)
84
+ def _add_hint(conn, element, multiparams, params, execution_options):
85
+ if conn.dialect.name == 'oracle' and isinstance(element, Delete) and element.table.name == 'locks':
86
+ element = element.prefix_with("/*+ INDEX(LOCKS LOCKS_PK) */")
87
+ if conn.dialect.name == 'oracle' and isinstance(element, Delete) and element.table.name == 'replicas':
88
+ element = element.prefix_with("/*+ INDEX(REPLICAS REPLICAS_PK) */")
89
+ if conn.dialect.name == 'oracle' and isinstance(element, Delete) and element.table.name == 'dids':
90
+ element = element.prefix_with("/*+ INDEX(DIDS DIDS_PK) */")
91
+ if conn.dialect.name == 'oracle' and isinstance(element, Delete) and element.table.name == 'updated_dids':
92
+ element = element.prefix_with("/*+ INDEX(updated_dids UPDATED_DIDS_SCOPERULENAME_IDX) */")
93
+ if conn.dialect.name == 'oracle' and isinstance(element, Delete) and element.table.name == 'tokens':
94
+ element = element.prefix_with("/*+ INDEX(TOKENS_ACCOUNT_EXPIRED_AT_IDX) */")
95
+ return element, multiparams, params
96
+
97
+
98
+ @event.listens_for(PrimaryKeyConstraint, "after_parent_attach")
99
+ def _pk_constraint_name(const, table):
100
+ if table.name.upper() == 'QUARANTINED_REPLICAS_HISTORY':
101
+ const.name = "QRD_REPLICAS_HISTORY_PK"
102
+ else:
103
+ const.name = "%s_PK" % (table.name.upper(),)
104
+
105
+
106
+ @event.listens_for(ForeignKeyConstraint, "after_parent_attach")
107
+ def _fk_constraint_name(const, table):
108
+ if const.name:
109
+ return
110
+ fk = const.elements[0]
111
+ reftable, refcol = fk.target_fullname.split(".")
112
+ const.name = "fk_%s_%s_%s" % (table.name,
113
+ fk.parent.name,
114
+ reftable)
115
+
116
+
117
+ @event.listens_for(UniqueConstraint, "after_parent_attach")
118
+ def _unique_constraint_name(const, table):
119
+ if const.name:
120
+ return
121
+ const.name = "uq_%s_%s" % (table.name, list(const.columns)[0].name)
122
+
123
+
124
+ @event.listens_for(CheckConstraint, "after_parent_attach")
125
+ def _ck_constraint_name(const, table):
126
+
127
+ if const.name is None:
128
+ if 'DELETED' in str(const.sqltext).upper():
129
+ if len(table.name) > 20:
130
+ const.name = "%s_DEL_CHK" % (table.name.upper())
131
+ else:
132
+ const.name = "%s_DELETED_CHK" % (table.name.upper())
133
+ elif const.name == 'SUBSCRIPTIONS_RETROACTIVE_CHK' and table.name.upper() == 'SUBSCRIPTIONS_HISTORY':
134
+ const.name = "SUBS_HISTORY_RETROACTIVE_CHK"
135
+ elif const.name == 'SUBSCRIPTIONS_STATE_CHK' and table.name.upper() == 'SUBSCRIPTIONS_HISTORY':
136
+ const.name = "SUBS_HISTORY_STATE_CHK"
137
+ elif const.name == 'QUARANTINED_REPLICAS_CREATED_NN' and table.name.upper() == 'QUARANTINED_REPLICAS':
138
+ const.name = "QURD_REPLICAS_CREATED_NN"
139
+ elif const.name == 'QUARANTINED_REPLICAS_UPDATED_NN' and table.name.upper() == 'QUARANTINED_REPLICAS':
140
+ const.name = "QURD_REPLICAS_UPDATED_NN"
141
+ elif const.name == 'QUARANTINED_REPLICAS_HISTORY_CREATED_NN' and table.name.upper() == 'QUARANTINED_REPLICAS_HISTORY':
142
+ const.name = "QURD_REPLICAS_HIST_CREATED_NN"
143
+ elif const.name == 'QUARANTINED_REPLICAS_HISTORY_UPDATED_NN' and table.name.upper() == 'QUARANTINED_REPLICAS_HISTORY':
144
+ const.name = "QURD_REPLICAS_HIST_UPDATED_NN"
145
+ elif const.name == 'ARCHIVE_CONTENTS_HISTORY_CREATED_NN' and table.name.upper() == 'ARCHIVE_CONTENTS_HISTORY':
146
+ const.name = "ARCH_CNTS_HIST_CREATED_NN"
147
+ elif const.name == 'ARCHIVE_CONTENTS_HISTORY_UPDATED_NN' and table.name.upper() == 'ARCHIVE_CONTENTS_HISTORY':
148
+ const.name = "ARCH_CNTS_HIST_UPDATED_NN"
149
+ elif const.name == 'ACCOUNT_USAGE_HISTORY_CREATED_NN' and table.name.upper() == 'ACCOUNT_USAGE_HISTORY':
150
+ const.name = "ACCOUNT_USAGE_HIST_CREATED_NN"
151
+ elif const.name == 'ACCOUNT_USAGE_HISTORY_UPDATED_NN' and table.name.upper() == 'ACCOUNT_USAGE_HISTORY':
152
+ const.name = "ACCOUNT_USAGE_HIST_UPDATED_NN"
153
+ elif const.name == 'SUBSCRIPTIONS_HISTORY_CREATED_NN' and table.name.upper() == 'SUBSCRIPTIONS_HISTORY':
154
+ const.name = "SUBSCRIPTIONS_HIST_CREATED_NN"
155
+ elif const.name == 'SUBSCRIPTIONS_HISTORY_UPDATED_NN' and table.name.upper() == 'SUBSCRIPTIONS_HISTORY':
156
+ const.name = "SUBSCRIPTIONS_HIST_UPDATED_NN"
157
+
158
+ if const.name is None:
159
+ const.name = table.name.upper() + '_' + str(uuid.uuid4())[:6] + '_CHK'
160
+
161
+ if const.name == 'REQUESTS_TYPE_CHK' and table.name.upper() == 'REQUESTS_HISTORY':
162
+ const.name = "REQUESTS_HISTORY_TYPE_CHK"
163
+ elif const.name == 'REQUESTS_DIDTYPE_CHK' and table.name.upper() == 'REQUESTS_HISTORY':
164
+ const.name = "REQUESTS_HISTORY_DIDTYPE_CHK"
165
+ elif const.name == 'REQUESTS_DIDTYPE_CHK' and table.name.upper() == 'REQUESTS_HISTORY':
166
+ const.name = "REQUESTS_HISTORY_DIDTYPE_CHK"
167
+ elif const.name == 'REQUESTS_STATE_CHK' and table.name.upper() == 'REQUESTS_HISTORY':
168
+ const.name = "REQUESTS_HISTORY_STATE_CHK"
169
+
170
+
171
+ class ModelBase(object):
172
+ """Base class for Rucio Models"""
173
+ __table_initialized__ = False
174
+
175
+ @declared_attr
176
+ def __table_args__(cls): # pylint: disable=no-self-argument
177
+ # exception for CERN Oracle identifier length limitations
178
+ # pylint: disable=maybe-no-member
179
+ if cls.__tablename__.upper() == 'UPDATED_ACCOUNT_COUNTERS':
180
+ return cls._table_args + (CheckConstraint('CREATED_AT IS NOT NULL', 'UPDATED_ACCNT_CNTRS_CREATED_NN'),
181
+ CheckConstraint('UPDATED_AT IS NOT NULL', 'UPDATED_ACCNT_CNTRS_UPDATED_NN'),
182
+ {'mysql_engine': 'InnoDB'})
183
+ # pylint: disable=maybe-no-member
184
+ elif cls.__tablename__.upper() == 'UPDATED_RSE_COUNTERS':
185
+ return cls._table_args + (CheckConstraint('CREATED_AT IS NOT NULL', 'UPDATED_RSE_CNTRS_CREATED_NN'),
186
+ CheckConstraint('UPDATED_AT IS NOT NULL', 'UPDATED_RSE_CNTRS_UPDATED_NN'),
187
+ {'mysql_engine': 'InnoDB'})
188
+ # pylint: disable=maybe-no-member
189
+ elif cls.__tablename__.upper() == 'DIDS_FOLLOWED_EVENTS':
190
+ return cls._table_args + (CheckConstraint('CREATED_AT IS NOT NULL', 'DIDS_FOLLOWED_EVENTS_CRE_NN'),
191
+ CheckConstraint('UPDATED_AT IS NOT NULL', 'DIDS_FOLLOWED_EVENTS_UPD_NN'),
192
+ {'mysql_engine': 'InnoDB'})
193
+
194
+ # otherwise, proceed normally
195
+ # pylint: disable=maybe-no-member
196
+ return cls._table_args + (CheckConstraint('CREATED_AT IS NOT NULL', name=cls.__tablename__.upper() + '_CREATED_NN'),
197
+ CheckConstraint('UPDATED_AT IS NOT NULL', name=cls.__tablename__.upper() + '_UPDATED_NN'),
198
+ {'mysql_engine': 'InnoDB'})
199
+
200
+ @declared_attr
201
+ def created_at(cls): # pylint: disable=no-self-argument
202
+ return mapped_column("created_at", DateTime, default=datetime.utcnow)
203
+
204
+ @declared_attr
205
+ def updated_at(cls): # pylint: disable=no-self-argument
206
+ return mapped_column("updated_at", DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
207
+
208
+ def save(self, flush=True, session=None):
209
+ """Save this object"""
210
+ # Sessions created with autoflush=True be default since sqlAlchemy 1.4.
211
+ # So explicatly calling session.flush is not necessary.
212
+ # However, when autogenerated primary keys involved, calling
213
+ # session.flush to get the id from DB.
214
+ session.add(self)
215
+ if flush:
216
+ session.flush()
217
+
218
+ def delete(self, flush=True, session=None):
219
+ """Delete this object"""
220
+ session.delete(self)
221
+ if flush:
222
+ session.flush()
223
+
224
+ def update(self, values, flush=True, session=None):
225
+ """dict.update() behaviour."""
226
+ for k, v in values.items():
227
+ self[k] = v
228
+ if session and flush:
229
+ session.flush()
230
+
231
+ def __setitem__(self, key, value):
232
+ setattr(self, key, value)
233
+
234
+ def __getitem__(self, key):
235
+ return getattr(self, key)
236
+
237
+ def __iter__(self):
238
+ self._i = iter(object_mapper(self).columns)
239
+ return self
240
+
241
+ def __next__(self):
242
+ n = next(self._i).name
243
+ return n, getattr(self, n)
244
+
245
+ def keys(self):
246
+ return list(self.__dict__.keys())
247
+
248
+ def values(self):
249
+ return list(self.__dict__.values())
250
+
251
+ def items(self):
252
+ return list(self.__dict__.items())
253
+
254
+ def to_dict(self):
255
+ dictionary = self.__dict__.copy()
256
+ dictionary.pop('_sa_instance_state')
257
+ return dictionary
258
+
259
+ next = __next__
260
+
261
+
262
+ class SoftModelBase(ModelBase):
263
+ """Base class for Rucio Models with soft-deletion support"""
264
+ __table_initialized__ = False
265
+
266
+ @declared_attr
267
+ def __table_args__(cls): # pylint: disable=no-self-argument
268
+ # pylint: disable=maybe-no-member
269
+ return cls._table_args + (CheckConstraint('CREATED_AT IS NOT NULL', name=cls.__tablename__.upper() + '_CREATED_NN'),
270
+ CheckConstraint('UPDATED_AT IS NOT NULL', name=cls.__tablename__.upper() + '_UPDATED_NN'),
271
+ CheckConstraint('DELETED IS NOT NULL', name=cls.__tablename__.upper() + '_DELETED_NN'),
272
+ {'mysql_engine': 'InnoDB'})
273
+
274
+ @declared_attr
275
+ def deleted(cls): # pylint: disable=no-self-argument
276
+ return mapped_column("deleted", Boolean, default=False)
277
+
278
+ @declared_attr
279
+ def deleted_at(cls): # pylint: disable=no-self-argument
280
+ return mapped_column("deleted_at", DateTime)
281
+
282
+ def delete(self, flush=True, session=None):
283
+ """Delete this object"""
284
+ self.deleted = True
285
+ self.deleted_at = datetime.utcnow()
286
+ self.save(session=session)
287
+
288
+
289
+ class Account(BASE, ModelBase):
290
+ """Represents an account"""
291
+ __tablename__ = 'accounts'
292
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
293
+ account_type: Mapped[AccountType] = mapped_column(Enum(AccountType, name='ACCOUNTS_TYPE_CHK',
294
+ create_constraint=True,
295
+ values_callable=lambda obj: [e.value for e in obj]))
296
+ status: Mapped[AccountStatus] = mapped_column(Enum(AccountStatus, name='ACCOUNTS_STATUS_CHK',
297
+ create_constraint=True,
298
+ values_callable=lambda obj: [e.value for e in obj]),
299
+ default=AccountStatus.ACTIVE, )
300
+ email: Mapped[Optional[str]] = mapped_column(String(255))
301
+ suspended_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
302
+ deleted_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
303
+ _table_args = (PrimaryKeyConstraint('account', name='ACCOUNTS_PK'),
304
+ CheckConstraint('ACCOUNT_TYPE IS NOT NULL', name='ACCOUNTS_TYPE_NN'),
305
+ CheckConstraint('STATUS IS NOT NULL', name='ACCOUNTS_STATUS_NN'))
306
+
307
+
308
+ class AccountAttrAssociation(BASE, ModelBase):
309
+ """Represents an account"""
310
+ __tablename__ = 'account_attr_map'
311
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
312
+ key: Mapped[str] = mapped_column(String(255))
313
+ value: Mapped[Optional[Union[bool, str]]] = mapped_column(BooleanString(255))
314
+ _table_args = (PrimaryKeyConstraint('account', 'key', name='ACCOUNT_ATTR_MAP_PK'),
315
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='ACCOUNT_ATTR_MAP_ACCOUNT_FK'),
316
+ Index('ACCOUNT_ATTR_MAP_KEY_VALUE_IDX', 'key', 'value'))
317
+
318
+
319
+ class Identity(BASE, SoftModelBase):
320
+ """Represents an identity"""
321
+ __tablename__ = 'identities'
322
+ identity: Mapped[str] = mapped_column(String(2048))
323
+ identity_type: Mapped[IdentityType] = mapped_column(Enum(IdentityType, name='IDENTITIES_TYPE_CHK',
324
+ create_constraint=True,
325
+ values_callable=lambda obj: [e.value for e in obj]))
326
+ username: Mapped[Optional[str]] = mapped_column(String(255))
327
+ password: Mapped[Optional[str]] = mapped_column(String(255))
328
+ salt = mapped_column(LargeBinary(255))
329
+ email: Mapped[str] = mapped_column(String(255))
330
+ _table_args = (PrimaryKeyConstraint('identity', 'identity_type', name='IDENTITIES_PK'),
331
+ CheckConstraint('IDENTITY_TYPE IS NOT NULL', name='IDENTITIES_TYPE_NN'),
332
+ CheckConstraint('EMAIL IS NOT NULL', name='IDENTITIES_EMAIL_NN'))
333
+
334
+
335
+ class IdentityAccountAssociation(BASE, ModelBase):
336
+ """Represents a map account-identity"""
337
+ __tablename__ = 'account_map'
338
+ identity: Mapped[str] = mapped_column(String(2048))
339
+ identity_type: Mapped[IdentityType] = mapped_column(Enum(IdentityType, name='ACCOUNT_MAP_ID_TYPE_CHK',
340
+ create_constraint=True,
341
+ values_callable=lambda obj: [e.value for e in obj]))
342
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
343
+ is_default: Mapped[bool] = mapped_column(Boolean(name='ACCOUNT_MAP_DEFAULT_CHK', create_constraint=True),
344
+ default=False)
345
+ _table_args = (PrimaryKeyConstraint('identity', 'identity_type', 'account', name='ACCOUNT_MAP_PK'),
346
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='ACCOUNT_MAP_ACCOUNT_FK'),
347
+ ForeignKeyConstraint(['identity', 'identity_type'], ['identities.identity', 'identities.identity_type'], name='ACCOUNT_MAP_ID_TYPE_FK'),
348
+ CheckConstraint('is_default IS NOT NULL', name='ACCOUNT_MAP_IS_DEFAULT_NN'),
349
+ CheckConstraint('IDENTITY_TYPE IS NOT NULL', name='ACCOUNT_MAP_ID_TYPE_NN'))
350
+
351
+
352
+ class Scope(BASE, ModelBase):
353
+ """Represents a scope"""
354
+ __tablename__ = 'scopes'
355
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
356
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
357
+ is_default: Mapped[bool] = mapped_column(Boolean(name='SCOPES_DEFAULT_CHK', create_constraint=True),
358
+ default=False)
359
+ status: Mapped[ScopeStatus] = mapped_column(Enum(ScopeStatus, name='SCOPE_STATUS_CHK',
360
+ create_constraint=True,
361
+ values_callable=lambda obj: [e.value for e in obj]),
362
+ default=ScopeStatus.OPEN)
363
+ closed_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
364
+ deleted_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
365
+ _table_args = (PrimaryKeyConstraint('scope', name='SCOPES_SCOPE_PK'),
366
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='SCOPES_ACCOUNT_FK'),
367
+ CheckConstraint('is_default IS NOT NULL', name='SCOPES_IS_DEFAULT_NN'),
368
+ CheckConstraint('STATUS IS NOT NULL', name='SCOPES_STATUS_NN'),
369
+ CheckConstraint('ACCOUNT IS NOT NULL', name='SCOPES_ACCOUNT_NN'))
370
+
371
+
372
+ class DataIdentifier(BASE, ModelBase):
373
+ """Represents a dataset"""
374
+ __tablename__ = 'dids'
375
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
376
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
377
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
378
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='DIDS_TYPE_CHK',
379
+ create_constraint=True,
380
+ values_callable=lambda obj: [e.value for e in obj]))
381
+ is_open: Mapped[Optional[bool]] = mapped_column(Boolean(name='DIDS_IS_OPEN_CHK', create_constraint=True))
382
+ monotonic: Mapped[bool] = mapped_column(Boolean(name='DIDS_MONOTONIC_CHK', create_constraint=True),
383
+ server_default='0')
384
+ hidden: Mapped[bool] = mapped_column(Boolean(name='DIDS_HIDDEN_CHK', create_constraint=True),
385
+ server_default='0')
386
+ obsolete: Mapped[bool] = mapped_column(Boolean(name='DIDS_OBSOLETE_CHK', create_constraint=True),
387
+ server_default='0')
388
+ complete: Mapped[Optional[bool]] = mapped_column(Boolean(name='DIDS_COMPLETE_CHK', create_constraint=True),
389
+ server_default=None)
390
+ is_new: Mapped[Optional[bool]] = mapped_column(Boolean(name='DIDS_IS_NEW_CHK', create_constraint=True),
391
+ server_default='1')
392
+ availability: Mapped[DIDAvailability] = mapped_column(Enum(DIDAvailability, name='DIDS_AVAILABILITY_CHK',
393
+ create_constraint=True,
394
+ values_callable=lambda obj: [e.value for e in obj]),
395
+ default=DIDAvailability.AVAILABLE)
396
+ suppressed: Mapped[bool] = mapped_column(Boolean(name='FILES_SUPP_CHK', create_constraint=True),
397
+ server_default='0')
398
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
399
+ length: Mapped[Optional[int]] = mapped_column(BigInteger)
400
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
401
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
402
+ expired_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
403
+ purge_replicas: Mapped[bool] = mapped_column(Boolean(name='DIDS_PURGE_RPLCS_CHK', create_constraint=True),
404
+ server_default='1')
405
+ deleted_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
406
+ # hardcoded meta-data to populate the db
407
+ events: Mapped[Optional[int]] = mapped_column(BigInteger)
408
+ guid: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
409
+ project: Mapped[Optional[str]] = mapped_column(String(50))
410
+ datatype: Mapped[Optional[str]] = mapped_column(String(50))
411
+ run_number: Mapped[Optional[int]] = mapped_column(Integer)
412
+ stream_name: Mapped[Optional[str]] = mapped_column(String(70))
413
+ prod_step: Mapped[Optional[str]] = mapped_column(String(50))
414
+ version: Mapped[Optional[str]] = mapped_column(String(50))
415
+ campaign: Mapped[Optional[str]] = mapped_column(String(50))
416
+ task_id: Mapped[Optional[int]] = mapped_column(Integer())
417
+ panda_id: Mapped[Optional[int]] = mapped_column(Integer())
418
+ lumiblocknr: Mapped[Optional[int]] = mapped_column(Integer())
419
+ provenance: Mapped[Optional[str]] = mapped_column(String(2))
420
+ phys_group: Mapped[Optional[str]] = mapped_column(String(25))
421
+ transient: Mapped[bool] = mapped_column(Boolean(name='DID_TRANSIENT_CHK', create_constraint=True),
422
+ server_default='0')
423
+ accessed_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
424
+ closed_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
425
+ eol_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
426
+ is_archive: Mapped[Optional[bool]] = mapped_column(Boolean(name='DIDS_ARCHIVE_CHK', create_constraint=True))
427
+ constituent: Mapped[Optional[bool]] = mapped_column(Boolean(name='DIDS_CONSTITUENT_CHK', create_constraint=True))
428
+ access_cnt: Mapped[Optional[int]] = mapped_column(Integer())
429
+ _table_args = (PrimaryKeyConstraint('scope', 'name', name='DIDS_PK'),
430
+ ForeignKeyConstraint(['account'], ['accounts.account'], ondelete='CASCADE', name='DIDS_ACCOUNT_FK'),
431
+ ForeignKeyConstraint(['scope'], ['scopes.scope'], name='DIDS_SCOPE_FK'),
432
+ CheckConstraint('MONOTONIC IS NOT NULL', name='DIDS_MONOTONIC_NN'),
433
+ CheckConstraint('OBSOLETE IS NOT NULL', name='DIDS_OBSOLETE_NN'),
434
+ CheckConstraint('SUPPRESSED IS NOT NULL', name='DIDS_SUPP_NN'),
435
+ CheckConstraint('ACCOUNT IS NOT NULL', name='DIDS_ACCOUNT_NN'),
436
+ CheckConstraint('PURGE_REPLICAS IS NOT NULL', name='DIDS_PURGE_REPLICAS_NN'),
437
+ Index('DIDS_IS_NEW_IDX', 'is_new'),
438
+ Index('DIDS_EXPIRED_AT_IDX', 'expired_at'))
439
+
440
+
441
+ class VirtualPlacements(BASE, ModelBase):
442
+ """Represents virtual placements"""
443
+ __tablename__ = 'virtual_placements'
444
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
445
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
446
+ placements = mapped_column(JSON())
447
+ _table_args = (PrimaryKeyConstraint('scope', 'name', name='VP_PK'),
448
+ ForeignKeyConstraint(['scope', 'name'], ['dids.scope', 'dids.name'], name='VP_FK')
449
+ )
450
+
451
+
452
+ class DidMeta(BASE, ModelBase):
453
+ __tablename__ = 'did_meta'
454
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
455
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
456
+ meta: Mapped[Optional[Union[str, dict[str, Any]]]] = mapped_column(JSON())
457
+ did_type: Mapped[Optional[DIDType]] = mapped_column(Enum(DIDType, name='DID_META_DID_TYPE_CHK',
458
+ create_constraint=True,
459
+ values_callable=lambda obj: [e.value for e in obj]))
460
+ _table_args = (PrimaryKeyConstraint('scope', 'name', name='DID_META_PK'),
461
+ ForeignKeyConstraint(['scope', 'name'], ['dids.scope', 'dids.name'], name='DID_META_FK'),
462
+ Index('DID_META_DID_TYPE_IDX', 'did_type'))
463
+
464
+
465
+ class DeletedDataIdentifier(BASE, ModelBase):
466
+ """Represents a dataset"""
467
+ __tablename__ = 'deleted_dids'
468
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
469
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
470
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
471
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='DEL_DIDS_TYPE_CHK',
472
+ create_constraint=True,
473
+ values_callable=lambda obj: [e.value for e in obj]))
474
+ is_open: Mapped[Optional[bool]] = mapped_column(Boolean(name='DEL_DIDS_IS_OPEN_CHK', create_constraint=True))
475
+ monotonic: Mapped[bool] = mapped_column(Boolean(name='DEL_DIDS_MONO_CHK', create_constraint=True),
476
+ server_default='0')
477
+ hidden: Mapped[bool] = mapped_column(Boolean(name='DEL_DIDS_HIDDEN_CHK', create_constraint=True),
478
+ server_default='0')
479
+ obsolete: Mapped[bool] = mapped_column(Boolean(name='DEL_DIDS_OBSOLETE_CHK', create_constraint=True),
480
+ server_default='0')
481
+ complete: Mapped[Optional[bool]] = mapped_column(Boolean(name='DEL_DIDS_COMPLETE_CHK', create_constraint=True))
482
+ is_new: Mapped[Optional[bool]] = mapped_column(Boolean(name='DEL_DIDS_IS_NEW_CHK', create_constraint=True),
483
+ server_default='1')
484
+ availability: Mapped[DIDAvailability] = mapped_column(Enum(DIDAvailability, name='DEL_DIDS_AVAIL_CHK',
485
+ create_constraint=True,
486
+ values_callable=lambda obj: [e.value for e in obj]),
487
+ default=DIDAvailability.AVAILABLE)
488
+ suppressed: Mapped[bool] = mapped_column(Boolean(name='DEL_FILES_SUPP_CHK', create_constraint=True),
489
+ server_default='0')
490
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
491
+ length: Mapped[Optional[int]] = mapped_column(BigInteger)
492
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
493
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
494
+ expired_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
495
+ deleted_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
496
+ events: Mapped[Optional[int]] = mapped_column(BigInteger)
497
+ guid: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
498
+ project: Mapped[Optional[str]] = mapped_column(String(50))
499
+ datatype: Mapped[Optional[str]] = mapped_column(String(50))
500
+ run_number: Mapped[Optional[int]] = mapped_column(Integer)
501
+ stream_name: Mapped[Optional[str]] = mapped_column(String(70))
502
+ prod_step: Mapped[Optional[str]] = mapped_column(String(50))
503
+ version: Mapped[Optional[str]] = mapped_column(String(50))
504
+ campaign: Mapped[Optional[str]] = mapped_column(String(50))
505
+ task_id: Mapped[Optional[int]] = mapped_column(Integer())
506
+ panda_id: Mapped[Optional[int]] = mapped_column(Integer())
507
+ lumiblocknr: Mapped[Optional[int]] = mapped_column(Integer())
508
+ provenance: Mapped[Optional[str]] = mapped_column(String(2))
509
+ phys_group: Mapped[Optional[str]] = mapped_column(String(25))
510
+ transient: Mapped[bool] = mapped_column(Boolean(name='DEL_DID_TRANSIENT_CHK', create_constraint=True),
511
+ server_default='0')
512
+ purge_replicas: Mapped[Optional[bool]] = mapped_column(Boolean(name='DELETED_DIDS_PURGE_RPLCS_CHK', create_constraint=True))
513
+ accessed_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
514
+ closed_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
515
+ eol_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
516
+ is_archive: Mapped[Optional[bool]] = mapped_column(Boolean(name='DEL_DIDS_ARCH_CHK', create_constraint=True))
517
+ constituent: Mapped[Optional[bool]] = mapped_column(Boolean(name='DEL_DIDS_CONST_CHK', create_constraint=True))
518
+ access_cnt: Mapped[Optional[int]] = mapped_column(Integer())
519
+ _table_args = (PrimaryKeyConstraint('scope', 'name', name='DELETED_DIDS_PK'), )
520
+
521
+
522
+ class UpdatedDID(BASE, ModelBase):
523
+ """Represents the recently updated dids"""
524
+ __tablename__ = 'updated_dids'
525
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
526
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
527
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
528
+ rule_evaluation_action: Mapped[DIDReEvaluation] = mapped_column(Enum(DIDReEvaluation, name='UPDATED_DIDS_RULE_EVAL_ACT_CHK',
529
+ create_constraint=True,
530
+ values_callable=lambda obj: [e.value for e in obj]))
531
+ _table_args = (PrimaryKeyConstraint('id', name='UPDATED_DIDS_PK'),
532
+ CheckConstraint('SCOPE IS NOT NULL', name='UPDATED_DIDS_SCOPE_NN'),
533
+ CheckConstraint('NAME IS NOT NULL', name='UPDATED_DIDS_NAME_NN'),
534
+ Index('UPDATED_DIDS_SCOPERULENAME_IDX', 'scope', 'rule_evaluation_action', 'name'))
535
+
536
+
537
+ class BadReplicas(BASE, ModelBase):
538
+ """Represents the suspicious or bad replicas"""
539
+ __tablename__ = 'bad_replicas'
540
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
541
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
542
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
543
+ reason: Mapped[Optional[str]] = mapped_column(String(255))
544
+ state: Mapped[BadFilesStatus] = mapped_column(Enum(BadFilesStatus, name='BAD_REPLICAS_STATE_CHK',
545
+ create_constraint=True,
546
+ values_callable=lambda obj: [e.value for e in obj]),
547
+ default=BadFilesStatus.SUSPICIOUS)
548
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
549
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
550
+ expires_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
551
+ _table_args = (PrimaryKeyConstraint('scope', 'name', 'rse_id', 'state', 'created_at', name='BAD_REPLICAS_STATE_PK'),
552
+ CheckConstraint('SCOPE IS NOT NULL', name='BAD_REPLICAS_SCOPE_NN'),
553
+ CheckConstraint('NAME IS NOT NULL', name='BAD_REPLICAS_NAME_NN'),
554
+ CheckConstraint('RSE_ID IS NOT NULL', name='BAD_REPLICAS_RSE_ID_NN'),
555
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='BAD_REPLICAS_ACCOUNT_FK'),
556
+ Index('BAD_REPLICAS_STATE_IDX', 'rse_id', 'state'),
557
+ Index('BAD_REPLICAS_EXPIRES_AT_IDX', 'expires_at'),
558
+ Index('BAD_REPLICAS_ACCOUNT_IDX', 'account'))
559
+
560
+
561
+ class BadPFNs(BASE, ModelBase):
562
+ """Represents bad, suspicious or temporary unavailable PFNs which have to be processed and added to BadReplicas Table"""
563
+ __tablename__ = 'bad_pfns'
564
+ path: Mapped[str] = mapped_column(String(2048)) # PREFIX + PFN
565
+ state: Mapped[BadPFNStatus] = mapped_column(Enum(BadPFNStatus, name='BAD_PFNS_STATE_CHK',
566
+ create_constraint=True,
567
+ values_callable=lambda obj: [e.value for e in obj]),
568
+ default=BadPFNStatus.SUSPICIOUS)
569
+ reason: Mapped[Optional[str]] = mapped_column(String(255))
570
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
571
+ expires_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
572
+ _table_args = (PrimaryKeyConstraint('path', 'state', name='BAD_PFNS_PK'),
573
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='BAD_PFNS_ACCOUNT_FK'))
574
+
575
+
576
+ class QuarantinedReplica(BASE, ModelBase):
577
+ """Represents the quarantined replicas"""
578
+ __tablename__ = 'quarantined_replicas'
579
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
580
+ path: Mapped[str] = mapped_column(String(1024))
581
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
582
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
583
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
584
+ scope: Mapped[Optional[InternalScope]] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
585
+ name: Mapped[Optional[str]] = mapped_column(String(get_schema_value('NAME_LENGTH')))
586
+ _table_args = (PrimaryKeyConstraint('rse_id', 'path', name='QURD_REPLICAS_STATE_PK'),
587
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='QURD_REPLICAS_RSE_ID_FK'),
588
+ Index('QUARANTINED_REPLICAS_PATH_IDX', 'path', 'rse_id', unique=True))
589
+
590
+
591
+ class QuarantinedReplicaHistory(BASE, ModelBase):
592
+ """Represents the quarantined replicas history"""
593
+ __tablename__ = 'quarantined_replicas_history'
594
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
595
+ path: Mapped[str] = mapped_column(String(1024))
596
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
597
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
598
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
599
+ scope: Mapped[Optional[InternalScope]] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
600
+ name: Mapped[Optional[str]] = mapped_column(String(get_schema_value('NAME_LENGTH')))
601
+ deleted_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
602
+ __mapper_args__ = {
603
+ 'primary_key': [rse_id, path] # Fake primary key for SQLA
604
+ }
605
+ _table_args = ()
606
+
607
+
608
+ class DIDKey(BASE, ModelBase):
609
+ """Represents Data IDentifier property keys"""
610
+ __tablename__ = 'did_keys'
611
+ key: Mapped[str] = mapped_column(String(255))
612
+ is_enum: Mapped[bool] = mapped_column(Boolean(name='DID_KEYS_IS_ENUM_CHK', create_constraint=True),
613
+ server_default='0')
614
+ key_type: Mapped[KeyType] = mapped_column(Enum(KeyType, name='DID_KEYS_TYPE_CHK',
615
+ create_constraint=True,
616
+ values_callable=lambda obj: [e.value for e in obj]))
617
+ value_type: Mapped[Optional[str]] = mapped_column(String(255))
618
+ value_regexp: Mapped[Optional[str]] = mapped_column(String(255))
619
+ _table_args = (PrimaryKeyConstraint('key', name='DID_KEYS_PK'),
620
+ CheckConstraint('key_type IS NOT NULL', name='DID_KEYS_TYPE_NN'),
621
+ CheckConstraint('is_enum IS NOT NULL', name='DID_KEYS_IS_ENUM_NN'))
622
+
623
+
624
+ class DIDKeyValueAssociation(BASE, ModelBase):
625
+ """Represents Data IDentifier property key/values"""
626
+ __tablename__ = 'did_key_map'
627
+ key: Mapped[str] = mapped_column(String(255))
628
+ value: Mapped[str] = mapped_column(String(255))
629
+ _table_args = (PrimaryKeyConstraint('key', 'value', name='DID_KEY_MAP_PK'),
630
+ ForeignKeyConstraint(['key'], ['did_keys.key'], name='DID_MAP_KEYS_FK'))
631
+
632
+
633
+ class DataIdentifierAssociation(BASE, ModelBase):
634
+ """Represents the map between containers/datasets and files"""
635
+ __tablename__ = 'contents'
636
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH'))) # dataset scope
637
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH'))) # dataset name
638
+ child_scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH'))) # Provenance scope
639
+ child_name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH'))) # Provenance name
640
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='CONTENTS_DID_TYPE_CHK',
641
+ create_constraint=True,
642
+ values_callable=lambda obj: [e.value for e in obj]))
643
+ child_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='CONTENTS_CHILD_TYPE_CHK',
644
+ create_constraint=True,
645
+ values_callable=lambda obj: [e.value for e in obj]))
646
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
647
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
648
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
649
+ guid: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
650
+ events: Mapped[Optional[int]] = mapped_column(BigInteger)
651
+ rule_evaluation: Mapped[Optional[bool]] = mapped_column(Boolean(name='CONTENTS_RULE_EVALUATION_CHK', create_constraint=True))
652
+ _table_args = (PrimaryKeyConstraint('scope', 'name', 'child_scope', 'child_name', name='CONTENTS_PK'),
653
+ ForeignKeyConstraint(['scope', 'name'], ['dids.scope', 'dids.name'], name='CONTENTS_ID_FK'),
654
+ ForeignKeyConstraint(['child_scope', 'child_name'], ['dids.scope', 'dids.name'], ondelete="CASCADE", name='CONTENTS_CHILD_ID_FK'),
655
+ CheckConstraint('DID_TYPE IS NOT NULL', name='CONTENTS_DID_TYPE_NN'),
656
+ CheckConstraint('CHILD_TYPE IS NOT NULL', name='CONTENTS_CHILD_TYPE_NN'),
657
+ Index('CONTENTS_CHILD_SCOPE_NAME_IDX', 'child_scope', 'child_name', 'scope', 'name'),
658
+ Index('CONTENTS_RULE_EVAL_FB_IDX', 'rule_evaluation')) # Under Oracle this is a FB index
659
+
660
+
661
+ class ConstituentAssociation(BASE, ModelBase):
662
+ """Represents the map between archives and constituents"""
663
+ __tablename__ = 'archive_contents'
664
+ child_scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH'))) # Constituent file scope
665
+ child_name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH'))) # Constituent file name
666
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH'))) # Archive file scope
667
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH'))) # Archive file name
668
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
669
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
670
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
671
+ guid: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
672
+ length: Mapped[Optional[int]] = mapped_column(BigInteger)
673
+ _table_args = (PrimaryKeyConstraint('child_scope', 'child_name', 'scope', 'name',
674
+ name='ARCH_CONTENTS_PK'),
675
+ ForeignKeyConstraint(['scope', 'name'], ['dids.scope', 'dids.name'],
676
+ name='ARCH_CONTENTS_PARENT_FK'),
677
+ ForeignKeyConstraint(['child_scope', 'child_name'],
678
+ ['dids.scope', 'dids.name'], ondelete="CASCADE",
679
+ name='ARCH_CONTENTS_CHILD_FK'),
680
+ Index('ARCH_CONTENTS_CHILD_IDX', 'scope', 'name',
681
+ 'child_scope', 'child_name', ))
682
+
683
+
684
+ class ConstituentAssociationHistory(BASE, ModelBase):
685
+ """Represents the map history between archives and constituents"""
686
+ __tablename__ = 'archive_contents_history'
687
+ child_scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH'))) # Constituent file scope
688
+ child_name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH'))) # Constituent file name
689
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH'))) # Archive file scope
690
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH'))) # Archive file name
691
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
692
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
693
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
694
+ guid: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
695
+ length: Mapped[Optional[int]] = mapped_column(BigInteger)
696
+ __mapper_args__ = {
697
+ 'primary_key': [scope, name, child_scope, child_name] # Fake primary key for SQLA
698
+ }
699
+ _table_args = (Index('ARCH_CONT_HIST_IDX', 'scope', 'name'), )
700
+
701
+
702
+ class DataIdentifierAssociationHistory(BASE, ModelBase):
703
+ """Represents the map history between containers/datasets and files"""
704
+ __tablename__ = 'contents_history'
705
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH'))) # dataset scope
706
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH'))) # dataset name
707
+ child_scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH'))) # Provenance scope
708
+ child_name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH'))) # Provenance name
709
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='CONTENTS_HIST_DID_TYPE_CHK',
710
+ create_constraint=True,
711
+ values_callable=lambda obj: [e.value for e in obj]))
712
+ child_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='CONTENTS_HIST_CHILD_TYPE_CHK',
713
+ create_constraint=True,
714
+ values_callable=lambda obj: [e.value for e in obj]))
715
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
716
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
717
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
718
+ guid: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
719
+ events: Mapped[Optional[int]] = mapped_column(BigInteger)
720
+ rule_evaluation: Mapped[Optional[bool]] = mapped_column(Boolean(name='CONTENTS_HIST_RULE_EVAL_CHK', create_constraint=True))
721
+ did_created_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
722
+ deleted_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
723
+ __mapper_args__ = {
724
+ 'primary_key': [scope, name, child_scope, child_name] # Fake primary key for SQLA
725
+ }
726
+ _table_args = (CheckConstraint('DID_TYPE IS NOT NULL', name='CONTENTS_HIST_DID_TYPE_NN'),
727
+ CheckConstraint('CHILD_TYPE IS NOT NULL', name='CONTENTS_HIST_CHILD_TYPE_NN'),
728
+ Index('CONTENTS_HISTORY_IDX', 'scope', 'name'))
729
+
730
+
731
+ class RSE(BASE, SoftModelBase):
732
+ """Represents a Rucio Location"""
733
+ __tablename__ = 'rses'
734
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
735
+ rse: Mapped[str] = mapped_column(String(255))
736
+ vo: Mapped[str] = mapped_column(String(3), nullable=False, server_default='def')
737
+ rse_type: Mapped[RSEType] = mapped_column(Enum(RSEType, name='RSES_TYPE_CHK',
738
+ create_constraint=True,
739
+ values_callable=lambda obj: [e.value for e in obj]),
740
+ default=RSEType.DISK)
741
+ deterministic: Mapped[bool] = mapped_column(Boolean(name='RSE_DETERMINISTIC_CHK', create_constraint=True),
742
+ default=True)
743
+ volatile: Mapped[bool] = mapped_column(Boolean(name='RSE_VOLATILE_CHK', create_constraint=True),
744
+ default=False)
745
+ staging_area: Mapped[bool] = mapped_column(Boolean(name='RSE_STAGING_AREA_CHK', create_constraint=True),
746
+ default=False)
747
+ city: Mapped[Optional[str]] = mapped_column(String(255))
748
+ region_code: Mapped[Optional[str]] = mapped_column(String(2))
749
+ country_name: Mapped[Optional[str]] = mapped_column(String(255))
750
+ continent: Mapped[Optional[str]] = mapped_column(String(2))
751
+ time_zone: Mapped[Optional[str]] = mapped_column(String(255))
752
+ ISP: Mapped[Optional[str]] = mapped_column(String(255))
753
+ ASN: Mapped[Optional[str]] = mapped_column(String(255))
754
+ longitude: Mapped[Optional[float]] = mapped_column(Float())
755
+ latitude: Mapped[Optional[float]] = mapped_column(Float())
756
+ availability: Mapped[int] = mapped_column(Integer, server_default='7') # Deprecated, will be removedx
757
+ availability_read: Mapped[bool] = mapped_column(Boolean, default=True)
758
+ availability_write: Mapped[bool] = mapped_column(Boolean, default=True)
759
+ availability_delete: Mapped[bool] = mapped_column(Boolean, default=True)
760
+ usage = relationship("RSEUsage", order_by="RSEUsage.rse_id", backref="rses")
761
+ qos_class: Mapped[Optional[str]] = mapped_column(String(64))
762
+ _table_args = (PrimaryKeyConstraint('id', name='RSES_PK'),
763
+ UniqueConstraint('rse', 'vo', name='RSES_RSE_UQ'),
764
+ CheckConstraint('RSE IS NOT NULL', name='RSES_RSE__NN'),
765
+ CheckConstraint('RSE_TYPE IS NOT NULL', name='RSES_TYPE_NN'),
766
+ ForeignKeyConstraint(['vo'], ['vos.vo'], name='RSES_VOS_FK'), )
767
+
768
+
769
+ class RSELimit(BASE, ModelBase):
770
+ """Represents RSE limits"""
771
+ __tablename__ = 'rse_limits'
772
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
773
+ name: Mapped[str] = mapped_column(String(255))
774
+ value: Mapped[int] = mapped_column(BigInteger)
775
+ _table_args = (PrimaryKeyConstraint('rse_id', 'name', name='RSE_LIMITS_PK'),
776
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='RSE_LIMIT_RSE_ID_FK'), )
777
+
778
+
779
+ class TransferLimit(BASE, ModelBase):
780
+ """Represents limits used to throttle transfer requests"""
781
+ __tablename__ = 'transfer_limits'
782
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
783
+ rse_expression: Mapped[str] = mapped_column(String(3000))
784
+ activity: Mapped[Optional[str]] = mapped_column(String(50))
785
+ direction: Mapped[TransferLimitDirection] = mapped_column(Enum(TransferLimitDirection, name='TRANSFER_LIMITS_DIRECTION_TYPE_CHK',
786
+ create_constraint=True,
787
+ values_callable=lambda obj: [e.value for e in obj]),
788
+ default=TransferLimitDirection.DESTINATION)
789
+ max_transfers: Mapped[Optional[int]] = mapped_column(BigInteger)
790
+ volume: Mapped[Optional[int]] = mapped_column(BigInteger)
791
+ deadline: Mapped[Optional[int]] = mapped_column(BigInteger)
792
+ strategy: Mapped[Optional[str]] = mapped_column(String(25))
793
+ transfers: Mapped[Optional[int]] = mapped_column(BigInteger)
794
+ waitings: Mapped[Optional[int]] = mapped_column(BigInteger)
795
+ _table_args = (PrimaryKeyConstraint('id', name='TRANSFER_LIMITS_PK'),
796
+ Index('TRANSFER_LIMITS_SELECTORS_IDX', 'rse_expression', 'activity'),
797
+ CheckConstraint('RSE_EXPRESSION IS NOT NULL', name='TRANSFER_LIMITS_RSE_EXPRESSION_NN'), )
798
+
799
+
800
+ class RSETransferLimit(BASE, ModelBase):
801
+ """Represents the binding of a transfer limit to an RSE as result of TransferLimit.rse_expression dereference"""
802
+ __tablename__ = 'rse_transfer_limits'
803
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
804
+ limit_id: Mapped[uuid.UUID] = mapped_column(GUID())
805
+ _table_args = (PrimaryKeyConstraint('rse_id', 'limit_id', name='RSE_TRANSFER_LIMITS_PK'),
806
+ Index('RSE_TRANSFER_LIMITS_LIMIT_ID_IDX', 'limit_id', 'rse_id'),
807
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='RSE_TRANSFER_LIMITS_RSE_ID_FK'),
808
+ ForeignKeyConstraint(['limit_id'], ['transfer_limits.id'], name='RSE_TRANSFER_LIMITS_LIMIT_ID_FK'), )
809
+
810
+
811
+ class RSEUsage(BASE, ModelBase):
812
+ """Represents location usage"""
813
+ __tablename__ = 'rse_usage'
814
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
815
+ source: Mapped[str] = mapped_column(String(255))
816
+ used: Mapped[Optional[int]] = mapped_column(BigInteger)
817
+ free: Mapped[Optional[int]] = mapped_column(BigInteger)
818
+ files: Mapped[Optional[int]] = mapped_column(BigInteger)
819
+ _table_args = (PrimaryKeyConstraint('rse_id', 'source', name='RSE_USAGE_PK'),
820
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='RSE_USAGE_RSE_ID_FK'), )
821
+
822
+
823
+ class RSEUsageHistory(BASE, ModelBase):
824
+ """Represents location usage history"""
825
+ __tablename__ = 'rse_usage_history'
826
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
827
+ source: Mapped[str] = mapped_column(String(255))
828
+ used: Mapped[Optional[int]] = mapped_column(BigInteger)
829
+ free: Mapped[Optional[int]] = mapped_column(BigInteger)
830
+ files: Mapped[Optional[int]] = mapped_column(BigInteger)
831
+ _table_args = (PrimaryKeyConstraint('rse_id', 'source', 'updated_at', name='RSE_USAGE_HISTORY_PK'), )
832
+
833
+
834
+ class UpdatedRSECounter(BASE, ModelBase):
835
+ """Represents the recently updated RSE counters"""
836
+ __tablename__ = 'updated_rse_counters'
837
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
838
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
839
+ files: Mapped[int] = mapped_column(BigInteger)
840
+ bytes: Mapped[int] = mapped_column(BigInteger)
841
+ _table_args = (PrimaryKeyConstraint('id', name='UPDATED_RSE_CNTRS_PK'),
842
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='UPDATED_RSE_CNTRS_RSE_ID_FK'),
843
+ Index('UPDATED_RSE_CNTRS_RSE_ID_IDX', 'rse_id'))
844
+
845
+
846
+ class RSEAttrAssociation(BASE, ModelBase):
847
+ """Represents the map between RSEs and tags"""
848
+ __tablename__ = 'rse_attr_map'
849
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
850
+ key: Mapped[str] = mapped_column(String(255))
851
+ value: Mapped[Optional[Union[bool, str]]] = mapped_column(BooleanString(255))
852
+ _table_args = (PrimaryKeyConstraint('rse_id', 'key', name='RSE_ATTR_MAP_PK'),
853
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='RSE_ATTR_MAP_RSE_ID_FK'),
854
+ Index('RSE_ATTR_MAP_KEY_VALUE_IDX', 'key', 'value'))
855
+
856
+
857
+ class RSEProtocols(BASE, ModelBase):
858
+ """Represents supported protocols of RSEs (Rucio Storage Elements)"""
859
+ __tablename__ = 'rse_protocols'
860
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
861
+ scheme: Mapped[str] = mapped_column(String(255))
862
+ hostname: Mapped[str] = mapped_column(String(255), server_default='') # For protocol without host e.g. POSIX on local file systems localhost is assumed as beeing default
863
+ port: Mapped[int] = mapped_column(Integer, server_default='0') # like host, for local protocol the port 0 is assumed to be default
864
+ prefix: Mapped[Optional[str]] = mapped_column(String(1024), nullable=True)
865
+ impl: Mapped[str] = mapped_column(String(255), nullable=False)
866
+ read_lan: Mapped[int] = mapped_column(Integer, server_default='0') # if no value is provided, 0 i.e. not supported is assumed as default value
867
+ write_lan: Mapped[int] = mapped_column(Integer, server_default='0') # if no value is provided, 0 i.e. not supported is assumed as default value
868
+ delete_lan: Mapped[int] = mapped_column(Integer, server_default='0') # if no value is provided, 0 i.e. not supported is assumed as default value
869
+ read_wan: Mapped[int] = mapped_column(Integer, server_default='0') # if no value is provided, 0 i.e. not supported is assumed as default value
870
+ write_wan: Mapped[int] = mapped_column(Integer, server_default='0') # if no value is provided, 0 i.e. not supported is assumed as default value
871
+ delete_wan: Mapped[int] = mapped_column(Integer, server_default='0') # if no value is provided, 0 i.e. not supported is assumed as default value
872
+ third_party_copy_read: Mapped[int] = mapped_column(Integer, server_default='0') # if no value is provided, 0 i.e. not supported is assumed as default value
873
+ third_party_copy_write: Mapped[int] = mapped_column(Integer, server_default='0') # if no value is provided, 0 i.e. not supported is assumed as default value
874
+ extended_attributes: Mapped[Optional[str]] = mapped_column(String(4000), nullable=True)
875
+ _table_args = (PrimaryKeyConstraint('rse_id', 'scheme', 'hostname', 'port', name='RSE_PROTOCOL_PK'),
876
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='RSE_PROTOCOL_RSE_ID_FK'),
877
+ CheckConstraint('IMPL IS NOT NULL', name='RSE_PROTOCOLS_IMPL_NN'))
878
+
879
+
880
+ class RSEQoSAssociation(BASE, ModelBase):
881
+ """Represents the mapping of RSEs"""
882
+ __tablename__ = 'rse_qos_map'
883
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
884
+ qos_policy: Mapped[str] = mapped_column(String(64))
885
+ _table_args = (PrimaryKeyConstraint('rse_id', 'qos_policy', name='RSE_QOS_MAP_PK'),
886
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='RSE_QOS_MAP_RSE_ID_FK'))
887
+
888
+
889
+ class AccountLimit(BASE, ModelBase):
890
+ """Represents account limits"""
891
+ __tablename__ = 'account_limits'
892
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
893
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
894
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
895
+ _table_args = (PrimaryKeyConstraint('account', 'rse_id', name='ACCOUNT_LIMITS_PK'),
896
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='ACCOUNT_LIMITS_ACCOUNT_FK'),
897
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='ACCOUNT_LIMITS_RSE_ID_FK'),)
898
+
899
+
900
+ class AccountGlobalLimit(BASE, ModelBase):
901
+ """Represents account limits"""
902
+ __tablename__ = 'account_glob_limits'
903
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
904
+ rse_expression: Mapped[str] = mapped_column(String(3000))
905
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
906
+ _table_args = (PrimaryKeyConstraint('account', 'rse_expression', name='ACCOUNT_GLOBAL_LIMITS_PK'),
907
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='ACCOUNT_GLOBAL_LIMITS_ACC_FK'),)
908
+
909
+
910
+ class AccountUsage(BASE, ModelBase):
911
+ """Represents account usage"""
912
+ __tablename__ = 'account_usage'
913
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
914
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
915
+ files: Mapped[int] = mapped_column(BigInteger)
916
+ bytes: Mapped[int] = mapped_column(BigInteger)
917
+ _table_args = (PrimaryKeyConstraint('account', 'rse_id', name='ACCOUNT_USAGE_PK'),
918
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='ACCOUNT_USAGE_ACCOUNT_FK'),
919
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='ACCOUNT_USAGE_RSES_ID_FK'), )
920
+
921
+
922
+ class AccountUsageHistory(BASE, ModelBase):
923
+ """Represents account usage history"""
924
+ __tablename__ = 'account_usage_history'
925
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
926
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
927
+ files: Mapped[int] = mapped_column(BigInteger)
928
+ bytes: Mapped[int] = mapped_column(BigInteger)
929
+ _table_args = (PrimaryKeyConstraint('account', 'rse_id', 'updated_at', name='ACCOUNT_USAGE_HISTORY_PK'),)
930
+
931
+
932
+ class RSEFileAssociation(BASE, ModelBase):
933
+ """Represents the map between locations and files"""
934
+ __tablename__ = 'replicas'
935
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
936
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
937
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
938
+ bytes: Mapped[int] = mapped_column(BigInteger)
939
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
940
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
941
+ path: Mapped[Optional[str]] = mapped_column(String(1024))
942
+ state: Mapped[ReplicaState] = mapped_column(Enum(ReplicaState, name='REPLICAS_STATE_CHK',
943
+ create_constraint=True,
944
+ values_callable=lambda obj: [e.value for e in obj]),
945
+ default=ReplicaState.UNAVAILABLE)
946
+ lock_cnt: Mapped[int] = mapped_column(Integer, server_default='0')
947
+ accessed_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
948
+ tombstone: Mapped[Optional[datetime]] = mapped_column(DateTime)
949
+ _table_args = (PrimaryKeyConstraint('scope', 'name', 'rse_id', name='REPLICAS_PK'),
950
+ ForeignKeyConstraint(['scope', 'name'], ['dids.scope', 'dids.name'], name='REPLICAS_LFN_FK'),
951
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='REPLICAS_RSE_ID_FK'),
952
+ CheckConstraint('STATE IS NOT NULL', name='REPLICAS_STATE_NN'),
953
+ CheckConstraint('bytes IS NOT NULL', name='REPLICAS_SIZE_NN'),
954
+ CheckConstraint('lock_cnt IS NOT NULL', name='REPLICAS_LOCK_CNT_NN'),
955
+ Index('REPLICAS_PATH_IDX', 'path', mysql_length=get_schema_value('NAME_LENGTH')),
956
+ Index('REPLICAS_STATE_IDX', 'state'),
957
+ Index('REPLICAS_RSE_ID_TOMBSTONE_IDX', 'rse_id', 'tombstone'))
958
+
959
+
960
+ class CollectionReplica(BASE, ModelBase):
961
+ """Represents replicas for datasets/collections"""
962
+ __tablename__ = 'collection_replicas'
963
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
964
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
965
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='COLLECTION_REPLICAS_TYPE_CHK',
966
+ create_constraint=True,
967
+ values_callable=lambda obj: [e.value for e in obj]))
968
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
969
+ bytes: Mapped[int] = mapped_column(BigInteger)
970
+ length: Mapped[int] = mapped_column(BigInteger)
971
+ available_bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
972
+ available_replicas_cnt: Mapped[Optional[int]] = mapped_column(BigInteger)
973
+ state: Mapped[ReplicaState] = mapped_column(Enum(ReplicaState, name='COLLECTION_REPLICAS_STATE_CHK',
974
+ create_constraint=True,
975
+ values_callable=lambda obj: [e.value for e in obj]),
976
+ default=ReplicaState.UNAVAILABLE)
977
+ accessed_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
978
+ _table_args = (PrimaryKeyConstraint('scope', 'name', 'rse_id', name='COLLECTION_REPLICAS_PK'),
979
+ ForeignKeyConstraint(['scope', 'name'], ['dids.scope', 'dids.name'], name='COLLECTION_REPLICAS_LFN_FK'),
980
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='COLLECTION_REPLICAS_RSE_ID_FK'),
981
+ CheckConstraint('STATE IS NOT NULL', name='COLLECTION_REPLICAS_STATE_NN'),
982
+ CheckConstraint('bytes IS NOT NULL', name='COLLECTION_REPLICAS_SIZE_NN'),
983
+ Index('COLLECTION_REPLICAS_RSE_ID_IDX', 'rse_id'))
984
+
985
+
986
+ class UpdatedCollectionReplica(BASE, ModelBase):
987
+ """Represents updates to replicas for datasets/collections"""
988
+ __tablename__ = 'updated_col_rep'
989
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
990
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
991
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
992
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='UPDATED_COL_REP_TYPE_CHK',
993
+ create_constraint=True,
994
+ values_callable=lambda obj: [e.value for e in obj]))
995
+ rse_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
996
+ _table_args = (PrimaryKeyConstraint('id', name='UPDATED_COL_REP_PK'),
997
+ CheckConstraint('SCOPE IS NOT NULL', name='UPDATED_COL_REP_SCOPE_NN'),
998
+ CheckConstraint('NAME IS NOT NULL', name='UPDATED_COL_REP_NAME_NN'),
999
+ Index('UPDATED_COL_REP_SNR_IDX', 'scope', 'name', 'rse_id'))
1000
+
1001
+
1002
+ class RSEFileAssociationHistory(BASE, ModelBase):
1003
+ """Represents a short history of the deleted replicas"""
1004
+ __tablename__ = 'replicas_history'
1005
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1006
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1007
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1008
+ bytes: Mapped[int] = mapped_column(BigInteger)
1009
+ _table_args = (PrimaryKeyConstraint('rse_id', 'scope', 'name', name='REPLICAS_HIST_PK'),
1010
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='REPLICAS_HIST_RSE_ID_FK'),
1011
+ CheckConstraint('bytes IS NOT NULL', name='REPLICAS_HIST_SIZE_NN'))
1012
+
1013
+
1014
+ class ReplicationRule(BASE, ModelBase):
1015
+ """Represents data identifier replication rules"""
1016
+ __tablename__ = 'rules'
1017
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
1018
+ subscription_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1019
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1020
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1021
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1022
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='RULES_DID_TYPE_CHK',
1023
+ create_constraint=True,
1024
+ values_callable=lambda obj: [e.value for e in obj]))
1025
+ state: Mapped[RuleState] = mapped_column(Enum(RuleState, name='RULES_STATE_CHK',
1026
+ create_constraint=True,
1027
+ values_callable=lambda obj: [e.value for e in obj]),
1028
+ default=RuleState.REPLICATING)
1029
+ error: Mapped[Optional[str]] = mapped_column(String(255))
1030
+ rse_expression: Mapped[str] = mapped_column(String(3000))
1031
+ copies: Mapped[int] = mapped_column(SmallInteger, server_default='1')
1032
+ expires_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1033
+ weight: Mapped[Optional[str]] = mapped_column(String(255))
1034
+ locked: Mapped[bool] = mapped_column(Boolean(name='RULES_LOCKED_CHK', create_constraint=True),
1035
+ default=False)
1036
+ locks_ok_cnt: Mapped[int] = mapped_column(BigInteger, server_default='0')
1037
+ locks_replicating_cnt: Mapped[int] = mapped_column(BigInteger, server_default='0')
1038
+ locks_stuck_cnt: Mapped[int] = mapped_column(BigInteger, server_default='0')
1039
+ source_replica_expression: Mapped[Optional[str]] = mapped_column(String(255))
1040
+ activity: Mapped[Optional[str]] = mapped_column(String(50), default='default')
1041
+ grouping: Mapped[RuleGrouping] = mapped_column(Enum(RuleGrouping, name='RULES_GROUPING_CHK',
1042
+ create_constraint=True,
1043
+ values_callable=lambda obj: [e.value for e in obj]),
1044
+ default=RuleGrouping.ALL)
1045
+ notification: Mapped[RuleNotification] = mapped_column(Enum(RuleNotification, name='RULES_NOTIFICATION_CHK',
1046
+ create_constraint=True,
1047
+ values_callable=lambda obj: [e.value for e in obj]),
1048
+ default=RuleNotification.NO)
1049
+ stuck_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1050
+ purge_replicas: Mapped[bool] = mapped_column(Boolean(name='RULES_PURGE_REPLICAS_CHK', create_constraint=True),
1051
+ default=False)
1052
+ ignore_availability: Mapped[bool] = mapped_column(Boolean(name='RULES_IGNORE_AVAILABILITY_CHK', create_constraint=True),
1053
+ default=False)
1054
+ ignore_account_limit: Mapped[bool] = mapped_column(Boolean(name='RULES_IGNORE_ACCOUNT_LIMIT_CHK', create_constraint=True),
1055
+ default=False)
1056
+ priority: Mapped[Optional[int]] = mapped_column(Integer)
1057
+ comments: Mapped[Optional[str]] = mapped_column(String(255))
1058
+ child_rule_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1059
+ eol_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1060
+ split_container: Mapped[bool] = mapped_column(Boolean(name='RULES_SPLIT_CONTAINER_CHK', create_constraint=True),
1061
+ default=False)
1062
+ meta: Mapped[Optional[str]] = mapped_column(String(4000))
1063
+ _table_args = (PrimaryKeyConstraint('id', name='RULES_PK'),
1064
+ ForeignKeyConstraint(['scope', 'name'], ['dids.scope', 'dids.name'], name='RULES_SCOPE_NAME_FK'),
1065
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='RULES_ACCOUNT_FK'),
1066
+ ForeignKeyConstraint(['subscription_id'], ['subscriptions.id'], name='RULES_SUBS_ID_FK'),
1067
+ ForeignKeyConstraint(['child_rule_id'], ['rules.id'], name='RULES_CHILD_RULE_ID_FK'),
1068
+ CheckConstraint('STATE IS NOT NULL', name='RULES_STATE_NN'),
1069
+ CheckConstraint('SCOPE IS NOT NULL', name='RULES_SCOPE_NN'),
1070
+ CheckConstraint('NAME IS NOT NULL', name='RULES_NAME_NN'),
1071
+ CheckConstraint(grouping != None, name='RULES_GROUPING_NN'), # NOQA: E711
1072
+ CheckConstraint('COPIES IS NOT NULL', name='RULES_COPIES_NN'),
1073
+ CheckConstraint('LOCKED IS NOT NULL', name='RULES_LOCKED_NN'),
1074
+ CheckConstraint('ACCOUNT IS NOT NULL', name='RULES_ACCOUNT_NN'),
1075
+ CheckConstraint('LOCKS_OK_CNT IS NOT NULL', name='RULES_LOCKS_OK_CNT_NN'),
1076
+ CheckConstraint('LOCKS_REPLICATING_CNT IS NOT NULL', name='RULES_LOCKS_REPLICATING_CNT_NN'),
1077
+ CheckConstraint('LOCKS_STUCK_CNT IS NOT NULL', name='RULES_LOCKS_STUCK_CNT_NN'),
1078
+ CheckConstraint('PURGE_REPLICAS IS NOT NULL', name='RULES_PURGE_REPLICAS_NN'),
1079
+ Index('RULES_SC_NA_AC_RS_CO_UQ_IDX', 'scope', 'name', 'account', 'rse_expression', 'copies',
1080
+ unique=True, mysql_length={'rse_expression': 767}),
1081
+ Index('RULES_SCOPE_NAME_IDX', 'scope', 'name'),
1082
+ Index('RULES_EXPIRES_AT_IDX', 'expires_at'),
1083
+ Index('RULES_STATE_IDX', 'state'),
1084
+ Index('RULES_CHILD_RULE_ID_IDX', 'child_rule_id'))
1085
+
1086
+
1087
+ class ReplicationRuleHistoryRecent(BASE, ModelBase):
1088
+ """Represents replication rules in the recent history"""
1089
+ __tablename__ = 'rules_hist_recent'
1090
+ id: Mapped[uuid.UUID] = mapped_column(GUID())
1091
+ subscription_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1092
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1093
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1094
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1095
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='RULES_HIST_RECENT_DIDTYPE_CHK',
1096
+ create_constraint=True,
1097
+ values_callable=lambda obj: [e.value for e in obj]))
1098
+ state: Mapped[RuleState] = mapped_column(Enum(RuleState, name='RULES_HIST_RECENT_STATE_CHK',
1099
+ create_constraint=True,
1100
+ values_callable=lambda obj: [e.value for e in obj]))
1101
+ error: Mapped[Optional[str]] = mapped_column(String(255))
1102
+ rse_expression: Mapped[str] = mapped_column(String(3000))
1103
+ copies: Mapped[Optional[int]] = mapped_column(SmallInteger)
1104
+ expires_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1105
+ weight: Mapped[Optional[str]] = mapped_column(String(255))
1106
+ locked: Mapped[bool] = mapped_column(Boolean())
1107
+ locks_ok_cnt: Mapped[Optional[int]] = mapped_column(BigInteger)
1108
+ locks_replicating_cnt: Mapped[int] = mapped_column(BigInteger)
1109
+ locks_stuck_cnt: Mapped[Optional[int]] = mapped_column(BigInteger)
1110
+ source_replica_expression: Mapped[Optional[str]] = mapped_column(String(255))
1111
+ activity: Mapped[Optional[str]] = mapped_column(String(50))
1112
+ grouping: Mapped[RuleGrouping] = mapped_column(Enum(RuleGrouping, name='RULES_HIST_RECENT_GROUPING_CHK',
1113
+ create_constraint=True,
1114
+ values_callable=lambda obj: [e.value for e in obj]))
1115
+ notification: Mapped[RuleNotification] = mapped_column(Enum(RuleNotification, name='RULES_HIST_RECENT_NOTIFY_CHK',
1116
+ create_constraint=True,
1117
+ values_callable=lambda obj: [e.value for e in obj]))
1118
+ stuck_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1119
+ purge_replicas: Mapped[bool] = mapped_column(Boolean())
1120
+ ignore_availability: Mapped[bool] = mapped_column(Boolean())
1121
+ ignore_account_limit: Mapped[bool] = mapped_column(Boolean())
1122
+ priority: Mapped[Optional[int]] = mapped_column(Integer)
1123
+ comments: Mapped[Optional[str]] = mapped_column(String(255))
1124
+ child_rule_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1125
+ eol_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1126
+ split_container: Mapped[bool] = mapped_column(Boolean())
1127
+ meta: Mapped[Optional[str]] = mapped_column(String(4000))
1128
+ __mapper_args__ = {
1129
+ 'primary_key': [id, locks_replicating_cnt] # Fake primary key for SQLA
1130
+ }
1131
+ _table_args = (Index('RULES_HIST_RECENT_ID_IDX', 'id'),
1132
+ Index('RULES_HIST_RECENT_SC_NA_IDX', 'scope', 'name'))
1133
+
1134
+
1135
+ class ReplicationRuleHistory(BASE, ModelBase):
1136
+ """Represents replication rules in the longterm history"""
1137
+ __tablename__ = 'rules_history'
1138
+ id: Mapped[uuid.UUID] = mapped_column(GUID())
1139
+ subscription_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1140
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1141
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1142
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1143
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='RULES_HISTORY_DIDTYPE_CHK',
1144
+ create_constraint=True,
1145
+ values_callable=lambda obj: [e.value for e in obj]))
1146
+ state: Mapped[RuleState] = mapped_column(Enum(RuleState, name='RULES_HISTORY_STATE_CHK',
1147
+ create_constraint=True,
1148
+ values_callable=lambda obj: [e.value for e in obj]))
1149
+ error: Mapped[Optional[str]] = mapped_column(String(255))
1150
+ rse_expression: Mapped[str] = mapped_column(String(3000))
1151
+ copies: Mapped[Optional[int]] = mapped_column(SmallInteger)
1152
+ expires_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1153
+ weight: Mapped[Optional[str]] = mapped_column(String(255))
1154
+ locked: Mapped[bool] = mapped_column(Boolean())
1155
+ locks_ok_cnt: Mapped[Optional[int]] = mapped_column(BigInteger)
1156
+ locks_replicating_cnt: Mapped[int] = mapped_column(BigInteger)
1157
+ locks_stuck_cnt: Mapped[Optional[int]] = mapped_column(BigInteger)
1158
+ source_replica_expression: Mapped[Optional[str]] = mapped_column(String(255))
1159
+ activity: Mapped[Optional[str]] = mapped_column(String(50))
1160
+ grouping: Mapped[RuleGrouping] = mapped_column(Enum(RuleGrouping, name='RULES_HISTORY_GROUPING_CHK',
1161
+ create_constraint=True,
1162
+ values_callable=lambda obj: [e.value for e in obj]))
1163
+ notification: Mapped[RuleNotification] = mapped_column(Enum(RuleNotification, name='RULES_HISTORY_NOTIFY_CHK',
1164
+ create_constraint=True,
1165
+ values_callable=lambda obj: [e.value for e in obj]))
1166
+ stuck_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1167
+ priority: Mapped[Optional[int]] = mapped_column(Integer)
1168
+ purge_replicas: Mapped[bool] = mapped_column(Boolean())
1169
+ ignore_availability: Mapped[bool] = mapped_column(Boolean())
1170
+ ignore_account_limit: Mapped[bool] = mapped_column(Boolean())
1171
+ comments: Mapped[Optional[str]] = mapped_column(String(255))
1172
+ child_rule_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1173
+ eol_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1174
+ split_container: Mapped[bool] = mapped_column(Boolean())
1175
+ meta: Mapped[Optional[str]] = mapped_column(String(4000))
1176
+ __mapper_args__ = {
1177
+ 'primary_key': [id, locks_replicating_cnt] # Fake primary key for SQLA
1178
+ }
1179
+ _table_args = (Index('RULES_HISTORY_SCOPENAME_IDX', 'scope', 'name'), )
1180
+
1181
+
1182
+ class ReplicaLock(BASE, ModelBase):
1183
+ """Represents replica locks"""
1184
+ __tablename__ = 'locks'
1185
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1186
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1187
+ rule_id: Mapped[uuid.UUID] = mapped_column(GUID())
1188
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1189
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1190
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
1191
+ state: Mapped[LockState] = mapped_column(Enum(LockState, name='LOCKS_STATE_CHK',
1192
+ create_constraint=True,
1193
+ values_callable=lambda obj: [e.value for e in obj]),
1194
+ default=LockState.REPLICATING)
1195
+ repair_cnt: Mapped[Optional[int]] = mapped_column(BigInteger)
1196
+ _table_args = (PrimaryKeyConstraint('scope', 'name', 'rule_id', 'rse_id', name='LOCKS_PK'),
1197
+ ForeignKeyConstraint(['rule_id'], ['rules.id'], name='LOCKS_RULE_ID_FK'),
1198
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='LOCKS_ACCOUNT_FK'),
1199
+ CheckConstraint('STATE IS NOT NULL', name='LOCKS_STATE_NN'),
1200
+ CheckConstraint('ACCOUNT IS NOT NULL', name='LOCKS_ACCOUNT_NN'),
1201
+ Index('LOCKS_RULE_ID_IDX', 'rule_id'))
1202
+
1203
+
1204
+ class DatasetLock(BASE, ModelBase):
1205
+ """Represents dataset locks"""
1206
+ __tablename__ = 'dataset_locks'
1207
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1208
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1209
+ rule_id: Mapped[uuid.UUID] = mapped_column(GUID())
1210
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1211
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1212
+ state: Mapped[LockState] = mapped_column(Enum(LockState, name='DATASET_LOCKS_STATE_CHK',
1213
+ create_constraint=True,
1214
+ values_callable=lambda obj: [e.value for e in obj]),
1215
+ default=LockState.REPLICATING)
1216
+ length: Mapped[Optional[int]] = mapped_column(BigInteger)
1217
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
1218
+ accessed_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1219
+ _table_args = (PrimaryKeyConstraint('scope', 'name', 'rule_id', 'rse_id', name='DATASET_LOCKS_PK'),
1220
+ ForeignKeyConstraint(['scope', 'name'], ['dids.scope', 'dids.name'], name='DATASET_LOCKS_DID_FK'),
1221
+ ForeignKeyConstraint(['rule_id'], ['rules.id'], name='DATASET_LOCKS_RULE_ID_FK'),
1222
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='DATASET_LOCKS_ACCOUNT_FK'),
1223
+ CheckConstraint('STATE IS NOT NULL', name='DATASET_LOCKS_STATE_NN'),
1224
+ CheckConstraint('ACCOUNT IS NOT NULL', name='DATASET_LOCKS_ACCOUNT_NN'),
1225
+ Index('DATASET_LOCKS_RULE_ID_IDX', 'rule_id'),
1226
+ Index('DATASET_LOCKS_RSE_ID_IDX', 'rse_id'))
1227
+
1228
+
1229
+ class UpdatedAccountCounter(BASE, ModelBase):
1230
+ """Represents the recently updated Account counters"""
1231
+ __tablename__ = 'updated_account_counters'
1232
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
1233
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1234
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1235
+ files: Mapped[int] = mapped_column(BigInteger)
1236
+ bytes: Mapped[int] = mapped_column(BigInteger)
1237
+ _table_args = (PrimaryKeyConstraint('id', name='UPDATED_ACCNT_CNTRS_PK'),
1238
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='UPDATED_ACCNT_CNTRS_RSE_ID_FK'),
1239
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='UPDATED_ACCNT_CNTRS_ACCOUNT_FK'),
1240
+ Index('UPDATED_ACCNT_CNTRS_RSE_ID_IDX', 'account', 'rse_id'))
1241
+
1242
+
1243
+ class Request(BASE, ModelBase):
1244
+ """Represents a request for a single file with a third party service"""
1245
+ __tablename__ = 'requests'
1246
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
1247
+ request_type: Mapped[RequestType] = mapped_column(Enum(RequestType, name='REQUESTS_TYPE_CHK',
1248
+ create_constraint=True,
1249
+ values_callable=lambda obj: [e.value for e in obj]),
1250
+ default=RequestType.TRANSFER)
1251
+ scope: Mapped[Optional[InternalScope]] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1252
+ name: Mapped[Optional[str]] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1253
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='REQUESTS_DIDTYPE_CHK',
1254
+ create_constraint=True,
1255
+ values_callable=lambda obj: [e.value for e in obj]),
1256
+ default=DIDType.FILE)
1257
+ dest_rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1258
+ source_rse_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1259
+ attributes: Mapped[Optional[str]] = mapped_column(String(4000))
1260
+ state: Mapped[RequestState] = mapped_column(Enum(RequestState, name='REQUESTS_STATE_CHK',
1261
+ create_constraint=True,
1262
+ values_callable=lambda obj: [e.value for e in obj]),
1263
+ default=RequestState.QUEUED)
1264
+ external_id: Mapped[Optional[str]] = mapped_column(String(64))
1265
+ external_host: Mapped[Optional[str]] = mapped_column(String(256))
1266
+ retry_count: Mapped[int] = mapped_column(Integer(), server_default='0')
1267
+ err_msg: Mapped[Optional[str]] = mapped_column(String(4000))
1268
+ previous_attempt_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1269
+ rule_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1270
+ activity: Mapped[Optional[str]] = mapped_column(String(50), default='default')
1271
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
1272
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
1273
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
1274
+ dest_url: Mapped[Optional[str]] = mapped_column(String(2048))
1275
+ submitted_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1276
+ started_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1277
+ transferred_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1278
+ estimated_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1279
+ submitter_id: Mapped[Optional[int]] = mapped_column(Integer)
1280
+ estimated_started_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1281
+ estimated_transferred_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1282
+ staging_started_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1283
+ staging_finished_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1284
+ account: Mapped[Optional[InternalAccount]] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1285
+ requested_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1286
+ last_processed_by: Mapped[Optional[str]] = mapped_column(String(64))
1287
+ last_processed_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1288
+ priority: Mapped[Optional[int]] = mapped_column(Integer)
1289
+ transfertool: Mapped[Optional[str]] = mapped_column(String(64))
1290
+ _table_args = (PrimaryKeyConstraint('id', name='REQUESTS_PK'),
1291
+ ForeignKeyConstraint(['scope', 'name'], ['dids.scope', 'dids.name'], name='REQUESTS_DID_FK'),
1292
+ ForeignKeyConstraint(['dest_rse_id'], ['rses.id'], name='REQUESTS_RSES_FK'),
1293
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='REQUESTS_ACCOUNT_FK'),
1294
+ CheckConstraint('dest_rse_id IS NOT NULL', name='REQUESTS_RSE_ID_NN'),
1295
+ Index('REQUESTS_SCOPE_NAME_RSE_IDX', 'scope', 'name', 'dest_rse_id', 'request_type'),
1296
+ Index('REQUESTS_TYP_STA_UPD_IDX_OLD', 'request_type', 'state', 'updated_at'),
1297
+ Index('REQUESTS_TYP_STA_UPD_IDX', 'request_type', 'state', 'activity'),
1298
+ Index('REQUESTS_RULEID_IDX', 'rule_id'),
1299
+ Index('REQUESTS_EXTERNALID_UQ', 'external_id'),
1300
+ Index('REQUESTS_DEST_RSE_ID_IDX', 'dest_rse_id'),
1301
+ Index('REQUESTS_TYP_STA_TRA_ACT_IDX', 'request_type', 'state', 'transfertool', 'activity'))
1302
+
1303
+
1304
+ class TransferHop(BASE, ModelBase):
1305
+ """Represents source files for transfers"""
1306
+ __tablename__ = 'transfer_hops'
1307
+ request_id: Mapped[uuid.UUID] = mapped_column(GUID())
1308
+ next_hop_request_id: Mapped[uuid.UUID] = mapped_column(GUID())
1309
+ initial_request_id: Mapped[uuid.UUID] = mapped_column(GUID())
1310
+ _table_args = (PrimaryKeyConstraint('request_id', 'next_hop_request_id', 'initial_request_id', name='TRANSFER_HOPS_PK'),
1311
+ ForeignKeyConstraint(['initial_request_id'], ['requests.id'], name='TRANSFER_HOPS_INIT_REQ_ID_FK'),
1312
+ ForeignKeyConstraint(['request_id'], ['requests.id'], name='TRANSFER_HOPS_REQ_ID_FK'),
1313
+ ForeignKeyConstraint(['next_hop_request_id'], ['requests.id'], name='TRANSFER_HOPS_NH_REQ_ID_FK'),
1314
+ Index('TRANSFER_HOPS_INITIAL_REQ_IDX', 'initial_request_id'),
1315
+ Index('TRANSFER_HOPS_NH_REQ_IDX', 'next_hop_request_id'))
1316
+
1317
+
1318
+ class RequestHistory(BASE, ModelBase):
1319
+ """Represents request history"""
1320
+ __tablename__ = 'requests_history'
1321
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
1322
+ request_type: Mapped[RequestType] = mapped_column(Enum(RequestType, name='REQUESTS_HIST_TYPE_CHK',
1323
+ create_constraint=True,
1324
+ values_callable=lambda obj: [e.value for e in obj]),
1325
+ default=RequestType.TRANSFER)
1326
+ scope: Mapped[Optional[InternalScope]] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1327
+ name: Mapped[Optional[str]] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1328
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='REQUESTS_HIST_DIDTYPE_CHK',
1329
+ create_constraint=True,
1330
+ values_callable=lambda obj: [e.value for e in obj]),
1331
+ default=DIDType.FILE)
1332
+ dest_rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1333
+ source_rse_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1334
+ attributes: Mapped[Optional[str]] = mapped_column(String(4000))
1335
+ state: Mapped[RequestState] = mapped_column(Enum(RequestState, name='REQUESTS_HIST_STATE_CHK',
1336
+ create_constraint=True,
1337
+ values_callable=lambda obj: [e.value for e in obj]),
1338
+ default=RequestState.QUEUED)
1339
+ external_id: Mapped[Optional[str]] = mapped_column(String(64))
1340
+ external_host: Mapped[Optional[str]] = mapped_column(String(256))
1341
+ retry_count: Mapped[int] = mapped_column(Integer(), server_default='0')
1342
+ err_msg: Mapped[Optional[str]] = mapped_column(String(4000))
1343
+ previous_attempt_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1344
+ rule_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1345
+ activity: Mapped[Optional[str]] = mapped_column(String(50), default='default')
1346
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
1347
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
1348
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
1349
+ dest_url: Mapped[Optional[str]] = mapped_column(String(2048))
1350
+ submitted_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1351
+ started_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1352
+ transferred_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1353
+ estimated_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1354
+ submitter_id: Mapped[Optional[int]] = mapped_column(Integer)
1355
+ estimated_started_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1356
+ estimated_transferred_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1357
+ staging_started_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1358
+ staging_finished_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1359
+ account: Mapped[Optional[InternalAccount]] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1360
+ requested_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1361
+ priority: Mapped[Optional[int]] = mapped_column(Integer)
1362
+ transfertool: Mapped[Optional[str]] = mapped_column(String(64))
1363
+ __mapper_args__ = {
1364
+ 'primary_key': [id] # Fake primary key for SQLA
1365
+ }
1366
+ _table_args = (Index('REQ_HIST_SCOPE_NAME_RSE_IDX', 'scope', 'name', 'dest_rse_id'),
1367
+ )
1368
+
1369
+
1370
+ class Source(BASE, ModelBase):
1371
+ """Represents source files for transfers"""
1372
+ __tablename__ = 'sources'
1373
+ request_id: Mapped[uuid.UUID] = mapped_column(GUID())
1374
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1375
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1376
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1377
+ dest_rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1378
+ url: Mapped[Optional[str]] = mapped_column(String(2048))
1379
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
1380
+ ranking: Mapped[Optional[int]] = mapped_column(Integer())
1381
+ is_using: Mapped[bool] = mapped_column(Boolean(), default=False)
1382
+ _table_args = (PrimaryKeyConstraint('request_id', 'rse_id', 'scope', 'name', name='SOURCES_PK'),
1383
+ ForeignKeyConstraint(['request_id'], ['requests.id'], name='SOURCES_REQ_ID_FK'),
1384
+ ForeignKeyConstraint(['scope', 'name', 'rse_id'], ['replicas.scope', 'replicas.name', 'replicas.rse_id'], name='SOURCES_REPLICA_FK'),
1385
+ ForeignKeyConstraint(['rse_id'], ['rses.id'], name='SOURCES_RSES_FK'),
1386
+ ForeignKeyConstraint(['dest_rse_id'], ['rses.id'], name='SOURCES_DEST_RSES_FK'),
1387
+ Index('SOURCES_SRC_DST_IDX', 'rse_id', 'dest_rse_id'),
1388
+ Index('SOURCES_SC_NM_DST_IDX', 'scope', 'rse_id', 'name'),
1389
+ Index('SOURCES_DEST_RSEID_IDX', 'dest_rse_id'))
1390
+
1391
+
1392
+ class SourceHistory(BASE, ModelBase):
1393
+ """Represents history of source files for transfers"""
1394
+ __tablename__ = 'sources_history'
1395
+ request_id: Mapped[uuid.UUID] = mapped_column(GUID())
1396
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1397
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1398
+ rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1399
+ dest_rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1400
+ url: Mapped[Optional[str]] = mapped_column(String(2048))
1401
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
1402
+ ranking: Mapped[Optional[int]] = mapped_column(Integer())
1403
+ is_using: Mapped[bool] = mapped_column(Boolean(), default=False)
1404
+ __mapper_args__ = {
1405
+ 'primary_key': [request_id] # Fake primary key for SQLA
1406
+ }
1407
+ _table_args = (Index('SOURCES_HIST_REQID_IDX', 'request_id'),
1408
+ )
1409
+
1410
+
1411
+ # Compatibility code to permit 1.30 to run with a distances table from the 1.29 database schema
1412
+ # TODO: remove this code in rucio 1.31
1413
+ _distance_column_name = 'distance'
1414
+ _engine = get_engine()
1415
+ if _engine.dialect.name in ['oracle', 'mysql', 'postgresql']:
1416
+ _insp = inspect(_engine)
1417
+ if _engine.dialect.name in ['oracle', 'postgresql'] or BASE.metadata.schema in _insp.get_schema_names():
1418
+ if 'distances' in _insp.get_table_names(schema=BASE.metadata.schema):
1419
+ if any(c['name'] == 'ranking' for c in _insp.get_columns(table_name='distances', schema=BASE.metadata.schema)):
1420
+ _distance_column_name = 'ranking'
1421
+
1422
+
1423
+ class Distance(BASE, ModelBase):
1424
+ """Represents distance between rses"""
1425
+ __tablename__ = 'distances'
1426
+ src_rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1427
+ dest_rse_id: Mapped[uuid.UUID] = mapped_column(GUID())
1428
+ distance: Mapped[Optional[int]] = mapped_column(Integer(), name=_distance_column_name)
1429
+ _table_args = (PrimaryKeyConstraint('src_rse_id', 'dest_rse_id', name='DISTANCES_PK'),
1430
+ ForeignKeyConstraint(['src_rse_id'], ['rses.id'], name='DISTANCES_SRC_RSES_FK'),
1431
+ ForeignKeyConstraint(['dest_rse_id'], ['rses.id'], name='DISTANCES_DEST_RSES_FK'),
1432
+ Index('DISTANCES_DEST_RSEID_IDX', 'dest_rse_id'))
1433
+
1434
+
1435
+ class Subscription(BASE, ModelBase):
1436
+ """Represents a subscription"""
1437
+ __tablename__ = 'subscriptions'
1438
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
1439
+ name: Mapped[str] = mapped_column(String(64))
1440
+ filter: Mapped[Optional[str]] = mapped_column(String(4000))
1441
+ replication_rules: Mapped[Optional[str]] = mapped_column(String(4000))
1442
+ policyid: Mapped[int] = mapped_column(SmallInteger, server_default='0')
1443
+ state: Mapped[SubscriptionState] = mapped_column(Enum(SubscriptionState, name='SUBSCRIPTIONS_STATE_CHK',
1444
+ create_constraint=True,
1445
+ values_callable=lambda obj: [e.value for e in obj]),
1446
+ default=SubscriptionState.ACTIVE)
1447
+ last_processed: Mapped[Optional[datetime]] = mapped_column(DateTime, default=datetime.utcnow())
1448
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1449
+ lifetime: Mapped[Optional[datetime]] = mapped_column(DateTime)
1450
+ comments: Mapped[Optional[str]] = mapped_column(String(4000))
1451
+ retroactive: Mapped[bool] = mapped_column(Boolean(name='SUBSCRIPTIONS_RETROACTIVE_CHK', create_constraint=True),
1452
+ default=False)
1453
+ expired_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1454
+ _table_args = (PrimaryKeyConstraint('id', name='SUBSCRIPTIONS_PK'),
1455
+ UniqueConstraint('name', 'account', name='SUBSCRIPTIONS_NAME_ACCOUNT_UQ'),
1456
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='SUBSCRIPTIONS_ACCOUNT_FK'),
1457
+ CheckConstraint('RETROACTIVE IS NOT NULL', name='SUBSCRIPTIONS_RETROACTIVE_NN'),
1458
+ CheckConstraint('ACCOUNT IS NOT NULL', name='SUBSCRIPTIONS_ACCOUNT_NN'),
1459
+ Index('SUBSCRIPTIONS_STATE_IDX', 'state')) # Under Oracle this is a FB index
1460
+
1461
+
1462
+ class SubscriptionHistory(BASE, ModelBase):
1463
+ """Represents a subscription history"""
1464
+ __tablename__ = 'subscriptions_history'
1465
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
1466
+ name: Mapped[str] = mapped_column(String(64))
1467
+ filter: Mapped[Optional[str]] = mapped_column(String(4000))
1468
+ replication_rules: Mapped[Optional[str]] = mapped_column(String(4000))
1469
+ policyid: Mapped[int] = mapped_column(SmallInteger, server_default='0')
1470
+ state: Mapped[SubscriptionState] = mapped_column(Enum(SubscriptionState, name='SUBSCRIPTIONS_HIST_STATE_CHK',
1471
+ create_constraint=True,
1472
+ values_callable=lambda obj: [e.value for e in obj]),
1473
+ default=SubscriptionState.ACTIVE)
1474
+ last_processed: Mapped[Optional[datetime]] = mapped_column(DateTime, default=datetime.utcnow())
1475
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1476
+ lifetime: Mapped[Optional[datetime]] = mapped_column(DateTime)
1477
+ comments: Mapped[Optional[str]] = mapped_column(String(4000))
1478
+ retroactive: Mapped[bool] = mapped_column(Boolean(name='SUBS_HISTORY_RETROACTIVE_CHK', create_constraint=True),
1479
+ default=False)
1480
+ expired_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1481
+ _table_args = (PrimaryKeyConstraint('id', 'updated_at', name='SUBSCRIPTIONS_PK'),)
1482
+
1483
+
1484
+ class Token(BASE, ModelBase):
1485
+ """Represents the authentication tokens and their lifetime"""
1486
+ __tablename__ = 'tokens'
1487
+ token: Mapped[str] = mapped_column(String(3072)) # account-identity-appid-uuid -> max length: (+ 30 1 255 1 32 1 32)
1488
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1489
+ refresh_token: Mapped[Optional[str]] = mapped_column(String(3072), default=None)
1490
+ refresh: Mapped[bool] = mapped_column(Boolean(name='TOKENS_REFRESH_CHK', create_constraint=True),
1491
+ default=False)
1492
+ refresh_start: Mapped[Optional[datetime]] = mapped_column(DateTime, default=None)
1493
+ refresh_expired_at: Mapped[Optional[datetime]] = mapped_column(DateTime, default=None)
1494
+ refresh_lifetime: Mapped[Optional[int]] = mapped_column(Integer())
1495
+ oidc_scope: Mapped[Optional[str]] = mapped_column(String(2048), default=None) # scopes define the specific actions applications can be allowed to do on a user's behalf
1496
+ identity: Mapped[Optional[str]] = mapped_column(String(2048))
1497
+ audience: Mapped[Optional[str]] = mapped_column(String(315), default=None)
1498
+ expired_at: Mapped[datetime] = mapped_column(DateTime, default=lambda: datetime.utcnow() + timedelta(seconds=3600)) # one hour lifetime by default
1499
+ ip: Mapped[Optional[str]] = mapped_column(String(39), nullable=True)
1500
+ _table_args = (PrimaryKeyConstraint('token', name='TOKENS_TOKEN_PK'), # not supported for primary key constraint mysql_length=255
1501
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='TOKENS_ACCOUNT_FK'),
1502
+ CheckConstraint('EXPIRED_AT IS NOT NULL', name='TOKENS_EXPIRED_AT_NN'),
1503
+ Index('TOKENS_ACCOUNT_EXPIRED_AT_IDX', 'account', 'expired_at'))
1504
+
1505
+
1506
+ class OAuthRequest(BASE, ModelBase):
1507
+ """Represents the authentication session parameters of OAuth 2.0 requests"""
1508
+ __tablename__ = 'oauth_requests'
1509
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1510
+ state: Mapped[str] = mapped_column(String(50))
1511
+ nonce: Mapped[Optional[str]] = mapped_column(String(50))
1512
+ access_msg: Mapped[Optional[str]] = mapped_column(String(2048))
1513
+ redirect_msg: Mapped[Optional[str]] = mapped_column(String(2048))
1514
+ refresh_lifetime: Mapped[Optional[int]] = mapped_column(Integer())
1515
+ ip: Mapped[Optional[str]] = mapped_column(String(39), nullable=True)
1516
+ expired_at: Mapped[datetime] = mapped_column(DateTime, default=lambda: datetime.utcnow() + timedelta(seconds=600)) # 10 min lifetime by default
1517
+ _table_args = (PrimaryKeyConstraint('state', name='OAUTH_REQUESTS_STATE_PK'),
1518
+ CheckConstraint('EXPIRED_AT IS NOT NULL', name='OAUTH_REQUESTS_EXPIRED_AT_NN'),
1519
+ Index('OAUTH_REQUESTS_ACC_EXP_AT_IDX', 'account', 'expired_at'),
1520
+ Index('OAUTH_REQUESTS_ACCESS_MSG_IDX', 'access_msg'))
1521
+
1522
+
1523
+ class Message(BASE, ModelBase):
1524
+ """Represents the event messages"""
1525
+ __tablename__ = 'messages'
1526
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
1527
+ event_type: Mapped[str] = mapped_column(String(256))
1528
+ payload: Mapped[str] = mapped_column(String(4000))
1529
+ payload_nolimit: Mapped[Optional[str]] = mapped_column(Text)
1530
+ services: Mapped[Optional[str]] = mapped_column(String(256))
1531
+ _table_args = (PrimaryKeyConstraint('id', name='MESSAGES_ID_PK'),
1532
+ CheckConstraint('EVENT_TYPE IS NOT NULL', name='MESSAGES_EVENT_TYPE_NN'),
1533
+ CheckConstraint('PAYLOAD IS NOT NULL', name='MESSAGES_PAYLOAD_NN'),
1534
+ Index('MESSAGES_SERVICES_IDX', 'services', 'event_type'))
1535
+
1536
+
1537
+ class MessageHistory(BASE, ModelBase):
1538
+ """Represents the history of event messages"""
1539
+ __tablename__ = 'messages_history'
1540
+ id: Mapped[uuid.UUID] = mapped_column(GUID())
1541
+ event_type: Mapped[Optional[str]] = mapped_column(String(1024))
1542
+ payload: Mapped[Optional[str]] = mapped_column(String(4000))
1543
+ payload_nolimit: Mapped[Optional[str]] = mapped_column(Text)
1544
+ services: Mapped[Optional[str]] = mapped_column(String(2048))
1545
+ __mapper_args__ = {
1546
+ 'primary_key': [id] # Fake primary key for SQLA
1547
+ }
1548
+ _table_args = () # PrimaryKeyConstraint('id', name='MESSAGES_HIST_ID_PK'),) # PK needed for SQLA only
1549
+
1550
+
1551
+ class AlembicVersion(BASE):
1552
+ """Table used to pinpoint actual database schema release."""
1553
+ __tablename__ = "alembic_version"
1554
+ version_num: Mapped[str] = mapped_column(String(32), primary_key=True, nullable=False)
1555
+
1556
+
1557
+ class Config(BASE, ModelBase):
1558
+ """Represents the configuration"""
1559
+ __tablename__ = 'configs'
1560
+ section: Mapped[str] = mapped_column(String(128))
1561
+ opt: Mapped[str] = mapped_column(String(128))
1562
+ value: Mapped[Optional[str]] = mapped_column(String(4000))
1563
+ _table_args = (PrimaryKeyConstraint('section', 'opt', name='CONFIGS_PK'), )
1564
+
1565
+
1566
+ class ConfigHistory(BASE, ModelBase):
1567
+ """Represents the configuration"""
1568
+ __tablename__ = 'configs_history'
1569
+ section: Mapped[str] = mapped_column(String(128))
1570
+ opt: Mapped[str] = mapped_column(String(128))
1571
+ value: Mapped[Optional[str]] = mapped_column(String(4000))
1572
+ __mapper_args__ = {
1573
+ 'primary_key': [section, opt] # Fake primary key for SQLA
1574
+ }
1575
+ _table_args = ()
1576
+
1577
+
1578
+ class Heartbeats(BASE, ModelBase):
1579
+ """Represents the status and heartbeat of the running daemons and services"""
1580
+ __tablename__ = 'heartbeats'
1581
+ executable: Mapped[str] = mapped_column(String(64)) # SHA-2
1582
+ readable: Mapped[Optional[str]] = mapped_column(String(4000))
1583
+ hostname: Mapped[str] = mapped_column(String(128))
1584
+ pid: Mapped[int] = mapped_column(Integer, autoincrement=False)
1585
+ thread_id: Mapped[int] = mapped_column(BigInteger, autoincrement=False)
1586
+ thread_name: Mapped[Optional[str]] = mapped_column(String(64))
1587
+ payload: Mapped[Optional[str]] = mapped_column(String(3000))
1588
+ _table_args = (PrimaryKeyConstraint('executable', 'hostname', 'pid', 'thread_id', name='HEARTBEATS_PK'), )
1589
+
1590
+
1591
+ class NamingConvention(BASE, ModelBase):
1592
+ """Represents naming conventions for name within a scope"""
1593
+ __tablename__ = 'naming_conventions'
1594
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1595
+ regexp: Mapped[Optional[str]] = mapped_column(String(255))
1596
+ convention_type: Mapped[KeyType] = mapped_column(Enum(KeyType, name='CVT_TYPE_CHK',
1597
+ create_constraint=True,
1598
+ values_callable=lambda obj: [e.value for e in obj]))
1599
+ _table_args = (PrimaryKeyConstraint('scope', name='NAMING_CONVENTIONS_PK'),
1600
+ ForeignKeyConstraint(['scope'], ['scopes.scope'], name='NAMING_CONVENTIONS_SCOPE_FK'))
1601
+
1602
+
1603
+ class TemporaryDataIdentifier(BASE, ModelBase):
1604
+ """Represents a temporary DID (pre-merged files, etc.)"""
1605
+ __tablename__ = 'tmp_dids'
1606
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1607
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1608
+ rse_id: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1609
+ path: Mapped[Optional[str]] = mapped_column(String(1024))
1610
+ bytes: Mapped[Optional[int]] = mapped_column(BigInteger)
1611
+ md5: Mapped[Optional[str]] = mapped_column(String(32))
1612
+ adler32: Mapped[Optional[str]] = mapped_column(String(8))
1613
+ expired_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1614
+ guid: Mapped[Optional[uuid.UUID]] = mapped_column(GUID())
1615
+ events: Mapped[Optional[int]] = mapped_column(BigInteger)
1616
+ task_id: Mapped[Optional[int]] = mapped_column(Integer())
1617
+ panda_id: Mapped[Optional[int]] = mapped_column(Integer())
1618
+ parent_scope: Mapped[Optional[InternalScope]] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1619
+ parent_name: Mapped[Optional[str]] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1620
+ offset: Mapped[Optional[int]] = mapped_column(BigInteger)
1621
+ _table_args = (PrimaryKeyConstraint('scope', 'name', name='TMP_DIDS_PK'),
1622
+ Index('TMP_DIDS_EXPIRED_AT_IDX', 'expired_at'))
1623
+
1624
+
1625
+ class LifetimeExceptions(BASE, ModelBase):
1626
+ """Represents the exceptions to the lifetime model"""
1627
+ __tablename__ = 'lifetime_except'
1628
+ id: Mapped[uuid.UUID] = mapped_column(GUID(), default=utils.generate_uuid)
1629
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1630
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1631
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='LIFETIME_EXCEPT_TYPE_CHK',
1632
+ create_constraint=True,
1633
+ values_callable=lambda obj: [e.value for e in obj]))
1634
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1635
+ pattern: Mapped[Optional[str]] = mapped_column(String(255))
1636
+ comments: Mapped[Optional[str]] = mapped_column(String(4000))
1637
+ state: Mapped[LifetimeExceptionsState] = mapped_column(Enum(LifetimeExceptionsState, name='LIFETIME_EXCEPT_STATE_CHK',
1638
+ create_constraint=True,
1639
+ values_callable=lambda obj: [e.value for e in obj]))
1640
+ expires_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
1641
+ _table_args = (PrimaryKeyConstraint('id', 'scope', 'name', 'did_type', 'account', name='LIFETIME_EXCEPT_PK'),
1642
+ CheckConstraint('SCOPE IS NOT NULL', name='LIFETIME_EXCEPT_SCOPE_NN'),
1643
+ CheckConstraint('NAME IS NOT NULL', name='LIFETIME_EXCEPT_NAME_NN'),
1644
+ CheckConstraint('DID_TYPE IS NOT NULL', name='LIFETIME_EXCEPT_DID_TYPE_NN'),
1645
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='LIFETIME_EXCEPT_ACCOUNT_FK'))
1646
+
1647
+
1648
+ class VO(BASE, ModelBase):
1649
+ """Represents the VOS in a MultiVO setup"""
1650
+ __tablename__ = 'vos'
1651
+ vo: Mapped[str] = mapped_column(String(3))
1652
+ description: Mapped[Optional[str]] = mapped_column(String(255))
1653
+ email: Mapped[Optional[str]] = mapped_column(String(255))
1654
+ _table_args = (PrimaryKeyConstraint('vo', name='VOS_PK'), )
1655
+
1656
+
1657
+ class DidsFollowed(BASE, ModelBase):
1658
+ """Represents the datasets followed by an user"""
1659
+ __tablename__ = 'dids_followed'
1660
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1661
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1662
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1663
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='DIDS_FOLLOWED_TYPE_CHK',
1664
+ create_constraint=True,
1665
+ values_callable=lambda obj: [e.value for e in obj]))
1666
+ _table_args = (PrimaryKeyConstraint('scope', 'name', 'account', name='DIDS_FOLLOWED_PK'),
1667
+ CheckConstraint('SCOPE IS NOT NULL', name='DIDS_FOLLOWED_SCOPE_NN'),
1668
+ CheckConstraint('NAME IS NOT NULL', name='DIDS_FOLLOWED_NAME_NN'),
1669
+ CheckConstraint('ACCOUNT IS NOT NULL', name='DIDS_FOLLOWED_ACCOUNT_NN'),
1670
+ CheckConstraint('DID_TYPE IS NOT NULL', name='DIDS_FOLLOWED_DID_TYPE_NN'),
1671
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='DIDS_FOLLOWED_ACCOUNT_FK'),
1672
+ ForeignKeyConstraint(['scope', 'name'], ['dids.scope', 'dids.name'], name='DIDS_FOLLOWED_SCOPE_NAME_FK'))
1673
+
1674
+
1675
+ class FollowEvents(BASE, ModelBase):
1676
+ """Represents the events affecting the datasets which are followed"""
1677
+ __tablename__ = 'dids_followed_events'
1678
+ scope: Mapped[InternalScope] = mapped_column(InternalScopeString(get_schema_value('SCOPE_LENGTH')))
1679
+ name: Mapped[str] = mapped_column(String(get_schema_value('NAME_LENGTH')))
1680
+ account: Mapped[InternalAccount] = mapped_column(InternalAccountString(get_schema_value('ACCOUNT_LENGTH')))
1681
+ did_type: Mapped[DIDType] = mapped_column(Enum(DIDType, name='DIDS_FOLLOWED_EVENTS_TYPE_CHK',
1682
+ create_constraint=True,
1683
+ values_callable=lambda obj: [e.value for e in obj]))
1684
+ event_type: Mapped[Optional[str]] = mapped_column(String(1024))
1685
+ payload: Mapped[Optional[str]] = mapped_column(Text)
1686
+ _table_args = (PrimaryKeyConstraint('scope', 'name', 'account', name='DIDS_FOLLOWED_EVENTS_PK'),
1687
+ CheckConstraint('SCOPE IS NOT NULL', name='DIDS_FOLLOWED_EVENTS_SCOPE_NN'),
1688
+ CheckConstraint('NAME IS NOT NULL', name='DIDS_FOLLOWED_EVENTS_NAME_NN'),
1689
+ CheckConstraint('ACCOUNT IS NOT NULL', name='DIDS_FOLLOWED_EVENTS_ACC_NN'),
1690
+ CheckConstraint('DID_TYPE IS NOT NULL', name='DIDS_FOLLOWED_EVENTS_TYPE_NN'),
1691
+ ForeignKeyConstraint(['account'], ['accounts.account'], name='DIDS_FOLLOWED_EVENTS_ACC_FK'),
1692
+ Index('DIDS_FOLLOWED_EVENTS_ACC_IDX', 'account'))
1693
+
1694
+
1695
+ def register_models(engine):
1696
+ """
1697
+ Creates database tables for all models with the given engine
1698
+ """
1699
+
1700
+ models = (Account,
1701
+ AccountAttrAssociation,
1702
+ AccountLimit,
1703
+ AccountGlobalLimit,
1704
+ AccountUsage,
1705
+ AccountUsageHistory,
1706
+ AlembicVersion,
1707
+ BadReplicas,
1708
+ CollectionReplica,
1709
+ Config,
1710
+ ConfigHistory,
1711
+ ConstituentAssociation,
1712
+ ConstituentAssociationHistory,
1713
+ DataIdentifierAssociation,
1714
+ DataIdentifierAssociationHistory,
1715
+ DIDKey,
1716
+ DIDKeyValueAssociation,
1717
+ DataIdentifier,
1718
+ DidMeta,
1719
+ VirtualPlacements,
1720
+ DeletedDataIdentifier,
1721
+ DidsFollowed,
1722
+ FollowEvents,
1723
+ Heartbeats,
1724
+ Identity,
1725
+ IdentityAccountAssociation,
1726
+ LifetimeExceptions,
1727
+ Message,
1728
+ MessageHistory,
1729
+ NamingConvention,
1730
+ OAuthRequest,
1731
+ QuarantinedReplica,
1732
+ QuarantinedReplicaHistory,
1733
+ RSE,
1734
+ RSEAttrAssociation,
1735
+ RSEFileAssociation,
1736
+ RSEFileAssociationHistory,
1737
+ RSELimit,
1738
+ RSEProtocols,
1739
+ RSEQoSAssociation,
1740
+ RSEUsage,
1741
+ RSEUsageHistory,
1742
+ ReplicaLock,
1743
+ ReplicationRule,
1744
+ ReplicationRule,
1745
+ ReplicationRuleHistory,
1746
+ ReplicationRuleHistoryRecent,
1747
+ Request,
1748
+ RequestHistory,
1749
+ TransferHop,
1750
+ Scope,
1751
+ Source,
1752
+ SourceHistory,
1753
+ Subscription,
1754
+ SubscriptionHistory,
1755
+ TemporaryDataIdentifier,
1756
+ Token,
1757
+ UpdatedAccountCounter,
1758
+ UpdatedDID,
1759
+ UpdatedRSECounter,
1760
+ UpdatedCollectionReplica,
1761
+ VO)
1762
+
1763
+ for model in models:
1764
+ model.metadata.create_all(engine) # pylint: disable=maybe-no-member
1765
+
1766
+
1767
+ def unregister_models(engine):
1768
+ """
1769
+ Drops database tables for all models with the given engine
1770
+ """
1771
+ models = (Account,
1772
+ AccountAttrAssociation,
1773
+ AccountLimit,
1774
+ AccountGlobalLimit,
1775
+ AccountUsage,
1776
+ AccountUsageHistory,
1777
+ AlembicVersion,
1778
+ BadReplicas,
1779
+ CollectionReplica,
1780
+ Config,
1781
+ ConfigHistory,
1782
+ ConstituentAssociation,
1783
+ ConstituentAssociationHistory,
1784
+ DataIdentifierAssociation,
1785
+ DataIdentifierAssociationHistory,
1786
+ DIDKey,
1787
+ DIDKeyValueAssociation,
1788
+ DidMeta,
1789
+ DataIdentifier,
1790
+ DeletedDataIdentifier,
1791
+ DidsFollowed,
1792
+ FollowEvents,
1793
+ Heartbeats,
1794
+ Identity,
1795
+ IdentityAccountAssociation,
1796
+ LifetimeExceptions,
1797
+ Message,
1798
+ MessageHistory,
1799
+ NamingConvention,
1800
+ OAuthRequest,
1801
+ QuarantinedReplica,
1802
+ QuarantinedReplicaHistory,
1803
+ RSE,
1804
+ RSEAttrAssociation,
1805
+ RSEFileAssociation,
1806
+ RSEFileAssociationHistory,
1807
+ RSELimit,
1808
+ RSEProtocols,
1809
+ RSEQoSAssociation,
1810
+ RSEUsage,
1811
+ RSEUsageHistory,
1812
+ ReplicaLock,
1813
+ ReplicationRule,
1814
+ ReplicationRule,
1815
+ ReplicationRuleHistory,
1816
+ ReplicationRuleHistoryRecent,
1817
+ Request,
1818
+ RequestHistory,
1819
+ TransferHop,
1820
+ Scope,
1821
+ Source,
1822
+ SourceHistory,
1823
+ Subscription,
1824
+ SubscriptionHistory,
1825
+ Token,
1826
+ TemporaryDataIdentifier,
1827
+ UpdatedAccountCounter,
1828
+ UpdatedDID,
1829
+ UpdatedRSECounter,
1830
+ UpdatedCollectionReplica,
1831
+ VO)
1832
+
1833
+ for model in models:
1834
+ model.metadata.drop_all(engine) # pylint: disable=maybe-no-member