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/{api → gateway}/rule.py
RENAMED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -13,23 +12,25 @@
|
|
|
13
12
|
# See the License for the specific language governing permissions and
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
16
|
-
from typing import Any,
|
|
15
|
+
from typing import TYPE_CHECKING, Any, Literal, Optional
|
|
17
16
|
|
|
18
|
-
from rucio.api.permission import has_permission
|
|
19
17
|
from rucio.common.config import config_get_bool
|
|
20
18
|
from rucio.common.exception import AccessDenied
|
|
21
19
|
from rucio.common.schema import validate_schema
|
|
22
20
|
from rucio.common.types import InternalAccount, InternalScope
|
|
23
|
-
from rucio.common.utils import
|
|
21
|
+
from rucio.common.utils import gateway_update_return_dict
|
|
24
22
|
from rucio.core import rule
|
|
25
23
|
from rucio.db.sqla.session import read_session, stream_session, transactional_session
|
|
24
|
+
from rucio.gateway.permission import has_permission
|
|
26
25
|
|
|
27
26
|
if TYPE_CHECKING:
|
|
27
|
+
from collections.abc import Iterator, Sequence
|
|
28
|
+
|
|
28
29
|
from sqlalchemy.orm import Session
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
@read_session
|
|
32
|
-
def is_multi_vo(*, session: "Session"):
|
|
33
|
+
def is_multi_vo(*, session: "Session") -> bool:
|
|
33
34
|
"""
|
|
34
35
|
Check whether this instance is configured for multi-VO
|
|
35
36
|
returns: Boolean True if running in multi-VO
|
|
@@ -38,9 +39,33 @@ def is_multi_vo(*, session: "Session"):
|
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
@transactional_session
|
|
41
|
-
def add_replication_rule(
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
def add_replication_rule(
|
|
43
|
+
dids: "Sequence[dict[str, str]]",
|
|
44
|
+
copies: int,
|
|
45
|
+
rse_expression: str,
|
|
46
|
+
weight: Optional[str],
|
|
47
|
+
lifetime: Optional[int],
|
|
48
|
+
grouping: Literal['ALL', 'DATASET', 'NONE'],
|
|
49
|
+
account: str,
|
|
50
|
+
locked: bool,
|
|
51
|
+
subscription_id: Optional[str],
|
|
52
|
+
source_replica_expression: Optional[str],
|
|
53
|
+
activity: Optional[str],
|
|
54
|
+
notify: Optional[Literal['Y', 'N', 'C', 'P']],
|
|
55
|
+
purge_replicas: bool,
|
|
56
|
+
ignore_availability: bool,
|
|
57
|
+
comment: Optional[str],
|
|
58
|
+
ask_approval: bool,
|
|
59
|
+
asynchronous: bool,
|
|
60
|
+
delay_injection: Optional[int],
|
|
61
|
+
priority: int,
|
|
62
|
+
split_container: bool,
|
|
63
|
+
meta: Optional[dict[str, Any]],
|
|
64
|
+
issuer: str,
|
|
65
|
+
vo: str = 'def',
|
|
66
|
+
*,
|
|
67
|
+
session: "Session"
|
|
68
|
+
) -> list[str]:
|
|
44
69
|
"""
|
|
45
70
|
Adds a replication rule.
|
|
46
71
|
|
|
@@ -89,12 +114,11 @@ def add_replication_rule(dids, copies, rse_expression, weight, lifetime, groupin
|
|
|
89
114
|
if not has_permission(issuer=issuer, vo=vo, action='add_rule', kwargs=kwargs, session=session):
|
|
90
115
|
raise AccessDenied('Account %s can not add replication rule' % (issuer))
|
|
91
116
|
|
|
92
|
-
|
|
93
|
-
for d in dids
|
|
94
|
-
d['scope'] = InternalScope(d['scope'], vo=vo)
|
|
117
|
+
account_internal = InternalAccount(account, vo=vo)
|
|
118
|
+
dids_with_internal_scope = [{'name': d['name'], 'scope': InternalScope(d['scope'], vo=vo)} for d in dids]
|
|
95
119
|
|
|
96
|
-
return rule.add_rule(account=
|
|
97
|
-
dids=
|
|
120
|
+
return rule.add_rule(account=account_internal,
|
|
121
|
+
dids=dids_with_internal_scope,
|
|
98
122
|
copies=copies,
|
|
99
123
|
rse_expression=rse_expression,
|
|
100
124
|
grouping=grouping,
|
|
@@ -118,7 +142,7 @@ def add_replication_rule(dids, copies, rse_expression, weight, lifetime, groupin
|
|
|
118
142
|
|
|
119
143
|
|
|
120
144
|
@read_session
|
|
121
|
-
def get_replication_rule(rule_id, issuer, vo='def', *, session: "Session"):
|
|
145
|
+
def get_replication_rule(rule_id: str, issuer: str, vo: str = 'def', *, session: "Session") -> dict[str, Any]:
|
|
122
146
|
"""
|
|
123
147
|
Get replication rule by it's id.
|
|
124
148
|
|
|
@@ -131,11 +155,16 @@ def get_replication_rule(rule_id, issuer, vo='def', *, session: "Session"):
|
|
|
131
155
|
if is_multi_vo(session=session) and not has_permission(issuer=issuer, vo=vo, action='access_rule_vo', kwargs=kwargs, session=session):
|
|
132
156
|
raise AccessDenied('Account %s can not access rules at other VOs.' % (issuer))
|
|
133
157
|
result = rule.get_rule(rule_id, session=session)
|
|
134
|
-
return
|
|
158
|
+
return gateway_update_return_dict(result, session=session)
|
|
135
159
|
|
|
136
160
|
|
|
137
161
|
@stream_session
|
|
138
|
-
def list_replication_rules(
|
|
162
|
+
def list_replication_rules(
|
|
163
|
+
filters: Optional[dict[str, Any]] = None,
|
|
164
|
+
vo: str = 'def',
|
|
165
|
+
*,
|
|
166
|
+
session: "Session"
|
|
167
|
+
) -> "Iterator[dict[str, Any]]":
|
|
139
168
|
"""
|
|
140
169
|
Lists replication rules based on a filter.
|
|
141
170
|
|
|
@@ -144,8 +173,7 @@ def list_replication_rules(filters={}, vo='def', *, session: "Session"):
|
|
|
144
173
|
:param session: The database session in use.
|
|
145
174
|
"""
|
|
146
175
|
# If filters is empty, create a new dict to avoid overwriting the function's default
|
|
147
|
-
|
|
148
|
-
filters = {}
|
|
176
|
+
filters = filters or {}
|
|
149
177
|
|
|
150
178
|
if 'scope' in filters:
|
|
151
179
|
scope = filters['scope']
|
|
@@ -161,11 +189,17 @@ def list_replication_rules(filters={}, vo='def', *, session: "Session"):
|
|
|
161
189
|
|
|
162
190
|
rules = rule.list_rules(filters, session=session)
|
|
163
191
|
for r in rules:
|
|
164
|
-
yield
|
|
192
|
+
yield gateway_update_return_dict(r, session=session)
|
|
165
193
|
|
|
166
194
|
|
|
167
195
|
@read_session
|
|
168
|
-
def list_replication_rule_history(
|
|
196
|
+
def list_replication_rule_history(
|
|
197
|
+
rule_id: str,
|
|
198
|
+
issuer: str,
|
|
199
|
+
vo: str = 'def',
|
|
200
|
+
*,
|
|
201
|
+
session: "Session"
|
|
202
|
+
) -> "Iterator[dict[str, Any]]":
|
|
169
203
|
"""
|
|
170
204
|
Lists replication rule history..
|
|
171
205
|
|
|
@@ -181,7 +215,13 @@ def list_replication_rule_history(rule_id, issuer, vo='def', *, session: "Sessio
|
|
|
181
215
|
|
|
182
216
|
|
|
183
217
|
@stream_session
|
|
184
|
-
def list_replication_rule_full_history(
|
|
218
|
+
def list_replication_rule_full_history(
|
|
219
|
+
scope: str,
|
|
220
|
+
name: str,
|
|
221
|
+
vo: str = 'def',
|
|
222
|
+
*,
|
|
223
|
+
session: "Session"
|
|
224
|
+
) -> "Iterator[dict[str, Any]]":
|
|
185
225
|
"""
|
|
186
226
|
List the rule history of a DID.
|
|
187
227
|
|
|
@@ -190,14 +230,20 @@ def list_replication_rule_full_history(scope, name, vo='def', *, session: "Sessi
|
|
|
190
230
|
:param vo: The VO to act on.
|
|
191
231
|
:param session: The database session in use.
|
|
192
232
|
"""
|
|
193
|
-
|
|
194
|
-
rules = rule.list_rule_full_history(
|
|
233
|
+
scope_internal = InternalScope(scope, vo=vo)
|
|
234
|
+
rules = rule.list_rule_full_history(scope_internal, name, session=session)
|
|
195
235
|
for r in rules:
|
|
196
|
-
yield
|
|
236
|
+
yield gateway_update_return_dict(r, session=session)
|
|
197
237
|
|
|
198
238
|
|
|
199
239
|
@stream_session
|
|
200
|
-
def list_associated_replication_rules_for_file(
|
|
240
|
+
def list_associated_replication_rules_for_file(
|
|
241
|
+
scope: str,
|
|
242
|
+
name: str,
|
|
243
|
+
vo: str = 'def',
|
|
244
|
+
*,
|
|
245
|
+
session: "Session"
|
|
246
|
+
) -> "Iterator[dict[str, Any]]":
|
|
201
247
|
"""
|
|
202
248
|
Lists associated replication rules by file.
|
|
203
249
|
|
|
@@ -206,14 +252,21 @@ def list_associated_replication_rules_for_file(scope, name, vo='def', *, session
|
|
|
206
252
|
:param vo: The VO to act on.
|
|
207
253
|
:param session: The database session in use.
|
|
208
254
|
"""
|
|
209
|
-
|
|
210
|
-
rules = rule.list_associated_rules_for_file(scope=
|
|
255
|
+
scope_internal = InternalScope(scope, vo=vo)
|
|
256
|
+
rules = rule.list_associated_rules_for_file(scope=scope_internal, name=name, session=session)
|
|
211
257
|
for r in rules:
|
|
212
|
-
yield
|
|
258
|
+
yield gateway_update_return_dict(r, session=session)
|
|
213
259
|
|
|
214
260
|
|
|
215
261
|
@transactional_session
|
|
216
|
-
def delete_replication_rule(
|
|
262
|
+
def delete_replication_rule(
|
|
263
|
+
rule_id: str,
|
|
264
|
+
purge_replicas: Optional[bool],
|
|
265
|
+
issuer: str,
|
|
266
|
+
vo: str = 'def',
|
|
267
|
+
*,
|
|
268
|
+
session: "Session"
|
|
269
|
+
) -> None:
|
|
217
270
|
"""
|
|
218
271
|
Deletes a replication rule and all associated locks.
|
|
219
272
|
|
|
@@ -233,7 +286,14 @@ def delete_replication_rule(rule_id, purge_replicas, issuer, vo='def', *, sessio
|
|
|
233
286
|
|
|
234
287
|
|
|
235
288
|
@transactional_session
|
|
236
|
-
def update_replication_rule(
|
|
289
|
+
def update_replication_rule(
|
|
290
|
+
rule_id: str,
|
|
291
|
+
options: dict[str, Any],
|
|
292
|
+
issuer: str,
|
|
293
|
+
vo: str = 'def',
|
|
294
|
+
*,
|
|
295
|
+
session: "Session"
|
|
296
|
+
) -> None:
|
|
237
297
|
"""
|
|
238
298
|
Update lock state of a replication rule.
|
|
239
299
|
|
|
@@ -265,7 +325,15 @@ def update_replication_rule(rule_id: str, options: dict[str, Any], issuer: str,
|
|
|
265
325
|
|
|
266
326
|
|
|
267
327
|
@transactional_session
|
|
268
|
-
def reduce_replication_rule(
|
|
328
|
+
def reduce_replication_rule(
|
|
329
|
+
rule_id: str,
|
|
330
|
+
copies: int,
|
|
331
|
+
exclude_expression: Optional[str],
|
|
332
|
+
issuer: str,
|
|
333
|
+
vo: str = 'def',
|
|
334
|
+
*,
|
|
335
|
+
session: "Session"
|
|
336
|
+
) -> str:
|
|
269
337
|
"""
|
|
270
338
|
Reduce the number of copies for a rule by atomically replacing the rule.
|
|
271
339
|
|
|
@@ -287,7 +355,13 @@ def reduce_replication_rule(rule_id, copies, exclude_expression, issuer, vo='def
|
|
|
287
355
|
|
|
288
356
|
|
|
289
357
|
@read_session
|
|
290
|
-
def examine_replication_rule(
|
|
358
|
+
def examine_replication_rule(
|
|
359
|
+
rule_id: str,
|
|
360
|
+
issuer: str,
|
|
361
|
+
vo: str = 'def',
|
|
362
|
+
*,
|
|
363
|
+
session: "Session"
|
|
364
|
+
) -> dict[str, Any]:
|
|
291
365
|
"""
|
|
292
366
|
Examine a replication rule.
|
|
293
367
|
|
|
@@ -300,14 +374,22 @@ def examine_replication_rule(rule_id, issuer, vo='def', *, session: "Session"):
|
|
|
300
374
|
if is_multi_vo(session=session) and not has_permission(issuer=issuer, vo=vo, action='access_rule_vo', kwargs=kwargs, session=session):
|
|
301
375
|
raise AccessDenied('Account %s can not access rules at other VOs.' % (issuer))
|
|
302
376
|
result = rule.examine_rule(rule_id, session=session)
|
|
303
|
-
result =
|
|
377
|
+
result = gateway_update_return_dict(result, session=session)
|
|
304
378
|
if 'transfers' in result:
|
|
305
|
-
result['transfers'] = [
|
|
379
|
+
result['transfers'] = [gateway_update_return_dict(t, session=session) for t in result['transfers']]
|
|
306
380
|
return result
|
|
307
381
|
|
|
308
382
|
|
|
309
383
|
@transactional_session
|
|
310
|
-
def move_replication_rule(
|
|
384
|
+
def move_replication_rule(
|
|
385
|
+
rule_id: str,
|
|
386
|
+
rse_expression: str,
|
|
387
|
+
override: dict[str, Any],
|
|
388
|
+
issuer: str,
|
|
389
|
+
vo: str = 'def',
|
|
390
|
+
*,
|
|
391
|
+
session: "Session"
|
|
392
|
+
) -> str:
|
|
311
393
|
"""
|
|
312
394
|
Move a replication rule to another RSE and, once done, delete the original one.
|
|
313
395
|
|
rucio/{api → gateway}/scope.py
RENAMED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -13,10 +12,10 @@
|
|
|
13
12
|
# See the License for the specific language governing permissions and
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
16
|
-
from typing import TYPE_CHECKING
|
|
15
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
17
16
|
|
|
18
|
-
import rucio.api.permission
|
|
19
17
|
import rucio.common.exception
|
|
18
|
+
import rucio.gateway.permission
|
|
20
19
|
from rucio.common.schema import validate_schema
|
|
21
20
|
from rucio.common.types import InternalAccount, InternalScope
|
|
22
21
|
from rucio.core import scope as core_scope
|
|
@@ -27,7 +26,7 @@ if TYPE_CHECKING:
|
|
|
27
26
|
|
|
28
27
|
|
|
29
28
|
@read_session
|
|
30
|
-
def list_scopes(filter_=
|
|
29
|
+
def list_scopes(filter_: Optional[dict[str, Any]] = None, vo: str = 'def', *, session: "Session") -> list[str]:
|
|
31
30
|
"""
|
|
32
31
|
Lists all scopes.
|
|
33
32
|
|
|
@@ -38,8 +37,7 @@ def list_scopes(filter_={}, vo='def', *, session: "Session"):
|
|
|
38
37
|
:returns: A list containing all scopes.
|
|
39
38
|
"""
|
|
40
39
|
# If filter is empty, create a new dict to avoid overwriting the function's default
|
|
41
|
-
|
|
42
|
-
filter_ = {}
|
|
40
|
+
filter_ = filter_ or {}
|
|
43
41
|
|
|
44
42
|
if 'scope' in filter_:
|
|
45
43
|
filter_['scope'] = InternalScope(scope=filter_['scope'], vo=vo)
|
|
@@ -49,7 +47,14 @@ def list_scopes(filter_={}, vo='def', *, session: "Session"):
|
|
|
49
47
|
|
|
50
48
|
|
|
51
49
|
@transactional_session
|
|
52
|
-
def add_scope(
|
|
50
|
+
def add_scope(
|
|
51
|
+
scope: str,
|
|
52
|
+
account: str,
|
|
53
|
+
issuer: str,
|
|
54
|
+
vo: str = 'def',
|
|
55
|
+
*,
|
|
56
|
+
session: "Session"
|
|
57
|
+
) -> None:
|
|
53
58
|
"""
|
|
54
59
|
Creates a scope for an account.
|
|
55
60
|
|
|
@@ -63,17 +68,22 @@ def add_scope(scope, account, issuer, vo='def', *, session: "Session"):
|
|
|
63
68
|
validate_schema(name='scope', obj=scope, vo=vo)
|
|
64
69
|
|
|
65
70
|
kwargs = {'scope': scope, 'account': account}
|
|
66
|
-
if not rucio.
|
|
71
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='add_scope', kwargs=kwargs, session=session):
|
|
67
72
|
raise rucio.common.exception.AccessDenied('Account %s can not add scope' % (issuer))
|
|
68
73
|
|
|
69
|
-
|
|
70
|
-
|
|
74
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
75
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
71
76
|
|
|
72
|
-
core_scope.add_scope(
|
|
77
|
+
core_scope.add_scope(internal_scope, internal_account, session=session)
|
|
73
78
|
|
|
74
79
|
|
|
75
80
|
@read_session
|
|
76
|
-
def get_scopes(
|
|
81
|
+
def get_scopes(
|
|
82
|
+
account: str,
|
|
83
|
+
vo: str = 'def',
|
|
84
|
+
*,
|
|
85
|
+
session: "Session"
|
|
86
|
+
) -> list[str]:
|
|
77
87
|
"""
|
|
78
88
|
Gets a list of all scopes for an account.
|
|
79
89
|
|
|
@@ -84,6 +94,6 @@ def get_scopes(account, vo='def', *, session: "Session"):
|
|
|
84
94
|
:returns: A list containing the names of all scopes for this account.
|
|
85
95
|
"""
|
|
86
96
|
|
|
87
|
-
|
|
97
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
88
98
|
|
|
89
|
-
return [scope.external for scope in core_scope.get_scopes(
|
|
99
|
+
return [scope.external for scope in core_scope.get_scopes(internal_account, session=session)]
|
|
@@ -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,15 +13,16 @@
|
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
16
15
|
from collections import namedtuple
|
|
16
|
+
from collections.abc import Iterator
|
|
17
17
|
from json import dumps, loads
|
|
18
|
-
from typing import TYPE_CHECKING
|
|
18
|
+
from typing import TYPE_CHECKING, Any, Literal, Optional, Union
|
|
19
19
|
|
|
20
|
-
from rucio.
|
|
21
|
-
from rucio.common.exception import InvalidObject, AccessDenied
|
|
20
|
+
from rucio.common.exception import AccessDenied, InvalidObject
|
|
22
21
|
from rucio.common.schema import validate_schema
|
|
23
22
|
from rucio.common.types import InternalAccount, InternalScope
|
|
24
23
|
from rucio.core import subscription
|
|
25
24
|
from rucio.db.sqla.session import read_session, stream_session, transactional_session
|
|
25
|
+
from rucio.gateway.permission import has_permission
|
|
26
26
|
|
|
27
27
|
if TYPE_CHECKING:
|
|
28
28
|
from sqlalchemy.orm import Session
|
|
@@ -32,36 +32,38 @@ SubscriptionRuleState = namedtuple('SubscriptionRuleState', ['account', 'name',
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
@transactional_session
|
|
35
|
-
def add_subscription(
|
|
35
|
+
def add_subscription(
|
|
36
|
+
name: str,
|
|
37
|
+
account: str,
|
|
38
|
+
filter_: dict[str, Any],
|
|
39
|
+
replication_rules: list[dict[str, Any]],
|
|
40
|
+
comments: str,
|
|
41
|
+
lifetime: Union[int, Literal[False]],
|
|
42
|
+
retroactive: bool,
|
|
43
|
+
dry_run: bool,
|
|
44
|
+
priority: Optional[int] = None,
|
|
45
|
+
issuer: Optional[str] = None,
|
|
46
|
+
vo: str = 'def',
|
|
47
|
+
*,
|
|
48
|
+
session: "Session"
|
|
49
|
+
) -> str:
|
|
36
50
|
"""
|
|
37
51
|
Adds a new subscription which will be verified against every new added file and dataset
|
|
38
52
|
|
|
39
53
|
:param account: Account identifier
|
|
40
|
-
:type account: String
|
|
41
54
|
:param name: Name of the subscription
|
|
42
|
-
:type: String
|
|
43
55
|
:param filter_: Dictionary of attributes by which the input data should be filtered
|
|
44
56
|
**Example**: ``{'dsn': 'data11_hi*.express_express.*,data11_hi*physics_MinBiasOverlay*', 'account': 'tzero'}``
|
|
45
|
-
:type filter_: Dict
|
|
46
57
|
:param replication_rules: Replication rules to be set : Dictionary with keys copies, rse_expression, weight, rse_expression
|
|
47
|
-
:type replication_rules: Dict
|
|
48
58
|
:param comments: Comments for the subscription
|
|
49
|
-
:type comments: String
|
|
50
59
|
:param lifetime: Subscription's lifetime (seconds); False if subscription has no lifetime
|
|
51
|
-
:type lifetime: Integer or False
|
|
52
60
|
:param retroactive: Flag to know if the subscription should be applied on previous data
|
|
53
|
-
:type retroactive: Boolean
|
|
54
61
|
:param dry_run: Just print the subscriptions actions without actually executing them (Useful if retroactive flag is set)
|
|
55
|
-
:type dry_run: Boolean
|
|
56
62
|
:param priority: The priority of the subscription
|
|
57
|
-
:type priority: Integer
|
|
58
63
|
:param issuer: The account issuing this operation.
|
|
59
|
-
:type issuer: String
|
|
60
64
|
:param vo: The VO to act on.
|
|
61
|
-
:type vo: String
|
|
62
65
|
:param session: The database session in use.
|
|
63
66
|
:returns: subscription_id
|
|
64
|
-
:rtype: String
|
|
65
67
|
"""
|
|
66
68
|
if not has_permission(issuer=issuer, vo=vo, action='add_subscription', kwargs={'account': account}, session=session):
|
|
67
69
|
raise AccessDenied('Account %s can not add subscription' % (issuer))
|
|
@@ -81,7 +83,7 @@ def add_subscription(name, account, filter_, replication_rules, comments, lifeti
|
|
|
81
83
|
except ValueError as error:
|
|
82
84
|
raise TypeError(error)
|
|
83
85
|
|
|
84
|
-
|
|
86
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
85
87
|
|
|
86
88
|
keys = ['scope', 'account']
|
|
87
89
|
types = [InternalScope, InternalAccount]
|
|
@@ -92,26 +94,29 @@ def add_subscription(name, account, filter_, replication_rules, comments, lifeti
|
|
|
92
94
|
else:
|
|
93
95
|
filter_[_key] = _type(filter_[_key], vo=vo).internal
|
|
94
96
|
|
|
95
|
-
return subscription.add_subscription(name=name, account=
|
|
97
|
+
return subscription.add_subscription(name=name, account=internal_account, filter_=dumps(filter_), replication_rules=dumps(replication_rules),
|
|
96
98
|
comments=comments, lifetime=lifetime, retroactive=retroactive, dry_run=dry_run, priority=priority,
|
|
97
99
|
session=session)
|
|
98
100
|
|
|
99
101
|
|
|
100
102
|
@transactional_session
|
|
101
|
-
def update_subscription(
|
|
103
|
+
def update_subscription(
|
|
104
|
+
name: str,
|
|
105
|
+
account: str,
|
|
106
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
107
|
+
issuer: Optional[str] = None,
|
|
108
|
+
vo: str = 'def',
|
|
109
|
+
*,
|
|
110
|
+
session: "Session"
|
|
111
|
+
) -> None:
|
|
102
112
|
"""
|
|
103
113
|
Updates a subscription
|
|
104
114
|
|
|
105
115
|
:param name: Name of the subscription
|
|
106
|
-
:type: String
|
|
107
116
|
:param account: Account identifier
|
|
108
|
-
:type account: String
|
|
109
117
|
:param metadata: Dictionary of metadata to update. Supported keys : filter, replication_rules, comments, lifetime, retroactive, dry_run, priority, last_processed
|
|
110
|
-
:type metadata: Dict
|
|
111
118
|
:param issuer: The account issuing this operation.
|
|
112
|
-
:type issuer: String
|
|
113
119
|
:param vo: The VO to act on.
|
|
114
|
-
:type vo: String
|
|
115
120
|
:param session: The database session in use.
|
|
116
121
|
:raises: SubscriptionNotFound if subscription is not found
|
|
117
122
|
"""
|
|
@@ -133,7 +138,7 @@ def update_subscription(name, account, metadata=None, issuer=None, vo='def', *,
|
|
|
133
138
|
except ValueError as error:
|
|
134
139
|
raise TypeError(error)
|
|
135
140
|
|
|
136
|
-
|
|
141
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
137
142
|
|
|
138
143
|
if 'filter' in metadata and metadata['filter'] is not None:
|
|
139
144
|
filter_ = metadata['filter']
|
|
@@ -147,35 +152,37 @@ def update_subscription(name, account, metadata=None, issuer=None, vo='def', *,
|
|
|
147
152
|
else:
|
|
148
153
|
filter_[_key] = _type(filter_[_key], vo=vo).internal
|
|
149
154
|
|
|
150
|
-
return subscription.update_subscription(name=name, account=
|
|
155
|
+
return subscription.update_subscription(name=name, account=internal_account, metadata=metadata, session=session)
|
|
151
156
|
|
|
152
157
|
|
|
153
158
|
@stream_session
|
|
154
|
-
def list_subscriptions(
|
|
159
|
+
def list_subscriptions(
|
|
160
|
+
name: Optional[str] = None,
|
|
161
|
+
account: Optional[str] = None,
|
|
162
|
+
state: Optional[str] = None,
|
|
163
|
+
vo: str = 'def',
|
|
164
|
+
*,
|
|
165
|
+
session: "Session"
|
|
166
|
+
) -> Iterator[dict[str, Any]]:
|
|
155
167
|
"""
|
|
156
168
|
Returns a dictionary with the subscription information :
|
|
157
169
|
Examples: ``{'status': 'INACTIVE/ACTIVE/BROKEN', 'last_modified_date': ...}``
|
|
158
170
|
|
|
159
171
|
:param name: Name of the subscription
|
|
160
|
-
:type: String
|
|
161
172
|
:param account: Account identifier
|
|
162
|
-
:type account: String
|
|
163
173
|
:param state: Filter for subscription state
|
|
164
|
-
:type state: String
|
|
165
174
|
:param vo: The VO to act on.
|
|
166
|
-
:type vo: String
|
|
167
175
|
:param session: The database session in use.
|
|
168
176
|
:returns: Dictionary containing subscription parameter
|
|
169
|
-
:rtype: Dict
|
|
170
177
|
:raises: exception.NotFound if subscription is not found
|
|
171
178
|
"""
|
|
172
179
|
|
|
173
180
|
if account:
|
|
174
|
-
|
|
181
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
175
182
|
else:
|
|
176
|
-
|
|
183
|
+
internal_account = InternalAccount('*', vo=vo)
|
|
177
184
|
|
|
178
|
-
subs = subscription.list_subscriptions(name,
|
|
185
|
+
subs = subscription.list_subscriptions(name, internal_account, state, session=session)
|
|
179
186
|
|
|
180
187
|
for sub in subs:
|
|
181
188
|
sub['account'] = sub['account'].external
|
|
@@ -192,7 +199,13 @@ def list_subscriptions(name=None, account=None, state=None, vo='def', *, session
|
|
|
192
199
|
|
|
193
200
|
|
|
194
201
|
@stream_session
|
|
195
|
-
def list_subscription_rule_states(
|
|
202
|
+
def list_subscription_rule_states(
|
|
203
|
+
name: Optional[str] = None,
|
|
204
|
+
account: Optional[str] = None,
|
|
205
|
+
vo: str = 'def',
|
|
206
|
+
*,
|
|
207
|
+
session: "Session"
|
|
208
|
+
) -> Iterator[SubscriptionRuleState]:
|
|
196
209
|
"""Returns a list of with the number of rules per state for a subscription.
|
|
197
210
|
|
|
198
211
|
:param name: Name of the subscription
|
|
@@ -202,10 +215,10 @@ def list_subscription_rule_states(name=None, account=None, vo='def', *, session:
|
|
|
202
215
|
:returns: Sequence with SubscriptionRuleState named tuples (account, name, state, count)
|
|
203
216
|
"""
|
|
204
217
|
if account is not None:
|
|
205
|
-
|
|
218
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
206
219
|
else:
|
|
207
|
-
|
|
208
|
-
subs = subscription.list_subscription_rule_states(name,
|
|
220
|
+
internal_account = InternalAccount('*', vo=vo)
|
|
221
|
+
subs = subscription.list_subscription_rule_states(name, internal_account, session=session)
|
|
209
222
|
for sub in subs:
|
|
210
223
|
# sub is an immutable Row so return new named tuple with edited entries
|
|
211
224
|
d = sub._asdict()
|
|
@@ -214,21 +227,30 @@ def list_subscription_rule_states(name=None, account=None, vo='def', *, session:
|
|
|
214
227
|
|
|
215
228
|
|
|
216
229
|
@transactional_session
|
|
217
|
-
def delete_subscription(
|
|
230
|
+
def delete_subscription(
|
|
231
|
+
subscription_id: str,
|
|
232
|
+
vo: str = 'def',
|
|
233
|
+
*,
|
|
234
|
+
session: "Session"
|
|
235
|
+
) -> None:
|
|
218
236
|
"""
|
|
219
237
|
Deletes a subscription
|
|
220
238
|
|
|
221
239
|
:param subscription_id: Subscription identifier
|
|
222
240
|
:param vo: The VO of the user issuing command
|
|
223
241
|
:param session: The database session in use.
|
|
224
|
-
:type subscription_id: String
|
|
225
242
|
"""
|
|
226
243
|
|
|
227
244
|
raise NotImplementedError
|
|
228
245
|
|
|
229
246
|
|
|
230
247
|
@read_session
|
|
231
|
-
def get_subscription_by_id(
|
|
248
|
+
def get_subscription_by_id(
|
|
249
|
+
subscription_id: str,
|
|
250
|
+
vo: str = 'def',
|
|
251
|
+
*,
|
|
252
|
+
session: "Session"
|
|
253
|
+
) -> dict[str, Any]:
|
|
232
254
|
"""
|
|
233
255
|
Get a specific subscription by id.
|
|
234
256
|
|
rucio/{api → gateway}/vo.py
RENAMED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -13,9 +12,8 @@
|
|
|
13
12
|
# See the License for the specific language governing permissions and
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
16
|
-
from typing import TYPE_CHECKING
|
|
15
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
17
16
|
|
|
18
|
-
from rucio.api.permission import has_permission
|
|
19
17
|
from rucio.common import exception
|
|
20
18
|
from rucio.common.schema import validate_schema
|
|
21
19
|
from rucio.common.types import InternalAccount
|
|
@@ -23,13 +21,14 @@ from rucio.core import identity
|
|
|
23
21
|
from rucio.core import vo as vo_core
|
|
24
22
|
from rucio.db.sqla.constants import IdentityType
|
|
25
23
|
from rucio.db.sqla.session import read_session, transactional_session
|
|
24
|
+
from rucio.gateway.permission import has_permission
|
|
26
25
|
|
|
27
26
|
if TYPE_CHECKING:
|
|
28
27
|
from sqlalchemy.orm import Session
|
|
29
28
|
|
|
30
29
|
|
|
31
30
|
@transactional_session
|
|
32
|
-
def add_vo(new_vo, issuer, description=None, email=None, vo='def', *, session: "Session"):
|
|
31
|
+
def add_vo(new_vo: str, issuer: str, description: Optional[str] = None, email: Optional[str] = None, vo: str = 'def', *, session: "Session") -> None:
|
|
33
32
|
'''
|
|
34
33
|
Add a new VO.
|
|
35
34
|
|
|
@@ -52,7 +51,7 @@ def add_vo(new_vo, issuer, description=None, email=None, vo='def', *, session: "
|
|
|
52
51
|
|
|
53
52
|
|
|
54
53
|
@read_session
|
|
55
|
-
def list_vos(issuer, vo='def', *, session: "Session"):
|
|
54
|
+
def list_vos(issuer: str, vo: str = 'def', *, session: "Session") -> list[dict[str, Any]]:
|
|
56
55
|
'''
|
|
57
56
|
List the VOs.
|
|
58
57
|
|
|
@@ -68,7 +67,18 @@ def list_vos(issuer, vo='def', *, session: "Session"):
|
|
|
68
67
|
|
|
69
68
|
|
|
70
69
|
@transactional_session
|
|
71
|
-
def recover_vo_root_identity(
|
|
70
|
+
def recover_vo_root_identity(
|
|
71
|
+
root_vo: str,
|
|
72
|
+
identity_key: str,
|
|
73
|
+
id_type: str,
|
|
74
|
+
email: str,
|
|
75
|
+
issuer: str,
|
|
76
|
+
default: bool = False,
|
|
77
|
+
password: Optional[str] = None,
|
|
78
|
+
vo: str = 'def',
|
|
79
|
+
*,
|
|
80
|
+
session: "Session"
|
|
81
|
+
) -> None:
|
|
72
82
|
"""
|
|
73
83
|
Adds a membership association between identity and the root account for given VO.
|
|
74
84
|
|
|
@@ -94,7 +104,7 @@ def recover_vo_root_identity(root_vo, identity_key, id_type, email, issuer, defa
|
|
|
94
104
|
|
|
95
105
|
|
|
96
106
|
@transactional_session
|
|
97
|
-
def update_vo(updated_vo, parameters, issuer, vo='def', *, session: "Session"):
|
|
107
|
+
def update_vo(updated_vo: str, parameters: dict[str, Any], issuer: str, vo: str = 'def', *, session: "Session") -> None:
|
|
98
108
|
"""
|
|
99
109
|
Update VO properties (email, description).
|
|
100
110
|
|