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/__init__.py
CHANGED
rucio/core/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");
|
|
@@ -17,9 +16,9 @@ from datetime import datetime
|
|
|
17
16
|
from enum import Enum
|
|
18
17
|
from re import match
|
|
19
18
|
from traceback import format_exc
|
|
20
|
-
from typing import TYPE_CHECKING
|
|
19
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
21
20
|
|
|
22
|
-
from sqlalchemy import
|
|
21
|
+
from sqlalchemy import and_, select
|
|
23
22
|
from sqlalchemy.exc import IntegrityError
|
|
24
23
|
from sqlalchemy.orm import exc
|
|
25
24
|
|
|
@@ -30,14 +29,24 @@ from rucio.common.config import config_get_bool
|
|
|
30
29
|
from rucio.core.vo import vo_exists
|
|
31
30
|
from rucio.db.sqla import models
|
|
32
31
|
from rucio.db.sqla.constants import AccountStatus, AccountType
|
|
33
|
-
from rucio.db.sqla.session import read_session,
|
|
32
|
+
from rucio.db.sqla.session import read_session, stream_session, transactional_session
|
|
34
33
|
|
|
35
34
|
if TYPE_CHECKING:
|
|
35
|
+
from collections.abc import Iterator, Mapping
|
|
36
|
+
|
|
36
37
|
from sqlalchemy.orm import Session
|
|
37
38
|
|
|
39
|
+
from rucio.common.types import AccountAttributesDict, AccountDict, AccountUsageModelDict, IdentityDict, InternalAccount, UsageDict
|
|
40
|
+
|
|
38
41
|
|
|
39
42
|
@transactional_session
|
|
40
|
-
def add_account(
|
|
43
|
+
def add_account(
|
|
44
|
+
account: "InternalAccount",
|
|
45
|
+
type_: AccountType,
|
|
46
|
+
email: str,
|
|
47
|
+
*,
|
|
48
|
+
session: "Session"
|
|
49
|
+
) -> None:
|
|
41
50
|
""" Add an account with the given account name and type.
|
|
42
51
|
|
|
43
52
|
:param account: the name of the new account.
|
|
@@ -63,7 +72,11 @@ def add_account(account, type_, email, *, session: "Session"):
|
|
|
63
72
|
|
|
64
73
|
|
|
65
74
|
@read_session
|
|
66
|
-
def account_exists(
|
|
75
|
+
def account_exists(
|
|
76
|
+
account: "InternalAccount",
|
|
77
|
+
*,
|
|
78
|
+
session: "Session"
|
|
79
|
+
) -> bool:
|
|
67
80
|
""" Checks to see if account exists and is active.
|
|
68
81
|
|
|
69
82
|
:param account: Name of the account.
|
|
@@ -81,7 +94,11 @@ def account_exists(account, *, session: "Session"):
|
|
|
81
94
|
|
|
82
95
|
|
|
83
96
|
@read_session
|
|
84
|
-
def get_account(
|
|
97
|
+
def get_account(
|
|
98
|
+
account: "InternalAccount",
|
|
99
|
+
*,
|
|
100
|
+
session: "Session"
|
|
101
|
+
) -> models.Account:
|
|
85
102
|
""" Returns an account for the given account name.
|
|
86
103
|
|
|
87
104
|
:param account: the name of the account.
|
|
@@ -102,7 +119,11 @@ def get_account(account, *, session: "Session"):
|
|
|
102
119
|
|
|
103
120
|
|
|
104
121
|
@transactional_session
|
|
105
|
-
def del_account(
|
|
122
|
+
def del_account(
|
|
123
|
+
account: "InternalAccount",
|
|
124
|
+
*,
|
|
125
|
+
session: "Session"
|
|
126
|
+
) -> None:
|
|
106
127
|
""" Disable an account with the given account name.
|
|
107
128
|
|
|
108
129
|
:param account: the account name.
|
|
@@ -115,15 +136,21 @@ def del_account(account, *, session: "Session"):
|
|
|
115
136
|
models.Account.status == AccountStatus.ACTIVE
|
|
116
137
|
)
|
|
117
138
|
try:
|
|
118
|
-
|
|
139
|
+
query_result = session.execute(query).scalar_one()
|
|
119
140
|
except exc.NoResultFound:
|
|
120
141
|
raise exception.AccountNotFound('Account with ID \'%s\' cannot be found' % account)
|
|
121
142
|
|
|
122
|
-
|
|
143
|
+
query_result.update({'status': AccountStatus.DELETED, 'deleted_at': datetime.utcnow()})
|
|
123
144
|
|
|
124
145
|
|
|
125
146
|
@transactional_session
|
|
126
|
-
def update_account(
|
|
147
|
+
def update_account(
|
|
148
|
+
account: "InternalAccount",
|
|
149
|
+
key: str,
|
|
150
|
+
value: Any,
|
|
151
|
+
*,
|
|
152
|
+
session: "Session"
|
|
153
|
+
) -> None:
|
|
127
154
|
""" Update a property of an account.
|
|
128
155
|
|
|
129
156
|
:param account: Name of the account.
|
|
@@ -137,22 +164,26 @@ def update_account(account, key, value, *, session: "Session"):
|
|
|
137
164
|
models.Account.account == account
|
|
138
165
|
)
|
|
139
166
|
try:
|
|
140
|
-
|
|
167
|
+
query_result = session.execute(query).scalar_one()
|
|
141
168
|
except exc.NoResultFound:
|
|
142
169
|
raise exception.AccountNotFound('Account with ID \'%s\' cannot be found' % account)
|
|
143
170
|
if key == 'status':
|
|
144
171
|
if isinstance(value, str):
|
|
145
172
|
value = AccountStatus[value]
|
|
146
173
|
if value == AccountStatus.SUSPENDED:
|
|
147
|
-
|
|
174
|
+
query_result.update({'status': value, 'suspended_at': datetime.utcnow()})
|
|
148
175
|
elif value == AccountStatus.ACTIVE:
|
|
149
|
-
|
|
176
|
+
query_result.update({'status': value, 'suspended_at': None})
|
|
150
177
|
else:
|
|
151
|
-
|
|
178
|
+
query_result.update({key: value})
|
|
152
179
|
|
|
153
180
|
|
|
154
181
|
@stream_session
|
|
155
|
-
def list_accounts(
|
|
182
|
+
def list_accounts(
|
|
183
|
+
filter_: Optional["Mapping[str, Any]"] = None,
|
|
184
|
+
*,
|
|
185
|
+
session: "Session"
|
|
186
|
+
) -> "Iterator[AccountDict]":
|
|
156
187
|
""" Returns a list of all account names.
|
|
157
188
|
|
|
158
189
|
:param filter_: Dictionary of attributes by which the input data should be filtered
|
|
@@ -213,7 +244,11 @@ def list_accounts(filter_=None, *, session: "Session"):
|
|
|
213
244
|
|
|
214
245
|
|
|
215
246
|
@read_session
|
|
216
|
-
def list_identities(
|
|
247
|
+
def list_identities(
|
|
248
|
+
account: "InternalAccount",
|
|
249
|
+
*,
|
|
250
|
+
session: "Session"
|
|
251
|
+
) -> list["IdentityDict"]:
|
|
217
252
|
"""
|
|
218
253
|
List all identities on an account.
|
|
219
254
|
|
|
@@ -244,11 +279,16 @@ def list_identities(account, *, session: "Session"):
|
|
|
244
279
|
).where(
|
|
245
280
|
models.IdentityAccountAssociation.account == account
|
|
246
281
|
)
|
|
247
|
-
|
|
282
|
+
|
|
283
|
+
return [row._asdict() for row in session.execute(query)] # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
248
284
|
|
|
249
285
|
|
|
250
286
|
@read_session
|
|
251
|
-
def list_account_attributes(
|
|
287
|
+
def list_account_attributes(
|
|
288
|
+
account: "InternalAccount",
|
|
289
|
+
*,
|
|
290
|
+
session: "Session"
|
|
291
|
+
) -> list["AccountAttributesDict"]:
|
|
252
292
|
"""
|
|
253
293
|
Get all attributes defined for an account.
|
|
254
294
|
|
|
@@ -274,11 +314,16 @@ def list_account_attributes(account, *, session: "Session"):
|
|
|
274
314
|
).where(
|
|
275
315
|
models.AccountAttrAssociation.account == account
|
|
276
316
|
)
|
|
277
|
-
return [row._asdict() for row in session.execute(query)]
|
|
317
|
+
return [row._asdict() for row in session.execute(query)] # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
278
318
|
|
|
279
319
|
|
|
280
320
|
@read_session
|
|
281
|
-
def has_account_attribute(
|
|
321
|
+
def has_account_attribute(
|
|
322
|
+
account: "InternalAccount",
|
|
323
|
+
key: str,
|
|
324
|
+
*,
|
|
325
|
+
session: "Session"
|
|
326
|
+
) -> bool:
|
|
282
327
|
"""
|
|
283
328
|
Indicates whether the named key is present for the account.
|
|
284
329
|
|
|
@@ -298,7 +343,13 @@ def has_account_attribute(account, key, *, session: "Session"):
|
|
|
298
343
|
|
|
299
344
|
|
|
300
345
|
@transactional_session
|
|
301
|
-
def add_account_attribute(
|
|
346
|
+
def add_account_attribute(
|
|
347
|
+
account: "InternalAccount",
|
|
348
|
+
key: str,
|
|
349
|
+
value: Any,
|
|
350
|
+
*,
|
|
351
|
+
session: "Session"
|
|
352
|
+
) -> None:
|
|
302
353
|
"""
|
|
303
354
|
Add an attribute for the given account name.
|
|
304
355
|
|
|
@@ -334,7 +385,12 @@ def add_account_attribute(account, key, value, *, session: "Session"):
|
|
|
334
385
|
|
|
335
386
|
|
|
336
387
|
@transactional_session
|
|
337
|
-
def del_account_attribute(
|
|
388
|
+
def del_account_attribute(
|
|
389
|
+
account: "InternalAccount",
|
|
390
|
+
key: str,
|
|
391
|
+
*,
|
|
392
|
+
session: "Session"
|
|
393
|
+
) -> None:
|
|
338
394
|
"""
|
|
339
395
|
Add an attribute for the given account name.
|
|
340
396
|
|
|
@@ -355,7 +411,12 @@ def del_account_attribute(account, key, *, session: "Session"):
|
|
|
355
411
|
|
|
356
412
|
|
|
357
413
|
@read_session
|
|
358
|
-
def get_usage(
|
|
414
|
+
def get_usage(
|
|
415
|
+
rse_id: str,
|
|
416
|
+
account: "InternalAccount",
|
|
417
|
+
*,
|
|
418
|
+
session: "Session"
|
|
419
|
+
) -> "UsageDict":
|
|
359
420
|
"""
|
|
360
421
|
Returns current values of the specified counter, or raises CounterNotFound if the counter does not exist.
|
|
361
422
|
|
|
@@ -373,13 +434,17 @@ def get_usage(rse_id, account, *, session: "Session"):
|
|
|
373
434
|
models.AccountUsage.account == account
|
|
374
435
|
)
|
|
375
436
|
try:
|
|
376
|
-
return session.execute(query).one()._asdict()
|
|
437
|
+
return session.execute(query).one()._asdict() # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
377
438
|
except exc.NoResultFound:
|
|
378
439
|
return {'bytes': 0, 'files': 0, 'updated_at': None}
|
|
379
440
|
|
|
380
441
|
|
|
381
442
|
@read_session
|
|
382
|
-
def get_all_rse_usages_per_account(
|
|
443
|
+
def get_all_rse_usages_per_account(
|
|
444
|
+
account: "InternalAccount",
|
|
445
|
+
*,
|
|
446
|
+
session: "Session"
|
|
447
|
+
) -> list["AccountUsageModelDict"]:
|
|
383
448
|
"""
|
|
384
449
|
Returns current values of the specified counter, or raises CounterNotFound if the counter does not exist.
|
|
385
450
|
|
|
@@ -394,13 +459,18 @@ def get_all_rse_usages_per_account(account, *, session: "Session"):
|
|
|
394
459
|
models.AccountUsage.account == account
|
|
395
460
|
)
|
|
396
461
|
try:
|
|
397
|
-
return [result.to_dict() for result in session.execute(query).scalars()]
|
|
462
|
+
return [result.to_dict() for result in session.execute(query).scalars()] # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
398
463
|
except exc.NoResultFound:
|
|
399
464
|
return []
|
|
400
465
|
|
|
401
466
|
|
|
402
467
|
@read_session
|
|
403
|
-
def get_usage_history(
|
|
468
|
+
def get_usage_history(
|
|
469
|
+
rse_id: str,
|
|
470
|
+
account: "InternalAccount",
|
|
471
|
+
*,
|
|
472
|
+
session: "Session"
|
|
473
|
+
) -> list["UsageDict"]:
|
|
404
474
|
"""
|
|
405
475
|
Returns historical values of the specified counter, or raises CounterNotFound if the counter does not exist.
|
|
406
476
|
|
|
@@ -420,7 +490,7 @@ def get_usage_history(rse_id, account, *, session: "Session"):
|
|
|
420
490
|
models.AccountUsageHistory.updated_at
|
|
421
491
|
)
|
|
422
492
|
try:
|
|
423
|
-
return [row._asdict() for row in session.execute(query)]
|
|
493
|
+
return [row._asdict() for row in session.execute(query)] # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
424
494
|
except exc.NoResultFound:
|
|
425
495
|
raise exception.CounterNotFound('No usage can be found for account %s on RSE %s' % (account, rucio.core.rse.get_rse_name(rse_id=rse_id, session=session)))
|
|
426
496
|
return []
|
rucio/core/account_counter.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");
|
|
@@ -15,20 +14,27 @@
|
|
|
15
14
|
import datetime
|
|
16
15
|
from typing import TYPE_CHECKING
|
|
17
16
|
|
|
18
|
-
from sqlalchemy import
|
|
19
|
-
from sqlalchemy.
|
|
17
|
+
from sqlalchemy import and_, delete, insert, literal, select
|
|
18
|
+
from sqlalchemy.exc import NoResultFound
|
|
20
19
|
|
|
21
|
-
from rucio.db.sqla import
|
|
20
|
+
from rucio.db.sqla import filter_thread_work, models
|
|
22
21
|
from rucio.db.sqla.session import read_session, transactional_session
|
|
23
22
|
|
|
24
23
|
if TYPE_CHECKING:
|
|
25
24
|
from sqlalchemy.orm import Session
|
|
26
25
|
|
|
26
|
+
from rucio.common.types import InternalAccount, RSEAccountCounterDict
|
|
27
|
+
|
|
27
28
|
MAX_COUNTERS = 10
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
@transactional_session
|
|
31
|
-
def add_counter(
|
|
32
|
+
def add_counter(
|
|
33
|
+
rse_id: str,
|
|
34
|
+
account: "InternalAccount",
|
|
35
|
+
*,
|
|
36
|
+
session: "Session"
|
|
37
|
+
) -> None:
|
|
32
38
|
"""
|
|
33
39
|
Creates the specified counter for a rse_id and account.
|
|
34
40
|
|
|
@@ -41,7 +47,14 @@ def add_counter(rse_id, account, *, session: "Session"):
|
|
|
41
47
|
|
|
42
48
|
|
|
43
49
|
@transactional_session
|
|
44
|
-
def increase(
|
|
50
|
+
def increase(
|
|
51
|
+
rse_id: str,
|
|
52
|
+
account: "InternalAccount",
|
|
53
|
+
files: int,
|
|
54
|
+
bytes_: int,
|
|
55
|
+
*,
|
|
56
|
+
session: "Session"
|
|
57
|
+
) -> None:
|
|
45
58
|
"""
|
|
46
59
|
Increments the specified counter by the specified amount.
|
|
47
60
|
|
|
@@ -55,7 +68,14 @@ def increase(rse_id, account, files, bytes_, *, session: "Session"):
|
|
|
55
68
|
|
|
56
69
|
|
|
57
70
|
@transactional_session
|
|
58
|
-
def decrease(
|
|
71
|
+
def decrease(
|
|
72
|
+
rse_id: str,
|
|
73
|
+
account: "InternalAccount",
|
|
74
|
+
files: int,
|
|
75
|
+
bytes_: int,
|
|
76
|
+
*,
|
|
77
|
+
session: "Session"
|
|
78
|
+
) -> None:
|
|
59
79
|
"""
|
|
60
80
|
Decreases the specified counter by the specified amount.
|
|
61
81
|
|
|
@@ -69,7 +89,12 @@ def decrease(rse_id, account, files, bytes_, *, session: "Session"):
|
|
|
69
89
|
|
|
70
90
|
|
|
71
91
|
@transactional_session
|
|
72
|
-
def del_counter(
|
|
92
|
+
def del_counter(
|
|
93
|
+
rse_id: str,
|
|
94
|
+
account: "InternalAccount",
|
|
95
|
+
*,
|
|
96
|
+
session: "Session"
|
|
97
|
+
) -> None:
|
|
73
98
|
"""
|
|
74
99
|
Resets the specified counter and initializes it by the specified amounts.
|
|
75
100
|
|
|
@@ -78,11 +103,24 @@ def del_counter(rse_id, account, *, session: "Session"):
|
|
|
78
103
|
:param session: The database session in use.
|
|
79
104
|
"""
|
|
80
105
|
|
|
81
|
-
|
|
106
|
+
stmt = delete(
|
|
107
|
+
models.AccountUsage
|
|
108
|
+
).where(
|
|
109
|
+
and_(models.AccountUsage.rse_id == rse_id,
|
|
110
|
+
models.AccountUsage.account == account)
|
|
111
|
+
).execution_options(
|
|
112
|
+
synchronize_session=False
|
|
113
|
+
)
|
|
114
|
+
session.execute(stmt)
|
|
82
115
|
|
|
83
116
|
|
|
84
117
|
@read_session
|
|
85
|
-
def get_updated_account_counters(
|
|
118
|
+
def get_updated_account_counters(
|
|
119
|
+
total_workers: int,
|
|
120
|
+
worker_number: int,
|
|
121
|
+
*,
|
|
122
|
+
session: "Session"
|
|
123
|
+
) -> list["RSEAccountCounterDict"]:
|
|
86
124
|
"""
|
|
87
125
|
Get updated rse_counters.
|
|
88
126
|
|
|
@@ -91,21 +129,25 @@ def get_updated_account_counters(total_workers, worker_number, *, session: "Sess
|
|
|
91
129
|
:param session: Database session in use.
|
|
92
130
|
:returns: List of rse_ids whose rse_counters need to be updated.
|
|
93
131
|
"""
|
|
94
|
-
query = session.query(models.UpdatedAccountCounter.account, models.UpdatedAccountCounter.rse_id).\
|
|
95
|
-
distinct(models.UpdatedAccountCounter.account, models.UpdatedAccountCounter.rse_id)
|
|
96
132
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
133
|
+
query = select(
|
|
134
|
+
models.UpdatedAccountCounter.account,
|
|
135
|
+
models.UpdatedAccountCounter.rse_id,
|
|
136
|
+
).distinct(
|
|
137
|
+
)
|
|
101
138
|
|
|
102
|
-
query = filter_thread_work(session=session, query=query, total_threads=total_workers, thread_id=worker_number, hash_variable=
|
|
139
|
+
query = filter_thread_work(session=session, query=query, total_threads=total_workers, thread_id=worker_number, hash_variable='CONCAT(account, rse_id)')
|
|
103
140
|
|
|
104
|
-
return query.all()
|
|
141
|
+
return [row._asdict() for row in session.execute(query).all()] # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
105
142
|
|
|
106
143
|
|
|
107
144
|
@transactional_session
|
|
108
|
-
def update_account_counter(
|
|
145
|
+
def update_account_counter(
|
|
146
|
+
account: "InternalAccount",
|
|
147
|
+
rse_id: str,
|
|
148
|
+
*,
|
|
149
|
+
session: "Session"
|
|
150
|
+
) -> None:
|
|
109
151
|
"""
|
|
110
152
|
Read the updated_account_counters and update the account_counter.
|
|
111
153
|
|
|
@@ -114,10 +156,22 @@ def update_account_counter(account, rse_id, *, session: "Session"):
|
|
|
114
156
|
:param session: Database session in use.
|
|
115
157
|
"""
|
|
116
158
|
|
|
117
|
-
|
|
159
|
+
stmt = select(
|
|
160
|
+
models.UpdatedAccountCounter
|
|
161
|
+
).where(
|
|
162
|
+
and_(models.UpdatedAccountCounter.account == account,
|
|
163
|
+
models.UpdatedAccountCounter.rse_id == rse_id)
|
|
164
|
+
)
|
|
165
|
+
updated_account_counters = session.execute(stmt).scalars().all()
|
|
118
166
|
|
|
119
167
|
try:
|
|
120
|
-
|
|
168
|
+
stmt = select(
|
|
169
|
+
models.AccountUsage
|
|
170
|
+
).where(
|
|
171
|
+
and_(models.AccountUsage.account == account,
|
|
172
|
+
models.AccountUsage.rse_id == rse_id)
|
|
173
|
+
)
|
|
174
|
+
account_counter = session.execute(stmt).scalar_one()
|
|
121
175
|
account_counter.bytes += sum([updated_account_counter.bytes for updated_account_counter in updated_account_counters])
|
|
122
176
|
account_counter.files += sum([updated_account_counter.files for updated_account_counter in updated_account_counters])
|
|
123
177
|
except NoResultFound:
|
|
@@ -131,7 +185,12 @@ def update_account_counter(account, rse_id, *, session: "Session"):
|
|
|
131
185
|
|
|
132
186
|
|
|
133
187
|
@transactional_session
|
|
134
|
-
def update_account_counter_history(
|
|
188
|
+
def update_account_counter_history(
|
|
189
|
+
account: "InternalAccount",
|
|
190
|
+
rse_id: str,
|
|
191
|
+
*,
|
|
192
|
+
session: "Session"
|
|
193
|
+
) -> None:
|
|
135
194
|
"""
|
|
136
195
|
Read the AccountUsage and update the AccountUsageHistory.
|
|
137
196
|
|
|
@@ -139,7 +198,13 @@ def update_account_counter_history(account, rse_id, *, session: "Session"):
|
|
|
139
198
|
:param rse_id: The rse_id to update.
|
|
140
199
|
:param session: Database session in use.
|
|
141
200
|
"""
|
|
142
|
-
|
|
201
|
+
stmt = select(
|
|
202
|
+
models.AccountUsage
|
|
203
|
+
).where(
|
|
204
|
+
and_(models.AccountUsage.account == account,
|
|
205
|
+
models.AccountUsage.rse_id == rse_id)
|
|
206
|
+
)
|
|
207
|
+
counter = session.execute(stmt).scalar_one_or_none()
|
|
143
208
|
if counter:
|
|
144
209
|
models.AccountUsageHistory(rse_id=rse_id, account=account, files=counter.files, bytes=counter.bytes).save(session=session)
|
|
145
210
|
else:
|
|
@@ -147,7 +212,7 @@ def update_account_counter_history(account, rse_id, *, session: "Session"):
|
|
|
147
212
|
|
|
148
213
|
|
|
149
214
|
@transactional_session
|
|
150
|
-
def fill_account_counter_history_table(*, session: "Session"):
|
|
215
|
+
def fill_account_counter_history_table(*, session: "Session") -> None:
|
|
151
216
|
"""
|
|
152
217
|
Make a snapshot of current counters
|
|
153
218
|
|