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/core/__init__.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
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.
|
rucio/core/account.py
ADDED
|
@@ -0,0 +1,496 @@
|
|
|
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 datetime import datetime
|
|
16
|
+
from enum import Enum
|
|
17
|
+
from re import match
|
|
18
|
+
from traceback import format_exc
|
|
19
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
20
|
+
|
|
21
|
+
from sqlalchemy import and_, select
|
|
22
|
+
from sqlalchemy.exc import IntegrityError
|
|
23
|
+
from sqlalchemy.orm import exc
|
|
24
|
+
|
|
25
|
+
import rucio.core.account_counter
|
|
26
|
+
import rucio.core.rse
|
|
27
|
+
from rucio.common import exception
|
|
28
|
+
from rucio.common.config import config_get_bool
|
|
29
|
+
from rucio.core.vo import vo_exists
|
|
30
|
+
from rucio.db.sqla import models
|
|
31
|
+
from rucio.db.sqla.constants import AccountStatus, AccountType
|
|
32
|
+
from rucio.db.sqla.session import read_session, stream_session, transactional_session
|
|
33
|
+
|
|
34
|
+
if TYPE_CHECKING:
|
|
35
|
+
from collections.abc import Iterator, Mapping
|
|
36
|
+
|
|
37
|
+
from sqlalchemy.orm import Session
|
|
38
|
+
|
|
39
|
+
from rucio.common.types import AccountAttributesDict, AccountDict, AccountUsageModelDict, IdentityDict, InternalAccount, UsageDict
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@transactional_session
|
|
43
|
+
def add_account(
|
|
44
|
+
account: "InternalAccount",
|
|
45
|
+
type_: AccountType,
|
|
46
|
+
email: str,
|
|
47
|
+
*,
|
|
48
|
+
session: "Session"
|
|
49
|
+
) -> None:
|
|
50
|
+
""" Add an account with the given account name and type.
|
|
51
|
+
|
|
52
|
+
:param account: the name of the new account.
|
|
53
|
+
:param type_: the type of the new account.
|
|
54
|
+
:param email: The Email address associated with the account.
|
|
55
|
+
:param session: the database session in use.
|
|
56
|
+
"""
|
|
57
|
+
vo = account.vo
|
|
58
|
+
if not vo_exists(vo=vo, session=session):
|
|
59
|
+
raise exception.VONotFound('VO {} not found'.format(vo))
|
|
60
|
+
|
|
61
|
+
# Reserve the name 'super_root' for multi_vo admins
|
|
62
|
+
if account.external == 'super_root':
|
|
63
|
+
if not (vo == 'def' and config_get_bool('common', 'multi_vo', raise_exception=False, default=False)):
|
|
64
|
+
raise exception.UnsupportedAccountName('The name "%s" cannot be used.' % account.external)
|
|
65
|
+
|
|
66
|
+
new_account = models.Account(account=account, account_type=type_, email=email,
|
|
67
|
+
status=AccountStatus.ACTIVE)
|
|
68
|
+
try:
|
|
69
|
+
new_account.save(session=session)
|
|
70
|
+
except IntegrityError:
|
|
71
|
+
raise exception.Duplicate('Account ID \'%s\' already exists!' % account)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@read_session
|
|
75
|
+
def account_exists(
|
|
76
|
+
account: "InternalAccount",
|
|
77
|
+
*,
|
|
78
|
+
session: "Session"
|
|
79
|
+
) -> bool:
|
|
80
|
+
""" Checks to see if account exists and is active.
|
|
81
|
+
|
|
82
|
+
:param account: Name of the account.
|
|
83
|
+
:param session: the database session in use.
|
|
84
|
+
|
|
85
|
+
:returns: True if found, otherwise false.
|
|
86
|
+
"""
|
|
87
|
+
query = select(
|
|
88
|
+
models.Account
|
|
89
|
+
).where(
|
|
90
|
+
models.Account.account == account,
|
|
91
|
+
models.Account.status == AccountStatus.ACTIVE
|
|
92
|
+
)
|
|
93
|
+
return session.execute(query).scalar() is not None
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@read_session
|
|
97
|
+
def get_account(
|
|
98
|
+
account: "InternalAccount",
|
|
99
|
+
*,
|
|
100
|
+
session: "Session"
|
|
101
|
+
) -> models.Account:
|
|
102
|
+
""" Returns an account for the given account name.
|
|
103
|
+
|
|
104
|
+
:param account: the name of the account.
|
|
105
|
+
:param session: the database session in use.
|
|
106
|
+
|
|
107
|
+
:returns: a dict with all information for the account.
|
|
108
|
+
"""
|
|
109
|
+
query = select(
|
|
110
|
+
models.Account
|
|
111
|
+
).where(
|
|
112
|
+
models.Account.account == account
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
result = session.execute(query).scalar()
|
|
116
|
+
if result is None:
|
|
117
|
+
raise exception.AccountNotFound('Account with ID \'%s\' cannot be found' % account)
|
|
118
|
+
return result
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
@transactional_session
|
|
122
|
+
def del_account(
|
|
123
|
+
account: "InternalAccount",
|
|
124
|
+
*,
|
|
125
|
+
session: "Session"
|
|
126
|
+
) -> None:
|
|
127
|
+
""" Disable an account with the given account name.
|
|
128
|
+
|
|
129
|
+
:param account: the account name.
|
|
130
|
+
:param session: the database session in use.
|
|
131
|
+
"""
|
|
132
|
+
query = select(
|
|
133
|
+
models.Account
|
|
134
|
+
).where(
|
|
135
|
+
models.Account.account == account,
|
|
136
|
+
models.Account.status == AccountStatus.ACTIVE
|
|
137
|
+
)
|
|
138
|
+
try:
|
|
139
|
+
query_result = session.execute(query).scalar_one()
|
|
140
|
+
except exc.NoResultFound:
|
|
141
|
+
raise exception.AccountNotFound('Account with ID \'%s\' cannot be found' % account)
|
|
142
|
+
|
|
143
|
+
query_result.update({'status': AccountStatus.DELETED, 'deleted_at': datetime.utcnow()})
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
@transactional_session
|
|
147
|
+
def update_account(
|
|
148
|
+
account: "InternalAccount",
|
|
149
|
+
key: str,
|
|
150
|
+
value: Any,
|
|
151
|
+
*,
|
|
152
|
+
session: "Session"
|
|
153
|
+
) -> None:
|
|
154
|
+
""" Update a property of an account.
|
|
155
|
+
|
|
156
|
+
:param account: Name of the account.
|
|
157
|
+
:param key: Account property like status.
|
|
158
|
+
:param value: Property value.
|
|
159
|
+
:param session: the database session in use.
|
|
160
|
+
"""
|
|
161
|
+
query = select(
|
|
162
|
+
models.Account
|
|
163
|
+
).where(
|
|
164
|
+
models.Account.account == account
|
|
165
|
+
)
|
|
166
|
+
try:
|
|
167
|
+
query_result = session.execute(query).scalar_one()
|
|
168
|
+
except exc.NoResultFound:
|
|
169
|
+
raise exception.AccountNotFound('Account with ID \'%s\' cannot be found' % account)
|
|
170
|
+
if key == 'status':
|
|
171
|
+
if isinstance(value, str):
|
|
172
|
+
value = AccountStatus[value]
|
|
173
|
+
if value == AccountStatus.SUSPENDED:
|
|
174
|
+
query_result.update({'status': value, 'suspended_at': datetime.utcnow()})
|
|
175
|
+
elif value == AccountStatus.ACTIVE:
|
|
176
|
+
query_result.update({'status': value, 'suspended_at': None})
|
|
177
|
+
else:
|
|
178
|
+
query_result.update({key: value})
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@stream_session
|
|
182
|
+
def list_accounts(
|
|
183
|
+
filter_: Optional["Mapping[str, Any]"] = None,
|
|
184
|
+
*,
|
|
185
|
+
session: "Session"
|
|
186
|
+
) -> "Iterator[AccountDict]":
|
|
187
|
+
""" Returns a list of all account names.
|
|
188
|
+
|
|
189
|
+
:param filter_: Dictionary of attributes by which the input data should be filtered
|
|
190
|
+
:param session: the database session in use.
|
|
191
|
+
|
|
192
|
+
returns: a list of all account names.
|
|
193
|
+
"""
|
|
194
|
+
if filter_ is None:
|
|
195
|
+
filter_ = {}
|
|
196
|
+
query = select(
|
|
197
|
+
models.Account.account,
|
|
198
|
+
models.Account.account_type,
|
|
199
|
+
models.Account.email
|
|
200
|
+
).where(
|
|
201
|
+
models.Account.status == AccountStatus.ACTIVE
|
|
202
|
+
)
|
|
203
|
+
for filter_type in filter_:
|
|
204
|
+
if filter_type == 'account_type':
|
|
205
|
+
if isinstance(filter_['account_type'], str):
|
|
206
|
+
query = query.where(
|
|
207
|
+
models.Account.account_type == AccountType[filter_['account_type']]
|
|
208
|
+
)
|
|
209
|
+
elif isinstance(filter_['account_type'], Enum):
|
|
210
|
+
query = query.where(
|
|
211
|
+
models.Account.account_type == filter_['account_type']
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
elif filter_type == 'identity':
|
|
215
|
+
query = query.join(
|
|
216
|
+
models.IdentityAccountAssociation,
|
|
217
|
+
models.Account.account == models.IdentityAccountAssociation.account
|
|
218
|
+
).where(
|
|
219
|
+
models.IdentityAccountAssociation.identity == filter_['identity']
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
elif filter_type == 'account':
|
|
223
|
+
if '*' in filter_['account'].internal:
|
|
224
|
+
account_str = filter_['account'].internal.replace('*', '%')
|
|
225
|
+
query = query.where(
|
|
226
|
+
models.Account.account.like(account_str)
|
|
227
|
+
)
|
|
228
|
+
else:
|
|
229
|
+
query = query.where(
|
|
230
|
+
models.Account.account == filter_['account']
|
|
231
|
+
)
|
|
232
|
+
else:
|
|
233
|
+
query = query.join(
|
|
234
|
+
models.AccountAttrAssociation,
|
|
235
|
+
models.Account.account == models.AccountAttrAssociation.account
|
|
236
|
+
).where(
|
|
237
|
+
models.AccountAttrAssociation.key == filter_type,
|
|
238
|
+
models.AccountAttrAssociation.value == filter_[filter_type]
|
|
239
|
+
)
|
|
240
|
+
query = query.order_by(models.Account.account)
|
|
241
|
+
|
|
242
|
+
for account, account_type, email in session.execute(query).yield_per(25):
|
|
243
|
+
yield {'account': account, 'type': account_type, 'email': email}
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
@read_session
|
|
247
|
+
def list_identities(
|
|
248
|
+
account: "InternalAccount",
|
|
249
|
+
*,
|
|
250
|
+
session: "Session"
|
|
251
|
+
) -> list["IdentityDict"]:
|
|
252
|
+
"""
|
|
253
|
+
List all identities on an account.
|
|
254
|
+
|
|
255
|
+
:param account: The account name.
|
|
256
|
+
:param session: the database session in use.
|
|
257
|
+
"""
|
|
258
|
+
query = select(
|
|
259
|
+
models.Account
|
|
260
|
+
).where(
|
|
261
|
+
models.Account.account == account,
|
|
262
|
+
models.Account.status == AccountStatus.ACTIVE
|
|
263
|
+
)
|
|
264
|
+
try:
|
|
265
|
+
session.execute(query).scalar_one()
|
|
266
|
+
except exc.NoResultFound:
|
|
267
|
+
raise exception.AccountNotFound('Account with ID \'%s\' cannot be found' % account)
|
|
268
|
+
|
|
269
|
+
query = select(
|
|
270
|
+
models.IdentityAccountAssociation.identity_type.label('type'),
|
|
271
|
+
models.IdentityAccountAssociation.identity,
|
|
272
|
+
models.Identity.email
|
|
273
|
+
).join(
|
|
274
|
+
models.Identity,
|
|
275
|
+
and_(
|
|
276
|
+
models.Identity.identity == models.IdentityAccountAssociation.identity,
|
|
277
|
+
models.Identity.identity_type == models.IdentityAccountAssociation.identity_type
|
|
278
|
+
)
|
|
279
|
+
).where(
|
|
280
|
+
models.IdentityAccountAssociation.account == account
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
return [row._asdict() for row in session.execute(query)] # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
@read_session
|
|
287
|
+
def list_account_attributes(
|
|
288
|
+
account: "InternalAccount",
|
|
289
|
+
*,
|
|
290
|
+
session: "Session"
|
|
291
|
+
) -> list["AccountAttributesDict"]:
|
|
292
|
+
"""
|
|
293
|
+
Get all attributes defined for an account.
|
|
294
|
+
|
|
295
|
+
:param account: the account name to list the scopes of.
|
|
296
|
+
:param session: The database session in use.
|
|
297
|
+
|
|
298
|
+
:returns: a list of all key, value pairs for this account.
|
|
299
|
+
"""
|
|
300
|
+
query = select(
|
|
301
|
+
models.Account
|
|
302
|
+
).where(
|
|
303
|
+
models.Account.account == account,
|
|
304
|
+
models.Account.status == AccountStatus.ACTIVE
|
|
305
|
+
)
|
|
306
|
+
try:
|
|
307
|
+
session.execute(query).scalar_one()
|
|
308
|
+
except exc.NoResultFound:
|
|
309
|
+
raise exception.AccountNotFound("Account ID '{0}' does not exist".format(account))
|
|
310
|
+
|
|
311
|
+
query = select(
|
|
312
|
+
models.AccountAttrAssociation.key,
|
|
313
|
+
models.AccountAttrAssociation.value
|
|
314
|
+
).where(
|
|
315
|
+
models.AccountAttrAssociation.account == account
|
|
316
|
+
)
|
|
317
|
+
return [row._asdict() for row in session.execute(query)] # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
@read_session
|
|
321
|
+
def has_account_attribute(
|
|
322
|
+
account: "InternalAccount",
|
|
323
|
+
key: str,
|
|
324
|
+
*,
|
|
325
|
+
session: "Session"
|
|
326
|
+
) -> bool:
|
|
327
|
+
"""
|
|
328
|
+
Indicates whether the named key is present for the account.
|
|
329
|
+
|
|
330
|
+
:param account: the account name to list the scopes of.
|
|
331
|
+
:param key: the key for the attribute.
|
|
332
|
+
:param session: The database session in use.
|
|
333
|
+
|
|
334
|
+
:returns: True or False
|
|
335
|
+
"""
|
|
336
|
+
query = select(
|
|
337
|
+
models.AccountAttrAssociation.value
|
|
338
|
+
).where(
|
|
339
|
+
models.AccountAttrAssociation.account == account,
|
|
340
|
+
models.AccountAttrAssociation.key == key
|
|
341
|
+
)
|
|
342
|
+
return session.execute(query).scalar() is not None
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
@transactional_session
|
|
346
|
+
def add_account_attribute(
|
|
347
|
+
account: "InternalAccount",
|
|
348
|
+
key: str,
|
|
349
|
+
value: Any,
|
|
350
|
+
*,
|
|
351
|
+
session: "Session"
|
|
352
|
+
) -> None:
|
|
353
|
+
"""
|
|
354
|
+
Add an attribute for the given account name.
|
|
355
|
+
|
|
356
|
+
:param key: the key for the new attribute.
|
|
357
|
+
:param value: the value for the new attribute.
|
|
358
|
+
:param account: the account to add the attribute to.
|
|
359
|
+
:param session: The database session in use.
|
|
360
|
+
"""
|
|
361
|
+
query = select(
|
|
362
|
+
models.Account
|
|
363
|
+
).where(
|
|
364
|
+
models.Account.account == account,
|
|
365
|
+
models.Account.status == AccountStatus.ACTIVE
|
|
366
|
+
)
|
|
367
|
+
try:
|
|
368
|
+
session.execute(query).scalar_one()
|
|
369
|
+
except exc.NoResultFound:
|
|
370
|
+
raise exception.AccountNotFound("Account ID '{0}' does not exist".format(account))
|
|
371
|
+
|
|
372
|
+
new_attr = models.AccountAttrAssociation(account=account, key=key, value=value)
|
|
373
|
+
try:
|
|
374
|
+
new_attr.save(session=session)
|
|
375
|
+
except IntegrityError as error:
|
|
376
|
+
if match('.*IntegrityError.*ORA-00001: unique constraint.*ACCOUNT_ATTR_MAP_PK.*violated.*', error.args[0]) \
|
|
377
|
+
or match('.*IntegrityError.*1062.*Duplicate entry.*for key.*', error.args[0]) \
|
|
378
|
+
or match('.*IntegrityError.*UNIQUE constraint failed: account_attr_map.account, account_attr_map.key.*', error.args[0]) \
|
|
379
|
+
or match('.*IntegrityError.*columns? account.*key.*not unique.*', error.args[0]) \
|
|
380
|
+
or match('.*IntegrityError.*duplicate key value violates unique constraint.*', error.args[0]) \
|
|
381
|
+
or match('.*UniqueViolation.*duplicate key value violates unique constraint.*', error.args[0]):
|
|
382
|
+
raise exception.Duplicate('Key {0} already exist for account {1}!'.format(key, account))
|
|
383
|
+
except Exception:
|
|
384
|
+
raise exception.RucioException(str(format_exc()))
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
@transactional_session
|
|
388
|
+
def del_account_attribute(
|
|
389
|
+
account: "InternalAccount",
|
|
390
|
+
key: str,
|
|
391
|
+
*,
|
|
392
|
+
session: "Session"
|
|
393
|
+
) -> None:
|
|
394
|
+
"""
|
|
395
|
+
Add an attribute for the given account name.
|
|
396
|
+
|
|
397
|
+
:param account: the account to add the attribute to.
|
|
398
|
+
:param key: the key for the new attribute.
|
|
399
|
+
:param session: The database session in use.
|
|
400
|
+
"""
|
|
401
|
+
query = select(
|
|
402
|
+
models.AccountAttrAssociation
|
|
403
|
+
).where(
|
|
404
|
+
models.AccountAttrAssociation.account == account,
|
|
405
|
+
models.AccountAttrAssociation.key == key
|
|
406
|
+
)
|
|
407
|
+
aid = session.execute(query).scalar()
|
|
408
|
+
if aid is None:
|
|
409
|
+
raise exception.AccountNotFound('Attribute ({0}) does not exist for the account {1}!'.format(key, account))
|
|
410
|
+
aid.delete(session=session)
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
@read_session
|
|
414
|
+
def get_usage(
|
|
415
|
+
rse_id: str,
|
|
416
|
+
account: "InternalAccount",
|
|
417
|
+
*,
|
|
418
|
+
session: "Session"
|
|
419
|
+
) -> "UsageDict":
|
|
420
|
+
"""
|
|
421
|
+
Returns current values of the specified counter, or raises CounterNotFound if the counter does not exist.
|
|
422
|
+
|
|
423
|
+
:param rse_id: The id of the RSE.
|
|
424
|
+
:param account: The account name.
|
|
425
|
+
:param session: The database session in use.
|
|
426
|
+
:returns: A dictionary {'bytes', 'files', 'updated_at'}
|
|
427
|
+
"""
|
|
428
|
+
query = select(
|
|
429
|
+
models.AccountUsage.bytes,
|
|
430
|
+
models.AccountUsage.files,
|
|
431
|
+
models.AccountUsage.updated_at
|
|
432
|
+
).where(
|
|
433
|
+
models.AccountUsage.rse_id == rse_id,
|
|
434
|
+
models.AccountUsage.account == account
|
|
435
|
+
)
|
|
436
|
+
try:
|
|
437
|
+
return session.execute(query).one()._asdict() # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
438
|
+
except exc.NoResultFound:
|
|
439
|
+
return {'bytes': 0, 'files': 0, 'updated_at': None}
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
@read_session
|
|
443
|
+
def get_all_rse_usages_per_account(
|
|
444
|
+
account: "InternalAccount",
|
|
445
|
+
*,
|
|
446
|
+
session: "Session"
|
|
447
|
+
) -> list["AccountUsageModelDict"]:
|
|
448
|
+
"""
|
|
449
|
+
Returns current values of the specified counter, or raises CounterNotFound if the counter does not exist.
|
|
450
|
+
|
|
451
|
+
:param rse_id: The id of the RSE.
|
|
452
|
+
:param account: The account name.
|
|
453
|
+
:param session: The database session in use.
|
|
454
|
+
:returns: List of dicts with :py:class:`models.AccountUsage` items
|
|
455
|
+
"""
|
|
456
|
+
query = select(
|
|
457
|
+
models.AccountUsage
|
|
458
|
+
).where(
|
|
459
|
+
models.AccountUsage.account == account
|
|
460
|
+
)
|
|
461
|
+
try:
|
|
462
|
+
return [result.to_dict() for result in session.execute(query).scalars()] # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
463
|
+
except exc.NoResultFound:
|
|
464
|
+
return []
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
@read_session
|
|
468
|
+
def get_usage_history(
|
|
469
|
+
rse_id: str,
|
|
470
|
+
account: "InternalAccount",
|
|
471
|
+
*,
|
|
472
|
+
session: "Session"
|
|
473
|
+
) -> list["UsageDict"]:
|
|
474
|
+
"""
|
|
475
|
+
Returns historical values of the specified counter, or raises CounterNotFound if the counter does not exist.
|
|
476
|
+
|
|
477
|
+
:param rse_id: The id of the RSE.
|
|
478
|
+
:param account: The account name.
|
|
479
|
+
:param session: The database session in use.
|
|
480
|
+
:returns: A dictionary {'bytes', 'files', 'updated_at'}
|
|
481
|
+
"""
|
|
482
|
+
query = select(
|
|
483
|
+
models.AccountUsageHistory.bytes,
|
|
484
|
+
models.AccountUsageHistory.files,
|
|
485
|
+
models.AccountUsageHistory.updated_at
|
|
486
|
+
).where(
|
|
487
|
+
models.AccountUsageHistory.rse_id == rse_id,
|
|
488
|
+
models.AccountUsageHistory.account == account
|
|
489
|
+
).order_by(
|
|
490
|
+
models.AccountUsageHistory.updated_at
|
|
491
|
+
)
|
|
492
|
+
try:
|
|
493
|
+
return [row._asdict() for row in session.execute(query)] # type: ignore (pending SQLA2.1: https://github.com/rucio/rucio/discussions/6615)
|
|
494
|
+
except exc.NoResultFound:
|
|
495
|
+
raise exception.CounterNotFound('No usage can be found for account %s on RSE %s' % (account, rucio.core.rse.get_rse_name(rse_id=rse_id, session=session)))
|
|
496
|
+
return []
|