rucio 32.8.6__py3-none-any.whl → 35.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rucio might be problematic. Click here for more details.
- rucio/__init__.py +0 -1
- rucio/alembicrevision.py +1 -2
- rucio/client/__init__.py +0 -1
- rucio/client/accountclient.py +45 -25
- rucio/client/accountlimitclient.py +37 -9
- rucio/client/baseclient.py +199 -154
- rucio/client/client.py +2 -3
- rucio/client/configclient.py +19 -6
- rucio/client/credentialclient.py +9 -4
- rucio/client/didclient.py +238 -63
- rucio/client/diracclient.py +13 -5
- rucio/client/downloadclient.py +162 -51
- rucio/client/exportclient.py +4 -4
- rucio/client/fileclient.py +3 -4
- rucio/client/importclient.py +4 -4
- rucio/client/lifetimeclient.py +21 -5
- rucio/client/lockclient.py +18 -8
- rucio/client/{metaclient.py → metaconventionsclient.py} +18 -15
- rucio/client/pingclient.py +0 -1
- rucio/client/replicaclient.py +15 -5
- rucio/client/requestclient.py +35 -19
- rucio/client/rseclient.py +133 -51
- rucio/client/ruleclient.py +29 -22
- rucio/client/scopeclient.py +8 -6
- rucio/client/subscriptionclient.py +47 -35
- rucio/client/touchclient.py +8 -4
- rucio/client/uploadclient.py +166 -82
- rucio/common/__init__.py +0 -1
- rucio/common/cache.py +4 -4
- rucio/common/config.py +52 -47
- rucio/common/constants.py +69 -2
- rucio/common/constraints.py +0 -1
- rucio/common/didtype.py +24 -22
- rucio/common/dumper/__init__.py +70 -41
- rucio/common/dumper/consistency.py +26 -22
- rucio/common/dumper/data_models.py +16 -23
- rucio/common/dumper/path_parsing.py +0 -1
- rucio/common/exception.py +281 -222
- rucio/common/extra.py +0 -1
- rucio/common/logging.py +54 -38
- rucio/common/pcache.py +122 -101
- rucio/common/plugins.py +153 -0
- rucio/common/policy.py +4 -4
- rucio/common/schema/__init__.py +17 -10
- rucio/common/schema/atlas.py +7 -5
- rucio/common/schema/belleii.py +7 -5
- rucio/common/schema/domatpc.py +7 -5
- rucio/common/schema/escape.py +7 -5
- rucio/common/schema/generic.py +8 -6
- rucio/common/schema/generic_multi_vo.py +7 -5
- rucio/common/schema/icecube.py +7 -5
- rucio/common/stomp_utils.py +0 -1
- rucio/common/stopwatch.py +0 -1
- rucio/common/test_rucio_server.py +2 -2
- rucio/common/types.py +262 -17
- rucio/common/utils.py +743 -451
- rucio/core/__init__.py +0 -1
- rucio/core/account.py +99 -29
- rucio/core/account_counter.py +89 -24
- rucio/core/account_limit.py +90 -24
- rucio/core/authentication.py +86 -29
- rucio/core/config.py +108 -38
- rucio/core/credential.py +14 -7
- rucio/core/did.py +680 -782
- rucio/core/did_meta_plugins/__init__.py +8 -6
- rucio/core/did_meta_plugins/did_column_meta.py +17 -12
- rucio/core/did_meta_plugins/did_meta_plugin_interface.py +60 -11
- rucio/core/did_meta_plugins/filter_engine.py +90 -50
- rucio/core/did_meta_plugins/json_meta.py +41 -16
- rucio/core/did_meta_plugins/mongo_meta.py +25 -8
- rucio/core/did_meta_plugins/postgres_meta.py +3 -4
- rucio/core/dirac.py +46 -17
- rucio/core/distance.py +66 -43
- rucio/core/exporter.py +5 -5
- rucio/core/heartbeat.py +181 -81
- rucio/core/identity.py +22 -12
- rucio/core/importer.py +23 -12
- rucio/core/lifetime_exception.py +32 -32
- rucio/core/lock.py +244 -142
- rucio/core/message.py +79 -38
- rucio/core/{meta.py → meta_conventions.py} +57 -44
- rucio/core/monitor.py +19 -13
- rucio/core/naming_convention.py +68 -27
- rucio/core/nongrid_trace.py +17 -5
- rucio/core/oidc.py +151 -29
- rucio/core/permission/__init__.py +18 -6
- rucio/core/permission/atlas.py +50 -35
- rucio/core/permission/belleii.py +6 -5
- rucio/core/permission/escape.py +8 -6
- rucio/core/permission/generic.py +82 -80
- rucio/core/permission/generic_multi_vo.py +9 -7
- rucio/core/quarantined_replica.py +91 -58
- rucio/core/replica.py +1303 -772
- rucio/core/replica_sorter.py +10 -12
- rucio/core/request.py +1133 -285
- rucio/core/rse.py +142 -102
- rucio/core/rse_counter.py +49 -18
- rucio/core/rse_expression_parser.py +6 -7
- rucio/core/rse_selector.py +41 -16
- rucio/core/rule.py +1538 -474
- rucio/core/rule_grouping.py +213 -68
- rucio/core/scope.py +50 -22
- rucio/core/subscription.py +92 -44
- rucio/core/topology.py +66 -24
- rucio/core/trace.py +42 -28
- rucio/core/transfer.py +543 -259
- rucio/core/vo.py +36 -18
- rucio/core/volatile_replica.py +59 -32
- rucio/daemons/__init__.py +0 -1
- rucio/daemons/abacus/__init__.py +0 -1
- rucio/daemons/abacus/account.py +29 -19
- rucio/daemons/abacus/collection_replica.py +21 -10
- rucio/daemons/abacus/rse.py +22 -12
- rucio/daemons/atropos/__init__.py +0 -1
- rucio/daemons/atropos/atropos.py +1 -2
- rucio/daemons/auditor/__init__.py +56 -28
- rucio/daemons/auditor/hdfs.py +17 -6
- rucio/daemons/auditor/srmdumps.py +116 -45
- rucio/daemons/automatix/__init__.py +0 -1
- rucio/daemons/automatix/automatix.py +30 -18
- rucio/daemons/badreplicas/__init__.py +0 -1
- rucio/daemons/badreplicas/minos.py +29 -18
- rucio/daemons/badreplicas/minos_temporary_expiration.py +5 -7
- rucio/daemons/badreplicas/necromancer.py +9 -13
- rucio/daemons/bb8/__init__.py +0 -1
- rucio/daemons/bb8/bb8.py +10 -13
- rucio/daemons/bb8/common.py +151 -154
- rucio/daemons/bb8/nuclei_background_rebalance.py +15 -9
- rucio/daemons/bb8/t2_background_rebalance.py +15 -8
- rucio/daemons/c3po/__init__.py +0 -1
- rucio/daemons/c3po/algorithms/__init__.py +0 -1
- rucio/daemons/c3po/algorithms/simple.py +8 -5
- rucio/daemons/c3po/algorithms/t2_free_space.py +10 -7
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +10 -7
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +30 -15
- rucio/daemons/c3po/c3po.py +81 -52
- rucio/daemons/c3po/collectors/__init__.py +0 -1
- rucio/daemons/c3po/collectors/agis.py +17 -17
- rucio/daemons/c3po/collectors/free_space.py +32 -13
- rucio/daemons/c3po/collectors/jedi_did.py +14 -5
- rucio/daemons/c3po/collectors/mock_did.py +11 -6
- rucio/daemons/c3po/collectors/network_metrics.py +12 -4
- rucio/daemons/c3po/collectors/workload.py +21 -19
- rucio/daemons/c3po/utils/__init__.py +0 -1
- rucio/daemons/c3po/utils/dataset_cache.py +15 -5
- rucio/daemons/c3po/utils/expiring_dataset_cache.py +16 -5
- rucio/daemons/c3po/utils/expiring_list.py +6 -7
- rucio/daemons/c3po/utils/popularity.py +5 -2
- rucio/daemons/c3po/utils/timeseries.py +25 -12
- rucio/daemons/cache/__init__.py +0 -1
- rucio/daemons/cache/consumer.py +21 -15
- rucio/daemons/common.py +42 -18
- rucio/daemons/conveyor/__init__.py +0 -1
- rucio/daemons/conveyor/common.py +69 -37
- rucio/daemons/conveyor/finisher.py +83 -46
- rucio/daemons/conveyor/poller.py +101 -69
- rucio/daemons/conveyor/preparer.py +35 -28
- rucio/daemons/conveyor/receiver.py +64 -21
- rucio/daemons/conveyor/stager.py +33 -28
- rucio/daemons/conveyor/submitter.py +71 -47
- rucio/daemons/conveyor/throttler.py +99 -35
- rucio/daemons/follower/__init__.py +0 -1
- rucio/daemons/follower/follower.py +12 -8
- rucio/daemons/hermes/__init__.py +0 -1
- rucio/daemons/hermes/hermes.py +57 -21
- rucio/daemons/judge/__init__.py +0 -1
- rucio/daemons/judge/cleaner.py +27 -17
- rucio/daemons/judge/evaluator.py +31 -18
- rucio/daemons/judge/injector.py +31 -23
- rucio/daemons/judge/repairer.py +28 -18
- rucio/daemons/oauthmanager/__init__.py +0 -1
- rucio/daemons/oauthmanager/oauthmanager.py +7 -8
- rucio/daemons/reaper/__init__.py +0 -1
- rucio/daemons/reaper/dark_reaper.py +15 -9
- rucio/daemons/reaper/reaper.py +109 -67
- rucio/daemons/replicarecoverer/__init__.py +0 -1
- rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +255 -116
- rucio/{api → daemons/rsedecommissioner}/__init__.py +0 -1
- 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 +451 -0
- rucio/daemons/rsedecommissioner/profiles/types.py +92 -0
- rucio/daemons/rsedecommissioner/rse_decommissioner.py +280 -0
- rucio/daemons/storage/__init__.py +0 -1
- rucio/daemons/storage/consistency/__init__.py +0 -1
- rucio/daemons/storage/consistency/actions.py +152 -59
- rucio/daemons/tracer/__init__.py +0 -1
- rucio/daemons/tracer/kronos.py +47 -24
- rucio/daemons/transmogrifier/__init__.py +0 -1
- rucio/daemons/transmogrifier/transmogrifier.py +35 -26
- rucio/daemons/undertaker/__init__.py +0 -1
- rucio/daemons/undertaker/undertaker.py +10 -10
- rucio/db/__init__.py +0 -1
- rucio/db/sqla/__init__.py +16 -2
- rucio/db/sqla/constants.py +10 -1
- rucio/db/sqla/migrate_repo/__init__.py +0 -1
- rucio/db/sqla/migrate_repo/env.py +0 -1
- rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -1
- rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +1 -3
- rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -3
- rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +1 -4
- rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -1
- rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -2
- rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -2
- rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -3
- rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +1 -2
- rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -3
- rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +1 -4
- rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -2
- rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -3
- rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +1 -2
- rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -1
- rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -2
- rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -2
- rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +1 -4
- rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +1 -3
- rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -2
- rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +1 -2
- rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -2
- rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +2 -3
- rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +1 -4
- rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -1
- rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -1
- rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -1
- rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -2
- rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -3
- rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -2
- rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +2 -4
- rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -2
- rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +1 -4
- rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -2
- rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -3
- 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 +0 -2
- rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -2
- rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -3
- rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -3
- rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +1 -3
- rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +1 -3
- rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -3
- rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +1 -2
- rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +2 -4
- rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +1 -4
- rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -2
- rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +1 -2
- rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -3
- rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +1 -3
- rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -3
- rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -1
- rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -2
- 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 +1 -3
- rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -2
- rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +1 -4
- rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -1
- rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +1 -4
- rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -1
- 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 +0 -3
- 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 +1 -2
- rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +1 -3
- rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +1 -5
- rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +1 -3
- rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -3
- rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +1 -3
- rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -3
- rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +1 -2
- rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +1 -3
- rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +1 -4
- rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -2
- rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +1 -3
- rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -1
- rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +1 -2
- rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -2
- rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -1
- rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +1 -2
- rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -3
- rucio/db/sqla/models.py +122 -216
- rucio/db/sqla/sautils.py +12 -5
- rucio/db/sqla/session.py +71 -43
- rucio/db/sqla/types.py +3 -4
- rucio/db/sqla/util.py +91 -69
- rucio/gateway/__init__.py +13 -0
- rucio/{api → gateway}/account.py +119 -46
- rucio/{api → gateway}/account_limit.py +12 -13
- rucio/{api → gateway}/authentication.py +106 -33
- rucio/{api → gateway}/config.py +12 -13
- rucio/{api → gateway}/credential.py +15 -4
- rucio/{api → gateway}/did.py +384 -140
- rucio/{api → gateway}/dirac.py +16 -6
- rucio/{api → gateway}/exporter.py +3 -4
- rucio/{api → gateway}/heartbeat.py +17 -5
- rucio/{api → gateway}/identity.py +63 -19
- rucio/{api → gateway}/importer.py +3 -4
- rucio/{api → gateway}/lifetime_exception.py +35 -10
- rucio/{api → gateway}/lock.py +34 -12
- rucio/{api/meta.py → gateway/meta_conventions.py} +18 -16
- rucio/{api → gateway}/permission.py +4 -5
- rucio/{api → gateway}/quarantined_replica.py +13 -4
- rucio/{api → gateway}/replica.py +12 -11
- rucio/{api → gateway}/request.py +129 -28
- rucio/{api → gateway}/rse.py +11 -12
- rucio/{api → gateway}/rule.py +117 -35
- rucio/{api → gateway}/scope.py +24 -14
- rucio/{api → gateway}/subscription.py +65 -43
- rucio/{api → gateway}/vo.py +17 -7
- rucio/rse/__init__.py +3 -4
- rucio/rse/protocols/__init__.py +0 -1
- rucio/rse/protocols/bittorrent.py +184 -0
- rucio/rse/protocols/cache.py +1 -2
- rucio/rse/protocols/dummy.py +1 -2
- rucio/rse/protocols/gfal.py +12 -10
- rucio/rse/protocols/globus.py +7 -7
- rucio/rse/protocols/gsiftp.py +2 -3
- rucio/rse/protocols/http_cache.py +1 -2
- rucio/rse/protocols/mock.py +1 -2
- rucio/rse/protocols/ngarc.py +1 -2
- rucio/rse/protocols/posix.py +12 -13
- rucio/rse/protocols/protocol.py +116 -52
- rucio/rse/protocols/rclone.py +6 -7
- rucio/rse/protocols/rfio.py +4 -5
- rucio/rse/protocols/srm.py +9 -10
- rucio/rse/protocols/ssh.py +8 -9
- rucio/rse/protocols/storm.py +2 -3
- rucio/rse/protocols/webdav.py +17 -14
- rucio/rse/protocols/xrootd.py +23 -17
- rucio/rse/rsemanager.py +19 -7
- rucio/tests/__init__.py +0 -1
- rucio/tests/common.py +43 -17
- rucio/tests/common_server.py +3 -3
- rucio/transfertool/__init__.py +0 -1
- rucio/transfertool/bittorrent.py +199 -0
- rucio/transfertool/bittorrent_driver.py +52 -0
- rucio/transfertool/bittorrent_driver_qbittorrent.py +133 -0
- rucio/transfertool/fts3.py +250 -138
- rucio/transfertool/fts3_plugins.py +152 -0
- rucio/transfertool/globus.py +9 -8
- rucio/transfertool/globus_library.py +1 -2
- rucio/transfertool/mock.py +21 -12
- rucio/transfertool/transfertool.py +33 -24
- rucio/vcsversion.py +4 -4
- rucio/version.py +5 -13
- rucio/web/__init__.py +0 -1
- rucio/web/rest/__init__.py +0 -1
- rucio/web/rest/flaskapi/__init__.py +0 -1
- rucio/web/rest/flaskapi/authenticated_bp.py +0 -1
- rucio/web/rest/flaskapi/v1/__init__.py +0 -1
- rucio/web/rest/flaskapi/v1/accountlimits.py +15 -13
- rucio/web/rest/flaskapi/v1/accounts.py +49 -48
- rucio/web/rest/flaskapi/v1/archives.py +12 -10
- rucio/web/rest/flaskapi/v1/auth.py +146 -144
- rucio/web/rest/flaskapi/v1/common.py +82 -41
- rucio/web/rest/flaskapi/v1/config.py +5 -6
- rucio/web/rest/flaskapi/v1/credentials.py +7 -8
- rucio/web/rest/flaskapi/v1/dids.py +158 -28
- rucio/web/rest/flaskapi/v1/dirac.py +8 -8
- rucio/web/rest/flaskapi/v1/export.py +3 -5
- rucio/web/rest/flaskapi/v1/heartbeats.py +3 -5
- rucio/web/rest/flaskapi/v1/identities.py +3 -5
- rucio/web/rest/flaskapi/v1/import.py +3 -4
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +6 -9
- rucio/web/rest/flaskapi/v1/locks.py +2 -4
- rucio/web/rest/flaskapi/v1/main.py +10 -2
- rucio/web/rest/flaskapi/v1/{meta.py → meta_conventions.py} +26 -11
- rucio/web/rest/flaskapi/v1/metrics.py +1 -2
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +4 -4
- rucio/web/rest/flaskapi/v1/ping.py +6 -7
- rucio/web/rest/flaskapi/v1/redirect.py +8 -9
- rucio/web/rest/flaskapi/v1/replicas.py +43 -19
- rucio/web/rest/flaskapi/v1/requests.py +178 -21
- rucio/web/rest/flaskapi/v1/rses.py +61 -26
- rucio/web/rest/flaskapi/v1/rules.py +48 -18
- rucio/web/rest/flaskapi/v1/scopes.py +3 -5
- rucio/web/rest/flaskapi/v1/subscriptions.py +22 -18
- rucio/web/rest/flaskapi/v1/traces.py +4 -4
- rucio/web/rest/flaskapi/v1/types.py +20 -0
- rucio/web/rest/flaskapi/v1/vos.py +3 -5
- rucio/web/rest/main.py +0 -1
- rucio/web/rest/metrics.py +0 -1
- rucio/web/rest/ping.py +27 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/ldap.cfg.template +1 -1
- rucio-35.8.0.data/data/rucio/requirements.server.txt +268 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/bootstrap.py +3 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/merge_rucio_configs.py +2 -5
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/reset_database.py +3 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio +87 -85
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-account +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-collection-replica +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-rse +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-admin +45 -32
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-atropos +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-auditor +13 -7
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-automatix +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-bb8 +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-c3po +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-client +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-consumer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-finisher +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-poller +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-preparer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-receiver +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-stager +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-submitter +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-throttler +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dark-reaper +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dumper +11 -10
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-follower +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-hermes +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-cleaner +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-evaluator +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-injector +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-repairer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-kronos +1 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos-temporary-expiration +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-necromancer +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-oauth-manager +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-reaper +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-replica-recoverer +6 -7
- rucio-35.8.0.data/scripts/rucio-rse-decommissioner +66 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-storage-consistency-actions +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-transmogrifier +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-undertaker +1 -2
- rucio-35.8.0.dist-info/METADATA +72 -0
- rucio-35.8.0.dist-info/RECORD +493 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/WHEEL +1 -1
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/AUTHORS.rst +3 -0
- rucio/api/temporary_did.py +0 -49
- rucio/common/schema/cms.py +0 -478
- rucio/common/schema/lsst.py +0 -423
- rucio/core/permission/cms.py +0 -1166
- rucio/core/temporary_did.py +0 -188
- rucio/daemons/reaper/light_reaper.py +0 -255
- rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -115
- rucio-32.8.6.data/data/rucio/requirements.txt +0 -55
- rucio-32.8.6.data/scripts/rucio-light-reaper +0 -53
- rucio-32.8.6.dist-info/METADATA +0 -83
- rucio-32.8.6.dist-info/RECORD +0 -481
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic.ini.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/LICENSE +0 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/top_level.txt +0 -0
rucio/core/vo.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -14,13 +13,13 @@
|
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
16
15
|
import re
|
|
17
|
-
from typing import TYPE_CHECKING
|
|
16
|
+
from typing import TYPE_CHECKING, Any
|
|
18
17
|
|
|
19
|
-
from sqlalchemy
|
|
20
|
-
from sqlalchemy.
|
|
18
|
+
from sqlalchemy import select, update
|
|
19
|
+
from sqlalchemy.exc import DatabaseError, IntegrityError, NoResultFound
|
|
21
20
|
|
|
22
21
|
from rucio.common import exception
|
|
23
|
-
from rucio.common.config import
|
|
22
|
+
from rucio.common.config import config_get, config_get_bool
|
|
24
23
|
from rucio.common.types import InternalAccount
|
|
25
24
|
from rucio.db.sqla import models
|
|
26
25
|
from rucio.db.sqla.constants import AccountType, IdentityType
|
|
@@ -34,7 +33,7 @@ if TYPE_CHECKING:
|
|
|
34
33
|
|
|
35
34
|
|
|
36
35
|
@read_session
|
|
37
|
-
def vo_exists(vo, *, session: "Session"):
|
|
36
|
+
def vo_exists(vo: str, *, session: "Session") -> bool:
|
|
38
37
|
"""
|
|
39
38
|
Verify that the vo exists.
|
|
40
39
|
|
|
@@ -43,17 +42,22 @@ def vo_exists(vo, *, session: "Session"):
|
|
|
43
42
|
|
|
44
43
|
:returns: True if the vo is in the vo table, False otherwise
|
|
45
44
|
"""
|
|
46
|
-
|
|
45
|
+
stmt = select(
|
|
46
|
+
models.VO
|
|
47
|
+
).where(
|
|
48
|
+
models.VO.vo == vo
|
|
49
|
+
)
|
|
50
|
+
return bool(session.execute(stmt).scalar())
|
|
47
51
|
|
|
48
52
|
|
|
49
53
|
@transactional_session
|
|
50
|
-
def add_vo(vo, description, email, *, session: "Session"):
|
|
54
|
+
def add_vo(vo: str, description: str, email: str, *, session: "Session") -> None:
|
|
51
55
|
"""
|
|
52
56
|
Add a VO and setup a new root user.
|
|
53
57
|
New root user will have account name 'root' and a userpass identity with username: 'root@<vo>' and password: 'password'
|
|
54
58
|
|
|
55
59
|
:param vo: 3-letter unique tag for a VO.
|
|
56
|
-
:param
|
|
60
|
+
:param description: Descriptive string for the VO (e.g. Full name).
|
|
57
61
|
:param email: Contact email for the VO.
|
|
58
62
|
:param session: The db session in use.
|
|
59
63
|
"""
|
|
@@ -81,7 +85,7 @@ def add_vo(vo, description, email, *, session: "Session"):
|
|
|
81
85
|
account=new_root,
|
|
82
86
|
email=email,
|
|
83
87
|
default=False,
|
|
84
|
-
password='password',
|
|
88
|
+
password='password', # noqa: S106
|
|
85
89
|
session=session)
|
|
86
90
|
|
|
87
91
|
for ident in list_identities(account=InternalAccount('super_root', vo='def'), session=session):
|
|
@@ -89,7 +93,7 @@ def add_vo(vo, description, email, *, session: "Session"):
|
|
|
89
93
|
|
|
90
94
|
|
|
91
95
|
@read_session
|
|
92
|
-
def list_vos(*, session: "Session"):
|
|
96
|
+
def list_vos(*, session: "Session") -> list[dict[str, Any]]:
|
|
93
97
|
"""
|
|
94
98
|
List all the VOs in the db.
|
|
95
99
|
|
|
@@ -99,10 +103,12 @@ def list_vos(*, session: "Session"):
|
|
|
99
103
|
if not config_get_bool('common', 'multi_vo', raise_exception=False, default=False):
|
|
100
104
|
raise exception.UnsupportedOperation('VO operations cannot be performed in single VO mode.')
|
|
101
105
|
|
|
102
|
-
|
|
106
|
+
stmt = select(
|
|
107
|
+
models.VO
|
|
108
|
+
)
|
|
103
109
|
|
|
104
110
|
vos = []
|
|
105
|
-
for vo in
|
|
111
|
+
for vo in session.execute(stmt).scalars().all():
|
|
106
112
|
vo_dict = {'vo': vo.vo,
|
|
107
113
|
'description': vo.description,
|
|
108
114
|
'email': vo.email,
|
|
@@ -114,7 +120,7 @@ def list_vos(*, session: "Session"):
|
|
|
114
120
|
|
|
115
121
|
|
|
116
122
|
@transactional_session
|
|
117
|
-
def update_vo(vo, parameters, *, session: "Session"):
|
|
123
|
+
def update_vo(vo: str, parameters: dict[str, Any], *, session: "Session") -> None:
|
|
118
124
|
"""
|
|
119
125
|
Update VO properties (email, description).
|
|
120
126
|
|
|
@@ -126,22 +132,34 @@ def update_vo(vo, parameters, *, session: "Session"):
|
|
|
126
132
|
raise exception.UnsupportedOperation('VO operations cannot be performed in single VO mode.')
|
|
127
133
|
|
|
128
134
|
try:
|
|
129
|
-
|
|
135
|
+
stmt = select(
|
|
136
|
+
models.VO
|
|
137
|
+
).where(
|
|
138
|
+
models.VO.vo == vo
|
|
139
|
+
)
|
|
140
|
+
session.execute(stmt).scalar_one()
|
|
130
141
|
except NoResultFound:
|
|
131
142
|
raise exception.VONotFound('VO {} not found'.format(vo))
|
|
132
143
|
param = {}
|
|
133
144
|
for key in parameters:
|
|
134
145
|
if key in ['email', 'description']:
|
|
135
146
|
param[key] = parameters[key]
|
|
136
|
-
|
|
147
|
+
stmt = update(
|
|
148
|
+
models.VO
|
|
149
|
+
).where(
|
|
150
|
+
models.VO.vo == vo
|
|
151
|
+
).values(
|
|
152
|
+
param
|
|
153
|
+
)
|
|
154
|
+
session.execute(stmt)
|
|
137
155
|
|
|
138
156
|
|
|
139
|
-
def map_vo(vo):
|
|
157
|
+
def map_vo(vo: str) -> str:
|
|
140
158
|
"""
|
|
141
159
|
Converts a long VO name into the internal short (three letter)
|
|
142
160
|
tag mapping.
|
|
143
161
|
Mappings are loaded from the vo-map section of the config database table.
|
|
144
|
-
If a mapping is not found, the
|
|
162
|
+
If a mapping is not found, the original is returned unchanged.
|
|
145
163
|
:param vo: The long VO name string.
|
|
146
164
|
:returns: The short VO name string.
|
|
147
165
|
"""
|
rucio/core/volatile_replica.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -13,13 +12,12 @@
|
|
|
13
12
|
# See the License for the specific language governing permissions and
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
from collections.abc import Iterable
|
|
17
16
|
from datetime import datetime
|
|
18
|
-
from typing import TYPE_CHECKING
|
|
17
|
+
from typing import TYPE_CHECKING, Any
|
|
19
18
|
|
|
20
|
-
from sqlalchemy import and_,
|
|
21
|
-
from sqlalchemy.
|
|
22
|
-
from sqlalchemy.sql.expression import select
|
|
19
|
+
from sqlalchemy import and_, delete, exists, insert, or_, select, true, update
|
|
20
|
+
from sqlalchemy.exc import NoResultFound
|
|
23
21
|
|
|
24
22
|
from rucio.common import exception
|
|
25
23
|
from rucio.core.rse import get_rse_name
|
|
@@ -32,18 +30,23 @@ if TYPE_CHECKING:
|
|
|
32
30
|
|
|
33
31
|
|
|
34
32
|
@transactional_session
|
|
35
|
-
def add_volatile_replicas(rse_id, replicas, *, session: "Session"):
|
|
33
|
+
def add_volatile_replicas(rse_id: str, replicas: Iterable[dict[str, Any]], *, session: "Session") -> None:
|
|
36
34
|
"""
|
|
37
35
|
Bulk add volatile replicas.
|
|
38
36
|
|
|
39
37
|
:param rse_id: the rse id.
|
|
40
|
-
:param replicas: the
|
|
38
|
+
:param replicas: the iterable of volatile replicas.
|
|
41
39
|
:param session: The database session in use.
|
|
42
|
-
:returns: True is successful.
|
|
43
40
|
"""
|
|
44
41
|
# first check that the rse is a volatile one
|
|
45
42
|
try:
|
|
46
|
-
|
|
43
|
+
stmt = select(
|
|
44
|
+
models.RSE
|
|
45
|
+
).where(
|
|
46
|
+
and_(models.RSE.id == rse_id,
|
|
47
|
+
models.RSE.volatile == true())
|
|
48
|
+
)
|
|
49
|
+
session.execute(stmt).one()
|
|
47
50
|
except NoResultFound:
|
|
48
51
|
raise exception.UnsupportedOperation('No volatile rse found for %s !'
|
|
49
52
|
% get_rse_name(rse_id=rse_id, session=session))
|
|
@@ -52,7 +55,7 @@ def add_volatile_replicas(rse_id, replicas, *, session: "Session"):
|
|
|
52
55
|
for replica in replicas:
|
|
53
56
|
file_clause.append(and_(models.DataIdentifier.scope == replica['scope'],
|
|
54
57
|
models.DataIdentifier.name == replica['name'],
|
|
55
|
-
~exists(select(1).prefix_with(
|
|
58
|
+
~exists(select(1).prefix_with('/*+ INDEX(REPLICAS REPLICAS_PK) */', dialect='oracle'))
|
|
56
59
|
.where(and_(models.RSEFileAssociation.scope == replica['scope'],
|
|
57
60
|
models.RSEFileAssociation.name == replica['name'],
|
|
58
61
|
models.RSEFileAssociation.rse_id == rse_id))))
|
|
@@ -61,20 +64,31 @@ def add_volatile_replicas(rse_id, replicas, *, session: "Session"):
|
|
|
61
64
|
models.RSEFileAssociation.rse_id == rse_id))
|
|
62
65
|
if replica_clause:
|
|
63
66
|
now = datetime.utcnow()
|
|
64
|
-
stmt = update(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
stmt = update(
|
|
68
|
+
models.RSEFileAssociation
|
|
69
|
+
).prefix_with(
|
|
70
|
+
'/*+ INDEX(REPLICAS REPLICAS_PK) */',
|
|
71
|
+
dialect='oracle'
|
|
72
|
+
).where(
|
|
73
|
+
or_(*replica_clause)
|
|
74
|
+
).execution_options(
|
|
75
|
+
synchronize_session=False
|
|
76
|
+
).values({
|
|
77
|
+
models.RSEFileAssociation.updated_at: now,
|
|
78
|
+
models.RSEFileAssociation.tombstone: now
|
|
79
|
+
})
|
|
69
80
|
session.execute(stmt)
|
|
70
81
|
|
|
71
82
|
if file_clause:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
83
|
+
stmt = select(
|
|
84
|
+
models.DataIdentifier.scope,
|
|
85
|
+
models.DataIdentifier.name,
|
|
86
|
+
models.DataIdentifier.bytes,
|
|
87
|
+
models.DataIdentifier.md5,
|
|
88
|
+
models.DataIdentifier.adler32
|
|
89
|
+
).filter(
|
|
90
|
+
or_(*file_clause)
|
|
91
|
+
)
|
|
78
92
|
|
|
79
93
|
new_replicas = [
|
|
80
94
|
{
|
|
@@ -88,25 +102,33 @@ def add_volatile_replicas(rse_id, replicas, *, session: "Session"):
|
|
|
88
102
|
'bytes': bytes_,
|
|
89
103
|
'md5': md5
|
|
90
104
|
}
|
|
91
|
-
for scope, name, bytes_, md5, adler32 in
|
|
105
|
+
for scope, name, bytes_, md5, adler32 in session.execute(stmt).all()
|
|
92
106
|
]
|
|
93
107
|
if new_replicas:
|
|
94
|
-
|
|
108
|
+
stmt = insert(
|
|
109
|
+
models.RSEFileAssociation
|
|
110
|
+
)
|
|
111
|
+
session.execute(stmt, new_replicas)
|
|
95
112
|
|
|
96
113
|
|
|
97
114
|
@transactional_session
|
|
98
|
-
def delete_volatile_replicas(rse_id, replicas, *, session: "Session"):
|
|
115
|
+
def delete_volatile_replicas(rse_id: str, replicas: Iterable[dict[str, Any]], *, session: "Session") -> None:
|
|
99
116
|
"""
|
|
100
117
|
Bulk delete volatile replicas.
|
|
101
118
|
|
|
102
119
|
:param rse_id: the rse id.
|
|
103
|
-
:param replicas: the
|
|
120
|
+
:param replicas: the iterable of volatile replicas.
|
|
104
121
|
:param session: The database session in use.
|
|
105
|
-
:returns: True is successful.
|
|
106
122
|
"""
|
|
107
123
|
# first check that the rse is a volatile one
|
|
108
124
|
try:
|
|
109
|
-
|
|
125
|
+
stmt = select(
|
|
126
|
+
models.RSE
|
|
127
|
+
).where(
|
|
128
|
+
and_(models.RSE.id == rse_id,
|
|
129
|
+
models.RSE.volatile == true())
|
|
130
|
+
)
|
|
131
|
+
session.execute(stmt).one()
|
|
110
132
|
except NoResultFound:
|
|
111
133
|
raise exception.UnsupportedOperation('No volatile rse found for %s !'
|
|
112
134
|
% get_rse_name(rse_id=rse_id, session=session))
|
|
@@ -117,7 +139,12 @@ def delete_volatile_replicas(rse_id, replicas, *, session: "Session"):
|
|
|
117
139
|
models.RSEFileAssociation.name == replica['name']))
|
|
118
140
|
|
|
119
141
|
if conditions:
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
142
|
+
stmt = delete(
|
|
143
|
+
models.RSEFileAssociation
|
|
144
|
+
).where(
|
|
145
|
+
and_(models.RSEFileAssociation.rse_id == rse_id,
|
|
146
|
+
or_(*conditions))
|
|
147
|
+
).execution_options(
|
|
148
|
+
synchronize_session=False
|
|
149
|
+
)
|
|
150
|
+
session.execute(stmt)
|
rucio/daemons/__init__.py
CHANGED
rucio/daemons/abacus/__init__.py
CHANGED
rucio/daemons/abacus/account.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -26,8 +25,8 @@ import rucio.db.sqla.util
|
|
|
26
25
|
from rucio.common import exception
|
|
27
26
|
from rucio.common.logging import setup_logging
|
|
28
27
|
from rucio.common.utils import get_thread_with_periodic_running_function
|
|
29
|
-
from rucio.core.account_counter import get_updated_account_counters, update_account_counter
|
|
30
|
-
from rucio.daemons.common import run_daemon
|
|
28
|
+
from rucio.core.account_counter import fill_account_counter_history_table, get_updated_account_counters, update_account_counter
|
|
29
|
+
from rucio.daemons.common import HeartbeatHandler, run_daemon
|
|
31
30
|
|
|
32
31
|
if TYPE_CHECKING:
|
|
33
32
|
from types import FrameType
|
|
@@ -37,7 +36,10 @@ graceful_stop = threading.Event()
|
|
|
37
36
|
DAEMON_NAME = 'abacus-account'
|
|
38
37
|
|
|
39
38
|
|
|
40
|
-
def account_update(
|
|
39
|
+
def account_update(
|
|
40
|
+
once: bool = False,
|
|
41
|
+
sleep_time: int = 10
|
|
42
|
+
) -> None:
|
|
41
43
|
"""
|
|
42
44
|
Main loop to check and update the Account Counters.
|
|
43
45
|
"""
|
|
@@ -51,26 +53,29 @@ def account_update(once=False, sleep_time=10):
|
|
|
51
53
|
)
|
|
52
54
|
|
|
53
55
|
|
|
54
|
-
def run_once(
|
|
56
|
+
def run_once(
|
|
57
|
+
heartbeat_handler: HeartbeatHandler,
|
|
58
|
+
**_kwargs
|
|
59
|
+
) -> None:
|
|
55
60
|
worker_number, total_workers, logger = heartbeat_handler.live()
|
|
56
61
|
|
|
57
62
|
start = time.time() # NOQA
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
logger(logging.DEBUG, 'Index query time %f size=%d' % (time.time() - start, len(
|
|
63
|
+
updated_account_counters = get_updated_account_counters(total_workers=total_workers,
|
|
64
|
+
worker_number=worker_number)
|
|
65
|
+
logger(logging.DEBUG, 'Index query time %f size=%d' % (time.time() - start, len(updated_account_counters)))
|
|
61
66
|
|
|
62
67
|
# If the list is empty, sent the worker to sleep
|
|
63
|
-
if not
|
|
68
|
+
if not updated_account_counters:
|
|
64
69
|
logger(logging.INFO, 'did not get any work')
|
|
65
70
|
return
|
|
66
71
|
|
|
67
|
-
for
|
|
72
|
+
for account_counter in updated_account_counters:
|
|
68
73
|
worker_number, total_workers, logger = heartbeat_handler.live()
|
|
69
74
|
if graceful_stop.is_set():
|
|
70
75
|
break
|
|
71
76
|
start_time = time.time()
|
|
72
|
-
update_account_counter(account=
|
|
73
|
-
logger(logging.DEBUG, 'update of account-rse counter "%s-%s" took %f' % (
|
|
77
|
+
update_account_counter(account=account_counter['account'], rse_id=account_counter['rse_id'])
|
|
78
|
+
logger(logging.DEBUG, 'update of account-rse counter "%s-%s" took %f' % (account_counter['account'], account_counter['rse_id'], time.time() - start_time))
|
|
74
79
|
|
|
75
80
|
|
|
76
81
|
def stop(signum: "Optional[int]" = None, frame: "Optional[FrameType]" = None) -> None:
|
|
@@ -81,7 +86,12 @@ def stop(signum: "Optional[int]" = None, frame: "Optional[FrameType]" = None) ->
|
|
|
81
86
|
graceful_stop.set()
|
|
82
87
|
|
|
83
88
|
|
|
84
|
-
def run(
|
|
89
|
+
def run(
|
|
90
|
+
once: bool = False,
|
|
91
|
+
threads: int = 1,
|
|
92
|
+
fill_history_table: bool = False,
|
|
93
|
+
sleep_time: int = 10
|
|
94
|
+
) -> None:
|
|
85
95
|
"""
|
|
86
96
|
Starts up the Abacus-Account threads.
|
|
87
97
|
"""
|
|
@@ -95,12 +105,12 @@ def run(once=False, threads=1, fill_history_table=False, sleep_time=10):
|
|
|
95
105
|
account_update(once)
|
|
96
106
|
else:
|
|
97
107
|
logging.info('main: starting threads')
|
|
98
|
-
|
|
99
|
-
|
|
108
|
+
thread_list = [threading.Thread(target=account_update, kwargs={'once': once, 'sleep_time': sleep_time}) for i in
|
|
109
|
+
range(0, threads)]
|
|
100
110
|
if fill_history_table:
|
|
101
|
-
|
|
102
|
-
[t.start() for t in
|
|
111
|
+
thread_list.append(get_thread_with_periodic_running_function(3600, fill_account_counter_history_table, graceful_stop))
|
|
112
|
+
[t.start() for t in thread_list]
|
|
103
113
|
logging.info('main: waiting for interrupts')
|
|
104
114
|
# Interruptible joins require a timeout.
|
|
105
|
-
while
|
|
106
|
-
[t.join(timeout=3.14) for t in
|
|
115
|
+
while thread_list[0].is_alive():
|
|
116
|
+
[t.join(timeout=3.14) for t in thread_list]
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -26,7 +25,7 @@ import rucio.db.sqla.util
|
|
|
26
25
|
from rucio.common import exception
|
|
27
26
|
from rucio.common.logging import setup_logging
|
|
28
27
|
from rucio.core.replica import get_cleaned_updated_collection_replicas, update_collection_replica
|
|
29
|
-
from rucio.daemons.common import run_daemon
|
|
28
|
+
from rucio.daemons.common import HeartbeatHandler, run_daemon
|
|
30
29
|
|
|
31
30
|
if TYPE_CHECKING:
|
|
32
31
|
from types import FrameType
|
|
@@ -36,7 +35,11 @@ graceful_stop = threading.Event()
|
|
|
36
35
|
DAEMON_NAME = 'abacus-collection-replica'
|
|
37
36
|
|
|
38
37
|
|
|
39
|
-
def collection_replica_update(
|
|
38
|
+
def collection_replica_update(
|
|
39
|
+
once: bool = False,
|
|
40
|
+
limit: int = 1000,
|
|
41
|
+
sleep_time: int = 10
|
|
42
|
+
) -> None:
|
|
40
43
|
"""
|
|
41
44
|
Main loop to check and update the collection replicas.
|
|
42
45
|
"""
|
|
@@ -53,7 +56,11 @@ def collection_replica_update(once=False, limit=1000, sleep_time=10):
|
|
|
53
56
|
)
|
|
54
57
|
|
|
55
58
|
|
|
56
|
-
def run_once(
|
|
59
|
+
def run_once(
|
|
60
|
+
heartbeat_handler: HeartbeatHandler,
|
|
61
|
+
limit: int,
|
|
62
|
+
**_kwargs
|
|
63
|
+
) -> bool:
|
|
57
64
|
worker_number, total_workers, logger = heartbeat_handler.live()
|
|
58
65
|
# Select a bunch of collection replicas for to update for this worker
|
|
59
66
|
start = time.time() # NOQA
|
|
@@ -90,7 +97,11 @@ def stop(signum: "Optional[int]" = None, frame: "Optional[FrameType]" = None) ->
|
|
|
90
97
|
graceful_stop.set()
|
|
91
98
|
|
|
92
99
|
|
|
93
|
-
def run(
|
|
100
|
+
def run(
|
|
101
|
+
once: bool = False,
|
|
102
|
+
threads: int = 1,
|
|
103
|
+
sleep_time: int = 10,
|
|
104
|
+
limit: int = 1000):
|
|
94
105
|
"""
|
|
95
106
|
Starts up the Abacus-Collection-Replica threads.
|
|
96
107
|
"""
|
|
@@ -104,10 +115,10 @@ def run(once=False, threads=1, sleep_time=10, limit=1000):
|
|
|
104
115
|
collection_replica_update(once)
|
|
105
116
|
else:
|
|
106
117
|
logging.info('main: starting threads')
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
[t.start() for t in
|
|
118
|
+
thread_list = [threading.Thread(target=collection_replica_update, kwargs={'once': once, 'sleep_time': sleep_time, 'limit': limit})
|
|
119
|
+
for _ in range(0, threads)]
|
|
120
|
+
[t.start() for t in thread_list]
|
|
110
121
|
logging.info('main: waiting for interrupts')
|
|
111
122
|
# Interruptible joins require a timeout.
|
|
112
|
-
while
|
|
113
|
-
[t.join(timeout=3.14) for t in
|
|
123
|
+
while thread_list[0].is_alive():
|
|
124
|
+
[t.join(timeout=3.14) for t in thread_list]
|
rucio/daemons/abacus/rse.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -26,8 +25,8 @@ import rucio.db.sqla.util
|
|
|
26
25
|
from rucio.common import exception
|
|
27
26
|
from rucio.common.logging import setup_logging
|
|
28
27
|
from rucio.common.utils import get_thread_with_periodic_running_function
|
|
29
|
-
from rucio.core.rse_counter import get_updated_rse_counters, update_rse_counter
|
|
30
|
-
from rucio.daemons.common import run_daemon
|
|
28
|
+
from rucio.core.rse_counter import fill_rse_counter_history_table, get_updated_rse_counters, update_rse_counter
|
|
29
|
+
from rucio.daemons.common import HeartbeatHandler, run_daemon
|
|
31
30
|
|
|
32
31
|
if TYPE_CHECKING:
|
|
33
32
|
from types import FrameType
|
|
@@ -37,7 +36,10 @@ graceful_stop = threading.Event()
|
|
|
37
36
|
DAEMON_NAME = 'abacus-rse'
|
|
38
37
|
|
|
39
38
|
|
|
40
|
-
def rse_update(
|
|
39
|
+
def rse_update(
|
|
40
|
+
once: bool = False,
|
|
41
|
+
sleep_time: int = 10
|
|
42
|
+
) -> None:
|
|
41
43
|
"""
|
|
42
44
|
Main loop to check and update the RSE Counters.
|
|
43
45
|
"""
|
|
@@ -51,7 +53,10 @@ def rse_update(once=False, sleep_time=10):
|
|
|
51
53
|
)
|
|
52
54
|
|
|
53
55
|
|
|
54
|
-
def run_once(
|
|
56
|
+
def run_once(
|
|
57
|
+
heartbeat_handler: HeartbeatHandler,
|
|
58
|
+
**_kwargs
|
|
59
|
+
) -> None:
|
|
55
60
|
worker_number, total_workers, logger = heartbeat_handler.live()
|
|
56
61
|
|
|
57
62
|
# Select a bunch of rses for to update for this worker
|
|
@@ -82,7 +87,12 @@ def stop(signum: "Optional[int]" = None, frame: "Optional[FrameType]" = None) ->
|
|
|
82
87
|
graceful_stop.set()
|
|
83
88
|
|
|
84
89
|
|
|
85
|
-
def run(
|
|
90
|
+
def run(
|
|
91
|
+
once: bool = False,
|
|
92
|
+
threads: int = 1,
|
|
93
|
+
fill_history_table: bool = False,
|
|
94
|
+
sleep_time: int = 10
|
|
95
|
+
) -> None:
|
|
86
96
|
"""
|
|
87
97
|
Starts up the Abacus-RSE threads.
|
|
88
98
|
"""
|
|
@@ -96,12 +106,12 @@ def run(once=False, threads=1, fill_history_table=False, sleep_time=10):
|
|
|
96
106
|
rse_update(once)
|
|
97
107
|
else:
|
|
98
108
|
logging.info('main: starting threads')
|
|
99
|
-
|
|
100
|
-
|
|
109
|
+
thread_list = [threading.Thread(target=rse_update, kwargs={'once': once, 'sleep_time': sleep_time}) for i in
|
|
110
|
+
range(0, threads)]
|
|
101
111
|
if fill_history_table:
|
|
102
|
-
|
|
103
|
-
[t.start() for t in
|
|
112
|
+
thread_list.append(get_thread_with_periodic_running_function(3600, fill_rse_counter_history_table, graceful_stop))
|
|
113
|
+
[t.start() for t in thread_list]
|
|
104
114
|
logging.info('main: waiting for interrupts')
|
|
105
115
|
# Interruptible joins require a timeout.
|
|
106
|
-
while
|
|
107
|
-
[t.join(timeout=3.14) for t in
|
|
116
|
+
while thread_list[0].is_alive():
|
|
117
|
+
[t.join(timeout=3.14) for t in thread_list]
|
rucio/daemons/atropos/atropos.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -110,7 +109,7 @@ def run_once(
|
|
|
110
109
|
lifetime_exceptions[key] = excep['expires_at']
|
|
111
110
|
logger(logging.DEBUG, '%d active exceptions', len(lifetime_exceptions))
|
|
112
111
|
|
|
113
|
-
rand = random.Random(worker_number)
|
|
112
|
+
rand = random.Random(worker_number) # noqa: S311
|
|
114
113
|
|
|
115
114
|
try:
|
|
116
115
|
rules = get_rules_beyond_eol(date_check, worker_number, total_workers, session=None)
|