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
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import sys
|
|
17
|
+
from typing import TYPE_CHECKING, Any, Optional, TypeVar
|
|
18
|
+
|
|
19
|
+
from rucio.common.config import config_get_int
|
|
20
|
+
from rucio.common.exception import InvalidRequest
|
|
21
|
+
from rucio.common.plugins import PolicyPackageAlgorithms
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from collections.abc import Callable
|
|
25
|
+
|
|
26
|
+
FTS3TapeMetadataPluginType = TypeVar('FTS3TapeMetadataPluginType', bound='FTS3TapeMetadataPlugin')
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class FTS3TapeMetadataPlugin(PolicyPackageAlgorithms):
|
|
30
|
+
"""
|
|
31
|
+
Add a "archive_metadata" field to a file's transfer parameters.
|
|
32
|
+
Plugins are registered during initialization and called during a transfer with FTS3
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
ALGORITHM_NAME = "fts3_tape_metadata_plugins"
|
|
36
|
+
_INIT_FUNC_NAME = "fts3_plugins_init"
|
|
37
|
+
DEFAULT = "def"
|
|
38
|
+
|
|
39
|
+
def __init__(self, policy_algorithm: str) -> None:
|
|
40
|
+
"""
|
|
41
|
+
:param policy_algorithm: policy algorithm identifier - choose from any of the policy package algorithms registered under the `fts3_tape_metadata_plugins` group.
|
|
42
|
+
"""
|
|
43
|
+
super().__init__()
|
|
44
|
+
self.transfer_limit = config_get_int(
|
|
45
|
+
"transfers",
|
|
46
|
+
option="metadata_byte_limit",
|
|
47
|
+
raise_exception=False,
|
|
48
|
+
default=4096,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
if not self._supports(self.ALGORITHM_NAME, policy_algorithm):
|
|
52
|
+
raise ValueError(f'Policy Algorithm {policy_algorithm} not found')
|
|
53
|
+
|
|
54
|
+
if self._supports(self._INIT_FUNC_NAME, policy_algorithm):
|
|
55
|
+
init_func = self._get_one_algorithm(self._INIT_FUNC_NAME, name=policy_algorithm)
|
|
56
|
+
init_func()
|
|
57
|
+
|
|
58
|
+
self.set_in_hints = self._get_one_algorithm(self.ALGORITHM_NAME, name=policy_algorithm)
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def _module_init(cls: type[FTS3TapeMetadataPluginType]) -> None:
|
|
62
|
+
cls.register(cls.DEFAULT, func=lambda x: cls._default(cls, x)) # type: ignore
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def register(cls: type[FTS3TapeMetadataPluginType], name: str, func: 'Callable', init_func: Optional['Callable'] = None) -> None:
|
|
66
|
+
"""
|
|
67
|
+
Register a fts3 transfer plugin
|
|
68
|
+
|
|
69
|
+
:param name: name to register under
|
|
70
|
+
:param func: function called by the plugin
|
|
71
|
+
:param init_func: Initialization requirements for the plugin, defaults to None
|
|
72
|
+
"""
|
|
73
|
+
super()._register(cls.ALGORITHM_NAME, algorithm_dict={name: func})
|
|
74
|
+
if init_func is not None:
|
|
75
|
+
super()._register(cls._INIT_FUNC_NAME, algorithm_dict={name: init_func})
|
|
76
|
+
|
|
77
|
+
@staticmethod
|
|
78
|
+
def _collocation(collocation_func: 'Callable', hints: dict[str, Any]) -> dict[str, dict]:
|
|
79
|
+
"""
|
|
80
|
+
Wraps a 'collocation' style plugin for formatting
|
|
81
|
+
|
|
82
|
+
:param collocation_func: Function that defines the collocation rules
|
|
83
|
+
:param hints: kwargs utilized by the collocation rules
|
|
84
|
+
:return: Collocation hints produced by the collocation_func, wrapped
|
|
85
|
+
"""
|
|
86
|
+
return {"collocation_hints": collocation_func(**hints)}
|
|
87
|
+
|
|
88
|
+
def _default(self, *hints: dict) -> dict:
|
|
89
|
+
return {}
|
|
90
|
+
|
|
91
|
+
def _verify_in_format(self, hint_dict: dict[str, Any]) -> None:
|
|
92
|
+
"""Check the to-be-submitted file transfer params are both json encodable and under the size limit for transfer"""
|
|
93
|
+
try:
|
|
94
|
+
hints_json = json.dumps(hint_dict)
|
|
95
|
+
in_tranfer_limit = sys.getsizeof(hints_json) < self.transfer_limit
|
|
96
|
+
|
|
97
|
+
except TypeError as e:
|
|
98
|
+
raise InvalidRequest("Request malformed, cannot encode to JSON", e)
|
|
99
|
+
|
|
100
|
+
if not in_tranfer_limit:
|
|
101
|
+
raise InvalidRequest(
|
|
102
|
+
f"Request too large, decrease to less than {self.transfer_limit}"
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
def hints(self, hint_kwargs: dict) -> dict[str, Any]:
|
|
106
|
+
"""
|
|
107
|
+
Produce "archive_metadata" hints for how a transfer should be executed by fts3.
|
|
108
|
+
|
|
109
|
+
:param hint_kwargs: Args passed forward to the plugin algorithm
|
|
110
|
+
:return: Archiving metadata in the format {archive_metadata: {<plugin produced hints>}}
|
|
111
|
+
"""
|
|
112
|
+
hints = self.set_in_hints(hint_kwargs)
|
|
113
|
+
self._verify_in_format(hints)
|
|
114
|
+
return {"archive_metadata": hints}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class ActivityBasedTransferPriorityPlugin(FTS3TapeMetadataPlugin):
|
|
118
|
+
def __init__(self, policy_algorithm: str = 'activity') -> None:
|
|
119
|
+
self.register(
|
|
120
|
+
policy_algorithm,
|
|
121
|
+
func=lambda x: self._get_activity_priority(x),
|
|
122
|
+
init_func=self._init_default_priority)
|
|
123
|
+
super().__init__(policy_algorithm)
|
|
124
|
+
|
|
125
|
+
def _init_default_priority(self) -> None:
|
|
126
|
+
self.default_priority = config_get_int(
|
|
127
|
+
"tape_priority",
|
|
128
|
+
option="default",
|
|
129
|
+
raise_exception=False,
|
|
130
|
+
default=20,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
def _get_activity_priority(self, activity_kwargs: dict[str, str]) -> dict[str, dict]:
|
|
134
|
+
""" Activity Hints - assign a priority based on activity"""
|
|
135
|
+
if "activity" in activity_kwargs:
|
|
136
|
+
activity = activity_kwargs["activity"]
|
|
137
|
+
else:
|
|
138
|
+
raise InvalidRequest("`activity` field not found in passed metadata")
|
|
139
|
+
|
|
140
|
+
priority = config_get_int(
|
|
141
|
+
"tape_priority",
|
|
142
|
+
option=activity,
|
|
143
|
+
raise_exception=False,
|
|
144
|
+
default=self.default_priority,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
return {"scheduling_hints": {"priority": priority}}
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# Register the policies
|
|
151
|
+
FTS3TapeMetadataPlugin._module_init()
|
|
152
|
+
ActivityBasedTransferPriorityPlugin()
|
rucio/transfertool/globus.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,15 +14,17 @@
|
|
|
15
14
|
|
|
16
15
|
import logging
|
|
17
16
|
|
|
17
|
+
from rucio.common.constants import RseAttr
|
|
18
18
|
from rucio.common.utils import chunks
|
|
19
19
|
from rucio.db.sqla.constants import RequestState
|
|
20
|
-
from rucio.transfertool.transfertool import Transfertool, TransferToolBuilder
|
|
21
|
-
|
|
20
|
+
from rucio.transfertool.transfertool import TransferStatusReport, Transfertool, TransferToolBuilder
|
|
21
|
+
|
|
22
|
+
from .globus_library import bulk_check_xfers, bulk_submit_xfer, submit_xfer
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
def bulk_group_transfers(transfer_paths, policy='single', group_bulk=200):
|
|
25
26
|
"""
|
|
26
|
-
Group transfers in bulk based on certain
|
|
27
|
+
Group transfers in bulk based on certain criteria
|
|
27
28
|
|
|
28
29
|
:param transfer_paths: List of (potentially multihop) transfer paths to group. Each path is a list of single-hop transfers.
|
|
29
30
|
:param policy: Policy to use to group.
|
|
@@ -82,7 +83,7 @@ class GlobusTransferTool(Transfertool):
|
|
|
82
83
|
"""
|
|
83
84
|
|
|
84
85
|
external_name = 'globus'
|
|
85
|
-
required_rse_attrs = (
|
|
86
|
+
required_rse_attrs = (RseAttr.GLOBUS_ENDPOINT_ID, )
|
|
86
87
|
|
|
87
88
|
def __init__(self, external_host, logger=logging.log, group_bulk=200, group_policy='single'):
|
|
88
89
|
"""
|
|
@@ -154,15 +155,15 @@ class GlobusTransferTool(Transfertool):
|
|
|
154
155
|
submitjob = [
|
|
155
156
|
{
|
|
156
157
|
# Some dict elements are not needed by globus transfertool, but are accessed by further common fts/globus code
|
|
157
|
-
'sources': [s
|
|
158
|
+
'sources': [transfer.source_url(s) for s in transfer.sources],
|
|
158
159
|
'destinations': [transfer.dest_url],
|
|
159
160
|
'metadata': {
|
|
160
161
|
'src_rse': transfer.src.rse.name,
|
|
161
162
|
'dst_rse': transfer.dst.rse.name,
|
|
162
163
|
'scope': str(transfer.rws.scope),
|
|
163
164
|
'name': transfer.rws.name,
|
|
164
|
-
'source_globus_endpoint_id': transfer.src.rse.attributes[
|
|
165
|
-
'dest_globus_endpoint_id': transfer.dst.rse.attributes[
|
|
165
|
+
'source_globus_endpoint_id': transfer.src.rse.attributes[RseAttr.GLOBUS_ENDPOINT_ID],
|
|
166
|
+
'dest_globus_endpoint_id': transfer.dst.rse.attributes[RseAttr.GLOBUS_ENDPOINT_ID],
|
|
166
167
|
'filesize': transfer.rws.byte_count,
|
|
167
168
|
},
|
|
168
169
|
}
|
|
@@ -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");
|
|
@@ -24,8 +23,8 @@ from rucio.core.monitor import MetricManager
|
|
|
24
23
|
EXTRA_MODULES = import_extras(['globus_sdk'])
|
|
25
24
|
|
|
26
25
|
if EXTRA_MODULES['globus_sdk']:
|
|
27
|
-
from globus_sdk import NativeAppAuthClient, RefreshTokenAuthorizer, TransferClient, TransferData, DeleteData # pylint: disable=import-error
|
|
28
26
|
import yaml # pylint: disable=import-error
|
|
27
|
+
from globus_sdk import DeleteData, NativeAppAuthClient, RefreshTokenAuthorizer, TransferClient, TransferData # pylint: disable=import-error
|
|
29
28
|
|
|
30
29
|
METRICS = MetricManager(module=__name__)
|
|
31
30
|
|
rucio/transfertool/mock.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");
|
|
@@ -16,12 +15,17 @@
|
|
|
16
15
|
import itertools
|
|
17
16
|
import logging
|
|
18
17
|
import uuid
|
|
19
|
-
from
|
|
18
|
+
from collections.abc import Sequence
|
|
19
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
20
20
|
|
|
21
21
|
from rucio.db.sqla.constants import RequestState
|
|
22
|
-
from rucio.transfertool.transfertool import Transfertool, TransferToolBuilder
|
|
22
|
+
from rucio.transfertool.transfertool import TransferStatusReport, Transfertool, TransferToolBuilder
|
|
23
23
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
25
|
+
from collections.abc import Iterable, Mapping
|
|
26
|
+
|
|
27
|
+
from rucio.common.types import LoggerFunction
|
|
28
|
+
from rucio.core.request import DirectTransfer
|
|
25
29
|
from rucio.db.sqla.session import Session
|
|
26
30
|
|
|
27
31
|
|
|
@@ -37,10 +41,10 @@ class MockTransferStatusReport(TransferStatusReport):
|
|
|
37
41
|
self.state = RequestState.DONE
|
|
38
42
|
self.external_id = external_id
|
|
39
43
|
|
|
40
|
-
def initialize(self, session: "Session", logger=logging.log):
|
|
44
|
+
def initialize(self, session: "Session", logger: "LoggerFunction" = logging.log) -> None:
|
|
41
45
|
pass
|
|
42
46
|
|
|
43
|
-
def get_monitor_msg_fields(self, session: "Session", logger=logging.log):
|
|
47
|
+
def get_monitor_msg_fields(self, session: "Session", logger: "LoggerFunction" = logging.log) -> dict[str, Any]:
|
|
44
48
|
return {}
|
|
45
49
|
|
|
46
50
|
|
|
@@ -53,29 +57,34 @@ class MockTransfertool(Transfertool):
|
|
|
53
57
|
|
|
54
58
|
external_name = 'mock'
|
|
55
59
|
required_rse_attrs = ()
|
|
60
|
+
supported_schemes = {'mock', 'file'}
|
|
56
61
|
|
|
57
|
-
def __init__(self, external_host: str, logger=logging.log):
|
|
62
|
+
def __init__(self, external_host: str, logger: "LoggerFunction" = logging.log):
|
|
58
63
|
super(MockTransfertool, self).__init__(external_host, logger)
|
|
59
64
|
|
|
60
65
|
@classmethod
|
|
61
|
-
def submission_builder_for_path(
|
|
66
|
+
def submission_builder_for_path(
|
|
67
|
+
cls,
|
|
68
|
+
transfer_path: list["DirectTransfer"],
|
|
69
|
+
logger: "LoggerFunction" = logging.log
|
|
70
|
+
) -> tuple[list["DirectTransfer"], "TransferToolBuilder"]:
|
|
62
71
|
return transfer_path, TransferToolBuilder(cls, external_host='Mock Transfertool')
|
|
63
72
|
|
|
64
|
-
def group_into_submit_jobs(self, transfers):
|
|
73
|
+
def group_into_submit_jobs(self, transfers: "Iterable[list[DirectTransfer]]") -> list[dict[str, Any]]:
|
|
65
74
|
return [{'transfers': list(itertools.chain.from_iterable(transfers)), 'job_params': {}}]
|
|
66
75
|
|
|
67
|
-
def submit(self,
|
|
76
|
+
def submit(self, transfers: "Iterable[DirectTransfer]", job_params: dict[str, str], timeout: Optional[int] = None) -> str:
|
|
68
77
|
return str(uuid.uuid1())
|
|
69
78
|
|
|
70
|
-
def bulk_query(self, requests_by_eid:
|
|
79
|
+
def bulk_query(self, requests_by_eid: "Mapping[str, Mapping[str, Any]]", timeout: Optional[int] = None) -> dict[str, dict[str, MockTransferStatusReport]]:
|
|
71
80
|
response = {}
|
|
72
81
|
for transfer_id, requests in requests_by_eid.items():
|
|
73
82
|
for request_id in requests:
|
|
74
83
|
response.setdefault(transfer_id, {})[request_id] = MockTransferStatusReport(request_id, transfer_id)
|
|
75
84
|
return response
|
|
76
85
|
|
|
77
|
-
def cancel(self, transfer_ids: Sequence[str], timeout: Optional[
|
|
86
|
+
def cancel(self, transfer_ids: Sequence[str], timeout: Optional[int] = None) -> bool:
|
|
78
87
|
return True
|
|
79
88
|
|
|
80
|
-
def update_priority(self, transfer_id: str, priority: int, timeout: Optional[
|
|
89
|
+
def update_priority(self, transfer_id: str, priority: int, timeout: Optional[int] = None) -> bool:
|
|
81
90
|
return True
|
|
@@ -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,15 +14,22 @@
|
|
|
15
14
|
|
|
16
15
|
import logging
|
|
17
16
|
from abc import ABCMeta, abstractmethod
|
|
18
|
-
from typing import TYPE_CHECKING
|
|
17
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
19
18
|
|
|
19
|
+
from rucio.common.constants import SUPPORTED_PROTOCOLS
|
|
20
20
|
from rucio.core.request import get_request
|
|
21
21
|
|
|
22
22
|
if TYPE_CHECKING:
|
|
23
|
+
from collections.abc import Iterable, Mapping, Sequence
|
|
24
|
+
|
|
25
|
+
from sqlalchemy.orm import Session
|
|
26
|
+
|
|
27
|
+
from rucio.common.types import LoggerFunction
|
|
28
|
+
from rucio.core.request import DirectTransfer
|
|
23
29
|
from rucio.core.rse import RseData
|
|
24
30
|
|
|
25
31
|
|
|
26
|
-
class TransferToolBuilder
|
|
32
|
+
class TransferToolBuilder:
|
|
27
33
|
"""
|
|
28
34
|
Builder for Transfertool objects.
|
|
29
35
|
Stores the parameters needed to create the Transfertool object of the given type/class.
|
|
@@ -31,7 +37,7 @@ class TransferToolBuilder(object):
|
|
|
31
37
|
Implements __hash__ and __eq__ to allow using it as key in dictionaries and group transfers
|
|
32
38
|
by common transfertool.
|
|
33
39
|
"""
|
|
34
|
-
def __init__(self, transfertool_class, **kwargs):
|
|
40
|
+
def __init__(self, transfertool_class: type["Transfertool"], **kwargs):
|
|
35
41
|
self.transfertool_class = transfertool_class
|
|
36
42
|
self.fixed_kwargs = frozenset(kwargs.items())
|
|
37
43
|
|
|
@@ -44,13 +50,13 @@ class TransferToolBuilder(object):
|
|
|
44
50
|
def __eq__(self, other):
|
|
45
51
|
return self.__class__ == other.__class__ and self.__dict__ == other.__dict__
|
|
46
52
|
|
|
47
|
-
def make_transfertool(self, **additional_kwargs):
|
|
53
|
+
def make_transfertool(self, **additional_kwargs) -> "Transfertool":
|
|
48
54
|
all_kwargs = dict(self.fixed_kwargs)
|
|
49
55
|
all_kwargs.update(additional_kwargs)
|
|
50
56
|
return self.transfertool_class(**all_kwargs)
|
|
51
57
|
|
|
52
58
|
|
|
53
|
-
class TransferStatusReport(
|
|
59
|
+
class TransferStatusReport(metaclass=ABCMeta):
|
|
54
60
|
"""
|
|
55
61
|
Allows to compute the changes which have to be applied to the database
|
|
56
62
|
to reflect the current status reported by the external transfertool into
|
|
@@ -61,34 +67,34 @@ class TransferStatusReport(object, metaclass=ABCMeta):
|
|
|
61
67
|
'state',
|
|
62
68
|
]
|
|
63
69
|
|
|
64
|
-
def __init__(self, request_id, request=None):
|
|
70
|
+
def __init__(self, request_id: str, request: Optional[dict[str, Any]] = None):
|
|
65
71
|
self.request_id = request_id
|
|
66
72
|
self.__request = request # Optional: DB request. If provided, saves us a database call to fetch it by request_id
|
|
67
73
|
self.__initialized = False
|
|
68
74
|
|
|
69
|
-
# Supported db fields
|
|
75
|
+
# Supported db fields below
|
|
70
76
|
self.state = None
|
|
71
77
|
|
|
72
78
|
@abstractmethod
|
|
73
|
-
def initialize(self, session, logger=logging.log):
|
|
79
|
+
def initialize(self, session: "Session", logger: "LoggerFunction" = logging.log) -> None:
|
|
74
80
|
"""
|
|
75
81
|
Initialize all fields from self.supported_update_fields
|
|
76
82
|
"""
|
|
77
83
|
pass
|
|
78
84
|
|
|
79
85
|
@abstractmethod
|
|
80
|
-
def get_monitor_msg_fields(self, session, logger=logging.log):
|
|
86
|
+
def get_monitor_msg_fields(self, session: "Session", logger: "LoggerFunction" = logging.log) -> dict[str, Any]:
|
|
81
87
|
"""
|
|
82
88
|
Return the fields which will be included in the message sent to hermes.
|
|
83
89
|
"""
|
|
84
90
|
pass
|
|
85
91
|
|
|
86
|
-
def ensure_initialized(self, session, logger=logging.log):
|
|
92
|
+
def ensure_initialized(self, session: "Session", logger: "LoggerFunction" = logging.log) -> None:
|
|
87
93
|
if not self.__initialized:
|
|
88
94
|
self.initialize(session, logger)
|
|
89
95
|
self.__initialized = True
|
|
90
96
|
|
|
91
|
-
def request(self, session):
|
|
97
|
+
def request(self, session: "Session") -> Optional[dict[str, Any]]:
|
|
92
98
|
"""
|
|
93
99
|
Fetch the request by request_id if needed.
|
|
94
100
|
"""
|
|
@@ -96,7 +102,7 @@ class TransferStatusReport(object, metaclass=ABCMeta):
|
|
|
96
102
|
self.__request = get_request(self.request_id, session=session)
|
|
97
103
|
return self.__request
|
|
98
104
|
|
|
99
|
-
def get_db_fields_to_update(self, session, logger=logging.log):
|
|
105
|
+
def get_db_fields_to_update(self, session: "Session", logger: "LoggerFunction" = logging.log) -> dict[str, Any]:
|
|
100
106
|
"""
|
|
101
107
|
Returns the fields which have to be updated in the request
|
|
102
108
|
"""
|
|
@@ -110,15 +116,16 @@ class TransferStatusReport(object, metaclass=ABCMeta):
|
|
|
110
116
|
return updates
|
|
111
117
|
|
|
112
118
|
|
|
113
|
-
class Transfertool(
|
|
119
|
+
class Transfertool(metaclass=ABCMeta):
|
|
114
120
|
"""
|
|
115
121
|
Interface definition of the Rucio transfertool
|
|
116
122
|
"""
|
|
117
123
|
|
|
118
124
|
external_name = ''
|
|
119
|
-
required_rse_attrs = (
|
|
125
|
+
required_rse_attrs = ()
|
|
126
|
+
supported_schemes = set(SUPPORTED_PROTOCOLS).difference(('magnet', ))
|
|
120
127
|
|
|
121
|
-
def __init__(self, external_host, logger=logging.log):
|
|
128
|
+
def __init__(self, external_host: str, logger: "LoggerFunction" = logging.log):
|
|
122
129
|
"""
|
|
123
130
|
Initializes the transfertool
|
|
124
131
|
|
|
@@ -132,7 +139,7 @@ class Transfertool(object, metaclass=ABCMeta):
|
|
|
132
139
|
return self.external_host if self.external_host is not None else self.__class__.__name__
|
|
133
140
|
|
|
134
141
|
@classmethod
|
|
135
|
-
def can_perform_transfer(cls, source_rse: "RseData", dest_rse: "RseData"):
|
|
142
|
+
def can_perform_transfer(cls, source_rse: "RseData", dest_rse: "RseData") -> bool:
|
|
136
143
|
"""
|
|
137
144
|
Return True if this transfertool is able to perform a transfer between the given source and destination rses
|
|
138
145
|
"""
|
|
@@ -144,12 +151,13 @@ class Transfertool(object, metaclass=ABCMeta):
|
|
|
144
151
|
return False
|
|
145
152
|
|
|
146
153
|
@classmethod
|
|
147
|
-
|
|
154
|
+
@abstractmethod
|
|
155
|
+
def submission_builder_for_path(cls, transfer_path: list["DirectTransfer"], logger: "LoggerFunction" = logging.log) -> tuple[list["DirectTransfer"], Optional["TransferToolBuilder"]]:
|
|
148
156
|
"""
|
|
149
157
|
Analyze the transfer path. If this transfertool class can submit the given transfers, return
|
|
150
158
|
a TransferToolBuilder instance capable to build transfertool objects configured for this
|
|
151
159
|
particular submission.
|
|
152
|
-
:param transfer_path: List of
|
|
160
|
+
:param transfer_path: List of DirectTransfer
|
|
153
161
|
:param logger: logger instance
|
|
154
162
|
:return: a tuple: a sub-path starting at the first node from transfer_path, and a TransfertoolBuilder instance
|
|
155
163
|
capable to submit this sub-path. Returns ([], None) if submission is impossible.
|
|
@@ -157,7 +165,8 @@ class Transfertool(object, metaclass=ABCMeta):
|
|
|
157
165
|
pass
|
|
158
166
|
|
|
159
167
|
@abstractmethod
|
|
160
|
-
|
|
168
|
+
@abstractmethod
|
|
169
|
+
def group_into_submit_jobs(self, transfer_paths: "Iterable[list[DirectTransfer]]") -> list[dict[str, Any]]:
|
|
161
170
|
"""
|
|
162
171
|
Takes an iterable over transfer paths, and create groups which can be submitted in one call to submit()
|
|
163
172
|
|
|
@@ -167,7 +176,7 @@ class Transfertool(object, metaclass=ABCMeta):
|
|
|
167
176
|
pass
|
|
168
177
|
|
|
169
178
|
@abstractmethod
|
|
170
|
-
def submit(self, transfers, job_params, timeout=None):
|
|
179
|
+
def submit(self, transfers: "Iterable[DirectTransfer]", job_params: dict[str, str], timeout: Optional[int] = None) -> str:
|
|
171
180
|
"""
|
|
172
181
|
Submit transfers to the transfertool.
|
|
173
182
|
|
|
@@ -179,7 +188,7 @@ class Transfertool(object, metaclass=ABCMeta):
|
|
|
179
188
|
pass
|
|
180
189
|
|
|
181
190
|
@abstractmethod
|
|
182
|
-
def bulk_query(self, requests_by_eid, timeout=None) -> dict[str, dict[str, TransferStatusReport]]:
|
|
191
|
+
def bulk_query(self, requests_by_eid: "Mapping[str, Mapping[str, Any]]", timeout: Optional[int] = None) -> dict[str, dict[str, TransferStatusReport]]:
|
|
183
192
|
"""
|
|
184
193
|
Query the status of a bulk of transfers in FTS3 via JSON.
|
|
185
194
|
|
|
@@ -189,7 +198,7 @@ class Transfertool(object, metaclass=ABCMeta):
|
|
|
189
198
|
pass
|
|
190
199
|
|
|
191
200
|
@abstractmethod
|
|
192
|
-
def cancel(self, transfer_ids, timeout=None):
|
|
201
|
+
def cancel(self, transfer_ids: "Sequence[str]", timeout: Optional[int] = None) -> None:
|
|
193
202
|
"""
|
|
194
203
|
Cancel transfers that have been submitted to the transfertool.
|
|
195
204
|
|
|
@@ -200,7 +209,7 @@ class Transfertool(object, metaclass=ABCMeta):
|
|
|
200
209
|
pass
|
|
201
210
|
|
|
202
211
|
@abstractmethod
|
|
203
|
-
def update_priority(self, transfer_id, priority, timeout=None):
|
|
212
|
+
def update_priority(self, transfer_id: str, priority: int, timeout: Optional[int] = None) -> Any:
|
|
204
213
|
"""
|
|
205
214
|
Update the priority of a transfer that has been submitted to the transfertool.
|
|
206
215
|
|
rucio/vcsversion.py
CHANGED
|
@@ -4,8 +4,8 @@ This file is automatically generated; Do not edit it. :)
|
|
|
4
4
|
'''
|
|
5
5
|
VERSION_INFO = {
|
|
6
6
|
'final': True,
|
|
7
|
-
'version': '
|
|
8
|
-
'branch_nick': 'release-
|
|
9
|
-
'revision_id': '
|
|
10
|
-
'revno':
|
|
7
|
+
'version': '35.8.0',
|
|
8
|
+
'branch_nick': 'release-35-LTS',
|
|
9
|
+
'revision_id': '8a304950325b8afa9499d3acccb176ef7f93fd07',
|
|
10
|
+
'revno': 13205
|
|
11
11
|
}
|
rucio/version.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -13,34 +12,27 @@
|
|
|
13
12
|
# See the License for the specific language governing permissions and
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
from rucio.vcsversion import VERSION_INFO
|
|
18
|
-
except ImportError:
|
|
19
|
-
VERSION_INFO = {'branch_nick': 'LOCALBRANCH', # NOQA
|
|
20
|
-
'revision_id': 'LOCALREVISION',
|
|
21
|
-
'version': 'VERSION',
|
|
22
|
-
'final': False,
|
|
23
|
-
'revno': 0}
|
|
15
|
+
from rucio.vcsversion import VERSION_INFO
|
|
24
16
|
|
|
25
17
|
RUCIO_VERSION = [VERSION_INFO['version'], ]
|
|
26
18
|
FINAL = VERSION_INFO['final'] # This becomes true at Release Candidate time
|
|
27
19
|
|
|
28
20
|
|
|
29
|
-
def canonical_version_string():
|
|
21
|
+
def canonical_version_string() -> str:
|
|
30
22
|
""" Get the canonical string """
|
|
31
23
|
return '.'.join(filter(None, RUCIO_VERSION))
|
|
32
24
|
|
|
33
25
|
|
|
34
|
-
def version_string():
|
|
26
|
+
def version_string() -> str:
|
|
35
27
|
""" Get the version string """
|
|
36
28
|
return canonical_version_string()
|
|
37
29
|
|
|
38
30
|
|
|
39
|
-
def vcs_version_string():
|
|
31
|
+
def vcs_version_string() -> str:
|
|
40
32
|
""" Get the VCS version string """
|
|
41
33
|
return "%s:%s" % (VERSION_INFO['branch_nick'], VERSION_INFO['revision_id'])
|
|
42
34
|
|
|
43
35
|
|
|
44
|
-
def version_string_with_vcs():
|
|
36
|
+
def version_string_with_vcs() -> str:
|
|
45
37
|
""" Get the version string with VCS """
|
|
46
38
|
return "%s-%s" % (canonical_version_string(), vcs_version_string())
|
rucio/web/__init__.py
CHANGED
rucio/web/rest/__init__.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -13,21 +12,24 @@
|
|
|
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
17
|
from flask import Flask, request
|
|
17
18
|
|
|
18
|
-
from rucio.
|
|
19
|
-
|
|
20
|
-
from rucio.common.exception import RSENotFound, AccessDenied, AccountNotFound
|
|
19
|
+
from rucio.common.exception import AccessDenied, AccountNotFound, RSENotFound
|
|
20
|
+
from rucio.gateway.account_limit import delete_global_account_limit, delete_local_account_limit, set_global_account_limit, set_local_account_limit
|
|
21
21
|
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
22
|
-
from rucio.web.rest.flaskapi.v1.common import
|
|
23
|
-
|
|
22
|
+
from rucio.web.rest.flaskapi.v1.common import ErrorHandlingMethodView, generate_http_error_flask, json_parameters, param_get, response_headers
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from flask.typing import ResponseReturnValue
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
class LocalAccountLimit(ErrorHandlingMethodView):
|
|
27
|
-
def post(self, account, rse):
|
|
29
|
+
def post(self, account: str, rse: str) -> 'ResponseReturnValue':
|
|
28
30
|
"""
|
|
29
31
|
---
|
|
30
|
-
summary: Create or update a local
|
|
32
|
+
summary: Create or update a local account limit
|
|
31
33
|
tags:
|
|
32
34
|
- Account Limit
|
|
33
35
|
parameters:
|
|
@@ -78,7 +80,7 @@ class LocalAccountLimit(ErrorHandlingMethodView):
|
|
|
78
80
|
|
|
79
81
|
return 'Created', 201
|
|
80
82
|
|
|
81
|
-
def delete(self, account, rse):
|
|
83
|
+
def delete(self, account: str, rse: str) -> 'ResponseReturnValue':
|
|
82
84
|
"""
|
|
83
85
|
---
|
|
84
86
|
summary: Delete a local account limit
|
|
@@ -116,7 +118,7 @@ class LocalAccountLimit(ErrorHandlingMethodView):
|
|
|
116
118
|
|
|
117
119
|
|
|
118
120
|
class GlobalAccountLimit(ErrorHandlingMethodView):
|
|
119
|
-
def post(self, account, rse_expression):
|
|
121
|
+
def post(self, account: str, rse_expression: str) -> 'ResponseReturnValue':
|
|
120
122
|
"""
|
|
121
123
|
---
|
|
122
124
|
summary: Create or update a global account limit
|
|
@@ -176,7 +178,7 @@ class GlobalAccountLimit(ErrorHandlingMethodView):
|
|
|
176
178
|
|
|
177
179
|
return 'Created', 201
|
|
178
180
|
|
|
179
|
-
def delete(self, account, rse_expression):
|
|
181
|
+
def delete(self, account: str, rse_expression: str) -> 'ResponseReturnValue':
|
|
180
182
|
"""
|
|
181
183
|
---
|
|
182
184
|
summary: Delete a global account limit
|
|
@@ -213,7 +215,7 @@ class GlobalAccountLimit(ErrorHandlingMethodView):
|
|
|
213
215
|
return '', 200
|
|
214
216
|
|
|
215
217
|
|
|
216
|
-
def blueprint(with_doc=False):
|
|
218
|
+
def blueprint(with_doc: bool = False) -> AuthenticatedBlueprint:
|
|
217
219
|
bp = AuthenticatedBlueprint('accountlimits', __name__, url_prefix='/accountlimits')
|
|
218
220
|
|
|
219
221
|
local_account_limit_view = LocalAccountLimit.as_view('local_account_limit')
|
|
@@ -227,7 +229,7 @@ def blueprint(with_doc=False):
|
|
|
227
229
|
return bp
|
|
228
230
|
|
|
229
231
|
|
|
230
|
-
def make_doc():
|
|
232
|
+
def make_doc() -> Flask:
|
|
231
233
|
""" Only used for sphinx documentation """
|
|
232
234
|
doc_app = Flask(__name__)
|
|
233
235
|
doc_app.register_blueprint(blueprint(with_doc=True))
|