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
|
@@ -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");
|
|
@@ -17,19 +16,25 @@
|
|
|
17
16
|
Mock DID collector
|
|
18
17
|
"""
|
|
19
18
|
|
|
20
|
-
from
|
|
19
|
+
from secrets import choice
|
|
20
|
+
from typing import TYPE_CHECKING
|
|
21
21
|
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from multiprocessing import Queue
|
|
22
24
|
|
|
23
|
-
|
|
25
|
+
from _typeshed import FileDescriptorOrPath
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class MockDIDCollector:
|
|
24
29
|
"""
|
|
25
30
|
Simple collector that reads dids from a file. Used to
|
|
26
31
|
test the interface.
|
|
27
32
|
"""
|
|
28
|
-
def __init__(self, queue):
|
|
33
|
+
def __init__(self, queue: "Queue"):
|
|
29
34
|
self._queue = queue
|
|
30
35
|
self._read_file('/opt/rucio/etc/dids_mc15_13TeV.csv')
|
|
31
36
|
|
|
32
|
-
def _read_file(self, infile):
|
|
37
|
+
def _read_file(self, infile: "FileDescriptorOrPath") -> None:
|
|
33
38
|
dids = []
|
|
34
39
|
with open(infile, 'r') as f:
|
|
35
40
|
f.readline()
|
|
@@ -41,6 +46,6 @@ class MockDIDCollector(object):
|
|
|
41
46
|
|
|
42
47
|
self._dids = tuple(dids)
|
|
43
48
|
|
|
44
|
-
def get_dids(self):
|
|
49
|
+
def get_dids(self) -> None:
|
|
45
50
|
did = choice(self._dids)
|
|
46
51
|
self._queue.put(did)
|
|
@@ -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,14 @@
|
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
16
15
|
from json import loads
|
|
16
|
+
from typing import Optional
|
|
17
17
|
|
|
18
18
|
from redis import StrictRedis
|
|
19
19
|
|
|
20
20
|
from rucio.common.config import config_get, config_get_int
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
class NetworkMetricsCollector
|
|
23
|
+
class NetworkMetricsCollector:
|
|
24
24
|
"""
|
|
25
25
|
Collector to get the bandwidth metrics between two sites.
|
|
26
26
|
"""
|
|
@@ -29,7 +29,11 @@ class NetworkMetricsCollector(object):
|
|
|
29
29
|
self._r = StrictRedis(host=config_get('c3po-network-metrics', 'redis_host'), port=config_get_int('c3po-network-metrics', 'redis_port'))
|
|
30
30
|
self._prefix = config_get('c3po-network-metrics', 'prefix')
|
|
31
31
|
|
|
32
|
-
def getMbps(
|
|
32
|
+
def getMbps(
|
|
33
|
+
self,
|
|
34
|
+
src: str,
|
|
35
|
+
type_: str
|
|
36
|
+
) -> Optional[dict[str, float]]:
|
|
33
37
|
pattern = "%s#%s:*" % (self._prefix, src)
|
|
34
38
|
keys = self._r.keys(pattern=pattern)
|
|
35
39
|
if len(keys) == 0:
|
|
@@ -52,7 +56,11 @@ class NetworkMetricsCollector(object):
|
|
|
52
56
|
|
|
53
57
|
return ret
|
|
54
58
|
|
|
55
|
-
def getQueuedFiles(
|
|
59
|
+
def getQueuedFiles(
|
|
60
|
+
self,
|
|
61
|
+
src: str,
|
|
62
|
+
dst: str
|
|
63
|
+
) -> int:
|
|
56
64
|
key = "%s#%s:%s" % (self._prefix, src, dst)
|
|
57
65
|
activities = loads(self._r.get(key)).get('files', {}).get('queued', {}).get('total', {})
|
|
58
66
|
|
|
@@ -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");
|
|
@@ -27,17 +26,20 @@ from rucio.common.config import config_get, config_get_int
|
|
|
27
26
|
from rucio.daemons.c3po.utils.timeseries import RedisTimeSeries
|
|
28
27
|
|
|
29
28
|
|
|
30
|
-
class WorkloadCollector
|
|
29
|
+
class WorkloadCollector:
|
|
31
30
|
"""
|
|
32
31
|
Collector to retrieve the workload from PanDA. It stores it as a time series in Redis and provides
|
|
33
32
|
the average and maximum number of running jobs for a sliding window.
|
|
34
33
|
"""
|
|
35
34
|
|
|
36
|
-
class __WorkloadCollector
|
|
35
|
+
class __WorkloadCollector:
|
|
37
36
|
"""
|
|
38
37
|
Private class needed implement singleton.
|
|
39
38
|
"""
|
|
40
|
-
def __init__(
|
|
39
|
+
def __init__(
|
|
40
|
+
self,
|
|
41
|
+
delete_keys: bool = False
|
|
42
|
+
):
|
|
41
43
|
self._avg_jobs = {}
|
|
42
44
|
self._cur_jobs = {}
|
|
43
45
|
self._max_jobs = {}
|
|
@@ -49,7 +51,7 @@ class WorkloadCollector(object):
|
|
|
49
51
|
self._tms.delete_keys()
|
|
50
52
|
self.reload_cache()
|
|
51
53
|
|
|
52
|
-
def reload_cache(self):
|
|
54
|
+
def reload_cache(self) -> None:
|
|
53
55
|
self._tms.trim()
|
|
54
56
|
|
|
55
57
|
for key in self._tms.get_keys():
|
|
@@ -61,7 +63,7 @@ class WorkloadCollector(object):
|
|
|
61
63
|
self._max_jobs[site] = max(job_series)
|
|
62
64
|
self._cur_jobs[site] = job_series[-1]
|
|
63
65
|
|
|
64
|
-
def collect_workload(self):
|
|
66
|
+
def collect_workload(self) -> None:
|
|
65
67
|
start = time()
|
|
66
68
|
resp = get(self._request_url, headers=self._request_headers)
|
|
67
69
|
logging.debug("PanDA response took %fs" % (time() - start))
|
|
@@ -88,23 +90,23 @@ class WorkloadCollector(object):
|
|
|
88
90
|
if not WorkloadCollector.instance:
|
|
89
91
|
WorkloadCollector.instance = WorkloadCollector.__WorkloadCollector()
|
|
90
92
|
|
|
91
|
-
def get_avg_jobs(self, site):
|
|
92
|
-
return self.instance._avg_jobs[site]
|
|
93
|
+
def get_avg_jobs(self, site: str) -> float:
|
|
94
|
+
return self.instance._avg_jobs[site] # type: ignore
|
|
93
95
|
|
|
94
|
-
def get_max_jobs(self, site):
|
|
95
|
-
return self.instance._max_jobs[site]
|
|
96
|
+
def get_max_jobs(self, site: str) -> int:
|
|
97
|
+
return self.instance._max_jobs[site] # type: ignore
|
|
96
98
|
|
|
97
|
-
def get_cur_jobs(self, site):
|
|
98
|
-
return self.instance._cur_jobs[site]
|
|
99
|
+
def get_cur_jobs(self, site: str) -> int:
|
|
100
|
+
return self.instance._cur_jobs[site] # type: ignore
|
|
99
101
|
|
|
100
|
-
def get_sites(self):
|
|
101
|
-
return list(self.instance._avg_jobs.keys())
|
|
102
|
+
def get_sites(self) -> list[str]:
|
|
103
|
+
return list(self.instance._avg_jobs.keys()) # type: ignore
|
|
102
104
|
|
|
103
|
-
def get_job_info(self, site):
|
|
105
|
+
def get_job_info(self, site: str) -> tuple[int, float, int]:
|
|
104
106
|
return (self.get_cur_jobs(site), self.get_avg_jobs(site), self.get_max_jobs(site))
|
|
105
107
|
|
|
106
|
-
def get_series(self, site):
|
|
107
|
-
return self.instance._tms.get_series(site)
|
|
108
|
+
def get_series(self, site: str) -> tuple[int]:
|
|
109
|
+
return self.instance._tms.get_series(site) # type: ignore
|
|
108
110
|
|
|
109
|
-
def collect_workload(self):
|
|
110
|
-
self.instance.collect_workload()
|
|
111
|
+
def collect_workload(self) -> None:
|
|
112
|
+
self.instance.collect_workload() # type: ignore
|
|
@@ -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,26 +12,37 @@
|
|
|
13
12
|
# See the License for the specific language governing permissions and
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
15
|
+
from typing import TYPE_CHECKING
|
|
16
16
|
from uuid import uuid4
|
|
17
17
|
|
|
18
18
|
from rucio.daemons.c3po.utils.timeseries import RedisTimeSeries
|
|
19
19
|
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from rucio.common.types import InternalScope
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
|
|
24
|
+
class DatasetCache:
|
|
22
25
|
"""
|
|
23
26
|
Utility to count the accesses of the datasets during the last day.
|
|
24
27
|
"""
|
|
25
|
-
def __init__(
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
redis_host: str,
|
|
31
|
+
redis_port: int,
|
|
32
|
+
timeout: int = 1,
|
|
33
|
+
prefix: str = 'did_cache',
|
|
34
|
+
delete_keys: bool = False
|
|
35
|
+
):
|
|
26
36
|
self._prefix = prefix + '_' + str(uuid4()).split('-')[0]
|
|
27
37
|
self._tms = RedisTimeSeries(redis_host, redis_port, timeout, self._prefix)
|
|
28
38
|
|
|
29
39
|
if delete_keys:
|
|
30
40
|
self._tms.delete_keys()
|
|
31
41
|
|
|
32
|
-
def add_did(self, did):
|
|
42
|
+
def add_did(self, did: tuple['InternalScope', str]) -> None:
|
|
33
43
|
self._tms.add_point('{}_{}'.format(did[0].internal, did[1]), 1)
|
|
34
44
|
|
|
35
|
-
def get_did(self, did):
|
|
45
|
+
def get_did(self, did: tuple['InternalScope', str]) -> int:
|
|
36
46
|
self._tms.trim()
|
|
37
47
|
|
|
38
48
|
series = self._tms.get_series('{}_{}'.format(did[0].internal, did[1]))
|
|
@@ -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");
|
|
@@ -21,22 +20,34 @@ from uuid import uuid4
|
|
|
21
20
|
from redis import StrictRedis
|
|
22
21
|
|
|
23
22
|
|
|
24
|
-
class ExpiringDatasetCache
|
|
23
|
+
class ExpiringDatasetCache:
|
|
25
24
|
"""
|
|
26
25
|
Cache with expiring values to keep track of recently created replicas.
|
|
27
26
|
"""
|
|
28
|
-
def __init__(
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
redis_host: str,
|
|
30
|
+
redis_port: int,
|
|
31
|
+
timeout: int = 1,
|
|
32
|
+
prefix: str = 'expiring_did_cache'
|
|
33
|
+
):
|
|
29
34
|
self._redis = StrictRedis(host=redis_host, port=redis_port)
|
|
30
35
|
self._prefix = prefix + '_' + str(uuid4()).split('-')[0]
|
|
31
36
|
self._timeout = timeout
|
|
32
37
|
|
|
33
|
-
def add_dataset(
|
|
38
|
+
def add_dataset(
|
|
39
|
+
self,
|
|
40
|
+
dataset: str
|
|
41
|
+
) -> None:
|
|
34
42
|
""" Adds a datasets to cache with lifetime """
|
|
35
43
|
key = ':'.join((self._prefix, dataset))
|
|
36
44
|
self._redis.set(key, 1)
|
|
37
45
|
self._redis.expire(key, self._timeout)
|
|
38
46
|
|
|
39
|
-
def check_dataset(
|
|
47
|
+
def check_dataset(
|
|
48
|
+
self,
|
|
49
|
+
dataset: str
|
|
50
|
+
) -> bool:
|
|
40
51
|
""" Checks if dataset is still in cache """
|
|
41
52
|
key = ':'.join((self._prefix, dataset))
|
|
42
53
|
if self._redis.get(key) is None:
|
|
@@ -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");
|
|
@@ -21,12 +20,12 @@ from collections import deque
|
|
|
21
20
|
from threading import Lock, Timer
|
|
22
21
|
|
|
23
22
|
|
|
24
|
-
class ExpiringList
|
|
23
|
+
class ExpiringList:
|
|
25
24
|
"""
|
|
26
25
|
Simple list with time based element expiration
|
|
27
26
|
"""
|
|
28
27
|
|
|
29
|
-
def __init__(self, timeout=1):
|
|
28
|
+
def __init__(self, timeout: int = 1):
|
|
30
29
|
self._lock = Lock()
|
|
31
30
|
self._timeout = timeout
|
|
32
31
|
self._items = deque()
|
|
@@ -38,26 +37,26 @@ class ExpiringList(object):
|
|
|
38
37
|
self._items.append(item)
|
|
39
38
|
Timer(self._timeout, self._expire).start()
|
|
40
39
|
|
|
41
|
-
def __len__(self):
|
|
40
|
+
def __len__(self) -> int:
|
|
42
41
|
"""
|
|
43
42
|
Return number of active events
|
|
44
43
|
"""
|
|
45
44
|
with self._lock:
|
|
46
45
|
return len(self._items)
|
|
47
46
|
|
|
48
|
-
def _expire(self):
|
|
47
|
+
def _expire(self) -> None:
|
|
49
48
|
"""
|
|
50
49
|
Remove any expired events
|
|
51
50
|
"""
|
|
52
51
|
with self._lock:
|
|
53
52
|
self._items.popleft()
|
|
54
53
|
|
|
55
|
-
def to_set(self):
|
|
54
|
+
def to_set(self) -> set:
|
|
56
55
|
"""
|
|
57
56
|
Return items as a set
|
|
58
57
|
"""
|
|
59
58
|
return set(self._items)
|
|
60
59
|
|
|
61
|
-
def __str__(self):
|
|
60
|
+
def __str__(self) -> str:
|
|
62
61
|
with self._lock:
|
|
63
62
|
return str(self._items)
|
|
@@ -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");
|
|
@@ -15,12 +14,16 @@
|
|
|
15
14
|
|
|
16
15
|
import logging
|
|
17
16
|
from json import dumps, loads
|
|
17
|
+
from typing import TYPE_CHECKING, Optional
|
|
18
18
|
|
|
19
19
|
from requests import post
|
|
20
20
|
from requests.auth import HTTPBasicAuth
|
|
21
21
|
|
|
22
22
|
from rucio.common.config import config_get, config_get_options
|
|
23
23
|
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from rucio.common.types import InternalScope
|
|
26
|
+
|
|
24
27
|
ELASTIC_URL = config_get('es-atlas', 'url')
|
|
25
28
|
|
|
26
29
|
ELASTIC_OPTIONS = config_get_options('es-atlas')
|
|
@@ -37,7 +40,7 @@ else:
|
|
|
37
40
|
URL = ELASTIC_URL + '/atlas_rucio-popularity-*/_search'
|
|
38
41
|
|
|
39
42
|
|
|
40
|
-
def get_popularity(did):
|
|
43
|
+
def get_popularity(did: tuple['InternalScope', str]) -> Optional[int]:
|
|
41
44
|
"""
|
|
42
45
|
Query the popularity for a given DID in the ElasticSearch popularity db.
|
|
43
46
|
"""
|
|
@@ -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");
|
|
@@ -18,59 +17,73 @@ Redis time series abstraction
|
|
|
18
17
|
"""
|
|
19
18
|
|
|
20
19
|
from time import time
|
|
20
|
+
from typing import TYPE_CHECKING
|
|
21
21
|
|
|
22
22
|
from redis import StrictRedis
|
|
23
23
|
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from redis.commands.core import ResponseT
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
|
|
28
|
+
class RedisTimeSeries:
|
|
26
29
|
"""
|
|
27
30
|
Redis time series abstraction
|
|
28
31
|
"""
|
|
29
32
|
|
|
30
|
-
def __init__(
|
|
33
|
+
def __init__(
|
|
34
|
+
self,
|
|
35
|
+
redis_host: str,
|
|
36
|
+
redis_port: int,
|
|
37
|
+
window: int,
|
|
38
|
+
prefix: str
|
|
39
|
+
):
|
|
31
40
|
self._redis = StrictRedis(host=redis_host, port=redis_port)
|
|
32
41
|
self._prefix = prefix
|
|
33
42
|
self._window = window * 1000000
|
|
34
43
|
|
|
35
|
-
def add_point(
|
|
44
|
+
def add_point(
|
|
45
|
+
self,
|
|
46
|
+
key: str,
|
|
47
|
+
value: int
|
|
48
|
+
) -> None:
|
|
36
49
|
"""
|
|
37
50
|
Add a point
|
|
38
51
|
"""
|
|
39
52
|
r_key = self._prefix + key
|
|
40
53
|
score = int(time() * 1000000)
|
|
41
|
-
self._redis.zadd(r_key, score, "%d:%d" % (value, score))
|
|
54
|
+
self._redis.zadd(r_key, score, "%d:%d" % (value, score)) # type: ignore
|
|
42
55
|
|
|
43
|
-
def get_series(self, key):
|
|
56
|
+
def get_series(self, key: str) -> tuple[int]:
|
|
44
57
|
"""
|
|
45
58
|
Return a time series tuple
|
|
46
59
|
"""
|
|
47
60
|
r_key = self._prefix + key
|
|
48
61
|
r_series = self._redis.zrange(r_key, 0, -1)
|
|
49
62
|
series = []
|
|
50
|
-
for val in r_series:
|
|
63
|
+
for val in r_series: # type: ignore
|
|
51
64
|
values, _ = val.split(':')
|
|
52
65
|
series.append(int(values))
|
|
53
66
|
|
|
54
67
|
return tuple(series)
|
|
55
68
|
|
|
56
|
-
def trim(self):
|
|
69
|
+
def trim(self) -> None:
|
|
57
70
|
"""
|
|
58
71
|
Trim the time series
|
|
59
72
|
"""
|
|
60
73
|
now = time()
|
|
61
74
|
max_score = int(now * 1000000 - self._window)
|
|
62
|
-
for key in self.get_keys():
|
|
75
|
+
for key in self.get_keys(): # type: ignore
|
|
63
76
|
self._redis.zremrangebyscore(key, 0, max_score)
|
|
64
77
|
|
|
65
|
-
def get_keys(self):
|
|
78
|
+
def get_keys(self) -> "ResponseT":
|
|
66
79
|
"""
|
|
67
80
|
Return matching keys
|
|
68
81
|
"""
|
|
69
82
|
return self._redis.keys(pattern=self._prefix + "*")
|
|
70
83
|
|
|
71
|
-
def delete_keys(self):
|
|
84
|
+
def delete_keys(self) -> None:
|
|
72
85
|
"""
|
|
73
86
|
Delete keys
|
|
74
87
|
"""
|
|
75
|
-
for key in self.get_keys():
|
|
88
|
+
for key in self.get_keys(): # type: ignore
|
|
76
89
|
self._redis.zremrangebyrank(key, 0, -1)
|
rucio/daemons/cache/__init__.py
CHANGED
rucio/daemons/cache/consumer.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");
|
|
@@ -22,21 +21,23 @@ import logging
|
|
|
22
21
|
import threading
|
|
23
22
|
import time
|
|
24
23
|
from traceback import format_exc
|
|
25
|
-
from typing import TYPE_CHECKING
|
|
24
|
+
from typing import TYPE_CHECKING, Optional
|
|
26
25
|
|
|
27
26
|
import rucio.db.sqla.util
|
|
28
27
|
from rucio.common import exception
|
|
29
|
-
from rucio.common.config import config_get,
|
|
30
|
-
from rucio.common.logging import
|
|
28
|
+
from rucio.common.config import config_get, config_get_bool, config_get_int, config_get_list
|
|
29
|
+
from rucio.common.logging import formatted_logger, setup_logging
|
|
31
30
|
from rucio.common.stomp_utils import StompConnectionManager
|
|
32
|
-
from rucio.common.types import InternalScope
|
|
31
|
+
from rucio.common.types import InternalScope, LoggerFunction
|
|
33
32
|
from rucio.core.monitor import MetricManager
|
|
34
33
|
from rucio.core.rse import get_rse_id
|
|
35
34
|
from rucio.core.volatile_replica import add_volatile_replicas, delete_volatile_replicas
|
|
36
35
|
|
|
37
36
|
if TYPE_CHECKING:
|
|
38
37
|
from types import FrameType
|
|
39
|
-
|
|
38
|
+
|
|
39
|
+
from stomp import Connection
|
|
40
|
+
from stomp.utils import Frame
|
|
40
41
|
|
|
41
42
|
logging.getLogger("stomp").setLevel(logging.CRITICAL)
|
|
42
43
|
|
|
@@ -45,12 +46,17 @@ GRACEFUL_STOP = threading.Event()
|
|
|
45
46
|
DAEMON_NAME = 'cache-consumer'
|
|
46
47
|
|
|
47
48
|
|
|
48
|
-
class AMQConsumer
|
|
49
|
+
class AMQConsumer:
|
|
49
50
|
"""
|
|
50
51
|
class Consumer
|
|
51
52
|
"""
|
|
52
53
|
|
|
53
|
-
def __init__(
|
|
54
|
+
def __init__(
|
|
55
|
+
self,
|
|
56
|
+
broker: str,
|
|
57
|
+
conn: "Connection",
|
|
58
|
+
logger: "LoggerFunction"
|
|
59
|
+
):
|
|
54
60
|
"""
|
|
55
61
|
__init__
|
|
56
62
|
"""
|
|
@@ -59,23 +65,23 @@ class AMQConsumer(object):
|
|
|
59
65
|
self.__logger = logger
|
|
60
66
|
|
|
61
67
|
@METRICS.count_it
|
|
62
|
-
def on_heartbeat_timeout(self):
|
|
68
|
+
def on_heartbeat_timeout(self) -> None:
|
|
63
69
|
self.__conn.disconnect()
|
|
64
70
|
|
|
65
71
|
@METRICS.count_it
|
|
66
|
-
def on_error(self, frame):
|
|
72
|
+
def on_error(self, frame: "Frame") -> None:
|
|
67
73
|
"""
|
|
68
74
|
on_error
|
|
69
75
|
"""
|
|
70
76
|
self.__logger(logging.ERROR, 'Message receive error: [%s] %s' % (self.__broker, frame.body))
|
|
71
77
|
|
|
72
78
|
@METRICS.count_it
|
|
73
|
-
def on_message(self, frame):
|
|
79
|
+
def on_message(self, frame: "Frame") -> None:
|
|
74
80
|
"""
|
|
75
81
|
on_message
|
|
76
82
|
"""
|
|
77
83
|
try:
|
|
78
|
-
msg = json.loads(frame.body)
|
|
84
|
+
msg = json.loads(frame.body) # type: ignore
|
|
79
85
|
self.__logger(logging.DEBUG, 'Message received: %s ' % msg)
|
|
80
86
|
if isinstance(msg, dict) and 'operation' in msg.keys():
|
|
81
87
|
for f in msg['files']:
|
|
@@ -101,7 +107,7 @@ class AMQConsumer(object):
|
|
|
101
107
|
self.__logger(logging.ERROR, str(format_exc()))
|
|
102
108
|
|
|
103
109
|
|
|
104
|
-
def consumer(id_, num_thread=1):
|
|
110
|
+
def consumer(id_: int, num_thread: int = 1) -> None:
|
|
105
111
|
"""
|
|
106
112
|
Main loop to consume messages from the Rucio Cache producer.
|
|
107
113
|
"""
|
|
@@ -161,7 +167,7 @@ def consumer(id_, num_thread=1):
|
|
|
161
167
|
logger(logging.INFO, 'graceful stop done')
|
|
162
168
|
|
|
163
169
|
|
|
164
|
-
def stop(signum:
|
|
170
|
+
def stop(signum: Optional[int] = None, frame: Optional["FrameType"] = None) -> None:
|
|
165
171
|
"""
|
|
166
172
|
Graceful exit.
|
|
167
173
|
"""
|
|
@@ -169,7 +175,7 @@ def stop(signum: "Optional[int]" = None, frame: "Optional[FrameType]" = None) ->
|
|
|
169
175
|
GRACEFUL_STOP.set()
|
|
170
176
|
|
|
171
177
|
|
|
172
|
-
def run(num_thread=1):
|
|
178
|
+
def run(num_thread: int = 1) -> None:
|
|
173
179
|
"""
|
|
174
180
|
Starts up the rucio cache consumer thread
|
|
175
181
|
"""
|