rucio 37.0.0rc1__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 +17 -0
- rucio/alembicrevision.py +15 -0
- rucio/cli/__init__.py +14 -0
- rucio/cli/account.py +216 -0
- rucio/cli/bin_legacy/__init__.py +13 -0
- rucio/cli/bin_legacy/rucio.py +2825 -0
- rucio/cli/bin_legacy/rucio_admin.py +2500 -0
- rucio/cli/command.py +272 -0
- rucio/cli/config.py +72 -0
- rucio/cli/did.py +191 -0
- rucio/cli/download.py +128 -0
- rucio/cli/lifetime_exception.py +33 -0
- rucio/cli/replica.py +162 -0
- rucio/cli/rse.py +293 -0
- rucio/cli/rule.py +158 -0
- rucio/cli/scope.py +40 -0
- rucio/cli/subscription.py +73 -0
- rucio/cli/upload.py +60 -0
- rucio/cli/utils.py +226 -0
- rucio/client/__init__.py +15 -0
- rucio/client/accountclient.py +432 -0
- rucio/client/accountlimitclient.py +183 -0
- rucio/client/baseclient.py +983 -0
- rucio/client/client.py +120 -0
- rucio/client/configclient.py +126 -0
- rucio/client/credentialclient.py +59 -0
- rucio/client/didclient.py +868 -0
- rucio/client/diracclient.py +56 -0
- rucio/client/downloadclient.py +1783 -0
- rucio/client/exportclient.py +44 -0
- rucio/client/fileclient.py +50 -0
- rucio/client/importclient.py +42 -0
- rucio/client/lifetimeclient.py +90 -0
- rucio/client/lockclient.py +109 -0
- rucio/client/metaconventionsclient.py +140 -0
- rucio/client/pingclient.py +44 -0
- rucio/client/replicaclient.py +452 -0
- rucio/client/requestclient.py +125 -0
- rucio/client/richclient.py +317 -0
- rucio/client/rseclient.py +746 -0
- rucio/client/ruleclient.py +294 -0
- rucio/client/scopeclient.py +90 -0
- rucio/client/subscriptionclient.py +173 -0
- rucio/client/touchclient.py +82 -0
- rucio/client/uploadclient.py +969 -0
- rucio/common/__init__.py +13 -0
- rucio/common/bittorrent.py +234 -0
- rucio/common/cache.py +111 -0
- rucio/common/checksum.py +168 -0
- rucio/common/client.py +122 -0
- rucio/common/config.py +788 -0
- rucio/common/constants.py +217 -0
- rucio/common/constraints.py +17 -0
- rucio/common/didtype.py +237 -0
- rucio/common/dumper/__init__.py +342 -0
- rucio/common/dumper/consistency.py +497 -0
- rucio/common/dumper/data_models.py +362 -0
- rucio/common/dumper/path_parsing.py +75 -0
- rucio/common/exception.py +1208 -0
- rucio/common/extra.py +31 -0
- rucio/common/logging.py +420 -0
- rucio/common/pcache.py +1409 -0
- rucio/common/plugins.py +185 -0
- rucio/common/policy.py +93 -0
- rucio/common/schema/__init__.py +200 -0
- rucio/common/schema/generic.py +416 -0
- rucio/common/schema/generic_multi_vo.py +395 -0
- rucio/common/stomp_utils.py +423 -0
- rucio/common/stopwatch.py +55 -0
- rucio/common/test_rucio_server.py +154 -0
- rucio/common/types.py +483 -0
- rucio/common/utils.py +1688 -0
- rucio/core/__init__.py +13 -0
- rucio/core/account.py +496 -0
- rucio/core/account_counter.py +236 -0
- rucio/core/account_limit.py +425 -0
- rucio/core/authentication.py +620 -0
- rucio/core/config.py +437 -0
- rucio/core/credential.py +224 -0
- rucio/core/did.py +3004 -0
- rucio/core/did_meta_plugins/__init__.py +252 -0
- rucio/core/did_meta_plugins/did_column_meta.py +331 -0
- rucio/core/did_meta_plugins/did_meta_plugin_interface.py +165 -0
- rucio/core/did_meta_plugins/elasticsearch_meta.py +407 -0
- rucio/core/did_meta_plugins/filter_engine.py +672 -0
- rucio/core/did_meta_plugins/json_meta.py +240 -0
- rucio/core/did_meta_plugins/mongo_meta.py +229 -0
- rucio/core/did_meta_plugins/postgres_meta.py +352 -0
- rucio/core/dirac.py +237 -0
- rucio/core/distance.py +187 -0
- rucio/core/exporter.py +59 -0
- rucio/core/heartbeat.py +363 -0
- rucio/core/identity.py +301 -0
- rucio/core/importer.py +260 -0
- rucio/core/lifetime_exception.py +377 -0
- rucio/core/lock.py +577 -0
- rucio/core/message.py +288 -0
- rucio/core/meta_conventions.py +203 -0
- rucio/core/monitor.py +448 -0
- rucio/core/naming_convention.py +195 -0
- rucio/core/nongrid_trace.py +136 -0
- rucio/core/oidc.py +1463 -0
- rucio/core/permission/__init__.py +161 -0
- rucio/core/permission/generic.py +1124 -0
- rucio/core/permission/generic_multi_vo.py +1144 -0
- rucio/core/quarantined_replica.py +224 -0
- rucio/core/replica.py +4483 -0
- rucio/core/replica_sorter.py +362 -0
- rucio/core/request.py +3091 -0
- rucio/core/rse.py +2079 -0
- rucio/core/rse_counter.py +185 -0
- rucio/core/rse_expression_parser.py +459 -0
- rucio/core/rse_selector.py +304 -0
- rucio/core/rule.py +4484 -0
- rucio/core/rule_grouping.py +1620 -0
- rucio/core/scope.py +181 -0
- rucio/core/subscription.py +362 -0
- rucio/core/topology.py +490 -0
- rucio/core/trace.py +375 -0
- rucio/core/transfer.py +1531 -0
- rucio/core/vo.py +169 -0
- rucio/core/volatile_replica.py +151 -0
- rucio/daemons/__init__.py +13 -0
- rucio/daemons/abacus/__init__.py +13 -0
- rucio/daemons/abacus/account.py +116 -0
- rucio/daemons/abacus/collection_replica.py +124 -0
- rucio/daemons/abacus/rse.py +117 -0
- rucio/daemons/atropos/__init__.py +13 -0
- rucio/daemons/atropos/atropos.py +242 -0
- rucio/daemons/auditor/__init__.py +289 -0
- rucio/daemons/auditor/hdfs.py +97 -0
- rucio/daemons/auditor/srmdumps.py +355 -0
- rucio/daemons/automatix/__init__.py +13 -0
- rucio/daemons/automatix/automatix.py +304 -0
- rucio/daemons/badreplicas/__init__.py +13 -0
- rucio/daemons/badreplicas/minos.py +322 -0
- rucio/daemons/badreplicas/minos_temporary_expiration.py +171 -0
- rucio/daemons/badreplicas/necromancer.py +196 -0
- rucio/daemons/bb8/__init__.py +13 -0
- rucio/daemons/bb8/bb8.py +353 -0
- rucio/daemons/bb8/common.py +759 -0
- rucio/daemons/bb8/nuclei_background_rebalance.py +153 -0
- rucio/daemons/bb8/t2_background_rebalance.py +153 -0
- rucio/daemons/cache/__init__.py +13 -0
- rucio/daemons/cache/consumer.py +133 -0
- rucio/daemons/common.py +405 -0
- rucio/daemons/conveyor/__init__.py +13 -0
- rucio/daemons/conveyor/common.py +562 -0
- rucio/daemons/conveyor/finisher.py +529 -0
- rucio/daemons/conveyor/poller.py +394 -0
- rucio/daemons/conveyor/preparer.py +205 -0
- rucio/daemons/conveyor/receiver.py +179 -0
- rucio/daemons/conveyor/stager.py +133 -0
- rucio/daemons/conveyor/submitter.py +403 -0
- rucio/daemons/conveyor/throttler.py +532 -0
- rucio/daemons/follower/__init__.py +13 -0
- rucio/daemons/follower/follower.py +101 -0
- rucio/daemons/hermes/__init__.py +13 -0
- rucio/daemons/hermes/hermes.py +534 -0
- rucio/daemons/judge/__init__.py +13 -0
- rucio/daemons/judge/cleaner.py +159 -0
- rucio/daemons/judge/evaluator.py +185 -0
- rucio/daemons/judge/injector.py +162 -0
- rucio/daemons/judge/repairer.py +154 -0
- rucio/daemons/oauthmanager/__init__.py +13 -0
- rucio/daemons/oauthmanager/oauthmanager.py +198 -0
- rucio/daemons/reaper/__init__.py +13 -0
- rucio/daemons/reaper/dark_reaper.py +282 -0
- rucio/daemons/reaper/reaper.py +739 -0
- rucio/daemons/replicarecoverer/__init__.py +13 -0
- rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +626 -0
- rucio/daemons/rsedecommissioner/__init__.py +13 -0
- 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 +452 -0
- rucio/daemons/rsedecommissioner/profiles/types.py +93 -0
- rucio/daemons/rsedecommissioner/rse_decommissioner.py +280 -0
- rucio/daemons/storage/__init__.py +13 -0
- rucio/daemons/storage/consistency/__init__.py +13 -0
- rucio/daemons/storage/consistency/actions.py +848 -0
- rucio/daemons/tracer/__init__.py +13 -0
- rucio/daemons/tracer/kronos.py +511 -0
- rucio/daemons/transmogrifier/__init__.py +13 -0
- rucio/daemons/transmogrifier/transmogrifier.py +762 -0
- rucio/daemons/undertaker/__init__.py +13 -0
- rucio/daemons/undertaker/undertaker.py +137 -0
- rucio/db/__init__.py +13 -0
- rucio/db/sqla/__init__.py +52 -0
- rucio/db/sqla/constants.py +206 -0
- rucio/db/sqla/migrate_repo/__init__.py +13 -0
- rucio/db/sqla/migrate_repo/env.py +110 -0
- rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +70 -0
- rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +47 -0
- rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +59 -0
- rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +43 -0
- rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +91 -0
- rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +76 -0
- rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +43 -0
- rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +50 -0
- rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +68 -0
- rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +40 -0
- rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +45 -0
- rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +60 -0
- rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +40 -0
- rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +140 -0
- rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +73 -0
- rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +74 -0
- rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +43 -0
- rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +50 -0
- rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +134 -0
- rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +64 -0
- rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +39 -0
- rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +64 -0
- rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +51 -0
- rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +41 -0
- rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +43 -0
- rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +44 -0
- rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +53 -0
- rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +38 -0
- rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +47 -0
- rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +57 -0
- rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +69 -0
- rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +43 -0
- rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +42 -0
- rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +47 -0
- rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +46 -0
- rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +40 -0
- rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +67 -0
- rucio/db/sqla/migrate_repo/versions/30d5206e9cad_increase_oauthrequest_redirect_msg_.py +37 -0
- rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +44 -0
- rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +77 -0
- rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +60 -0
- rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +72 -0
- rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +42 -0
- rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +65 -0
- rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +133 -0
- rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +76 -0
- rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +60 -0
- rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +44 -0
- rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +43 -0
- rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +64 -0
- rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +40 -0
- rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +43 -0
- rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +44 -0
- rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +78 -0
- rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +41 -0
- rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +59 -0
- rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +44 -0
- rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +49 -0
- rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +40 -0
- rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +63 -0
- rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +43 -0
- 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 +45 -0
- rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +43 -0
- rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +43 -0
- rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +45 -0
- rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +47 -0
- rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +58 -0
- rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +45 -0
- rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +106 -0
- rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +55 -0
- rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +50 -0
- rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +47 -0
- rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +43 -0
- rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +41 -0
- rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +91 -0
- rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +72 -0
- rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +49 -0
- rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +43 -0
- rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +53 -0
- rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +45 -0
- rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +68 -0
- rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +45 -0
- rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +94 -0
- rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +54 -0
- rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +72 -0
- 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 +76 -0
- rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +47 -0
- rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +121 -0
- rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +59 -0
- rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +52 -0
- rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +54 -0
- rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +64 -0
- rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +49 -0
- 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 +43 -0
- 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 +91 -0
- rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +40 -0
- rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +143 -0
- rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +76 -0
- rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +50 -0
- rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +72 -0
- rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +43 -0
- rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +65 -0
- rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +47 -0
- rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +146 -0
- rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +104 -0
- rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +44 -0
- rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +43 -0
- rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +103 -0
- rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +49 -0
- rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +104 -0
- rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +29 -0
- rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +74 -0
- rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +47 -0
- rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +43 -0
- rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +37 -0
- rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +43 -0
- rucio/db/sqla/models.py +1743 -0
- rucio/db/sqla/sautils.py +55 -0
- rucio/db/sqla/session.py +529 -0
- rucio/db/sqla/types.py +206 -0
- rucio/db/sqla/util.py +543 -0
- rucio/gateway/__init__.py +13 -0
- rucio/gateway/account.py +345 -0
- rucio/gateway/account_limit.py +363 -0
- rucio/gateway/authentication.py +381 -0
- rucio/gateway/config.py +227 -0
- rucio/gateway/credential.py +70 -0
- rucio/gateway/did.py +987 -0
- rucio/gateway/dirac.py +83 -0
- rucio/gateway/exporter.py +60 -0
- rucio/gateway/heartbeat.py +76 -0
- rucio/gateway/identity.py +189 -0
- rucio/gateway/importer.py +46 -0
- rucio/gateway/lifetime_exception.py +121 -0
- rucio/gateway/lock.py +153 -0
- rucio/gateway/meta_conventions.py +98 -0
- rucio/gateway/permission.py +74 -0
- rucio/gateway/quarantined_replica.py +79 -0
- rucio/gateway/replica.py +538 -0
- rucio/gateway/request.py +330 -0
- rucio/gateway/rse.py +632 -0
- rucio/gateway/rule.py +437 -0
- rucio/gateway/scope.py +100 -0
- rucio/gateway/subscription.py +280 -0
- rucio/gateway/vo.py +126 -0
- rucio/rse/__init__.py +96 -0
- rucio/rse/protocols/__init__.py +13 -0
- rucio/rse/protocols/bittorrent.py +194 -0
- rucio/rse/protocols/cache.py +111 -0
- rucio/rse/protocols/dummy.py +100 -0
- rucio/rse/protocols/gfal.py +708 -0
- rucio/rse/protocols/globus.py +243 -0
- rucio/rse/protocols/http_cache.py +82 -0
- rucio/rse/protocols/mock.py +123 -0
- rucio/rse/protocols/ngarc.py +209 -0
- rucio/rse/protocols/posix.py +250 -0
- rucio/rse/protocols/protocol.py +361 -0
- rucio/rse/protocols/rclone.py +365 -0
- rucio/rse/protocols/rfio.py +145 -0
- rucio/rse/protocols/srm.py +338 -0
- rucio/rse/protocols/ssh.py +414 -0
- rucio/rse/protocols/storm.py +195 -0
- rucio/rse/protocols/webdav.py +594 -0
- rucio/rse/protocols/xrootd.py +302 -0
- rucio/rse/rsemanager.py +881 -0
- rucio/rse/translation.py +260 -0
- rucio/tests/__init__.py +13 -0
- rucio/tests/common.py +280 -0
- rucio/tests/common_server.py +149 -0
- rucio/transfertool/__init__.py +13 -0
- rucio/transfertool/bittorrent.py +200 -0
- rucio/transfertool/bittorrent_driver.py +50 -0
- rucio/transfertool/bittorrent_driver_qbittorrent.py +134 -0
- rucio/transfertool/fts3.py +1600 -0
- rucio/transfertool/fts3_plugins.py +152 -0
- rucio/transfertool/globus.py +201 -0
- rucio/transfertool/globus_library.py +181 -0
- rucio/transfertool/mock.py +89 -0
- rucio/transfertool/transfertool.py +221 -0
- rucio/vcsversion.py +11 -0
- rucio/version.py +45 -0
- rucio/web/__init__.py +13 -0
- rucio/web/rest/__init__.py +13 -0
- rucio/web/rest/flaskapi/__init__.py +13 -0
- rucio/web/rest/flaskapi/authenticated_bp.py +27 -0
- rucio/web/rest/flaskapi/v1/__init__.py +13 -0
- rucio/web/rest/flaskapi/v1/accountlimits.py +236 -0
- rucio/web/rest/flaskapi/v1/accounts.py +1103 -0
- rucio/web/rest/flaskapi/v1/archives.py +102 -0
- rucio/web/rest/flaskapi/v1/auth.py +1644 -0
- rucio/web/rest/flaskapi/v1/common.py +426 -0
- rucio/web/rest/flaskapi/v1/config.py +304 -0
- rucio/web/rest/flaskapi/v1/credentials.py +213 -0
- rucio/web/rest/flaskapi/v1/dids.py +2340 -0
- rucio/web/rest/flaskapi/v1/dirac.py +116 -0
- rucio/web/rest/flaskapi/v1/export.py +75 -0
- rucio/web/rest/flaskapi/v1/heartbeats.py +127 -0
- rucio/web/rest/flaskapi/v1/identities.py +285 -0
- rucio/web/rest/flaskapi/v1/import.py +132 -0
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +312 -0
- rucio/web/rest/flaskapi/v1/locks.py +358 -0
- rucio/web/rest/flaskapi/v1/main.py +91 -0
- rucio/web/rest/flaskapi/v1/meta_conventions.py +241 -0
- rucio/web/rest/flaskapi/v1/metrics.py +36 -0
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +97 -0
- rucio/web/rest/flaskapi/v1/ping.py +88 -0
- rucio/web/rest/flaskapi/v1/redirect.py +366 -0
- rucio/web/rest/flaskapi/v1/replicas.py +1894 -0
- rucio/web/rest/flaskapi/v1/requests.py +998 -0
- rucio/web/rest/flaskapi/v1/rses.py +2250 -0
- rucio/web/rest/flaskapi/v1/rules.py +854 -0
- rucio/web/rest/flaskapi/v1/scopes.py +159 -0
- rucio/web/rest/flaskapi/v1/subscriptions.py +650 -0
- rucio/web/rest/flaskapi/v1/templates/auth_crash.html +80 -0
- rucio/web/rest/flaskapi/v1/templates/auth_granted.html +82 -0
- rucio/web/rest/flaskapi/v1/traces.py +137 -0
- rucio/web/rest/flaskapi/v1/types.py +20 -0
- rucio/web/rest/flaskapi/v1/vos.py +278 -0
- rucio/web/rest/main.py +18 -0
- rucio/web/rest/metrics.py +27 -0
- rucio/web/rest/ping.py +27 -0
- rucio-37.0.0rc1.data/data/rucio/etc/alembic.ini.template +71 -0
- rucio-37.0.0rc1.data/data/rucio/etc/alembic_offline.ini.template +74 -0
- rucio-37.0.0rc1.data/data/rucio/etc/globus-config.yml.template +5 -0
- rucio-37.0.0rc1.data/data/rucio/etc/ldap.cfg.template +30 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_approval_request.tmpl +38 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +4 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_approved_user.tmpl +17 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +6 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_denied_user.tmpl +17 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +19 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rse-accounts.cfg.template +25 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rucio.cfg.atlas.client.template +43 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rucio.cfg.template +241 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rucio_multi_vo.cfg.template +217 -0
- rucio-37.0.0rc1.data/data/rucio/requirements.server.txt +297 -0
- rucio-37.0.0rc1.data/data/rucio/tools/bootstrap.py +34 -0
- rucio-37.0.0rc1.data/data/rucio/tools/merge_rucio_configs.py +144 -0
- rucio-37.0.0rc1.data/data/rucio/tools/reset_database.py +40 -0
- rucio-37.0.0rc1.data/scripts/rucio +133 -0
- rucio-37.0.0rc1.data/scripts/rucio-abacus-account +74 -0
- rucio-37.0.0rc1.data/scripts/rucio-abacus-collection-replica +46 -0
- rucio-37.0.0rc1.data/scripts/rucio-abacus-rse +78 -0
- rucio-37.0.0rc1.data/scripts/rucio-admin +97 -0
- rucio-37.0.0rc1.data/scripts/rucio-atropos +60 -0
- rucio-37.0.0rc1.data/scripts/rucio-auditor +206 -0
- rucio-37.0.0rc1.data/scripts/rucio-automatix +50 -0
- rucio-37.0.0rc1.data/scripts/rucio-bb8 +57 -0
- rucio-37.0.0rc1.data/scripts/rucio-cache-client +141 -0
- rucio-37.0.0rc1.data/scripts/rucio-cache-consumer +42 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-finisher +58 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-poller +66 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-preparer +37 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-receiver +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-stager +76 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-submitter +139 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-throttler +104 -0
- rucio-37.0.0rc1.data/scripts/rucio-dark-reaper +53 -0
- rucio-37.0.0rc1.data/scripts/rucio-dumper +160 -0
- rucio-37.0.0rc1.data/scripts/rucio-follower +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-hermes +54 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-cleaner +89 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-evaluator +137 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-injector +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-repairer +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-kronos +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-minos +53 -0
- rucio-37.0.0rc1.data/scripts/rucio-minos-temporary-expiration +50 -0
- rucio-37.0.0rc1.data/scripts/rucio-necromancer +120 -0
- rucio-37.0.0rc1.data/scripts/rucio-oauth-manager +63 -0
- rucio-37.0.0rc1.data/scripts/rucio-reaper +83 -0
- rucio-37.0.0rc1.data/scripts/rucio-replica-recoverer +248 -0
- rucio-37.0.0rc1.data/scripts/rucio-rse-decommissioner +66 -0
- rucio-37.0.0rc1.data/scripts/rucio-storage-consistency-actions +74 -0
- rucio-37.0.0rc1.data/scripts/rucio-transmogrifier +77 -0
- rucio-37.0.0rc1.data/scripts/rucio-undertaker +76 -0
- rucio-37.0.0rc1.dist-info/METADATA +92 -0
- rucio-37.0.0rc1.dist-info/RECORD +487 -0
- rucio-37.0.0rc1.dist-info/WHEEL +5 -0
- rucio-37.0.0rc1.dist-info/licenses/AUTHORS.rst +100 -0
- rucio-37.0.0rc1.dist-info/licenses/LICENSE +201 -0
- rucio-37.0.0rc1.dist-info/top_level.txt +1 -0
rucio/gateway/account.py
ADDED
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
16
|
+
|
|
17
|
+
import rucio.common.exception
|
|
18
|
+
import rucio.core.identity
|
|
19
|
+
import rucio.gateway.permission
|
|
20
|
+
from rucio.common.schema import validate_schema
|
|
21
|
+
from rucio.common.types import InternalAccount
|
|
22
|
+
from rucio.common.utils import gateway_update_return_dict
|
|
23
|
+
from rucio.core import account as account_core
|
|
24
|
+
from rucio.core.rse import get_rse_id
|
|
25
|
+
from rucio.db.sqla.constants import AccountType
|
|
26
|
+
from rucio.db.sqla.session import read_session, stream_session, transactional_session
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from collections.abc import Iterator
|
|
30
|
+
|
|
31
|
+
from sqlalchemy.orm import Session
|
|
32
|
+
|
|
33
|
+
from rucio.common.types import AccountAttributesDict, IdentityDict, UsageDict
|
|
34
|
+
from rucio.db.sqla.models import Account
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@transactional_session
|
|
38
|
+
def add_account(
|
|
39
|
+
account: str,
|
|
40
|
+
type_: str,
|
|
41
|
+
email: str,
|
|
42
|
+
issuer: str,
|
|
43
|
+
vo: str = 'def',
|
|
44
|
+
*,
|
|
45
|
+
session: "Session"
|
|
46
|
+
) -> None:
|
|
47
|
+
"""
|
|
48
|
+
Creates an account with the provided account name, contact information, etc.
|
|
49
|
+
|
|
50
|
+
:param account: The account name.
|
|
51
|
+
:param type_: The account type
|
|
52
|
+
:param email: The Email address associated with the account.
|
|
53
|
+
|
|
54
|
+
:param issuer: The issuer account_core.
|
|
55
|
+
:param vo: The VO to act on.
|
|
56
|
+
:param session: The database session in use.
|
|
57
|
+
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
validate_schema(name='account', obj=account, vo=vo)
|
|
61
|
+
|
|
62
|
+
kwargs = {'account': account, 'type': type_}
|
|
63
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='add_account', kwargs=kwargs, session=session)
|
|
64
|
+
if not auth_result.allowed:
|
|
65
|
+
raise rucio.common.exception.AccessDenied('Account %s can not add account. %s' % (issuer, auth_result.message))
|
|
66
|
+
|
|
67
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
68
|
+
|
|
69
|
+
account_core.add_account(internal_account, AccountType[type_.upper()], email, session=session)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@transactional_session
|
|
73
|
+
def del_account(
|
|
74
|
+
account: str,
|
|
75
|
+
issuer: str,
|
|
76
|
+
vo: str = 'def',
|
|
77
|
+
*,
|
|
78
|
+
session: "Session"
|
|
79
|
+
) -> None:
|
|
80
|
+
"""
|
|
81
|
+
Disables an account with the provided account name.
|
|
82
|
+
|
|
83
|
+
:param account: The account name.
|
|
84
|
+
:param issuer: The issuer account.
|
|
85
|
+
:param vo: The VO to act on.
|
|
86
|
+
:param session: The database session in use.
|
|
87
|
+
|
|
88
|
+
"""
|
|
89
|
+
kwargs = {'account': account}
|
|
90
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='del_account', kwargs=kwargs, session=session)
|
|
91
|
+
if not auth_result.allowed:
|
|
92
|
+
raise rucio.common.exception.AccessDenied('Account %s can not delete account. %s' % (issuer, auth_result.message))
|
|
93
|
+
|
|
94
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
95
|
+
|
|
96
|
+
account_core.del_account(internal_account, session=session)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@read_session
|
|
100
|
+
def get_account_info(
|
|
101
|
+
account: str,
|
|
102
|
+
vo: str = 'def',
|
|
103
|
+
*,
|
|
104
|
+
session: "Session"
|
|
105
|
+
) -> "Account":
|
|
106
|
+
"""
|
|
107
|
+
Returns the info like the statistics information associated to an account_core.
|
|
108
|
+
|
|
109
|
+
:param account: The account name.
|
|
110
|
+
:returns: A list with all account information.
|
|
111
|
+
:param vo: The VO to act on.
|
|
112
|
+
:param session: The database session in use.
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
116
|
+
|
|
117
|
+
acc = account_core.get_account(internal_account, session=session)
|
|
118
|
+
acc.account = acc.account.external
|
|
119
|
+
return acc
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@transactional_session
|
|
123
|
+
def update_account(
|
|
124
|
+
account: str,
|
|
125
|
+
key: str,
|
|
126
|
+
value: Any,
|
|
127
|
+
issuer: str = 'root',
|
|
128
|
+
vo: str = 'def',
|
|
129
|
+
*,
|
|
130
|
+
session: "Session"
|
|
131
|
+
) -> None:
|
|
132
|
+
""" Update a property of an account_core.
|
|
133
|
+
|
|
134
|
+
:param account: Name of the account_core.
|
|
135
|
+
:param key: Account property like status.
|
|
136
|
+
:param value: Property value.
|
|
137
|
+
:param issuer: The issuer account
|
|
138
|
+
:param vo: The VO to act on.
|
|
139
|
+
:param session: The database session in use.
|
|
140
|
+
"""
|
|
141
|
+
validate_schema(name='account', obj=account, vo=vo)
|
|
142
|
+
kwargs = {}
|
|
143
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='update_account', kwargs=kwargs, session=session)
|
|
144
|
+
if not auth_result.allowed:
|
|
145
|
+
raise rucio.common.exception.AccessDenied('Account %s can not change %s of the account. %s' % (issuer, key, auth_result.message))
|
|
146
|
+
|
|
147
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
148
|
+
|
|
149
|
+
return account_core.update_account(internal_account, key, value, session=session)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@stream_session
|
|
153
|
+
def list_accounts(filter_: Optional[dict[str, Any]] = None, vo: str = 'def', *, session: "Session") -> 'Iterator[dict[str, Any]]':
|
|
154
|
+
"""
|
|
155
|
+
Lists all the Rucio account names.
|
|
156
|
+
|
|
157
|
+
REST API: http://<host>:<port>/rucio/accounts
|
|
158
|
+
|
|
159
|
+
:param filter_: Dictionary of attributes by which the input data should be filtered
|
|
160
|
+
:param vo: The VO to act on.
|
|
161
|
+
:param session: The database session in use.
|
|
162
|
+
|
|
163
|
+
:returns: List of all accounts.
|
|
164
|
+
"""
|
|
165
|
+
# If filter is empty, create a new dict to avoid overwriting the function's default
|
|
166
|
+
filter_ = filter_ or {}
|
|
167
|
+
|
|
168
|
+
if 'account' in filter_:
|
|
169
|
+
filter_['account'] = InternalAccount(filter_['account'], vo=vo)
|
|
170
|
+
else:
|
|
171
|
+
filter_['account'] = InternalAccount(account='*', vo=vo)
|
|
172
|
+
for result in account_core.list_accounts(filter_=filter_, session=session):
|
|
173
|
+
yield gateway_update_return_dict(result, session=session)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
@read_session
|
|
177
|
+
def account_exists(
|
|
178
|
+
account: str,
|
|
179
|
+
vo: str = 'def',
|
|
180
|
+
*,
|
|
181
|
+
session: "Session"
|
|
182
|
+
) -> bool:
|
|
183
|
+
"""
|
|
184
|
+
Checks to see if account exists. This procedure does not check it's status.
|
|
185
|
+
|
|
186
|
+
:param account: Name of the account.
|
|
187
|
+
:param vo: The VO to act on.
|
|
188
|
+
:param session: The database session in use.
|
|
189
|
+
:returns: True if found, otherwise false.
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
193
|
+
|
|
194
|
+
return account_core.account_exists(internal_account, session=session)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@read_session
|
|
198
|
+
def list_identities(
|
|
199
|
+
account: str,
|
|
200
|
+
vo: str = 'def',
|
|
201
|
+
*,
|
|
202
|
+
session: "Session"
|
|
203
|
+
) -> list["IdentityDict"]:
|
|
204
|
+
"""
|
|
205
|
+
List all identities on an account_core.
|
|
206
|
+
|
|
207
|
+
:param account: The account name.
|
|
208
|
+
:param vo: The VO to act on.
|
|
209
|
+
:param session: The database session in use.
|
|
210
|
+
"""
|
|
211
|
+
|
|
212
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
213
|
+
|
|
214
|
+
return account_core.list_identities(internal_account, session=session)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
@read_session
|
|
218
|
+
def list_account_attributes(
|
|
219
|
+
account: str,
|
|
220
|
+
vo: str = 'def',
|
|
221
|
+
*,
|
|
222
|
+
session: "Session"
|
|
223
|
+
) -> list["AccountAttributesDict"]:
|
|
224
|
+
"""
|
|
225
|
+
Returns all the attributes for the given account.
|
|
226
|
+
|
|
227
|
+
:param account: The account name.
|
|
228
|
+
:param vo: The VO to act on
|
|
229
|
+
:param session: The database session in use.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
233
|
+
|
|
234
|
+
return account_core.list_account_attributes(internal_account, session=session)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
@transactional_session
|
|
238
|
+
def add_account_attribute(
|
|
239
|
+
key: str,
|
|
240
|
+
value: Any,
|
|
241
|
+
account: str,
|
|
242
|
+
issuer: str,
|
|
243
|
+
vo: str = 'def',
|
|
244
|
+
*,
|
|
245
|
+
session: "Session"
|
|
246
|
+
) -> None:
|
|
247
|
+
"""
|
|
248
|
+
Add an attribute to an account.
|
|
249
|
+
|
|
250
|
+
:param key: attribute key.
|
|
251
|
+
:param value: attribute value.
|
|
252
|
+
:param account: The account name.
|
|
253
|
+
:param issuer: The issuer account.
|
|
254
|
+
:param vo: The VO to act on.
|
|
255
|
+
:param session: The database session in use.
|
|
256
|
+
"""
|
|
257
|
+
validate_schema(name='account_attribute', obj=key, vo=vo)
|
|
258
|
+
validate_schema(name='account_attribute', obj=value, vo=vo)
|
|
259
|
+
|
|
260
|
+
kwargs = {'account': account, 'key': key, 'value': value}
|
|
261
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='add_attribute', kwargs=kwargs, session=session)
|
|
262
|
+
if not auth_result.allowed:
|
|
263
|
+
raise rucio.common.exception.AccessDenied('Account %s can not add attributes. %s' % (issuer, auth_result.message))
|
|
264
|
+
|
|
265
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
266
|
+
|
|
267
|
+
account_core.add_account_attribute(internal_account, key, value, session=session)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
@transactional_session
|
|
271
|
+
def del_account_attribute(
|
|
272
|
+
key: str,
|
|
273
|
+
account: str,
|
|
274
|
+
issuer: str,
|
|
275
|
+
vo: str = 'def',
|
|
276
|
+
*,
|
|
277
|
+
session: "Session"
|
|
278
|
+
) -> None:
|
|
279
|
+
"""
|
|
280
|
+
Delete an attribute to an account.
|
|
281
|
+
|
|
282
|
+
:param key: attribute key.
|
|
283
|
+
:param account: The account name.
|
|
284
|
+
:param issuer: The issuer account.
|
|
285
|
+
:param vo: The VO to act on.
|
|
286
|
+
:param session: The database session in use.
|
|
287
|
+
"""
|
|
288
|
+
kwargs = {'account': account, 'key': key}
|
|
289
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='del_attribute', kwargs=kwargs, session=session)
|
|
290
|
+
if not auth_result.allowed:
|
|
291
|
+
raise rucio.common.exception.AccessDenied('Account %s can not delete attribute. %s' % (issuer, auth_result.message))
|
|
292
|
+
|
|
293
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
294
|
+
|
|
295
|
+
account_core.del_account_attribute(internal_account, key, session=session)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
@read_session
|
|
299
|
+
def get_usage(
|
|
300
|
+
rse: str,
|
|
301
|
+
account: str,
|
|
302
|
+
issuer: str,
|
|
303
|
+
vo: str = 'def',
|
|
304
|
+
*,
|
|
305
|
+
session: "Session"
|
|
306
|
+
) -> "UsageDict":
|
|
307
|
+
"""
|
|
308
|
+
Returns current values of the specified counter, or raises CounterNotFound if the counter does not exist.
|
|
309
|
+
|
|
310
|
+
:param rse: The RSE.
|
|
311
|
+
:param account: The account name.
|
|
312
|
+
:param issuer: The issuer account.
|
|
313
|
+
:param vo: The VO to act on.
|
|
314
|
+
:param session: The database session in use.
|
|
315
|
+
:returns: A dictionary with total and bytes.
|
|
316
|
+
"""
|
|
317
|
+
rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
318
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
319
|
+
|
|
320
|
+
return account_core.get_usage(rse_id, internal_account, session=session)
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
@read_session
|
|
324
|
+
def get_usage_history(
|
|
325
|
+
rse: str,
|
|
326
|
+
account: str,
|
|
327
|
+
issuer: str,
|
|
328
|
+
vo: str = 'def',
|
|
329
|
+
*,
|
|
330
|
+
session: "Session"
|
|
331
|
+
) -> list["UsageDict"]:
|
|
332
|
+
"""
|
|
333
|
+
Returns historical values of the specified counter, or raises CounterNotFound if the counter does not exist.
|
|
334
|
+
|
|
335
|
+
:param rse: The RSE.
|
|
336
|
+
:param account: The account name.
|
|
337
|
+
:param issuer: The issuer account.
|
|
338
|
+
:param vo: The VO to act on.
|
|
339
|
+
:param session: The database session in use.
|
|
340
|
+
:returns: A dictionary with total and bytes.
|
|
341
|
+
"""
|
|
342
|
+
rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
343
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
344
|
+
|
|
345
|
+
return account_core.get_usage_history(rse_id, internal_account, session=session)
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from typing import TYPE_CHECKING, Any, Union
|
|
16
|
+
|
|
17
|
+
import rucio.common.exception
|
|
18
|
+
import rucio.gateway.permission
|
|
19
|
+
from rucio.common.types import InternalAccount, RSEResolvedGlobalAccountLimitDict
|
|
20
|
+
from rucio.common.utils import gateway_update_return_dict
|
|
21
|
+
from rucio.core import account_limit as account_limit_core
|
|
22
|
+
from rucio.core.account import account_exists
|
|
23
|
+
from rucio.core.rse import get_rse_id, get_rse_name
|
|
24
|
+
from rucio.db.sqla.session import read_session, transactional_session
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from sqlalchemy.orm import Session
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@read_session
|
|
31
|
+
def get_rse_account_usage(
|
|
32
|
+
rse: str,
|
|
33
|
+
vo: str = 'def',
|
|
34
|
+
*,
|
|
35
|
+
session: "Session"
|
|
36
|
+
) -> list[dict[str, Any]]:
|
|
37
|
+
"""
|
|
38
|
+
Returns the account limit and usage for all for all accounts on a RSE.
|
|
39
|
+
|
|
40
|
+
:param rse: The RSE name.
|
|
41
|
+
:param vo: The VO to act on.
|
|
42
|
+
:param session: The database session in use.
|
|
43
|
+
:return: List of dictionaries.
|
|
44
|
+
"""
|
|
45
|
+
rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
46
|
+
|
|
47
|
+
return [gateway_update_return_dict(d, session=session) for d in account_limit_core.get_rse_account_usage(rse_id=rse_id, session=session)]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@read_session
|
|
51
|
+
def get_local_account_limits(
|
|
52
|
+
account: str,
|
|
53
|
+
vo: str = 'def',
|
|
54
|
+
*,
|
|
55
|
+
session: "Session"
|
|
56
|
+
) -> dict[str, Any]:
|
|
57
|
+
"""
|
|
58
|
+
Lists the limitation names/values for the specified account name.
|
|
59
|
+
|
|
60
|
+
REST API: http://<host>:<port>/rucio/account/<account>/limits
|
|
61
|
+
|
|
62
|
+
:param account: The account name.
|
|
63
|
+
:param vo: The VO to act on.
|
|
64
|
+
:param session: The database session in use.
|
|
65
|
+
|
|
66
|
+
:returns: The account limits.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
70
|
+
|
|
71
|
+
rse_instead_id = {}
|
|
72
|
+
for elem in account_limit_core.get_local_account_limits(account=internal_account, session=session).items():
|
|
73
|
+
rse_instead_id[get_rse_name(rse_id=elem[0], session=session)] = elem[1]
|
|
74
|
+
return rse_instead_id
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@read_session
|
|
78
|
+
def get_local_account_limit(
|
|
79
|
+
account: str,
|
|
80
|
+
rse: str,
|
|
81
|
+
vo: str = 'def',
|
|
82
|
+
*,
|
|
83
|
+
session: "Session"
|
|
84
|
+
) -> dict[str, Union[int, float, None]]:
|
|
85
|
+
"""
|
|
86
|
+
Lists the limitation names/values for the specified account name and rse name.
|
|
87
|
+
|
|
88
|
+
REST API: http://<host>:<port>/rucio/account/<account>/limits
|
|
89
|
+
|
|
90
|
+
:param account: The account name.
|
|
91
|
+
:param rse: The rse name.
|
|
92
|
+
:param vo: The VO to act on.
|
|
93
|
+
:param session: The database session in use.
|
|
94
|
+
|
|
95
|
+
:returns: The account limit.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
99
|
+
|
|
100
|
+
rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
101
|
+
return {rse: account_limit_core.get_local_account_limit(account=internal_account, rse_id=rse_id, session=session)}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@read_session
|
|
105
|
+
def get_global_account_limits(
|
|
106
|
+
account: str,
|
|
107
|
+
vo: str = 'def',
|
|
108
|
+
*,
|
|
109
|
+
session: "Session"
|
|
110
|
+
) -> dict[str, RSEResolvedGlobalAccountLimitDict]:
|
|
111
|
+
"""
|
|
112
|
+
Lists the limitation names/values for the specified account name.
|
|
113
|
+
|
|
114
|
+
REST API: http://<host>:<port>/rucio/account/<account>/limits
|
|
115
|
+
|
|
116
|
+
:param account: The account name.
|
|
117
|
+
:param vo: The VO to act on.
|
|
118
|
+
:param session: The database session in use.
|
|
119
|
+
|
|
120
|
+
:returns: The account limits.
|
|
121
|
+
"""
|
|
122
|
+
if account:
|
|
123
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
124
|
+
else:
|
|
125
|
+
internal_account = InternalAccount('*', vo=vo)
|
|
126
|
+
|
|
127
|
+
return account_limit_core.get_global_account_limits(account=internal_account, session=session)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@read_session
|
|
131
|
+
def get_global_account_limit(
|
|
132
|
+
account: str,
|
|
133
|
+
rse_expression: str,
|
|
134
|
+
vo: str = 'def',
|
|
135
|
+
*,
|
|
136
|
+
session: "Session"
|
|
137
|
+
) -> dict[str, dict[str, RSEResolvedGlobalAccountLimitDict]]:
|
|
138
|
+
"""
|
|
139
|
+
Lists the limitation names/values for the specified account name and rse expression.
|
|
140
|
+
|
|
141
|
+
REST API: http://<host>:<port>/rucio/account/<account>/limits
|
|
142
|
+
|
|
143
|
+
:param account: The account name.
|
|
144
|
+
:param rse_expression: The rse expression.
|
|
145
|
+
:param vo: The VO to act on.
|
|
146
|
+
:param session: The database session in use.
|
|
147
|
+
|
|
148
|
+
:returns: The account limit.
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
152
|
+
|
|
153
|
+
return {rse_expression: account_limit_core.get_global_account_limit(account=internal_account, rse_expression=rse_expression, session=session)}
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
@transactional_session
|
|
157
|
+
def set_local_account_limit(
|
|
158
|
+
account: str,
|
|
159
|
+
rse: str,
|
|
160
|
+
bytes_: int,
|
|
161
|
+
issuer: str,
|
|
162
|
+
vo: str = 'def',
|
|
163
|
+
*,
|
|
164
|
+
session: "Session"
|
|
165
|
+
) -> None:
|
|
166
|
+
"""
|
|
167
|
+
Set an account limit.
|
|
168
|
+
|
|
169
|
+
:param account: The account name.
|
|
170
|
+
:param rse: The rse name.
|
|
171
|
+
:param bytes_: The limit in bytes.
|
|
172
|
+
:param issuer: The issuer account_core.
|
|
173
|
+
:param vo: The VO to act on.
|
|
174
|
+
:param session: The database session in use.
|
|
175
|
+
"""
|
|
176
|
+
rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
177
|
+
|
|
178
|
+
kwargs = {'account': account, 'rse': rse, 'rse_id': rse_id, 'bytes': bytes_}
|
|
179
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='set_local_account_limit', kwargs=kwargs, session=session)
|
|
180
|
+
if not auth_result.allowed:
|
|
181
|
+
raise rucio.common.exception.AccessDenied('Account %s can not set account limits. %s' % (issuer, auth_result.message))
|
|
182
|
+
|
|
183
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
184
|
+
|
|
185
|
+
if not account_exists(account=internal_account, session=session):
|
|
186
|
+
raise rucio.common.exception.AccountNotFound('Account %s does not exist' % (internal_account))
|
|
187
|
+
|
|
188
|
+
account_limit_core.set_local_account_limit(account=internal_account, rse_id=rse_id, bytes_=bytes_, session=session)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
@transactional_session
|
|
192
|
+
def set_global_account_limit(
|
|
193
|
+
account: str,
|
|
194
|
+
rse_expression: str,
|
|
195
|
+
bytes_: int,
|
|
196
|
+
issuer: str,
|
|
197
|
+
vo: str = 'def',
|
|
198
|
+
*,
|
|
199
|
+
session: "Session"
|
|
200
|
+
) -> None:
|
|
201
|
+
"""
|
|
202
|
+
Set a global account limit.
|
|
203
|
+
|
|
204
|
+
:param account: The account name.
|
|
205
|
+
:param rse_expression: The rse expression.
|
|
206
|
+
:param bytes_: The limit in bytes.
|
|
207
|
+
:param issuer: The issuer account_core.
|
|
208
|
+
:param vo: The VO to act on.
|
|
209
|
+
:param session: The database session in use.
|
|
210
|
+
"""
|
|
211
|
+
|
|
212
|
+
kwargs = {'account': account, 'rse_expression': rse_expression, 'bytes': bytes_}
|
|
213
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='set_global_account_limit', kwargs=kwargs, session=session)
|
|
214
|
+
if not auth_result.allowed:
|
|
215
|
+
raise rucio.common.exception.AccessDenied('Account %s can not set account limits. %s' % (issuer, auth_result.message))
|
|
216
|
+
|
|
217
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
218
|
+
|
|
219
|
+
if not account_exists(account=internal_account, session=session):
|
|
220
|
+
raise rucio.common.exception.AccountNotFound('Account %s does not exist' % (internal_account))
|
|
221
|
+
|
|
222
|
+
account_limit_core.set_global_account_limit(account=internal_account, rse_expression=rse_expression, bytes_=bytes_, session=session)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
@transactional_session
|
|
226
|
+
def delete_local_account_limit(
|
|
227
|
+
account: str,
|
|
228
|
+
rse: str,
|
|
229
|
+
issuer: str,
|
|
230
|
+
vo: str = 'def',
|
|
231
|
+
*,
|
|
232
|
+
session: "Session"
|
|
233
|
+
) -> bool:
|
|
234
|
+
"""
|
|
235
|
+
Delete an account limit.
|
|
236
|
+
|
|
237
|
+
:param account: The account name.
|
|
238
|
+
:param rse: The rse name.
|
|
239
|
+
:param issuer: The issuer account_core.
|
|
240
|
+
:param vo: The VO to act on.
|
|
241
|
+
:param session: The database session in use.
|
|
242
|
+
|
|
243
|
+
:returns: True if successful; False otherwise.
|
|
244
|
+
"""
|
|
245
|
+
|
|
246
|
+
rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
247
|
+
kwargs = {'account': account, 'rse': rse, 'rse_id': rse_id}
|
|
248
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='delete_local_account_limit', kwargs=kwargs, session=session)
|
|
249
|
+
if not auth_result.allowed:
|
|
250
|
+
raise rucio.common.exception.AccessDenied('Account %s can not delete account limits. %s' % (issuer, auth_result.message))
|
|
251
|
+
|
|
252
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
253
|
+
|
|
254
|
+
if not account_exists(account=internal_account, session=session):
|
|
255
|
+
raise rucio.common.exception.AccountNotFound('Account %s does not exist' % (internal_account))
|
|
256
|
+
|
|
257
|
+
return account_limit_core.delete_local_account_limit(account=internal_account, rse_id=rse_id, session=session)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
@transactional_session
|
|
261
|
+
def delete_global_account_limit(
|
|
262
|
+
account: str,
|
|
263
|
+
rse_expression: str,
|
|
264
|
+
issuer: str,
|
|
265
|
+
vo: str = 'def',
|
|
266
|
+
*,
|
|
267
|
+
session: "Session"
|
|
268
|
+
) -> bool:
|
|
269
|
+
"""
|
|
270
|
+
Delete a global account limit..
|
|
271
|
+
|
|
272
|
+
:param account: The account name.
|
|
273
|
+
:param rse_expression: The rse expression.
|
|
274
|
+
:param issuer: The issuer account_core.
|
|
275
|
+
:param vo: The VO to act on.
|
|
276
|
+
:param session: The database session in use.
|
|
277
|
+
|
|
278
|
+
:returns: True if successful; False otherwise.
|
|
279
|
+
"""
|
|
280
|
+
|
|
281
|
+
kwargs = {'account': account, 'rse_expression': rse_expression}
|
|
282
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='delete_global_account_limit', kwargs=kwargs, session=session)
|
|
283
|
+
if not auth_result.allowed:
|
|
284
|
+
raise rucio.common.exception.AccessDenied('Account %s can not delete global account limits. %s' % (issuer, auth_result.message))
|
|
285
|
+
|
|
286
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
287
|
+
|
|
288
|
+
if not account_exists(account=internal_account, session=session):
|
|
289
|
+
raise rucio.common.exception.AccountNotFound('Account %s does not exist' % (internal_account))
|
|
290
|
+
|
|
291
|
+
return account_limit_core.delete_global_account_limit(account=internal_account, rse_expression=rse_expression, session=session)
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
@read_session
|
|
295
|
+
def get_local_account_usage(
|
|
296
|
+
account: str,
|
|
297
|
+
rse: str,
|
|
298
|
+
issuer: str,
|
|
299
|
+
vo: str = 'def',
|
|
300
|
+
*,
|
|
301
|
+
session: "Session"
|
|
302
|
+
) -> list[dict[str, Any]]:
|
|
303
|
+
"""
|
|
304
|
+
Get the account usage and connect it with (if available) the account limits of the account.
|
|
305
|
+
|
|
306
|
+
:param account: The account to read.
|
|
307
|
+
:param rse: The rse to read (If none, get all).
|
|
308
|
+
:param issuer: The issuer account.
|
|
309
|
+
:param vo: The VO to act on.
|
|
310
|
+
:param session: The database session in use.
|
|
311
|
+
|
|
312
|
+
:returns: List of dicts {'rse_id', 'rse', 'bytes', 'files', 'bytes_limit', 'bytes_remaining'}
|
|
313
|
+
"""
|
|
314
|
+
|
|
315
|
+
rse_id = None
|
|
316
|
+
|
|
317
|
+
if rse:
|
|
318
|
+
rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
319
|
+
kwargs = {'account': account, 'rse': rse, 'rse_id': rse_id}
|
|
320
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='get_local_account_usage', kwargs=kwargs, session=session)
|
|
321
|
+
if not auth_result.allowed:
|
|
322
|
+
raise rucio.common.exception.AccessDenied('Account %s can not list account usage. %s' % (issuer, auth_result.message))
|
|
323
|
+
|
|
324
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
325
|
+
|
|
326
|
+
if not account_exists(account=internal_account, session=session):
|
|
327
|
+
raise rucio.common.exception.AccountNotFound('Account %s does not exist' % (internal_account))
|
|
328
|
+
|
|
329
|
+
return [gateway_update_return_dict(d, session=session) for d in account_limit_core.get_local_account_usage(account=internal_account, rse_id=rse_id, session=session)]
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
@read_session
|
|
333
|
+
def get_global_account_usage(
|
|
334
|
+
account: str,
|
|
335
|
+
rse_expression: str,
|
|
336
|
+
issuer: str,
|
|
337
|
+
vo: str = 'def',
|
|
338
|
+
*,
|
|
339
|
+
session: "Session"
|
|
340
|
+
) -> list[dict[str, Any]]:
|
|
341
|
+
"""
|
|
342
|
+
Get the account usage and connect it with (if available) the account limits of the account.
|
|
343
|
+
|
|
344
|
+
:param account: The account to read.
|
|
345
|
+
:param rse_expression: The rse expression to read (If none, get all).
|
|
346
|
+
:param issuer: The issuer account.
|
|
347
|
+
:param vo: The VO to act on.
|
|
348
|
+
:param session: The database session in use.
|
|
349
|
+
|
|
350
|
+
:returns: List of dicts {'rse_id', 'rse', 'bytes', 'files', 'bytes_limit', 'bytes_remaining'}
|
|
351
|
+
"""
|
|
352
|
+
|
|
353
|
+
kwargs = {'account': account, 'rse_expression': rse_expression}
|
|
354
|
+
auth_result = rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='get_global_account_usage', kwargs=kwargs, session=session)
|
|
355
|
+
if not auth_result.allowed:
|
|
356
|
+
raise rucio.common.exception.AccessDenied('Account %s can not list global account usage. %s' % (issuer, auth_result.message))
|
|
357
|
+
|
|
358
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
359
|
+
|
|
360
|
+
if not account_exists(account=internal_account, session=session):
|
|
361
|
+
raise rucio.common.exception.AccountNotFound('Account %s does not exist' % (internal_account))
|
|
362
|
+
|
|
363
|
+
return [gateway_update_return_dict(d, session=session) for d in account_limit_core.get_global_account_usage(account=internal_account, rse_expression=rse_expression, session=session)]
|