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/rse/protocols/webdav.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,11 +15,11 @@
|
|
|
16
15
|
import os
|
|
17
16
|
import sys
|
|
18
17
|
import xml.etree.ElementTree as ET
|
|
19
|
-
from
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
from typing import Any, Optional
|
|
20
20
|
from urllib.parse import urlparse
|
|
21
21
|
|
|
22
22
|
import requests
|
|
23
|
-
from dataclasses import dataclass
|
|
24
23
|
from requests.adapters import HTTPAdapter
|
|
25
24
|
from urllib3.poolmanager import PoolManager
|
|
26
25
|
|
|
@@ -40,7 +39,7 @@ class TLSHTTPAdapter(HTTPAdapter):
|
|
|
40
39
|
ca_cert_dir="/etc/grid-security/certificates")
|
|
41
40
|
|
|
42
41
|
|
|
43
|
-
class UploadInChunks
|
|
42
|
+
class UploadInChunks:
|
|
44
43
|
'''
|
|
45
44
|
Class to upload by chunks.
|
|
46
45
|
'''
|
|
@@ -73,7 +72,7 @@ class UploadInChunks(object):
|
|
|
73
72
|
return self.__totalsize
|
|
74
73
|
|
|
75
74
|
|
|
76
|
-
class IterableToFileAdapter
|
|
75
|
+
class IterableToFileAdapter:
|
|
77
76
|
'''
|
|
78
77
|
Class IterableToFileAdapter
|
|
79
78
|
'''
|
|
@@ -134,7 +133,7 @@ class _PropfindResponse:
|
|
|
134
133
|
"""
|
|
135
134
|
|
|
136
135
|
try:
|
|
137
|
-
xml = ET.fromstring(document)
|
|
136
|
+
xml = ET.fromstring(document) # noqa: S314
|
|
138
137
|
except ET.ParseError as ex:
|
|
139
138
|
raise ValueError("Couldn't parse XML document") from ex
|
|
140
139
|
|
|
@@ -152,7 +151,7 @@ class Default(protocol.RSEProtocol):
|
|
|
152
151
|
|
|
153
152
|
""" Implementing access to RSEs using the webDAV protocol."""
|
|
154
153
|
|
|
155
|
-
def connect(self, credentials=
|
|
154
|
+
def connect(self, credentials: Optional[dict[str, Any]] = None) -> None:
|
|
156
155
|
""" Establishes the actual connection to the referred RSE.
|
|
157
156
|
|
|
158
157
|
:param credentials: Provides information to establish a connection
|
|
@@ -161,6 +160,7 @@ class Default(protocol.RSEProtocol):
|
|
|
161
160
|
|
|
162
161
|
:raises RSEAccessDenied
|
|
163
162
|
"""
|
|
163
|
+
credentials = credentials or {}
|
|
164
164
|
try:
|
|
165
165
|
parse_url = urlparse(self.path2pfn(''))
|
|
166
166
|
self.server = f'{parse_url.scheme}://{parse_url.netloc}'
|
|
@@ -185,12 +185,15 @@ class Default(protocol.RSEProtocol):
|
|
|
185
185
|
# Trying to get the proxy from the default location
|
|
186
186
|
proxy_path = '/tmp/x509up_u%s' % os.geteuid()
|
|
187
187
|
if os.path.isfile(proxy_path):
|
|
188
|
-
|
|
188
|
+
self.cert = (proxy_path, proxy_path)
|
|
189
189
|
elif self.auth_token:
|
|
190
|
+
# If no proxy is found, we set the cert to None and use the auth_token
|
|
191
|
+
self.cert = None
|
|
190
192
|
pass
|
|
191
193
|
else:
|
|
192
194
|
raise exception.RSEAccessDenied('X509_USER_PROXY is not set')
|
|
193
|
-
|
|
195
|
+
else:
|
|
196
|
+
self.cert = (x509, x509)
|
|
194
197
|
|
|
195
198
|
try:
|
|
196
199
|
self.timeout = credentials['timeout']
|
|
@@ -332,13 +335,13 @@ class Default(protocol.RSEProtocol):
|
|
|
332
335
|
raise exception.RucioException(result.status_code, result.text)
|
|
333
336
|
except requests.exceptions.ConnectionError as error:
|
|
334
337
|
raise exception.ServiceUnavailable(error)
|
|
335
|
-
except
|
|
338
|
+
except OSError as error:
|
|
336
339
|
raise exception.SourceNotFound(error)
|
|
337
340
|
except requests.exceptions.ConnectionError as error:
|
|
338
341
|
raise exception.ServiceUnavailable(error)
|
|
339
342
|
except requests.exceptions.ReadTimeout as error:
|
|
340
343
|
raise exception.ServiceUnavailable(error)
|
|
341
|
-
except
|
|
344
|
+
except OSError as error:
|
|
342
345
|
raise exception.SourceNotFound(error)
|
|
343
346
|
|
|
344
347
|
def rename(self, pfn, new_pfn):
|
|
@@ -479,7 +482,7 @@ class Default(protocol.RSEProtocol):
|
|
|
479
482
|
|
|
480
483
|
:param path: path to file
|
|
481
484
|
|
|
482
|
-
:raises ServiceUnavailable: if some generic error
|
|
485
|
+
:raises ServiceUnavailable: if some generic error occurred in the library.
|
|
483
486
|
:raises SourceNotFound: if the source file was not found on the referred storage.
|
|
484
487
|
:raises RSEAccessDenied: in case of permission issue.
|
|
485
488
|
|
|
@@ -528,13 +531,13 @@ class Default(protocol.RSEProtocol):
|
|
|
528
531
|
|
|
529
532
|
:returns: a list with dict containing 'totalsize' and 'unusedsize'
|
|
530
533
|
|
|
531
|
-
:raises ServiceUnavailable: if some generic error
|
|
534
|
+
:raises ServiceUnavailable: if some generic error occurred in the library.
|
|
532
535
|
"""
|
|
533
536
|
endpoint_basepath = self.path2pfn('')
|
|
534
537
|
headers = {'Depth': '0'}
|
|
535
538
|
|
|
536
539
|
try:
|
|
537
|
-
root = ET.fromstring(self.session.request('PROPFIND', endpoint_basepath, verify=False, headers=headers, cert=self.session.cert).text)
|
|
540
|
+
root = ET.fromstring(self.session.request('PROPFIND', endpoint_basepath, verify=False, headers=headers, cert=self.session.cert).text) # noqa: S314
|
|
538
541
|
usedsize = root[0][1][0].find('{DAV:}quota-used-bytes').text
|
|
539
542
|
try:
|
|
540
543
|
unusedsize = root[0][1][0].find('{DAV:}quota-available-bytes').text
|
rucio/rse/protocols/xrootd.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,13 +16,20 @@ import logging
|
|
|
17
16
|
import os
|
|
18
17
|
|
|
19
18
|
from rucio.common import exception
|
|
20
|
-
from rucio.common.utils import
|
|
19
|
+
from rucio.common.utils import PREFERRED_CHECKSUM, execute
|
|
21
20
|
from rucio.rse.protocols import protocol
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
class Default(protocol.RSEProtocol):
|
|
25
24
|
""" Implementing access to RSEs using the XRootD protocol using GSI authentication."""
|
|
26
25
|
|
|
26
|
+
@property
|
|
27
|
+
def _auth_env(self):
|
|
28
|
+
if self.auth_token:
|
|
29
|
+
return f"XrdSecPROTOCOL=ztn BEARER_TOKEN='{self.auth_token}'"
|
|
30
|
+
else:
|
|
31
|
+
return 'XrdSecPROTOCOL=gsi'
|
|
32
|
+
|
|
27
33
|
def __init__(self, protocol_attr, rse_settings, logger=logging.log):
|
|
28
34
|
""" Initializes the object with information about the referred RSE.
|
|
29
35
|
|
|
@@ -66,7 +72,7 @@ class Default(protocol.RSEProtocol):
|
|
|
66
72
|
self.logger(logging.DEBUG, 'xrootd.exists: pfn: {}'.format(pfn))
|
|
67
73
|
try:
|
|
68
74
|
path = self.pfn2path(pfn)
|
|
69
|
-
cmd = '
|
|
75
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} stat {path}'
|
|
70
76
|
self.logger(logging.DEBUG, 'xrootd.exists: cmd: {}'.format(cmd))
|
|
71
77
|
status, out, err = execute(cmd)
|
|
72
78
|
if status != 0:
|
|
@@ -82,11 +88,11 @@ class Default(protocol.RSEProtocol):
|
|
|
82
88
|
|
|
83
89
|
:param path: path to file
|
|
84
90
|
|
|
85
|
-
:raises ServiceUnavailable: if some generic error
|
|
91
|
+
:raises ServiceUnavailable: if some generic error occurred in the library.
|
|
86
92
|
|
|
87
93
|
:returns: a dict with two keys, filesize and an element of GLOBALLY_SUPPORTED_CHECKSUMS.
|
|
88
94
|
"""
|
|
89
|
-
self.logger(logging.DEBUG, 'xrootd.stat: path: {}'
|
|
95
|
+
self.logger(logging.DEBUG, f'xrootd.stat: path: {path}')
|
|
90
96
|
ret = {}
|
|
91
97
|
chsum = None
|
|
92
98
|
if path.startswith('root:'):
|
|
@@ -94,7 +100,7 @@ class Default(protocol.RSEProtocol):
|
|
|
94
100
|
|
|
95
101
|
try:
|
|
96
102
|
# xrdfs stat for getting filesize
|
|
97
|
-
cmd = '
|
|
103
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} stat {path}'
|
|
98
104
|
self.logger(logging.DEBUG, 'xrootd.stat: filesize cmd: {}'.format(cmd))
|
|
99
105
|
status_stat, out, err = execute(cmd)
|
|
100
106
|
if status_stat == 0:
|
|
@@ -106,7 +112,7 @@ class Default(protocol.RSEProtocol):
|
|
|
106
112
|
break
|
|
107
113
|
|
|
108
114
|
# xrdfs query checksum for getting checksum
|
|
109
|
-
cmd = '
|
|
115
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} query checksum {path}'
|
|
110
116
|
self.logger(logging.DEBUG, 'xrootd.stat: checksum cmd: {}'.format(cmd))
|
|
111
117
|
status_query, out, err = execute(cmd)
|
|
112
118
|
if status_query == 0:
|
|
@@ -160,7 +166,7 @@ class Default(protocol.RSEProtocol):
|
|
|
160
166
|
if not prefix.endswith('/'):
|
|
161
167
|
prefix = ''.join([prefix, '/'])
|
|
162
168
|
|
|
163
|
-
lfns = [lfns] if
|
|
169
|
+
lfns = [lfns] if isinstance(lfns, dict) else lfns
|
|
164
170
|
for lfn in lfns:
|
|
165
171
|
scope, name = lfn['scope'], lfn['name']
|
|
166
172
|
if 'path' in lfn and lfn['path'] is not None:
|
|
@@ -183,7 +189,7 @@ class Default(protocol.RSEProtocol):
|
|
|
183
189
|
try:
|
|
184
190
|
# The query stats call is not implemented on some xroot doors.
|
|
185
191
|
# Workaround: fail, if server does not reply within 10 seconds for static config query
|
|
186
|
-
cmd = '
|
|
192
|
+
cmd = f'{self._auth_env} XRD_REQUESTTIMEOUT=10 xrdfs {self.hostname}:{self.port} query config {self.hostname}:{self.port}'
|
|
187
193
|
self.logger(logging.DEBUG, 'xrootd.connect: cmd: {}'.format(cmd))
|
|
188
194
|
status, out, err = execute(cmd)
|
|
189
195
|
if status != 0:
|
|
@@ -206,7 +212,7 @@ class Default(protocol.RSEProtocol):
|
|
|
206
212
|
"""
|
|
207
213
|
self.logger(logging.DEBUG, 'xrootd.get: pfn: {}'.format(pfn))
|
|
208
214
|
try:
|
|
209
|
-
cmd = '
|
|
215
|
+
cmd = f'{self._auth_env} xrdcp -f {pfn} {dest}'
|
|
210
216
|
self.logger(logging.DEBUG, 'xrootd.get: cmd: {}'.format(cmd))
|
|
211
217
|
status, out, err = execute(cmd)
|
|
212
218
|
if status == 54:
|
|
@@ -226,7 +232,7 @@ class Default(protocol.RSEProtocol):
|
|
|
226
232
|
:param transfer_timeout: Transfer timeout (in seconds) - dummy
|
|
227
233
|
|
|
228
234
|
:raises DestinationNotAccessible: if the destination storage was not accessible.
|
|
229
|
-
:raises ServiceUnavailable: if some generic error
|
|
235
|
+
:raises ServiceUnavailable: if some generic error occurred in the library.
|
|
230
236
|
:raises SourceNotFound: if the source file was not found on the referred storage.
|
|
231
237
|
"""
|
|
232
238
|
self.logger(logging.DEBUG, 'xrootd.put: filename: {} target: {}'.format(filename, target))
|
|
@@ -237,7 +243,7 @@ class Default(protocol.RSEProtocol):
|
|
|
237
243
|
if not os.path.exists(source_url):
|
|
238
244
|
raise exception.SourceNotFound()
|
|
239
245
|
try:
|
|
240
|
-
cmd = '
|
|
246
|
+
cmd = f'{self._auth_env} xrdcp -f {source_url} {path}'
|
|
241
247
|
self.logger(logging.DEBUG, 'xrootd.put: cmd: {}'.format(cmd))
|
|
242
248
|
status, out, err = execute(cmd)
|
|
243
249
|
if status != 0:
|
|
@@ -251,7 +257,7 @@ class Default(protocol.RSEProtocol):
|
|
|
251
257
|
|
|
252
258
|
:param pfn: Physical file name
|
|
253
259
|
|
|
254
|
-
:raises ServiceUnavailable: if some generic error
|
|
260
|
+
:raises ServiceUnavailable: if some generic error occurred in the library.
|
|
255
261
|
:raises SourceNotFound: if the source file was not found on the referred storage.
|
|
256
262
|
"""
|
|
257
263
|
self.logger(logging.DEBUG, 'xrootd.delete: pfn: {}'.format(pfn))
|
|
@@ -259,7 +265,7 @@ class Default(protocol.RSEProtocol):
|
|
|
259
265
|
raise exception.SourceNotFound()
|
|
260
266
|
try:
|
|
261
267
|
path = self.pfn2path(pfn)
|
|
262
|
-
cmd = '
|
|
268
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} rm {path}'
|
|
263
269
|
self.logger(logging.DEBUG, 'xrootd.delete: cmd: {}'.format(cmd))
|
|
264
270
|
status, out, err = execute(cmd)
|
|
265
271
|
if status != 0:
|
|
@@ -273,7 +279,7 @@ class Default(protocol.RSEProtocol):
|
|
|
273
279
|
:param pfn: Current physical file name
|
|
274
280
|
:param new_pfn New physical file name
|
|
275
281
|
:raises DestinationNotAccessible: if the destination storage was not accessible.
|
|
276
|
-
:raises ServiceUnavailable: if some generic error
|
|
282
|
+
:raises ServiceUnavailable: if some generic error occurred in the library.
|
|
277
283
|
:raises SourceNotFound: if the source file was not found on the referred storage.
|
|
278
284
|
"""
|
|
279
285
|
self.logger(logging.DEBUG, 'xrootd.rename: pfn: {}'.format(pfn))
|
|
@@ -283,10 +289,10 @@ class Default(protocol.RSEProtocol):
|
|
|
283
289
|
path = self.pfn2path(pfn)
|
|
284
290
|
new_path = self.pfn2path(new_pfn)
|
|
285
291
|
new_dir = new_path[:new_path.rindex('/') + 1]
|
|
286
|
-
cmd = '
|
|
292
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} mkdir -p {new_dir}'
|
|
287
293
|
self.logger(logging.DEBUG, 'xrootd.stat: mkdir cmd: {}'.format(cmd))
|
|
288
294
|
status, out, err = execute(cmd)
|
|
289
|
-
cmd = '
|
|
295
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} mv {path} {new_path}'
|
|
290
296
|
self.logger(logging.DEBUG, 'xrootd.stat: rename cmd: {}'.format(cmd))
|
|
291
297
|
status, out, err = execute(cmd)
|
|
292
298
|
if status != 0:
|
rucio/rse/rsemanager.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,15 +15,28 @@
|
|
|
16
15
|
import copy
|
|
17
16
|
import logging
|
|
18
17
|
import random
|
|
18
|
+
from collections.abc import Callable
|
|
19
19
|
from time import sleep
|
|
20
20
|
from urllib.parse import urlparse
|
|
21
21
|
|
|
22
|
-
from rucio.common import exception,
|
|
23
|
-
from rucio.common import types
|
|
22
|
+
from rucio.common import constants, exception, types, utils
|
|
24
23
|
from rucio.common.config import config_get_int
|
|
24
|
+
from rucio.common.constants import RSE_SUPPORTED_PROTOCOL_OPERATIONS
|
|
25
25
|
from rucio.common.constraints import STRING_TYPES
|
|
26
26
|
from rucio.common.logging import formatted_logger
|
|
27
|
-
from rucio.common.utils import
|
|
27
|
+
from rucio.common.utils import GLOBALLY_SUPPORTED_CHECKSUMS, make_valid_did
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def get_scope_protocol(vo: str = 'def') -> Callable:
|
|
31
|
+
"""
|
|
32
|
+
Returns the callable protocol to translate the pfn to a name/scope pair
|
|
33
|
+
|
|
34
|
+
:returns:
|
|
35
|
+
Callable: Scope Parser function
|
|
36
|
+
"""
|
|
37
|
+
from rucio.rse.protocols.protocol import RSEDeterministicScopeTranslation
|
|
38
|
+
translation = RSEDeterministicScopeTranslation(vo=vo)
|
|
39
|
+
return translation.parser
|
|
28
40
|
|
|
29
41
|
|
|
30
42
|
def get_rse_info(rse=None, vo='def', rse_id=None, session=None) -> types.RSESettingsDict:
|
|
@@ -118,7 +130,7 @@ def _get_possible_protocols(rse_settings: types.RSESettingsDict, operation, sche
|
|
|
118
130
|
|
|
119
131
|
|
|
120
132
|
def get_protocols_ordered(rse_settings: types.RSESettingsDict, operation, scheme=None, domain='wan', impl=None):
|
|
121
|
-
if operation not in
|
|
133
|
+
if operation not in RSE_SUPPORTED_PROTOCOL_OPERATIONS:
|
|
122
134
|
raise exception.RSEOperationNotSupported('Operation %s is not supported' % operation)
|
|
123
135
|
|
|
124
136
|
if domain and domain not in utils.rse_supported_protocol_domains():
|
|
@@ -130,7 +142,7 @@ def get_protocols_ordered(rse_settings: types.RSESettingsDict, operation, scheme
|
|
|
130
142
|
|
|
131
143
|
|
|
132
144
|
def select_protocol(rse_settings: types.RSESettingsDict, operation, scheme=None, domain='wan'):
|
|
133
|
-
if operation not in
|
|
145
|
+
if operation not in RSE_SUPPORTED_PROTOCOL_OPERATIONS:
|
|
134
146
|
raise exception.RSEOperationNotSupported('Operation %s is not supported' % operation)
|
|
135
147
|
|
|
136
148
|
if domain and domain not in utils.rse_supported_protocol_domains():
|
|
@@ -158,7 +170,7 @@ def create_protocol(rse_settings: types.RSESettingsDict, operation, scheme=None,
|
|
|
158
170
|
|
|
159
171
|
# Verify feasibility of Protocol
|
|
160
172
|
operation = operation.lower()
|
|
161
|
-
if operation not in
|
|
173
|
+
if operation not in RSE_SUPPORTED_PROTOCOL_OPERATIONS:
|
|
162
174
|
raise exception.RSEOperationNotSupported('Operation %s is not supported' % operation)
|
|
163
175
|
|
|
164
176
|
if domain and domain not in utils.rse_supported_protocol_domains():
|
rucio/tests/__init__.py
CHANGED
rucio/tests/common.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");
|
|
@@ -19,15 +18,19 @@ import json
|
|
|
19
18
|
import os
|
|
20
19
|
import tempfile
|
|
21
20
|
from collections import namedtuple
|
|
21
|
+
from collections.abc import Callable, Iterable
|
|
22
|
+
from functools import wraps
|
|
23
|
+
from os import rename
|
|
22
24
|
from random import choice, choices
|
|
23
|
-
from string import
|
|
24
|
-
from typing import Optional
|
|
25
|
+
from string import ascii_letters, ascii_uppercase, digits
|
|
26
|
+
from typing import Any, Optional
|
|
25
27
|
|
|
26
28
|
import pytest
|
|
27
29
|
import requests
|
|
28
30
|
|
|
29
31
|
from rucio.common.config import config_get, config_get_bool, get_config_dirs
|
|
30
|
-
from rucio.common.utils import
|
|
32
|
+
from rucio.common.utils import execute
|
|
33
|
+
from rucio.common.utils import generate_uuid as uuid
|
|
31
34
|
|
|
32
35
|
skip_rse_tests_with_accounts = pytest.mark.skipif(not any(os.path.exists(os.path.join(d, 'rse-accounts.cfg')) for d in get_config_dirs()),
|
|
33
36
|
reason='fails if no rse-accounts.cfg found')
|
|
@@ -126,27 +129,27 @@ def rse_name_generator(size: int = 10) -> str:
|
|
|
126
129
|
|
|
127
130
|
:returns: A random RSE name
|
|
128
131
|
"""
|
|
129
|
-
return 'MOCK-' + ''.join(choice(ascii_uppercase) for x in range(size))
|
|
132
|
+
return 'MOCK-' + ''.join(choice(ascii_uppercase) for x in range(size)) # noqa: S311
|
|
130
133
|
|
|
131
134
|
|
|
132
|
-
def rfc2253_dn_generator():
|
|
135
|
+
def rfc2253_dn_generator() -> str:
|
|
133
136
|
""" Generate a random DN in RFC 2253 format.
|
|
134
137
|
|
|
135
138
|
:returns: A random DN
|
|
136
139
|
"""
|
|
137
|
-
random_cn = ''.join(choices(ascii_letters + digits, k=8))
|
|
138
|
-
random_o = ''.join(choices(ascii_letters + digits, k=8))
|
|
139
|
-
random_c = ''.join(choices(ascii_letters, k=2))
|
|
140
|
+
random_cn = ''.join(choices(ascii_letters + digits, k=8)) # noqa: S311
|
|
141
|
+
random_o = ''.join(choices(ascii_letters + digits, k=8)) # noqa: S311
|
|
142
|
+
random_c = ''.join(choices(ascii_letters, k=2)) # noqa: S311
|
|
140
143
|
random_dn = "CN={}, O={}, C={}".format(random_cn, random_o, random_c)
|
|
141
144
|
return random_dn
|
|
142
145
|
|
|
143
146
|
|
|
144
|
-
def file_generator(size: int = 2, namelen: int = 10):
|
|
147
|
+
def file_generator(size: int = 2, namelen: int = 10) -> str:
|
|
145
148
|
""" Create a bogus file and returns it's name.
|
|
146
149
|
:param size: size in bytes
|
|
147
150
|
:returns: The name of the generated file.
|
|
148
151
|
"""
|
|
149
|
-
fn = '/tmp/file_' + ''.join(choice(ascii_uppercase) for x in range(namelen))
|
|
152
|
+
fn = '/tmp/file_' + ''.join(choice(ascii_uppercase) for x in range(namelen)) # noqa: S311
|
|
150
153
|
execute('dd if=/dev/urandom of={0} count={1} bs=1'.format(fn, size))
|
|
151
154
|
return fn
|
|
152
155
|
|
|
@@ -154,7 +157,7 @@ def file_generator(size: int = 2, namelen: int = 10):
|
|
|
154
157
|
def make_temp_file(dir_: str, data: str) -> str:
|
|
155
158
|
"""
|
|
156
159
|
Creates a temporal file and write `data` on it.
|
|
157
|
-
:param data: String to be
|
|
160
|
+
:param data: String to be written on the created file.
|
|
158
161
|
:returns: Name of the temporal file.
|
|
159
162
|
"""
|
|
160
163
|
fd, path = tempfile.mkstemp(dir=dir_)
|
|
@@ -199,11 +202,11 @@ def print_response(rest_response):
|
|
|
199
202
|
print(text if text else '<no content>')
|
|
200
203
|
|
|
201
204
|
|
|
202
|
-
def headers(*iterables):
|
|
205
|
+
def headers(*iterables: Iterable):
|
|
203
206
|
return list(itertools.chain(*iterables))
|
|
204
207
|
|
|
205
208
|
|
|
206
|
-
def loginhdr(account, username, password):
|
|
209
|
+
def loginhdr(account: str, username: str, password: str):
|
|
207
210
|
yield 'X-Rucio-Account', str(account)
|
|
208
211
|
yield 'X-Rucio-Username', str(username)
|
|
209
212
|
yield 'X-Rucio-Password', str(password)
|
|
@@ -213,12 +216,12 @@ def auth(token):
|
|
|
213
216
|
yield 'X-Rucio-Auth-Token', str(token)
|
|
214
217
|
|
|
215
218
|
|
|
216
|
-
def vohdr(vo):
|
|
219
|
+
def vohdr(vo: str):
|
|
217
220
|
if vo:
|
|
218
221
|
yield 'X-Rucio-VO', str(vo)
|
|
219
222
|
|
|
220
223
|
|
|
221
|
-
def hdrdict(dictionary):
|
|
224
|
+
def hdrdict(dictionary: dict):
|
|
222
225
|
for key in dictionary:
|
|
223
226
|
yield str(key), str(dictionary[key])
|
|
224
227
|
|
|
@@ -235,10 +238,33 @@ class Mime:
|
|
|
235
238
|
BINARY = 'application/octet-stream'
|
|
236
239
|
|
|
237
240
|
|
|
238
|
-
def load_test_conf_file(file_name):
|
|
241
|
+
def load_test_conf_file(file_name: str) -> dict[str, Any]:
|
|
239
242
|
config_dir = next(filter(lambda d: os.path.exists(os.path.join(d, file_name)), get_config_dirs()))
|
|
240
243
|
with open(os.path.join(config_dir, file_name)) as f:
|
|
241
244
|
return json.load(f)
|
|
242
245
|
|
|
243
246
|
|
|
247
|
+
def remove_config(func: Callable) -> Callable:
|
|
248
|
+
@wraps(func)
|
|
249
|
+
def wrapper(*args, **kwargs):
|
|
250
|
+
for configfile in get_config_dirs():
|
|
251
|
+
# Rename the config to <config>.tmp
|
|
252
|
+
try:
|
|
253
|
+
rename(f"{configfile}rucio.cfg", f"{configfile}rucio.cfg.tmp")
|
|
254
|
+
except FileNotFoundError:
|
|
255
|
+
pass # When a test uses a os.env assigned conf, there's nothing stating the default location has something
|
|
256
|
+
try:
|
|
257
|
+
# Execute the test
|
|
258
|
+
func(*args, **kwargs)
|
|
259
|
+
finally:
|
|
260
|
+
# And put the config back
|
|
261
|
+
for configfile in get_config_dirs():
|
|
262
|
+
try:
|
|
263
|
+
rename(f"{configfile}rucio.cfg.tmp", f"{configfile}rucio.cfg")
|
|
264
|
+
except FileNotFoundError:
|
|
265
|
+
pass
|
|
266
|
+
|
|
267
|
+
return wrapper
|
|
268
|
+
|
|
269
|
+
|
|
244
270
|
RSE_namedtuple = namedtuple('RSE_namedtuple', ['name', 'id'])
|
rucio/tests/common_server.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");
|
|
@@ -20,7 +19,8 @@ from sqlalchemy.orm import aliased
|
|
|
20
19
|
from rucio.core import config as core_config
|
|
21
20
|
from rucio.core.vo import map_vo
|
|
22
21
|
from rucio.db.sqla import models
|
|
23
|
-
from rucio.db.sqla.session import
|
|
22
|
+
from rucio.db.sqla.session import get_session, transactional_session
|
|
23
|
+
|
|
24
24
|
from .common import get_long_vo
|
|
25
25
|
|
|
26
26
|
# Functions containing server-only includes that can't be included in client tests
|
|
@@ -115,7 +115,7 @@ def cleanup_db_deps(model, select_rows_stmt, *, session=None):
|
|
|
115
115
|
|
|
116
116
|
|
|
117
117
|
def reset_config_table():
|
|
118
|
-
""" Clear the config table and install any default
|
|
118
|
+
""" Clear the config table and install any default entries needed for the tests.
|
|
119
119
|
"""
|
|
120
120
|
db_session = get_session()
|
|
121
121
|
db_session.query(models.Config).delete()
|
rucio/transfertool/__init__.py
CHANGED