rucio 32.8.6__py3-none-any.whl → 35.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rucio might be problematic. Click here for more details.
- rucio/__init__.py +0 -1
- rucio/alembicrevision.py +1 -2
- rucio/client/__init__.py +0 -1
- rucio/client/accountclient.py +45 -25
- rucio/client/accountlimitclient.py +37 -9
- rucio/client/baseclient.py +199 -154
- rucio/client/client.py +2 -3
- rucio/client/configclient.py +19 -6
- rucio/client/credentialclient.py +9 -4
- rucio/client/didclient.py +238 -63
- rucio/client/diracclient.py +13 -5
- rucio/client/downloadclient.py +162 -51
- rucio/client/exportclient.py +4 -4
- rucio/client/fileclient.py +3 -4
- rucio/client/importclient.py +4 -4
- rucio/client/lifetimeclient.py +21 -5
- rucio/client/lockclient.py +18 -8
- rucio/client/{metaclient.py → metaconventionsclient.py} +18 -15
- rucio/client/pingclient.py +0 -1
- rucio/client/replicaclient.py +15 -5
- rucio/client/requestclient.py +35 -19
- rucio/client/rseclient.py +133 -51
- rucio/client/ruleclient.py +29 -22
- rucio/client/scopeclient.py +8 -6
- rucio/client/subscriptionclient.py +47 -35
- rucio/client/touchclient.py +8 -4
- rucio/client/uploadclient.py +166 -82
- rucio/common/__init__.py +0 -1
- rucio/common/cache.py +4 -4
- rucio/common/config.py +52 -47
- rucio/common/constants.py +69 -2
- rucio/common/constraints.py +0 -1
- rucio/common/didtype.py +24 -22
- rucio/common/dumper/__init__.py +70 -41
- rucio/common/dumper/consistency.py +26 -22
- rucio/common/dumper/data_models.py +16 -23
- rucio/common/dumper/path_parsing.py +0 -1
- rucio/common/exception.py +281 -222
- rucio/common/extra.py +0 -1
- rucio/common/logging.py +54 -38
- rucio/common/pcache.py +122 -101
- rucio/common/plugins.py +153 -0
- rucio/common/policy.py +4 -4
- rucio/common/schema/__init__.py +17 -10
- rucio/common/schema/atlas.py +7 -5
- rucio/common/schema/belleii.py +7 -5
- rucio/common/schema/domatpc.py +7 -5
- rucio/common/schema/escape.py +7 -5
- rucio/common/schema/generic.py +8 -6
- rucio/common/schema/generic_multi_vo.py +7 -5
- rucio/common/schema/icecube.py +7 -5
- rucio/common/stomp_utils.py +0 -1
- rucio/common/stopwatch.py +0 -1
- rucio/common/test_rucio_server.py +2 -2
- rucio/common/types.py +262 -17
- rucio/common/utils.py +743 -451
- rucio/core/__init__.py +0 -1
- rucio/core/account.py +99 -29
- rucio/core/account_counter.py +89 -24
- rucio/core/account_limit.py +90 -24
- rucio/core/authentication.py +86 -29
- rucio/core/config.py +108 -38
- rucio/core/credential.py +14 -7
- rucio/core/did.py +680 -782
- rucio/core/did_meta_plugins/__init__.py +8 -6
- rucio/core/did_meta_plugins/did_column_meta.py +17 -12
- rucio/core/did_meta_plugins/did_meta_plugin_interface.py +60 -11
- rucio/core/did_meta_plugins/filter_engine.py +90 -50
- rucio/core/did_meta_plugins/json_meta.py +41 -16
- rucio/core/did_meta_plugins/mongo_meta.py +25 -8
- rucio/core/did_meta_plugins/postgres_meta.py +3 -4
- rucio/core/dirac.py +46 -17
- rucio/core/distance.py +66 -43
- rucio/core/exporter.py +5 -5
- rucio/core/heartbeat.py +181 -81
- rucio/core/identity.py +22 -12
- rucio/core/importer.py +23 -12
- rucio/core/lifetime_exception.py +32 -32
- rucio/core/lock.py +244 -142
- rucio/core/message.py +79 -38
- rucio/core/{meta.py → meta_conventions.py} +57 -44
- rucio/core/monitor.py +19 -13
- rucio/core/naming_convention.py +68 -27
- rucio/core/nongrid_trace.py +17 -5
- rucio/core/oidc.py +151 -29
- rucio/core/permission/__init__.py +18 -6
- rucio/core/permission/atlas.py +50 -35
- rucio/core/permission/belleii.py +6 -5
- rucio/core/permission/escape.py +8 -6
- rucio/core/permission/generic.py +82 -80
- rucio/core/permission/generic_multi_vo.py +9 -7
- rucio/core/quarantined_replica.py +91 -58
- rucio/core/replica.py +1303 -772
- rucio/core/replica_sorter.py +10 -12
- rucio/core/request.py +1133 -285
- rucio/core/rse.py +142 -102
- rucio/core/rse_counter.py +49 -18
- rucio/core/rse_expression_parser.py +6 -7
- rucio/core/rse_selector.py +41 -16
- rucio/core/rule.py +1538 -474
- rucio/core/rule_grouping.py +213 -68
- rucio/core/scope.py +50 -22
- rucio/core/subscription.py +92 -44
- rucio/core/topology.py +66 -24
- rucio/core/trace.py +42 -28
- rucio/core/transfer.py +543 -259
- rucio/core/vo.py +36 -18
- rucio/core/volatile_replica.py +59 -32
- rucio/daemons/__init__.py +0 -1
- rucio/daemons/abacus/__init__.py +0 -1
- rucio/daemons/abacus/account.py +29 -19
- rucio/daemons/abacus/collection_replica.py +21 -10
- rucio/daemons/abacus/rse.py +22 -12
- rucio/daemons/atropos/__init__.py +0 -1
- rucio/daemons/atropos/atropos.py +1 -2
- rucio/daemons/auditor/__init__.py +56 -28
- rucio/daemons/auditor/hdfs.py +17 -6
- rucio/daemons/auditor/srmdumps.py +116 -45
- rucio/daemons/automatix/__init__.py +0 -1
- rucio/daemons/automatix/automatix.py +30 -18
- rucio/daemons/badreplicas/__init__.py +0 -1
- rucio/daemons/badreplicas/minos.py +29 -18
- rucio/daemons/badreplicas/minos_temporary_expiration.py +5 -7
- rucio/daemons/badreplicas/necromancer.py +9 -13
- rucio/daemons/bb8/__init__.py +0 -1
- rucio/daemons/bb8/bb8.py +10 -13
- rucio/daemons/bb8/common.py +151 -154
- rucio/daemons/bb8/nuclei_background_rebalance.py +15 -9
- rucio/daemons/bb8/t2_background_rebalance.py +15 -8
- rucio/daemons/c3po/__init__.py +0 -1
- rucio/daemons/c3po/algorithms/__init__.py +0 -1
- rucio/daemons/c3po/algorithms/simple.py +8 -5
- rucio/daemons/c3po/algorithms/t2_free_space.py +10 -7
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +10 -7
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +30 -15
- rucio/daemons/c3po/c3po.py +81 -52
- rucio/daemons/c3po/collectors/__init__.py +0 -1
- rucio/daemons/c3po/collectors/agis.py +17 -17
- rucio/daemons/c3po/collectors/free_space.py +32 -13
- rucio/daemons/c3po/collectors/jedi_did.py +14 -5
- rucio/daemons/c3po/collectors/mock_did.py +11 -6
- rucio/daemons/c3po/collectors/network_metrics.py +12 -4
- rucio/daemons/c3po/collectors/workload.py +21 -19
- rucio/daemons/c3po/utils/__init__.py +0 -1
- rucio/daemons/c3po/utils/dataset_cache.py +15 -5
- rucio/daemons/c3po/utils/expiring_dataset_cache.py +16 -5
- rucio/daemons/c3po/utils/expiring_list.py +6 -7
- rucio/daemons/c3po/utils/popularity.py +5 -2
- rucio/daemons/c3po/utils/timeseries.py +25 -12
- rucio/daemons/cache/__init__.py +0 -1
- rucio/daemons/cache/consumer.py +21 -15
- rucio/daemons/common.py +42 -18
- rucio/daemons/conveyor/__init__.py +0 -1
- rucio/daemons/conveyor/common.py +69 -37
- rucio/daemons/conveyor/finisher.py +83 -46
- rucio/daemons/conveyor/poller.py +101 -69
- rucio/daemons/conveyor/preparer.py +35 -28
- rucio/daemons/conveyor/receiver.py +64 -21
- rucio/daemons/conveyor/stager.py +33 -28
- rucio/daemons/conveyor/submitter.py +71 -47
- rucio/daemons/conveyor/throttler.py +99 -35
- rucio/daemons/follower/__init__.py +0 -1
- rucio/daemons/follower/follower.py +12 -8
- rucio/daemons/hermes/__init__.py +0 -1
- rucio/daemons/hermes/hermes.py +57 -21
- rucio/daemons/judge/__init__.py +0 -1
- rucio/daemons/judge/cleaner.py +27 -17
- rucio/daemons/judge/evaluator.py +31 -18
- rucio/daemons/judge/injector.py +31 -23
- rucio/daemons/judge/repairer.py +28 -18
- rucio/daemons/oauthmanager/__init__.py +0 -1
- rucio/daemons/oauthmanager/oauthmanager.py +7 -8
- rucio/daemons/reaper/__init__.py +0 -1
- rucio/daemons/reaper/dark_reaper.py +15 -9
- rucio/daemons/reaper/reaper.py +109 -67
- rucio/daemons/replicarecoverer/__init__.py +0 -1
- rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +255 -116
- rucio/{api → daemons/rsedecommissioner}/__init__.py +0 -1
- rucio/daemons/rsedecommissioner/config.py +81 -0
- rucio/daemons/rsedecommissioner/profiles/__init__.py +24 -0
- rucio/daemons/rsedecommissioner/profiles/atlas.py +60 -0
- rucio/daemons/rsedecommissioner/profiles/generic.py +451 -0
- rucio/daemons/rsedecommissioner/profiles/types.py +92 -0
- rucio/daemons/rsedecommissioner/rse_decommissioner.py +280 -0
- rucio/daemons/storage/__init__.py +0 -1
- rucio/daemons/storage/consistency/__init__.py +0 -1
- rucio/daemons/storage/consistency/actions.py +152 -59
- rucio/daemons/tracer/__init__.py +0 -1
- rucio/daemons/tracer/kronos.py +47 -24
- rucio/daemons/transmogrifier/__init__.py +0 -1
- rucio/daemons/transmogrifier/transmogrifier.py +35 -26
- rucio/daemons/undertaker/__init__.py +0 -1
- rucio/daemons/undertaker/undertaker.py +10 -10
- rucio/db/__init__.py +0 -1
- rucio/db/sqla/__init__.py +16 -2
- rucio/db/sqla/constants.py +10 -1
- rucio/db/sqla/migrate_repo/__init__.py +0 -1
- rucio/db/sqla/migrate_repo/env.py +0 -1
- rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -1
- rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +1 -3
- rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -3
- rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +1 -4
- rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -1
- rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -2
- rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -2
- rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -3
- rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +1 -2
- rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -3
- rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +1 -4
- rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -2
- rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -3
- rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +1 -2
- rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -1
- rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -2
- rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -2
- rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +1 -4
- rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +1 -3
- rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -2
- rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +1 -2
- rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -2
- rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +2 -3
- rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +1 -4
- rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -1
- rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -1
- rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -1
- rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -2
- rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -3
- rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -2
- rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +2 -4
- rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -2
- rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +1 -4
- rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -2
- rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +55 -0
- rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -2
- rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -2
- rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -3
- rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -3
- rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +1 -3
- rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +1 -3
- rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -3
- rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +1 -2
- rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +2 -4
- rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +1 -4
- rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -2
- rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +1 -2
- rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -3
- rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +1 -3
- rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -3
- rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -1
- rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -2
- rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +1 -3
- rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -2
- rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +1 -4
- rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -1
- rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +1 -4
- rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -1
- rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +57 -0
- rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -3
- rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +41 -0
- rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +1 -2
- rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +1 -3
- rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +1 -5
- rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +1 -3
- rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -3
- rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +1 -3
- rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -3
- rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +1 -2
- rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +1 -3
- rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +1 -4
- rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -2
- rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +1 -3
- rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -1
- rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +1 -2
- rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -2
- rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -1
- rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +1 -2
- rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -3
- rucio/db/sqla/models.py +122 -216
- rucio/db/sqla/sautils.py +12 -5
- rucio/db/sqla/session.py +71 -43
- rucio/db/sqla/types.py +3 -4
- rucio/db/sqla/util.py +91 -69
- rucio/gateway/__init__.py +13 -0
- rucio/{api → gateway}/account.py +119 -46
- rucio/{api → gateway}/account_limit.py +12 -13
- rucio/{api → gateway}/authentication.py +106 -33
- rucio/{api → gateway}/config.py +12 -13
- rucio/{api → gateway}/credential.py +15 -4
- rucio/{api → gateway}/did.py +384 -140
- rucio/{api → gateway}/dirac.py +16 -6
- rucio/{api → gateway}/exporter.py +3 -4
- rucio/{api → gateway}/heartbeat.py +17 -5
- rucio/{api → gateway}/identity.py +63 -19
- rucio/{api → gateway}/importer.py +3 -4
- rucio/{api → gateway}/lifetime_exception.py +35 -10
- rucio/{api → gateway}/lock.py +34 -12
- rucio/{api/meta.py → gateway/meta_conventions.py} +18 -16
- rucio/{api → gateway}/permission.py +4 -5
- rucio/{api → gateway}/quarantined_replica.py +13 -4
- rucio/{api → gateway}/replica.py +12 -11
- rucio/{api → gateway}/request.py +129 -28
- rucio/{api → gateway}/rse.py +11 -12
- rucio/{api → gateway}/rule.py +117 -35
- rucio/{api → gateway}/scope.py +24 -14
- rucio/{api → gateway}/subscription.py +65 -43
- rucio/{api → gateway}/vo.py +17 -7
- rucio/rse/__init__.py +3 -4
- rucio/rse/protocols/__init__.py +0 -1
- rucio/rse/protocols/bittorrent.py +184 -0
- rucio/rse/protocols/cache.py +1 -2
- rucio/rse/protocols/dummy.py +1 -2
- rucio/rse/protocols/gfal.py +12 -10
- rucio/rse/protocols/globus.py +7 -7
- rucio/rse/protocols/gsiftp.py +2 -3
- rucio/rse/protocols/http_cache.py +1 -2
- rucio/rse/protocols/mock.py +1 -2
- rucio/rse/protocols/ngarc.py +1 -2
- rucio/rse/protocols/posix.py +12 -13
- rucio/rse/protocols/protocol.py +116 -52
- rucio/rse/protocols/rclone.py +6 -7
- rucio/rse/protocols/rfio.py +4 -5
- rucio/rse/protocols/srm.py +9 -10
- rucio/rse/protocols/ssh.py +8 -9
- rucio/rse/protocols/storm.py +2 -3
- rucio/rse/protocols/webdav.py +17 -14
- rucio/rse/protocols/xrootd.py +23 -17
- rucio/rse/rsemanager.py +19 -7
- rucio/tests/__init__.py +0 -1
- rucio/tests/common.py +43 -17
- rucio/tests/common_server.py +3 -3
- rucio/transfertool/__init__.py +0 -1
- rucio/transfertool/bittorrent.py +199 -0
- rucio/transfertool/bittorrent_driver.py +52 -0
- rucio/transfertool/bittorrent_driver_qbittorrent.py +133 -0
- rucio/transfertool/fts3.py +250 -138
- rucio/transfertool/fts3_plugins.py +152 -0
- rucio/transfertool/globus.py +9 -8
- rucio/transfertool/globus_library.py +1 -2
- rucio/transfertool/mock.py +21 -12
- rucio/transfertool/transfertool.py +33 -24
- rucio/vcsversion.py +4 -4
- rucio/version.py +5 -13
- rucio/web/__init__.py +0 -1
- rucio/web/rest/__init__.py +0 -1
- rucio/web/rest/flaskapi/__init__.py +0 -1
- rucio/web/rest/flaskapi/authenticated_bp.py +0 -1
- rucio/web/rest/flaskapi/v1/__init__.py +0 -1
- rucio/web/rest/flaskapi/v1/accountlimits.py +15 -13
- rucio/web/rest/flaskapi/v1/accounts.py +49 -48
- rucio/web/rest/flaskapi/v1/archives.py +12 -10
- rucio/web/rest/flaskapi/v1/auth.py +146 -144
- rucio/web/rest/flaskapi/v1/common.py +82 -41
- rucio/web/rest/flaskapi/v1/config.py +5 -6
- rucio/web/rest/flaskapi/v1/credentials.py +7 -8
- rucio/web/rest/flaskapi/v1/dids.py +158 -28
- rucio/web/rest/flaskapi/v1/dirac.py +8 -8
- rucio/web/rest/flaskapi/v1/export.py +3 -5
- rucio/web/rest/flaskapi/v1/heartbeats.py +3 -5
- rucio/web/rest/flaskapi/v1/identities.py +3 -5
- rucio/web/rest/flaskapi/v1/import.py +3 -4
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +6 -9
- rucio/web/rest/flaskapi/v1/locks.py +2 -4
- rucio/web/rest/flaskapi/v1/main.py +10 -2
- rucio/web/rest/flaskapi/v1/{meta.py → meta_conventions.py} +26 -11
- rucio/web/rest/flaskapi/v1/metrics.py +1 -2
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +4 -4
- rucio/web/rest/flaskapi/v1/ping.py +6 -7
- rucio/web/rest/flaskapi/v1/redirect.py +8 -9
- rucio/web/rest/flaskapi/v1/replicas.py +43 -19
- rucio/web/rest/flaskapi/v1/requests.py +178 -21
- rucio/web/rest/flaskapi/v1/rses.py +61 -26
- rucio/web/rest/flaskapi/v1/rules.py +48 -18
- rucio/web/rest/flaskapi/v1/scopes.py +3 -5
- rucio/web/rest/flaskapi/v1/subscriptions.py +22 -18
- rucio/web/rest/flaskapi/v1/traces.py +4 -4
- rucio/web/rest/flaskapi/v1/types.py +20 -0
- rucio/web/rest/flaskapi/v1/vos.py +3 -5
- rucio/web/rest/main.py +0 -1
- rucio/web/rest/metrics.py +0 -1
- rucio/web/rest/ping.py +27 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/ldap.cfg.template +1 -1
- rucio-35.8.0.data/data/rucio/requirements.server.txt +268 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/bootstrap.py +3 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/merge_rucio_configs.py +2 -5
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/reset_database.py +3 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio +87 -85
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-account +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-collection-replica +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-rse +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-admin +45 -32
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-atropos +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-auditor +13 -7
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-automatix +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-bb8 +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-c3po +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-client +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-consumer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-finisher +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-poller +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-preparer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-receiver +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-stager +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-submitter +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-throttler +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dark-reaper +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dumper +11 -10
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-follower +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-hermes +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-cleaner +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-evaluator +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-injector +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-repairer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-kronos +1 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos-temporary-expiration +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-necromancer +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-oauth-manager +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-reaper +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-replica-recoverer +6 -7
- rucio-35.8.0.data/scripts/rucio-rse-decommissioner +66 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-storage-consistency-actions +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-transmogrifier +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-undertaker +1 -2
- rucio-35.8.0.dist-info/METADATA +72 -0
- rucio-35.8.0.dist-info/RECORD +493 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/WHEEL +1 -1
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/AUTHORS.rst +3 -0
- rucio/api/temporary_did.py +0 -49
- rucio/common/schema/cms.py +0 -478
- rucio/common/schema/lsst.py +0 -423
- rucio/core/permission/cms.py +0 -1166
- rucio/core/temporary_did.py +0 -188
- rucio/daemons/reaper/light_reaper.py +0 -255
- rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -115
- rucio-32.8.6.data/data/rucio/requirements.txt +0 -55
- rucio-32.8.6.data/scripts/rucio-light-reaper +0 -53
- rucio-32.8.6.dist-info/METADATA +0 -83
- rucio-32.8.6.dist-info/RECORD +0 -481
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic.ini.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/LICENSE +0 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -15,28 +14,30 @@
|
|
|
15
14
|
|
|
16
15
|
from datetime import datetime
|
|
17
16
|
from json import dumps
|
|
17
|
+
from typing import TYPE_CHECKING, Any, Literal, Optional, Union
|
|
18
18
|
|
|
19
|
-
from flask import Flask, Response,
|
|
20
|
-
|
|
21
|
-
from rucio.
|
|
22
|
-
list_account_attributes, add_account_attribute, del_account_attribute, update_account, get_usage_history
|
|
23
|
-
from rucio.api.account_limit import get_local_account_limits, get_local_account_limit, get_local_account_usage, \
|
|
24
|
-
get_global_account_limit, get_global_account_limits, get_global_account_usage
|
|
25
|
-
from rucio.api.identity import add_account_identity, del_account_identity
|
|
26
|
-
from rucio.api.rule import list_replication_rules
|
|
27
|
-
from rucio.api.scope import add_scope, get_scopes
|
|
28
|
-
from rucio.common.exception import AccountNotFound, Duplicate, AccessDenied, RuleNotFound, RSENotFound, \
|
|
29
|
-
IdentityError, CounterNotFound, ScopeNotFound, InvalidObject
|
|
19
|
+
from flask import Flask, Response, jsonify, redirect, request
|
|
20
|
+
|
|
21
|
+
from rucio.common.exception import AccessDenied, AccountNotFound, CounterNotFound, Duplicate, IdentityError, InvalidObject, RSENotFound, RuleNotFound, ScopeNotFound
|
|
30
22
|
from rucio.common.utils import APIEncoder, render_json
|
|
23
|
+
from rucio.gateway.account import add_account, add_account_attribute, del_account, del_account_attribute, get_account_info, get_usage_history, list_account_attributes, list_accounts, list_identities, update_account
|
|
24
|
+
from rucio.gateway.account_limit import get_global_account_limit, get_global_account_limits, get_global_account_usage, get_local_account_limit, get_local_account_limits, get_local_account_usage
|
|
25
|
+
from rucio.gateway.identity import add_account_identity, del_account_identity
|
|
26
|
+
from rucio.gateway.rule import list_replication_rules
|
|
27
|
+
from rucio.gateway.scope import add_scope, get_scopes
|
|
31
28
|
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
32
|
-
from rucio.web.rest.flaskapi.v1.common import
|
|
33
|
-
|
|
29
|
+
from rucio.web.rest.flaskapi.v1.common import ErrorHandlingMethodView, check_accept_header_wrapper_flask, generate_http_error_flask, json_parameters, param_get, response_headers, try_stream
|
|
30
|
+
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
from collections.abc import Iterator
|
|
33
|
+
|
|
34
|
+
from flask.typing import ResponseReturnValue
|
|
34
35
|
|
|
35
36
|
|
|
36
37
|
class Attributes(ErrorHandlingMethodView):
|
|
37
38
|
|
|
38
39
|
@check_accept_header_wrapper_flask(['application/json'])
|
|
39
|
-
def get(self, account):
|
|
40
|
+
def get(self, account: str) -> Response:
|
|
40
41
|
"""
|
|
41
42
|
---
|
|
42
43
|
summary: List attributes
|
|
@@ -81,7 +82,7 @@ class Attributes(ErrorHandlingMethodView):
|
|
|
81
82
|
|
|
82
83
|
return jsonify(attribs)
|
|
83
84
|
|
|
84
|
-
def post(self, account, key):
|
|
85
|
+
def post(self, account: str, key: str) -> 'ResponseReturnValue':
|
|
85
86
|
"""
|
|
86
87
|
---
|
|
87
88
|
summary: Create attribute
|
|
@@ -143,7 +144,7 @@ class Attributes(ErrorHandlingMethodView):
|
|
|
143
144
|
|
|
144
145
|
return 'Created', 201
|
|
145
146
|
|
|
146
|
-
def delete(self, account, key):
|
|
147
|
+
def delete(self, account: str, key: str) -> Union[Response, tuple[Literal[''], Literal[200]]]:
|
|
147
148
|
"""
|
|
148
149
|
---
|
|
149
150
|
summary: Delete attribute
|
|
@@ -183,7 +184,7 @@ class Attributes(ErrorHandlingMethodView):
|
|
|
183
184
|
|
|
184
185
|
class Scopes(ErrorHandlingMethodView):
|
|
185
186
|
@check_accept_header_wrapper_flask(['application/json'])
|
|
186
|
-
def get(self, account):
|
|
187
|
+
def get(self, account: str) -> Response:
|
|
187
188
|
"""
|
|
188
189
|
---
|
|
189
190
|
summary: List scopes
|
|
@@ -225,7 +226,7 @@ class Scopes(ErrorHandlingMethodView):
|
|
|
225
226
|
|
|
226
227
|
return jsonify(scopes)
|
|
227
228
|
|
|
228
|
-
def post(self, account, scope):
|
|
229
|
+
def post(self, account: str, scope: str) -> 'ResponseReturnValue':
|
|
229
230
|
"""
|
|
230
231
|
---
|
|
231
232
|
summary: Create scope
|
|
@@ -280,7 +281,7 @@ class AccountParameter(ErrorHandlingMethodView):
|
|
|
280
281
|
""" create, update, get and disable rucio accounts. """
|
|
281
282
|
|
|
282
283
|
@check_accept_header_wrapper_flask(['application/json'])
|
|
283
|
-
def get(self, account):
|
|
284
|
+
def get(self, account: str) -> "ResponseReturnValue":
|
|
284
285
|
"""
|
|
285
286
|
---
|
|
286
287
|
summary: List account parameters
|
|
@@ -332,7 +333,7 @@ class AccountParameter(ErrorHandlingMethodView):
|
|
|
332
333
|
frontend = request.headers.get('X-Requested-Host', default=None)
|
|
333
334
|
if frontend:
|
|
334
335
|
return redirect(f'{frontend}/accounts/{request.environ.get("issuer")}', code=302)
|
|
335
|
-
return redirect(request.environ.get('issuer'), code=303)
|
|
336
|
+
return redirect(request.environ.get('issuer'), code=303) # type: ignore (request.environ.get('issuer') might be None)
|
|
336
337
|
|
|
337
338
|
try:
|
|
338
339
|
acc = get_account_info(account, vo=request.environ.get('vo'))
|
|
@@ -349,7 +350,7 @@ class AccountParameter(ErrorHandlingMethodView):
|
|
|
349
350
|
|
|
350
351
|
return Response(render_json(**accdict), content_type="application/json")
|
|
351
352
|
|
|
352
|
-
def put(self, account):
|
|
353
|
+
def put(self, account: str) -> Union[Response, tuple[Literal[''], Literal[200]]]:
|
|
353
354
|
"""
|
|
354
355
|
---
|
|
355
356
|
summary: Update
|
|
@@ -392,7 +393,7 @@ class AccountParameter(ErrorHandlingMethodView):
|
|
|
392
393
|
|
|
393
394
|
return '', 200
|
|
394
395
|
|
|
395
|
-
def post(self, account):
|
|
396
|
+
def post(self, account: str) -> 'ResponseReturnValue':
|
|
396
397
|
"""
|
|
397
398
|
---
|
|
398
399
|
summary: Create
|
|
@@ -451,7 +452,7 @@ class AccountParameter(ErrorHandlingMethodView):
|
|
|
451
452
|
|
|
452
453
|
return 'Created', 201
|
|
453
454
|
|
|
454
|
-
def delete(self, account):
|
|
455
|
+
def delete(self, account: str) -> Union[Response, tuple[Literal[''], Literal[200]]]:
|
|
455
456
|
"""
|
|
456
457
|
---
|
|
457
458
|
summary: Delete
|
|
@@ -485,7 +486,7 @@ class AccountParameter(ErrorHandlingMethodView):
|
|
|
485
486
|
|
|
486
487
|
class Account(ErrorHandlingMethodView):
|
|
487
488
|
@check_accept_header_wrapper_flask(['application/x-json-stream'])
|
|
488
|
-
def get(self):
|
|
489
|
+
def get(self) -> Response:
|
|
489
490
|
"""
|
|
490
491
|
---
|
|
491
492
|
summary: List
|
|
@@ -515,16 +516,16 @@ class Account(ErrorHandlingMethodView):
|
|
|
515
516
|
description: Invalid Auth Token
|
|
516
517
|
"""
|
|
517
518
|
|
|
518
|
-
def generate(_filter, vo):
|
|
519
|
+
def generate(_filter: dict[str, Any], vo: str) -> "Iterator[str]":
|
|
519
520
|
for account in list_accounts(filter_=_filter, vo=vo):
|
|
520
521
|
yield render_json(**account) + "\n"
|
|
521
522
|
|
|
522
|
-
return try_stream(generate(_filter=dict(request.args.items(multi=False)), vo=request.environ.get('vo')))
|
|
523
|
+
return try_stream(generate(_filter=dict(request.args.items(multi=False)), vo=request.environ.get('vo', 'def')))
|
|
523
524
|
|
|
524
525
|
|
|
525
526
|
class LocalAccountLimits(ErrorHandlingMethodView):
|
|
526
527
|
@check_accept_header_wrapper_flask(['application/json'])
|
|
527
|
-
def get(self, account, rse=None):
|
|
528
|
+
def get(self, account: str, rse: Optional[str] = None) -> Response:
|
|
528
529
|
"""
|
|
529
530
|
---
|
|
530
531
|
summary: Get local limit
|
|
@@ -572,11 +573,11 @@ class LocalAccountLimits(ErrorHandlingMethodView):
|
|
|
572
573
|
|
|
573
574
|
class GlobalAccountLimits(ErrorHandlingMethodView):
|
|
574
575
|
@check_accept_header_wrapper_flask(['application/json'])
|
|
575
|
-
def get(self, account, rse_expression=None):
|
|
576
|
+
def get(self, account: str, rse_expression: Optional[str] = None) -> Response:
|
|
576
577
|
"""
|
|
577
578
|
---
|
|
578
|
-
summary: Get
|
|
579
|
-
description: Get the current
|
|
579
|
+
summary: Get global limit
|
|
580
|
+
description: Get the current global limits for an account on a specific RSE expression.
|
|
580
581
|
tags:
|
|
581
582
|
- Account
|
|
582
583
|
parameters:
|
|
@@ -619,7 +620,7 @@ class GlobalAccountLimits(ErrorHandlingMethodView):
|
|
|
619
620
|
|
|
620
621
|
|
|
621
622
|
class Identities(ErrorHandlingMethodView):
|
|
622
|
-
def post(self, account):
|
|
623
|
+
def post(self, account: str) -> 'ResponseReturnValue':
|
|
623
624
|
"""
|
|
624
625
|
---
|
|
625
626
|
summary: Create identity
|
|
@@ -704,7 +705,7 @@ class Identities(ErrorHandlingMethodView):
|
|
|
704
705
|
return 'Created', 201
|
|
705
706
|
|
|
706
707
|
@check_accept_header_wrapper_flask(['application/x-json-stream'])
|
|
707
|
-
def get(self, account):
|
|
708
|
+
def get(self, account: str) -> Response:
|
|
708
709
|
"""
|
|
709
710
|
---
|
|
710
711
|
summary: List identities
|
|
@@ -739,15 +740,15 @@ class Identities(ErrorHandlingMethodView):
|
|
|
739
740
|
description: Not acceptable
|
|
740
741
|
"""
|
|
741
742
|
try:
|
|
742
|
-
def generate(vo):
|
|
743
|
+
def generate(vo: str) -> "Iterator[str]":
|
|
743
744
|
for identity in list_identities(account, vo=vo):
|
|
744
745
|
yield render_json(**identity) + "\n"
|
|
745
746
|
|
|
746
|
-
return try_stream(generate(request.environ.get('vo')))
|
|
747
|
+
return try_stream(generate(request.environ.get('vo', 'def')))
|
|
747
748
|
except AccountNotFound as error:
|
|
748
749
|
return generate_http_error_flask(404, error)
|
|
749
750
|
|
|
750
|
-
def delete(self, account):
|
|
751
|
+
def delete(self, account: str) -> 'ResponseReturnValue':
|
|
751
752
|
"""
|
|
752
753
|
---
|
|
753
754
|
summary: Delete identity
|
|
@@ -800,7 +801,7 @@ class Identities(ErrorHandlingMethodView):
|
|
|
800
801
|
class Rules(ErrorHandlingMethodView):
|
|
801
802
|
|
|
802
803
|
@check_accept_header_wrapper_flask(['application/x-json-stream'])
|
|
803
|
-
def get(self, account):
|
|
804
|
+
def get(self, account: str) -> Response:
|
|
804
805
|
"""
|
|
805
806
|
---
|
|
806
807
|
summary: List rules
|
|
@@ -833,11 +834,11 @@ class Rules(ErrorHandlingMethodView):
|
|
|
833
834
|
filters = {'account': account}
|
|
834
835
|
filters.update(request.args)
|
|
835
836
|
try:
|
|
836
|
-
def generate(vo):
|
|
837
|
+
def generate(vo: str) -> "Iterator[str]":
|
|
837
838
|
for rule in list_replication_rules(filters=filters, vo=vo):
|
|
838
839
|
yield dumps(rule, cls=APIEncoder) + '\n'
|
|
839
840
|
|
|
840
|
-
return try_stream(generate(vo=request.environ.get('vo')))
|
|
841
|
+
return try_stream(generate(vo=request.environ.get('vo', 'def')))
|
|
841
842
|
except RuleNotFound as error:
|
|
842
843
|
return generate_http_error_flask(404, error)
|
|
843
844
|
|
|
@@ -845,7 +846,7 @@ class Rules(ErrorHandlingMethodView):
|
|
|
845
846
|
class UsageHistory(ErrorHandlingMethodView):
|
|
846
847
|
|
|
847
848
|
@check_accept_header_wrapper_flask(['application/json'])
|
|
848
|
-
def get(self, account, rse):
|
|
849
|
+
def get(self, account: str, rse: str) -> Response:
|
|
849
850
|
"""
|
|
850
851
|
---
|
|
851
852
|
summary: Get account usage history
|
|
@@ -909,7 +910,7 @@ class UsageHistory(ErrorHandlingMethodView):
|
|
|
909
910
|
class LocalUsage(ErrorHandlingMethodView):
|
|
910
911
|
|
|
911
912
|
@check_accept_header_wrapper_flask(['application/x-json-stream'])
|
|
912
|
-
def get(self, account, rse=None):
|
|
913
|
+
def get(self, account: str, rse: Optional[str] = None) -> Response:
|
|
913
914
|
"""
|
|
914
915
|
---
|
|
915
916
|
summary: Get local account usage
|
|
@@ -959,11 +960,11 @@ class LocalUsage(ErrorHandlingMethodView):
|
|
|
959
960
|
description: Not acceptable
|
|
960
961
|
"""
|
|
961
962
|
try:
|
|
962
|
-
def generate(issuer, vo):
|
|
963
|
+
def generate(issuer: str, vo: str) -> "Iterator[str]":
|
|
963
964
|
for usage in get_local_account_usage(account=account, rse=rse, issuer=issuer, vo=vo):
|
|
964
965
|
yield dumps(usage, cls=APIEncoder) + '\n'
|
|
965
966
|
|
|
966
|
-
return try_stream(generate(issuer=request.environ.get('issuer'), vo=request.environ.get('vo')))
|
|
967
|
+
return try_stream(generate(issuer=request.environ.get('issuer'), vo=request.environ.get('vo', 'def'))) # type: ignore (request.environ.get('issuer') could be None)
|
|
967
968
|
except (AccountNotFound, RSENotFound) as error:
|
|
968
969
|
return generate_http_error_flask(404, error)
|
|
969
970
|
except AccessDenied as error:
|
|
@@ -973,7 +974,7 @@ class LocalUsage(ErrorHandlingMethodView):
|
|
|
973
974
|
class GlobalUsage(ErrorHandlingMethodView):
|
|
974
975
|
|
|
975
976
|
@check_accept_header_wrapper_flask(['application/x-json-stream'])
|
|
976
|
-
def get(self, account, rse_expression=None):
|
|
977
|
+
def get(self, account: str, rse_expression: Optional[str] = None) -> Response:
|
|
977
978
|
"""
|
|
978
979
|
---
|
|
979
980
|
summary: Get local account usage
|
|
@@ -1023,18 +1024,18 @@ class GlobalUsage(ErrorHandlingMethodView):
|
|
|
1023
1024
|
description: Not acceptable
|
|
1024
1025
|
"""
|
|
1025
1026
|
try:
|
|
1026
|
-
def generate(vo, issuer):
|
|
1027
|
+
def generate(vo: str, issuer: str) -> "Iterator[str]":
|
|
1027
1028
|
for usage in get_global_account_usage(account=account, rse_expression=rse_expression, issuer=issuer, vo=vo):
|
|
1028
1029
|
yield dumps(usage, cls=APIEncoder) + '\n'
|
|
1029
1030
|
|
|
1030
|
-
return try_stream(generate(vo=request.environ.get('vo'), issuer=request.environ.get('issuer')))
|
|
1031
|
+
return try_stream(generate(vo=request.environ.get('vo', 'def'), issuer=request.environ.get('issuer'))) # type: ignore (request.environ.get('issuer') could be None)
|
|
1031
1032
|
except (AccountNotFound, RSENotFound) as error:
|
|
1032
1033
|
return generate_http_error_flask(404, error)
|
|
1033
1034
|
except AccessDenied as error:
|
|
1034
1035
|
return generate_http_error_flask(401, error)
|
|
1035
1036
|
|
|
1036
1037
|
|
|
1037
|
-
def blueprint(with_doc=False):
|
|
1038
|
+
def blueprint(with_doc: bool = False) -> AuthenticatedBlueprint:
|
|
1038
1039
|
bp = AuthenticatedBlueprint('accounts', __name__, url_prefix='/accounts')
|
|
1039
1040
|
|
|
1040
1041
|
attributes_view = Attributes.as_view('attributes')
|
|
@@ -1081,7 +1082,7 @@ def blueprint(with_doc=False):
|
|
|
1081
1082
|
return bp
|
|
1082
1083
|
|
|
1083
1084
|
|
|
1084
|
-
def make_doc():
|
|
1085
|
+
def make_doc() -> Flask:
|
|
1085
1086
|
""" Only used for sphinx documentation """
|
|
1086
1087
|
doc_app = Flask(__name__)
|
|
1087
1088
|
doc_app.register_blueprint(blueprint(with_doc=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");
|
|
@@ -14,20 +13,23 @@
|
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
16
15
|
from json import dumps
|
|
16
|
+
from typing import TYPE_CHECKING
|
|
17
17
|
|
|
18
|
-
from flask import Flask, request
|
|
18
|
+
from flask import Flask, Response, request
|
|
19
19
|
|
|
20
|
-
from rucio.
|
|
20
|
+
from rucio.gateway.did import list_archive_content
|
|
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, check_accept_header_wrapper_flask, generate_http_error_flask, parse_scope_name, response_headers, try_stream
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from collections.abc import Iterator
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
class Archive(ErrorHandlingMethodView):
|
|
27
29
|
""" REST APIs for archive. """
|
|
28
30
|
|
|
29
31
|
@check_accept_header_wrapper_flask(['application/x-json-stream'])
|
|
30
|
-
def get(self, scope_name):
|
|
32
|
+
def get(self, scope_name: str) -> Response:
|
|
31
33
|
"""
|
|
32
34
|
---
|
|
33
35
|
summary: List
|
|
@@ -74,16 +76,16 @@ class Archive(ErrorHandlingMethodView):
|
|
|
74
76
|
try:
|
|
75
77
|
scope, name = parse_scope_name(scope_name, request.environ.get('vo'))
|
|
76
78
|
|
|
77
|
-
def generate(vo):
|
|
79
|
+
def generate(vo: str) -> 'Iterator[str]':
|
|
78
80
|
for file in list_archive_content(scope=scope, name=name, vo=vo):
|
|
79
81
|
yield dumps(file) + '\n'
|
|
80
82
|
|
|
81
|
-
return try_stream(generate(vo=request.environ.get('vo')))
|
|
83
|
+
return try_stream(generate(vo=request.environ.get('vo', 'def')))
|
|
82
84
|
except ValueError as error:
|
|
83
85
|
return generate_http_error_flask(400, error)
|
|
84
86
|
|
|
85
87
|
|
|
86
|
-
def blueprint():
|
|
88
|
+
def blueprint() -> AuthenticatedBlueprint:
|
|
87
89
|
bp = AuthenticatedBlueprint('archives', __name__, url_prefix='/archives')
|
|
88
90
|
|
|
89
91
|
archive_view = Archive.as_view('archive')
|
|
@@ -93,7 +95,7 @@ def blueprint():
|
|
|
93
95
|
return bp
|
|
94
96
|
|
|
95
97
|
|
|
96
|
-
def make_doc():
|
|
98
|
+
def make_doc() -> Flask:
|
|
97
99
|
""" Only used for sphinx documentation """
|
|
98
100
|
doc_app = Flask(__name__)
|
|
99
101
|
doc_app.register_blueprint(blueprint())
|