rucio 37.0.0rc1__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.
- rucio/__init__.py +17 -0
- rucio/alembicrevision.py +15 -0
- rucio/cli/__init__.py +14 -0
- rucio/cli/account.py +216 -0
- rucio/cli/bin_legacy/__init__.py +13 -0
- rucio/cli/bin_legacy/rucio.py +2825 -0
- rucio/cli/bin_legacy/rucio_admin.py +2500 -0
- rucio/cli/command.py +272 -0
- rucio/cli/config.py +72 -0
- rucio/cli/did.py +191 -0
- rucio/cli/download.py +128 -0
- rucio/cli/lifetime_exception.py +33 -0
- rucio/cli/replica.py +162 -0
- rucio/cli/rse.py +293 -0
- rucio/cli/rule.py +158 -0
- rucio/cli/scope.py +40 -0
- rucio/cli/subscription.py +73 -0
- rucio/cli/upload.py +60 -0
- rucio/cli/utils.py +226 -0
- rucio/client/__init__.py +15 -0
- rucio/client/accountclient.py +432 -0
- rucio/client/accountlimitclient.py +183 -0
- rucio/client/baseclient.py +983 -0
- rucio/client/client.py +120 -0
- rucio/client/configclient.py +126 -0
- rucio/client/credentialclient.py +59 -0
- rucio/client/didclient.py +868 -0
- rucio/client/diracclient.py +56 -0
- rucio/client/downloadclient.py +1783 -0
- rucio/client/exportclient.py +44 -0
- rucio/client/fileclient.py +50 -0
- rucio/client/importclient.py +42 -0
- rucio/client/lifetimeclient.py +90 -0
- rucio/client/lockclient.py +109 -0
- rucio/client/metaconventionsclient.py +140 -0
- rucio/client/pingclient.py +44 -0
- rucio/client/replicaclient.py +452 -0
- rucio/client/requestclient.py +125 -0
- rucio/client/richclient.py +317 -0
- rucio/client/rseclient.py +746 -0
- rucio/client/ruleclient.py +294 -0
- rucio/client/scopeclient.py +90 -0
- rucio/client/subscriptionclient.py +173 -0
- rucio/client/touchclient.py +82 -0
- rucio/client/uploadclient.py +969 -0
- rucio/common/__init__.py +13 -0
- rucio/common/bittorrent.py +234 -0
- rucio/common/cache.py +111 -0
- rucio/common/checksum.py +168 -0
- rucio/common/client.py +122 -0
- rucio/common/config.py +788 -0
- rucio/common/constants.py +217 -0
- rucio/common/constraints.py +17 -0
- rucio/common/didtype.py +237 -0
- rucio/common/dumper/__init__.py +342 -0
- rucio/common/dumper/consistency.py +497 -0
- rucio/common/dumper/data_models.py +362 -0
- rucio/common/dumper/path_parsing.py +75 -0
- rucio/common/exception.py +1208 -0
- rucio/common/extra.py +31 -0
- rucio/common/logging.py +420 -0
- rucio/common/pcache.py +1409 -0
- rucio/common/plugins.py +185 -0
- rucio/common/policy.py +93 -0
- rucio/common/schema/__init__.py +200 -0
- rucio/common/schema/generic.py +416 -0
- rucio/common/schema/generic_multi_vo.py +395 -0
- rucio/common/stomp_utils.py +423 -0
- rucio/common/stopwatch.py +55 -0
- rucio/common/test_rucio_server.py +154 -0
- rucio/common/types.py +483 -0
- rucio/common/utils.py +1688 -0
- rucio/core/__init__.py +13 -0
- rucio/core/account.py +496 -0
- rucio/core/account_counter.py +236 -0
- rucio/core/account_limit.py +425 -0
- rucio/core/authentication.py +620 -0
- rucio/core/config.py +437 -0
- rucio/core/credential.py +224 -0
- rucio/core/did.py +3004 -0
- rucio/core/did_meta_plugins/__init__.py +252 -0
- rucio/core/did_meta_plugins/did_column_meta.py +331 -0
- rucio/core/did_meta_plugins/did_meta_plugin_interface.py +165 -0
- rucio/core/did_meta_plugins/elasticsearch_meta.py +407 -0
- rucio/core/did_meta_plugins/filter_engine.py +672 -0
- rucio/core/did_meta_plugins/json_meta.py +240 -0
- rucio/core/did_meta_plugins/mongo_meta.py +229 -0
- rucio/core/did_meta_plugins/postgres_meta.py +352 -0
- rucio/core/dirac.py +237 -0
- rucio/core/distance.py +187 -0
- rucio/core/exporter.py +59 -0
- rucio/core/heartbeat.py +363 -0
- rucio/core/identity.py +301 -0
- rucio/core/importer.py +260 -0
- rucio/core/lifetime_exception.py +377 -0
- rucio/core/lock.py +577 -0
- rucio/core/message.py +288 -0
- rucio/core/meta_conventions.py +203 -0
- rucio/core/monitor.py +448 -0
- rucio/core/naming_convention.py +195 -0
- rucio/core/nongrid_trace.py +136 -0
- rucio/core/oidc.py +1463 -0
- rucio/core/permission/__init__.py +161 -0
- rucio/core/permission/generic.py +1124 -0
- rucio/core/permission/generic_multi_vo.py +1144 -0
- rucio/core/quarantined_replica.py +224 -0
- rucio/core/replica.py +4483 -0
- rucio/core/replica_sorter.py +362 -0
- rucio/core/request.py +3091 -0
- rucio/core/rse.py +2079 -0
- rucio/core/rse_counter.py +185 -0
- rucio/core/rse_expression_parser.py +459 -0
- rucio/core/rse_selector.py +304 -0
- rucio/core/rule.py +4484 -0
- rucio/core/rule_grouping.py +1620 -0
- rucio/core/scope.py +181 -0
- rucio/core/subscription.py +362 -0
- rucio/core/topology.py +490 -0
- rucio/core/trace.py +375 -0
- rucio/core/transfer.py +1531 -0
- rucio/core/vo.py +169 -0
- rucio/core/volatile_replica.py +151 -0
- rucio/daemons/__init__.py +13 -0
- rucio/daemons/abacus/__init__.py +13 -0
- rucio/daemons/abacus/account.py +116 -0
- rucio/daemons/abacus/collection_replica.py +124 -0
- rucio/daemons/abacus/rse.py +117 -0
- rucio/daemons/atropos/__init__.py +13 -0
- rucio/daemons/atropos/atropos.py +242 -0
- rucio/daemons/auditor/__init__.py +289 -0
- rucio/daemons/auditor/hdfs.py +97 -0
- rucio/daemons/auditor/srmdumps.py +355 -0
- rucio/daemons/automatix/__init__.py +13 -0
- rucio/daemons/automatix/automatix.py +304 -0
- rucio/daemons/badreplicas/__init__.py +13 -0
- rucio/daemons/badreplicas/minos.py +322 -0
- rucio/daemons/badreplicas/minos_temporary_expiration.py +171 -0
- rucio/daemons/badreplicas/necromancer.py +196 -0
- rucio/daemons/bb8/__init__.py +13 -0
- rucio/daemons/bb8/bb8.py +353 -0
- rucio/daemons/bb8/common.py +759 -0
- rucio/daemons/bb8/nuclei_background_rebalance.py +153 -0
- rucio/daemons/bb8/t2_background_rebalance.py +153 -0
- rucio/daemons/cache/__init__.py +13 -0
- rucio/daemons/cache/consumer.py +133 -0
- rucio/daemons/common.py +405 -0
- rucio/daemons/conveyor/__init__.py +13 -0
- rucio/daemons/conveyor/common.py +562 -0
- rucio/daemons/conveyor/finisher.py +529 -0
- rucio/daemons/conveyor/poller.py +394 -0
- rucio/daemons/conveyor/preparer.py +205 -0
- rucio/daemons/conveyor/receiver.py +179 -0
- rucio/daemons/conveyor/stager.py +133 -0
- rucio/daemons/conveyor/submitter.py +403 -0
- rucio/daemons/conveyor/throttler.py +532 -0
- rucio/daemons/follower/__init__.py +13 -0
- rucio/daemons/follower/follower.py +101 -0
- rucio/daemons/hermes/__init__.py +13 -0
- rucio/daemons/hermes/hermes.py +534 -0
- rucio/daemons/judge/__init__.py +13 -0
- rucio/daemons/judge/cleaner.py +159 -0
- rucio/daemons/judge/evaluator.py +185 -0
- rucio/daemons/judge/injector.py +162 -0
- rucio/daemons/judge/repairer.py +154 -0
- rucio/daemons/oauthmanager/__init__.py +13 -0
- rucio/daemons/oauthmanager/oauthmanager.py +198 -0
- rucio/daemons/reaper/__init__.py +13 -0
- rucio/daemons/reaper/dark_reaper.py +282 -0
- rucio/daemons/reaper/reaper.py +739 -0
- rucio/daemons/replicarecoverer/__init__.py +13 -0
- rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +626 -0
- rucio/daemons/rsedecommissioner/__init__.py +13 -0
- rucio/daemons/rsedecommissioner/config.py +81 -0
- rucio/daemons/rsedecommissioner/profiles/__init__.py +24 -0
- rucio/daemons/rsedecommissioner/profiles/atlas.py +60 -0
- rucio/daemons/rsedecommissioner/profiles/generic.py +452 -0
- rucio/daemons/rsedecommissioner/profiles/types.py +93 -0
- rucio/daemons/rsedecommissioner/rse_decommissioner.py +280 -0
- rucio/daemons/storage/__init__.py +13 -0
- rucio/daemons/storage/consistency/__init__.py +13 -0
- rucio/daemons/storage/consistency/actions.py +848 -0
- rucio/daemons/tracer/__init__.py +13 -0
- rucio/daemons/tracer/kronos.py +511 -0
- rucio/daemons/transmogrifier/__init__.py +13 -0
- rucio/daemons/transmogrifier/transmogrifier.py +762 -0
- rucio/daemons/undertaker/__init__.py +13 -0
- rucio/daemons/undertaker/undertaker.py +137 -0
- rucio/db/__init__.py +13 -0
- rucio/db/sqla/__init__.py +52 -0
- rucio/db/sqla/constants.py +206 -0
- rucio/db/sqla/migrate_repo/__init__.py +13 -0
- rucio/db/sqla/migrate_repo/env.py +110 -0
- rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +70 -0
- rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +47 -0
- rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +59 -0
- rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +43 -0
- rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +91 -0
- rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +76 -0
- rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +43 -0
- rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +50 -0
- rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +68 -0
- rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +40 -0
- rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +45 -0
- rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +60 -0
- rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +40 -0
- rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +140 -0
- rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +73 -0
- rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +74 -0
- rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +43 -0
- rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +50 -0
- rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +134 -0
- rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +64 -0
- rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +39 -0
- rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +64 -0
- rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +51 -0
- rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +41 -0
- rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +43 -0
- rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +44 -0
- rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +53 -0
- rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +38 -0
- rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +47 -0
- rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +57 -0
- rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +69 -0
- rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +43 -0
- rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +42 -0
- rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +47 -0
- rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +46 -0
- rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +40 -0
- rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +67 -0
- rucio/db/sqla/migrate_repo/versions/30d5206e9cad_increase_oauthrequest_redirect_msg_.py +37 -0
- rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +44 -0
- rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +77 -0
- rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +60 -0
- rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +72 -0
- rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +42 -0
- rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +65 -0
- rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +133 -0
- rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +76 -0
- rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +60 -0
- rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +44 -0
- rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +43 -0
- rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +64 -0
- rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +40 -0
- rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +43 -0
- rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +44 -0
- rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +78 -0
- rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +41 -0
- rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +59 -0
- rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +44 -0
- rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +49 -0
- rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +40 -0
- rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +63 -0
- rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +43 -0
- rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +55 -0
- rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +45 -0
- rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +43 -0
- rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +43 -0
- rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +45 -0
- rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +47 -0
- rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +58 -0
- rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +45 -0
- rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +106 -0
- rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +55 -0
- rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +50 -0
- rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +47 -0
- rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +43 -0
- rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +41 -0
- rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +91 -0
- rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +72 -0
- rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +49 -0
- rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +43 -0
- rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +53 -0
- rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +45 -0
- rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +68 -0
- rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +45 -0
- rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +94 -0
- rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +54 -0
- rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +72 -0
- rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +76 -0
- rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +47 -0
- rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +121 -0
- rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +59 -0
- rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +52 -0
- rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +54 -0
- rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +64 -0
- rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +49 -0
- rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +57 -0
- rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +43 -0
- rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +41 -0
- rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +91 -0
- rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +40 -0
- rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +143 -0
- rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +76 -0
- rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +50 -0
- rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +72 -0
- rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +43 -0
- rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +65 -0
- rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +47 -0
- rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +146 -0
- rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +104 -0
- rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +44 -0
- rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +43 -0
- rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +103 -0
- rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +49 -0
- rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +104 -0
- rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +29 -0
- rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +74 -0
- rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +47 -0
- rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +43 -0
- rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +37 -0
- rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +43 -0
- rucio/db/sqla/models.py +1743 -0
- rucio/db/sqla/sautils.py +55 -0
- rucio/db/sqla/session.py +529 -0
- rucio/db/sqla/types.py +206 -0
- rucio/db/sqla/util.py +543 -0
- rucio/gateway/__init__.py +13 -0
- rucio/gateway/account.py +345 -0
- rucio/gateway/account_limit.py +363 -0
- rucio/gateway/authentication.py +381 -0
- rucio/gateway/config.py +227 -0
- rucio/gateway/credential.py +70 -0
- rucio/gateway/did.py +987 -0
- rucio/gateway/dirac.py +83 -0
- rucio/gateway/exporter.py +60 -0
- rucio/gateway/heartbeat.py +76 -0
- rucio/gateway/identity.py +189 -0
- rucio/gateway/importer.py +46 -0
- rucio/gateway/lifetime_exception.py +121 -0
- rucio/gateway/lock.py +153 -0
- rucio/gateway/meta_conventions.py +98 -0
- rucio/gateway/permission.py +74 -0
- rucio/gateway/quarantined_replica.py +79 -0
- rucio/gateway/replica.py +538 -0
- rucio/gateway/request.py +330 -0
- rucio/gateway/rse.py +632 -0
- rucio/gateway/rule.py +437 -0
- rucio/gateway/scope.py +100 -0
- rucio/gateway/subscription.py +280 -0
- rucio/gateway/vo.py +126 -0
- rucio/rse/__init__.py +96 -0
- rucio/rse/protocols/__init__.py +13 -0
- rucio/rse/protocols/bittorrent.py +194 -0
- rucio/rse/protocols/cache.py +111 -0
- rucio/rse/protocols/dummy.py +100 -0
- rucio/rse/protocols/gfal.py +708 -0
- rucio/rse/protocols/globus.py +243 -0
- rucio/rse/protocols/http_cache.py +82 -0
- rucio/rse/protocols/mock.py +123 -0
- rucio/rse/protocols/ngarc.py +209 -0
- rucio/rse/protocols/posix.py +250 -0
- rucio/rse/protocols/protocol.py +361 -0
- rucio/rse/protocols/rclone.py +365 -0
- rucio/rse/protocols/rfio.py +145 -0
- rucio/rse/protocols/srm.py +338 -0
- rucio/rse/protocols/ssh.py +414 -0
- rucio/rse/protocols/storm.py +195 -0
- rucio/rse/protocols/webdav.py +594 -0
- rucio/rse/protocols/xrootd.py +302 -0
- rucio/rse/rsemanager.py +881 -0
- rucio/rse/translation.py +260 -0
- rucio/tests/__init__.py +13 -0
- rucio/tests/common.py +280 -0
- rucio/tests/common_server.py +149 -0
- rucio/transfertool/__init__.py +13 -0
- rucio/transfertool/bittorrent.py +200 -0
- rucio/transfertool/bittorrent_driver.py +50 -0
- rucio/transfertool/bittorrent_driver_qbittorrent.py +134 -0
- rucio/transfertool/fts3.py +1600 -0
- rucio/transfertool/fts3_plugins.py +152 -0
- rucio/transfertool/globus.py +201 -0
- rucio/transfertool/globus_library.py +181 -0
- rucio/transfertool/mock.py +89 -0
- rucio/transfertool/transfertool.py +221 -0
- rucio/vcsversion.py +11 -0
- rucio/version.py +45 -0
- rucio/web/__init__.py +13 -0
- rucio/web/rest/__init__.py +13 -0
- rucio/web/rest/flaskapi/__init__.py +13 -0
- rucio/web/rest/flaskapi/authenticated_bp.py +27 -0
- rucio/web/rest/flaskapi/v1/__init__.py +13 -0
- rucio/web/rest/flaskapi/v1/accountlimits.py +236 -0
- rucio/web/rest/flaskapi/v1/accounts.py +1103 -0
- rucio/web/rest/flaskapi/v1/archives.py +102 -0
- rucio/web/rest/flaskapi/v1/auth.py +1644 -0
- rucio/web/rest/flaskapi/v1/common.py +426 -0
- rucio/web/rest/flaskapi/v1/config.py +304 -0
- rucio/web/rest/flaskapi/v1/credentials.py +213 -0
- rucio/web/rest/flaskapi/v1/dids.py +2340 -0
- rucio/web/rest/flaskapi/v1/dirac.py +116 -0
- rucio/web/rest/flaskapi/v1/export.py +75 -0
- rucio/web/rest/flaskapi/v1/heartbeats.py +127 -0
- rucio/web/rest/flaskapi/v1/identities.py +285 -0
- rucio/web/rest/flaskapi/v1/import.py +132 -0
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +312 -0
- rucio/web/rest/flaskapi/v1/locks.py +358 -0
- rucio/web/rest/flaskapi/v1/main.py +91 -0
- rucio/web/rest/flaskapi/v1/meta_conventions.py +241 -0
- rucio/web/rest/flaskapi/v1/metrics.py +36 -0
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +97 -0
- rucio/web/rest/flaskapi/v1/ping.py +88 -0
- rucio/web/rest/flaskapi/v1/redirect.py +366 -0
- rucio/web/rest/flaskapi/v1/replicas.py +1894 -0
- rucio/web/rest/flaskapi/v1/requests.py +998 -0
- rucio/web/rest/flaskapi/v1/rses.py +2250 -0
- rucio/web/rest/flaskapi/v1/rules.py +854 -0
- rucio/web/rest/flaskapi/v1/scopes.py +159 -0
- rucio/web/rest/flaskapi/v1/subscriptions.py +650 -0
- rucio/web/rest/flaskapi/v1/templates/auth_crash.html +80 -0
- rucio/web/rest/flaskapi/v1/templates/auth_granted.html +82 -0
- rucio/web/rest/flaskapi/v1/traces.py +137 -0
- rucio/web/rest/flaskapi/v1/types.py +20 -0
- rucio/web/rest/flaskapi/v1/vos.py +278 -0
- rucio/web/rest/main.py +18 -0
- rucio/web/rest/metrics.py +27 -0
- rucio/web/rest/ping.py +27 -0
- rucio-37.0.0rc1.data/data/rucio/etc/alembic.ini.template +71 -0
- rucio-37.0.0rc1.data/data/rucio/etc/alembic_offline.ini.template +74 -0
- rucio-37.0.0rc1.data/data/rucio/etc/globus-config.yml.template +5 -0
- rucio-37.0.0rc1.data/data/rucio/etc/ldap.cfg.template +30 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_approval_request.tmpl +38 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +4 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_approved_user.tmpl +17 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +6 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_denied_user.tmpl +17 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +19 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rse-accounts.cfg.template +25 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rucio.cfg.atlas.client.template +43 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rucio.cfg.template +241 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rucio_multi_vo.cfg.template +217 -0
- rucio-37.0.0rc1.data/data/rucio/requirements.server.txt +297 -0
- rucio-37.0.0rc1.data/data/rucio/tools/bootstrap.py +34 -0
- rucio-37.0.0rc1.data/data/rucio/tools/merge_rucio_configs.py +144 -0
- rucio-37.0.0rc1.data/data/rucio/tools/reset_database.py +40 -0
- rucio-37.0.0rc1.data/scripts/rucio +133 -0
- rucio-37.0.0rc1.data/scripts/rucio-abacus-account +74 -0
- rucio-37.0.0rc1.data/scripts/rucio-abacus-collection-replica +46 -0
- rucio-37.0.0rc1.data/scripts/rucio-abacus-rse +78 -0
- rucio-37.0.0rc1.data/scripts/rucio-admin +97 -0
- rucio-37.0.0rc1.data/scripts/rucio-atropos +60 -0
- rucio-37.0.0rc1.data/scripts/rucio-auditor +206 -0
- rucio-37.0.0rc1.data/scripts/rucio-automatix +50 -0
- rucio-37.0.0rc1.data/scripts/rucio-bb8 +57 -0
- rucio-37.0.0rc1.data/scripts/rucio-cache-client +141 -0
- rucio-37.0.0rc1.data/scripts/rucio-cache-consumer +42 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-finisher +58 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-poller +66 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-preparer +37 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-receiver +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-stager +76 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-submitter +139 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-throttler +104 -0
- rucio-37.0.0rc1.data/scripts/rucio-dark-reaper +53 -0
- rucio-37.0.0rc1.data/scripts/rucio-dumper +160 -0
- rucio-37.0.0rc1.data/scripts/rucio-follower +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-hermes +54 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-cleaner +89 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-evaluator +137 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-injector +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-repairer +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-kronos +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-minos +53 -0
- rucio-37.0.0rc1.data/scripts/rucio-minos-temporary-expiration +50 -0
- rucio-37.0.0rc1.data/scripts/rucio-necromancer +120 -0
- rucio-37.0.0rc1.data/scripts/rucio-oauth-manager +63 -0
- rucio-37.0.0rc1.data/scripts/rucio-reaper +83 -0
- rucio-37.0.0rc1.data/scripts/rucio-replica-recoverer +248 -0
- rucio-37.0.0rc1.data/scripts/rucio-rse-decommissioner +66 -0
- rucio-37.0.0rc1.data/scripts/rucio-storage-consistency-actions +74 -0
- rucio-37.0.0rc1.data/scripts/rucio-transmogrifier +77 -0
- rucio-37.0.0rc1.data/scripts/rucio-undertaker +76 -0
- rucio-37.0.0rc1.dist-info/METADATA +92 -0
- rucio-37.0.0rc1.dist-info/RECORD +487 -0
- rucio-37.0.0rc1.dist-info/WHEEL +5 -0
- rucio-37.0.0rc1.dist-info/licenses/AUTHORS.rst +100 -0
- rucio-37.0.0rc1.dist-info/licenses/LICENSE +201 -0
- rucio-37.0.0rc1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
'''
|
|
16
|
+
Undertaker is a daemon to manage expired did.
|
|
17
|
+
'''
|
|
18
|
+
|
|
19
|
+
import functools
|
|
20
|
+
import logging
|
|
21
|
+
import threading
|
|
22
|
+
import traceback
|
|
23
|
+
from copy import deepcopy
|
|
24
|
+
from datetime import datetime, timedelta
|
|
25
|
+
from random import randint
|
|
26
|
+
from re import match
|
|
27
|
+
from typing import TYPE_CHECKING
|
|
28
|
+
|
|
29
|
+
from sqlalchemy.exc import DatabaseError
|
|
30
|
+
|
|
31
|
+
import rucio.db.sqla.util
|
|
32
|
+
from rucio.common.exception import DatabaseException, RuleNotFound, UnsupportedOperation
|
|
33
|
+
from rucio.common.logging import setup_logging
|
|
34
|
+
from rucio.common.types import InternalAccount
|
|
35
|
+
from rucio.common.utils import chunks
|
|
36
|
+
from rucio.core.did import delete_dids, list_expired_dids
|
|
37
|
+
from rucio.core.monitor import MetricManager
|
|
38
|
+
from rucio.daemons.common import HeartbeatHandler, run_daemon
|
|
39
|
+
from rucio.db.sqla.constants import MYSQL_LOCK_NOWAIT_REGEX, ORACLE_RESOURCE_BUSY_REGEX, PSQL_LOCK_NOT_AVAILABLE_REGEX
|
|
40
|
+
|
|
41
|
+
if TYPE_CHECKING:
|
|
42
|
+
from types import FrameType
|
|
43
|
+
from typing import Optional
|
|
44
|
+
|
|
45
|
+
logging.getLogger("requests").setLevel(logging.CRITICAL)
|
|
46
|
+
|
|
47
|
+
METRICS = MetricManager(module=__name__)
|
|
48
|
+
graceful_stop = threading.Event()
|
|
49
|
+
DAEMON_NAME = 'undertaker'
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def undertaker(once: bool = False, sleep_time: int = 60, chunk_size: int = 10) -> None:
|
|
53
|
+
"""
|
|
54
|
+
Main loop to select and delete dids.
|
|
55
|
+
"""
|
|
56
|
+
paused_dids = {} # {(scope, name): datetime}
|
|
57
|
+
run_daemon(
|
|
58
|
+
once=once,
|
|
59
|
+
graceful_stop=graceful_stop,
|
|
60
|
+
executable=DAEMON_NAME,
|
|
61
|
+
partition_wait_time=1,
|
|
62
|
+
sleep_time=sleep_time,
|
|
63
|
+
run_once_fnc=functools.partial(
|
|
64
|
+
run_once,
|
|
65
|
+
paused_dids=paused_dids,
|
|
66
|
+
chunk_size=chunk_size,
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def run_once(paused_dids: dict[tuple, datetime], chunk_size: int, heartbeat_handler: HeartbeatHandler, **_kwargs) -> None:
|
|
72
|
+
worker_number, total_workers, logger = heartbeat_handler.live()
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
# Refresh paused dids
|
|
76
|
+
iter_paused_dids = deepcopy(paused_dids)
|
|
77
|
+
for key in iter_paused_dids:
|
|
78
|
+
if datetime.utcnow() > paused_dids[key]:
|
|
79
|
+
del paused_dids[key]
|
|
80
|
+
|
|
81
|
+
dids = list_expired_dids(worker_number=worker_number, total_workers=total_workers, limit=10000)
|
|
82
|
+
|
|
83
|
+
dids = [did for did in dids if (did['scope'], did['name']) not in paused_dids]
|
|
84
|
+
|
|
85
|
+
if not dids:
|
|
86
|
+
logger(logging.INFO, 'did not get any work')
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
for chunk in chunks(dids, chunk_size):
|
|
90
|
+
_, _, logger = heartbeat_handler.live()
|
|
91
|
+
try:
|
|
92
|
+
logger(logging.INFO, 'Receive %s dids to delete', len(chunk))
|
|
93
|
+
delete_dids(dids=chunk, account=InternalAccount('root', vo='def'), expire_rules=True)
|
|
94
|
+
logger(logging.INFO, 'Delete %s dids', len(chunk))
|
|
95
|
+
METRICS.counter(name='undertaker.delete_dids').inc(len(chunk))
|
|
96
|
+
except RuleNotFound as error:
|
|
97
|
+
logger(logging.ERROR, error)
|
|
98
|
+
except (DatabaseException, DatabaseError, UnsupportedOperation) as e:
|
|
99
|
+
if match(ORACLE_RESOURCE_BUSY_REGEX, str(e.args[0])) or match(PSQL_LOCK_NOT_AVAILABLE_REGEX, str(e.args[0])) or match(MYSQL_LOCK_NOWAIT_REGEX, str(e.args[0])):
|
|
100
|
+
for did in chunk:
|
|
101
|
+
paused_dids[(did['scope'], did['name'])] = datetime.utcnow() + timedelta(seconds=randint(600, 2400)) # noqa: S311
|
|
102
|
+
METRICS.counter('delete_dids.exceptions.{exception}').labels(exception='LocksDetected').inc()
|
|
103
|
+
logger(logging.WARNING, 'Locks detected for chunk')
|
|
104
|
+
else:
|
|
105
|
+
logger(logging.ERROR, 'Got database error %s.', str(e))
|
|
106
|
+
except:
|
|
107
|
+
logging.critical(traceback.format_exc())
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def stop(signum: "Optional[int]" = None, frame: "Optional[FrameType]" = None) -> None:
|
|
111
|
+
"""
|
|
112
|
+
Graceful exit.
|
|
113
|
+
"""
|
|
114
|
+
graceful_stop.set()
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def run(once: bool = False, total_workers: int = 1, chunk_size: int = 10, sleep_time: int = 60) -> None:
|
|
118
|
+
"""
|
|
119
|
+
Starts up the undertaker threads.
|
|
120
|
+
"""
|
|
121
|
+
setup_logging(process_name=DAEMON_NAME)
|
|
122
|
+
|
|
123
|
+
if rucio.db.sqla.util.is_old_db():
|
|
124
|
+
raise DatabaseException("Database was not updated, daemon won't start")
|
|
125
|
+
|
|
126
|
+
if once:
|
|
127
|
+
undertaker(once)
|
|
128
|
+
else:
|
|
129
|
+
logging.info('main: starting threads')
|
|
130
|
+
threads = [threading.Thread(target=undertaker, kwargs={'once': once, 'chunk_size': chunk_size,
|
|
131
|
+
'sleep_time': sleep_time}) for i in range(0, total_workers)]
|
|
132
|
+
[t.start() for t in threads]
|
|
133
|
+
logging.info('main: waiting for interrupts')
|
|
134
|
+
|
|
135
|
+
# Interruptible joins require a timeout.
|
|
136
|
+
while threads[0].is_alive():
|
|
137
|
+
[t.join(timeout=3.14) for t in threads]
|
rucio/db/__init__.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from typing import TYPE_CHECKING, Optional, TypeVar
|
|
16
|
+
|
|
17
|
+
from sqlalchemy.sql.expression import bindparam, text
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from sqlalchemy.orm import Session
|
|
21
|
+
from sqlalchemy.orm.query import RowReturningQuery
|
|
22
|
+
from sqlalchemy.sql.selectable import Select
|
|
23
|
+
|
|
24
|
+
Q = TypeVar('Q', RowReturningQuery, Select)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def filter_thread_work(
|
|
28
|
+
session: "Session",
|
|
29
|
+
query: "Q",
|
|
30
|
+
total_threads: Optional[int],
|
|
31
|
+
thread_id: Optional[int],
|
|
32
|
+
hash_variable: Optional[str] = None
|
|
33
|
+
) -> "Q":
|
|
34
|
+
""" Filters a query to partition thread workloads based on the thread id and total number of threads """
|
|
35
|
+
if thread_id is not None and total_threads is not None and (total_threads - 1) > 0:
|
|
36
|
+
if session.bind.dialect.name == 'oracle':
|
|
37
|
+
bindparams = [bindparam('thread_id', thread_id), bindparam('total_threads', total_threads - 1)]
|
|
38
|
+
if not hash_variable:
|
|
39
|
+
query = query.filter(text('ORA_HASH(id, :total_threads) = :thread_id').bindparams(*bindparams))
|
|
40
|
+
else:
|
|
41
|
+
query = query.filter(text('ORA_HASH(%s, :total_threads) = :thread_id' % (hash_variable)).bindparams(*bindparams))
|
|
42
|
+
elif session.bind.dialect.name == 'mysql':
|
|
43
|
+
if not hash_variable:
|
|
44
|
+
query = query.filter(text('mod(md5(id), %s) = %s' % (total_threads, thread_id)))
|
|
45
|
+
else:
|
|
46
|
+
query = query.filter(text('mod(md5(%s), %s) = %s' % (hash_variable, total_threads, thread_id)))
|
|
47
|
+
elif session.bind.dialect.name == 'postgresql':
|
|
48
|
+
if not hash_variable:
|
|
49
|
+
query = query.filter(text('mod(abs((\'x\'||md5(id::text))::bit(32)::bigint), %s) = %s' % (total_threads, thread_id)))
|
|
50
|
+
else:
|
|
51
|
+
query = query.filter(text('mod(abs((\'x\'||md5(%s::text))::bit(32)::bigint), %s) = %s' % (hash_variable, total_threads, thread_id)))
|
|
52
|
+
return query
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from enum import Enum
|
|
17
|
+
|
|
18
|
+
# Individual constants
|
|
19
|
+
|
|
20
|
+
OBSOLETE = datetime(year=1970, month=1, day=1) # Tombstone value to mark obsolete replicas
|
|
21
|
+
|
|
22
|
+
# Regex patterns
|
|
23
|
+
|
|
24
|
+
ORACLE_CONNECTION_LOST_CONTACT_REGEX = r".*ORA-03135.*"
|
|
25
|
+
ORACLE_DEADLOCK_DETECTED_REGEX = r".*ORA-00060.*"
|
|
26
|
+
ORACLE_RESOURCE_BUSY_REGEX = r".*ORA-00054.*"
|
|
27
|
+
ORACLE_UNIQUE_CONSTRAINT_VIOLATED_REGEX = r".*ORA-00001.*"
|
|
28
|
+
PSQL_LOCK_NOT_AVAILABLE_REGEX = r".*55P03.*"
|
|
29
|
+
MYSQL_LOCK_NOWAIT_REGEX = r".*3572.*"
|
|
30
|
+
MYSQL_LOCK_WAIT_TIMEOUT_EXCEEDED = "ERROR 1205 (HY000)"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# The enum values below are the actual strings stored in the database -- these must be string types.
|
|
34
|
+
# This is done explicitly via values_callable to SQLAlchemy enums in models.py and alembic scripts,
|
|
35
|
+
# as overloading/overriding Python internal enums is discouraged.
|
|
36
|
+
|
|
37
|
+
class AccountStatus(Enum):
|
|
38
|
+
ACTIVE = 'ACTIVE'
|
|
39
|
+
SUSPENDED = 'SUSPENDED'
|
|
40
|
+
DELETED = 'DELETED'
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class AccountType(Enum):
|
|
44
|
+
USER = 'USER'
|
|
45
|
+
GROUP = 'GROUP'
|
|
46
|
+
SERVICE = 'SERVICE'
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class BadFilesStatus(Enum):
|
|
50
|
+
BAD = 'B'
|
|
51
|
+
DELETED = 'D'
|
|
52
|
+
LOST = 'L'
|
|
53
|
+
RECOVERED = 'R'
|
|
54
|
+
SUSPICIOUS = 'S'
|
|
55
|
+
TEMPORARY_UNAVAILABLE = 'T'
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class BadPFNStatus(Enum):
|
|
59
|
+
BAD = 'B'
|
|
60
|
+
SUSPICIOUS = 'S'
|
|
61
|
+
TEMPORARY_UNAVAILABLE = 'T'
|
|
62
|
+
AVAILABLE = 'A'
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class DIDAvailability(Enum):
|
|
66
|
+
LOST = 'L'
|
|
67
|
+
DELETED = 'D'
|
|
68
|
+
AVAILABLE = 'A'
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class DIDReEvaluation(Enum):
|
|
72
|
+
ATTACH = 'A'
|
|
73
|
+
DETACH = 'D'
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class DIDType(Enum):
|
|
77
|
+
FILE = 'F'
|
|
78
|
+
DATASET = 'D'
|
|
79
|
+
CONTAINER = 'C'
|
|
80
|
+
ARCHIVE = 'A'
|
|
81
|
+
DELETED_FILE = 'X'
|
|
82
|
+
DELETED_DATASET = 'Y'
|
|
83
|
+
DELETED_CONTAINER = 'Z'
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class IdentityType(Enum):
|
|
87
|
+
X509 = 'X509'
|
|
88
|
+
GSS = 'GSS'
|
|
89
|
+
USERPASS = 'USERPASS'
|
|
90
|
+
SSH = 'SSH'
|
|
91
|
+
SAML = 'SAML'
|
|
92
|
+
OIDC = 'OIDC'
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class KeyType(Enum):
|
|
96
|
+
ALL = 'ALL'
|
|
97
|
+
COLLECTION = 'COLLECTION'
|
|
98
|
+
CONTAINER = 'CONTAINER'
|
|
99
|
+
DATASET = 'DATASET'
|
|
100
|
+
FILE = 'FILE'
|
|
101
|
+
DERIVED = 'DERIVED'
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class LifetimeExceptionsState(Enum):
|
|
105
|
+
APPROVED = 'A'
|
|
106
|
+
REJECTED = 'R'
|
|
107
|
+
WAITING = 'W'
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class LockState(Enum):
|
|
111
|
+
REPLICATING = 'R'
|
|
112
|
+
OK = 'O'
|
|
113
|
+
STUCK = 'S'
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class ReplicaState(Enum):
|
|
117
|
+
# Update rucio.common.constants at the same time than this
|
|
118
|
+
AVAILABLE = 'A'
|
|
119
|
+
UNAVAILABLE = 'U'
|
|
120
|
+
COPYING = 'C'
|
|
121
|
+
BEING_DELETED = 'B'
|
|
122
|
+
BAD = 'D'
|
|
123
|
+
TEMPORARY_UNAVAILABLE = 'T'
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class RequestErrMsg(Enum):
|
|
127
|
+
NO_SOURCES = 'NO_SOURCES'
|
|
128
|
+
SUBMISSION_FAILED = 'SUBMISSION_FAILED'
|
|
129
|
+
TRANSFER_FAILED = 'TRANSFER_FAILED'
|
|
130
|
+
MISMATCH_SCHEME = 'MISMATCH_SCHEME'
|
|
131
|
+
OTHER = 'OTHER'
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class RequestState(Enum):
|
|
135
|
+
QUEUED = 'Q'
|
|
136
|
+
SUBMITTING = 'G'
|
|
137
|
+
SUBMITTED = 'S'
|
|
138
|
+
FAILED = 'F'
|
|
139
|
+
DONE = 'D'
|
|
140
|
+
LOST = 'L'
|
|
141
|
+
NO_SOURCES = 'N'
|
|
142
|
+
ONLY_TAPE_SOURCES = 'O'
|
|
143
|
+
SUBMISSION_FAILED = 'A'
|
|
144
|
+
MISMATCH_SCHEME = 'M'
|
|
145
|
+
SUSPEND = 'U'
|
|
146
|
+
WAITING = 'W'
|
|
147
|
+
PREPARING = 'P'
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class RequestType(Enum):
|
|
151
|
+
TRANSFER = 'T'
|
|
152
|
+
UPLOAD = 'U'
|
|
153
|
+
DOWNLOAD = 'D'
|
|
154
|
+
STAGEIN = 'I'
|
|
155
|
+
STAGEOUT = 'O'
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class RSEType(Enum):
|
|
159
|
+
DISK = 'DISK'
|
|
160
|
+
TAPE = 'TAPE'
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class RuleGrouping(Enum):
|
|
164
|
+
ALL = 'A'
|
|
165
|
+
DATASET = 'D'
|
|
166
|
+
NONE = 'N'
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
class RuleNotification(Enum):
|
|
170
|
+
YES = 'Y'
|
|
171
|
+
NO = 'N'
|
|
172
|
+
CLOSE = 'C'
|
|
173
|
+
PROGRESS = 'P'
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class RuleState(Enum):
|
|
177
|
+
REPLICATING = 'R'
|
|
178
|
+
OK = 'O'
|
|
179
|
+
STUCK = 'S'
|
|
180
|
+
SUSPENDED = 'U'
|
|
181
|
+
WAITING_APPROVAL = 'W'
|
|
182
|
+
INJECT = 'I'
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class ScopeStatus(Enum):
|
|
186
|
+
OPEN = 'O'
|
|
187
|
+
CLOSED = 'C'
|
|
188
|
+
DELETED = 'D'
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class SubscriptionState(Enum):
|
|
192
|
+
ACTIVE = 'A'
|
|
193
|
+
INACTIVE = 'I'
|
|
194
|
+
NEW = 'N'
|
|
195
|
+
UPDATED = 'U'
|
|
196
|
+
BROKEN = 'B'
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class TransferLimitDirection(Enum):
|
|
200
|
+
SOURCE = 'S'
|
|
201
|
+
DESTINATION = 'D'
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class DatabaseOperationType(Enum):
|
|
205
|
+
READ = 'read'
|
|
206
|
+
WRITE = 'write'
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from logging.config import fileConfig
|
|
16
|
+
|
|
17
|
+
from alembic import context
|
|
18
|
+
from sqlalchemy import engine_from_config, pool
|
|
19
|
+
|
|
20
|
+
# this is the Alembic Config object, which provides
|
|
21
|
+
# access to the values within the .ini file in use.
|
|
22
|
+
config = context.config
|
|
23
|
+
|
|
24
|
+
# Interpret the config file for Python logging.
|
|
25
|
+
# This line sets up loggers basically.
|
|
26
|
+
fileConfig(config.config_file_name)
|
|
27
|
+
|
|
28
|
+
# add your model's MetaData object here
|
|
29
|
+
# for 'autogenerate' support
|
|
30
|
+
# from myapp import mymodel
|
|
31
|
+
# target_metadata = mymodel.Base.metadata
|
|
32
|
+
target_metadata = None
|
|
33
|
+
|
|
34
|
+
# other values from the config, defined by the needs of env.py,
|
|
35
|
+
# can be acquired:
|
|
36
|
+
# my_important_option = config.get_main_option("my_important_option")
|
|
37
|
+
# ... etc.
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def run_migrations_offline():
|
|
41
|
+
"""
|
|
42
|
+
Run migrations in 'offline' mode.
|
|
43
|
+
|
|
44
|
+
This configures the context with just a URL/dialect
|
|
45
|
+
and not an Engine, though an Engine is acceptable
|
|
46
|
+
here as well. By skipping the Engine creation
|
|
47
|
+
we don't even need a DBAPI to be available.
|
|
48
|
+
|
|
49
|
+
Calls to context.execute() here emit the given string to the
|
|
50
|
+
script output.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
# try getting url & version_table_schema
|
|
54
|
+
url = config.get_main_option("sqlalchemy.url")
|
|
55
|
+
version_table_schema = config.get_main_option("version_table_schema")
|
|
56
|
+
|
|
57
|
+
# try getting dialect in case URL has not been specified
|
|
58
|
+
dialect = config.get_main_option("dialect")
|
|
59
|
+
|
|
60
|
+
# try getting starting revision
|
|
61
|
+
starting_rev = config.get_main_option("starting_rev")
|
|
62
|
+
|
|
63
|
+
context.configure(
|
|
64
|
+
url=url,
|
|
65
|
+
version_table_schema=version_table_schema,
|
|
66
|
+
dialect_name=dialect,
|
|
67
|
+
starting_rev=starting_rev,
|
|
68
|
+
target_metadata=target_metadata,
|
|
69
|
+
literal_binds=True,
|
|
70
|
+
include_schemas=True)
|
|
71
|
+
|
|
72
|
+
with context.begin_transaction():
|
|
73
|
+
context.run_migrations()
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def run_migrations_online():
|
|
77
|
+
"""
|
|
78
|
+
Run migrations in 'online' mode.
|
|
79
|
+
|
|
80
|
+
In this scenario we need to create an Engine
|
|
81
|
+
and associate a connection with the context.
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
params = config.get_section(config.config_ini_section)
|
|
85
|
+
|
|
86
|
+
connectable = engine_from_config(
|
|
87
|
+
config.get_section(config.config_ini_section),
|
|
88
|
+
prefix='sqlalchemy.',
|
|
89
|
+
poolclass=pool.NullPool)
|
|
90
|
+
|
|
91
|
+
with connectable.connect() as connection:
|
|
92
|
+
# Forcing the default is needed for PostgreSQL installations with named schemas.
|
|
93
|
+
# For other databases it doesn't matter.
|
|
94
|
+
# https://github.com/sqlalchemy/alembic/issues/409
|
|
95
|
+
conn = connection.execution_options(schema_translate_map={None: params.get('version_table_schema', None)})
|
|
96
|
+
|
|
97
|
+
context.configure(
|
|
98
|
+
connection=conn,
|
|
99
|
+
target_metadata=target_metadata,
|
|
100
|
+
version_table_schema=params.get('version_table_schema', None),
|
|
101
|
+
include_schemas=True)
|
|
102
|
+
|
|
103
|
+
with context.begin_transaction():
|
|
104
|
+
context.run_migrations()
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
if context.is_offline_mode():
|
|
108
|
+
run_migrations_offline()
|
|
109
|
+
else:
|
|
110
|
+
run_migrations_online()
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
''' add new rule notification state progress '''
|
|
16
|
+
|
|
17
|
+
from alembic import context, op
|
|
18
|
+
from alembic.op import create_check_constraint
|
|
19
|
+
|
|
20
|
+
from rucio.db.sqla.util import try_drop_constraint
|
|
21
|
+
|
|
22
|
+
# Alembic revision identifiers
|
|
23
|
+
revision = '01eaf73ab656'
|
|
24
|
+
down_revision = '90f47792bb76'
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def upgrade():
|
|
28
|
+
'''
|
|
29
|
+
Upgrade the database to this revision
|
|
30
|
+
'''
|
|
31
|
+
|
|
32
|
+
schema = context.get_context().version_table_schema + '.' if context.get_context().version_table_schema else ''
|
|
33
|
+
|
|
34
|
+
if context.get_context().dialect.name == 'oracle':
|
|
35
|
+
try_drop_constraint('RULES_NOTIFICATION_CHK', 'rules')
|
|
36
|
+
create_check_constraint(constraint_name='RULES_NOTIFICATION_CHK', table_name='rules',
|
|
37
|
+
condition="notification in ('Y', 'N', 'C', 'P')")
|
|
38
|
+
|
|
39
|
+
elif context.get_context().dialect.name == 'postgresql':
|
|
40
|
+
op.execute('ALTER TABLE ' + schema + 'rules DROP CONSTRAINT IF EXISTS "RULES_NOTIFICATION_CHK", ALTER COLUMN notification TYPE CHAR')
|
|
41
|
+
op.execute('DROP TYPE \"RULES_NOTIFICATION_CHK\"')
|
|
42
|
+
op.execute("CREATE TYPE \"RULES_NOTIFICATION_CHK\" AS ENUM('Y', 'N', 'C', 'P')")
|
|
43
|
+
op.execute("ALTER TABLE %srules ALTER COLUMN notification TYPE \"RULES_NOTIFICATION_CHK\" USING notification::\"RULES_NOTIFICATION_CHK\"" % schema)
|
|
44
|
+
|
|
45
|
+
elif context.get_context().dialect.name == 'mysql':
|
|
46
|
+
create_check_constraint(constraint_name='RULES_NOTIFICATION_CHK', table_name='rules',
|
|
47
|
+
condition="notification in ('Y', 'N', 'C', 'P')")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def downgrade():
|
|
51
|
+
'''
|
|
52
|
+
Downgrade the database to the previous revision
|
|
53
|
+
'''
|
|
54
|
+
|
|
55
|
+
schema = context.get_context().version_table_schema + '.' if context.get_context().version_table_schema else ''
|
|
56
|
+
|
|
57
|
+
if context.get_context().dialect.name == 'oracle':
|
|
58
|
+
try_drop_constraint('RULES_NOTIFICATION_CHK', 'rules')
|
|
59
|
+
create_check_constraint(constraint_name='RULES_NOTIFICATION_CHK', table_name='rules',
|
|
60
|
+
condition="notification in ('Y', 'N', 'C')")
|
|
61
|
+
|
|
62
|
+
elif context.get_context().dialect.name == 'postgresql':
|
|
63
|
+
op.execute('ALTER TABLE ' + schema + 'rules DROP CONSTRAINT IF EXISTS "RULES_NOTIFICATION_CHK", ALTER COLUMN notification TYPE CHAR')
|
|
64
|
+
op.execute('DROP TYPE "RULES_NOTIFICATION_CHK"')
|
|
65
|
+
op.execute("CREATE TYPE \"RULES_NOTIFICATION_CHK\" AS ENUM('Y', 'N', 'C')")
|
|
66
|
+
op.execute("ALTER TABLE %srules ALTER COLUMN notification TYPE \"RULES_NOTIFICATION_CHK\" USING notification::\"RULES_NOTIFICATION_CHK\"" % schema)
|
|
67
|
+
|
|
68
|
+
elif context.get_context().dialect.name == 'mysql':
|
|
69
|
+
create_check_constraint(constraint_name='RULES_NOTIFICATION_CHK', table_name='rules',
|
|
70
|
+
condition="notification in ('Y', 'N', 'C')")
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
''' add eol_at in rules '''
|
|
16
|
+
|
|
17
|
+
import sqlalchemy as sa
|
|
18
|
+
from alembic import context
|
|
19
|
+
from alembic.op import add_column, drop_column
|
|
20
|
+
|
|
21
|
+
# Alembic revision identifiers
|
|
22
|
+
revision = '0437a40dbfd1'
|
|
23
|
+
down_revision = 'a5f6f6e928a7'
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def upgrade():
|
|
27
|
+
'''
|
|
28
|
+
Upgrade the database to this revision
|
|
29
|
+
'''
|
|
30
|
+
|
|
31
|
+
if context.get_context().dialect.name in ['oracle', 'mysql', 'postgresql']:
|
|
32
|
+
schema = context.get_context().version_table_schema if context.get_context().version_table_schema else ''
|
|
33
|
+
add_column('rules', sa.Column('eol_at', sa.DateTime), schema=schema)
|
|
34
|
+
add_column('rules_hist_recent', sa.Column('eol_at', sa.DateTime), schema=schema)
|
|
35
|
+
add_column('rules_history', sa.Column('eol_at', sa.DateTime), schema=schema)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def downgrade():
|
|
39
|
+
'''
|
|
40
|
+
Downgrade the database to the previous revision
|
|
41
|
+
'''
|
|
42
|
+
|
|
43
|
+
if context.get_context().dialect.name in ['oracle', 'mysql', 'postgresql']:
|
|
44
|
+
schema = context.get_context().version_table_schema if context.get_context().version_table_schema else ''
|
|
45
|
+
drop_column('rules', 'eol_at', schema=schema)
|
|
46
|
+
drop_column('rules_hist_recent', 'eol_at', schema=schema)
|
|
47
|
+
drop_column('rules_history', 'eol_at', schema=schema)
|