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/dirac.py
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
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
|
+
from rucio.common.exception import AccessDenied
|
|
18
|
+
from rucio.common.utils import extract_scope
|
|
19
|
+
from rucio.core import dirac
|
|
20
|
+
from rucio.core.rse import get_rse_id
|
|
21
|
+
from rucio.db.sqla.session import transactional_session
|
|
22
|
+
from rucio.gateway.permission import has_permission
|
|
23
|
+
from rucio.gateway.scope import list_scopes
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from collections.abc import Iterable
|
|
27
|
+
|
|
28
|
+
from sqlalchemy.orm import Session
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@transactional_session
|
|
32
|
+
def add_files(
|
|
33
|
+
lfns: "Iterable[dict[str, Any]]",
|
|
34
|
+
issuer: str,
|
|
35
|
+
ignore_availability: bool,
|
|
36
|
+
parents_metadata: Optional[dict[str, Any]] = None,
|
|
37
|
+
vo: str = 'def',
|
|
38
|
+
*,
|
|
39
|
+
session: "Session"
|
|
40
|
+
) -> None:
|
|
41
|
+
"""
|
|
42
|
+
Bulk add files :
|
|
43
|
+
- Create the file and replica.
|
|
44
|
+
- If doesn't exist create the dataset containing the file as well as a rule on the dataset on ANY sites.
|
|
45
|
+
- Create all the ascendants of the dataset if they do not exist
|
|
46
|
+
|
|
47
|
+
:param lfns: List of lfn (dictionary {'lfn': <lfn>, 'rse': <rse>, 'bytes': <bytes>, 'adler32': <adler32>, 'guid': <guid>, 'pfn': <pfn>}
|
|
48
|
+
:param issuer: The issuer account.
|
|
49
|
+
:param ignore_availability: A boolean to ignore blocked sites.
|
|
50
|
+
:param parents_metadata: Metadata for selected hierarchy DIDs. (dictionary {'lpn': {key : value}}). Default=None
|
|
51
|
+
:param vo: The VO to act on.
|
|
52
|
+
:param session: The database session in use.
|
|
53
|
+
|
|
54
|
+
"""
|
|
55
|
+
scopes = list_scopes(vo=vo, session=session)
|
|
56
|
+
dids = []
|
|
57
|
+
rses = {}
|
|
58
|
+
for lfn in lfns:
|
|
59
|
+
scope, name = extract_scope(lfn['lfn'], scopes)
|
|
60
|
+
dids.append({'scope': scope, 'name': name})
|
|
61
|
+
rse = lfn['rse']
|
|
62
|
+
if rse not in rses:
|
|
63
|
+
rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
64
|
+
rses[rse] = rse_id
|
|
65
|
+
lfn['rse_id'] = rses[rse]
|
|
66
|
+
|
|
67
|
+
# Check if the issuer can add dids and use skip_availabitlity
|
|
68
|
+
for rse in rses:
|
|
69
|
+
rse_id = rses[rse]
|
|
70
|
+
kwargs = {'rse': rse, 'rse_id': rse_id}
|
|
71
|
+
auth_result = has_permission(issuer=issuer, action='add_replicas', kwargs=kwargs, vo=vo, session=session)
|
|
72
|
+
if not auth_result.allowed:
|
|
73
|
+
raise AccessDenied('Account %s can not add file replicas on %s for VO %s. %s' % (issuer, rse, vo, auth_result.message))
|
|
74
|
+
if not has_permission(issuer=issuer, action='skip_availability_check', kwargs=kwargs, vo=vo, session=session):
|
|
75
|
+
ignore_availability = False
|
|
76
|
+
|
|
77
|
+
# Check if the issuer can add the files
|
|
78
|
+
kwargs = {'issuer': issuer, 'dids': dids}
|
|
79
|
+
auth_result = has_permission(issuer=issuer, action='add_dids', kwargs=kwargs, vo=vo, session=session)
|
|
80
|
+
if not auth_result.allowed:
|
|
81
|
+
raise AccessDenied('Account %s can not bulk add data identifier for VO %s. %s' % (issuer, vo, auth_result.message))
|
|
82
|
+
|
|
83
|
+
dirac.add_files(lfns=lfns, account=issuer, ignore_availability=ignore_availability, parents_metadata=parents_metadata, vo=vo, session=session)
|
|
@@ -0,0 +1,60 @@
|
|
|
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
|
|
16
|
+
|
|
17
|
+
from rucio.common import exception
|
|
18
|
+
from rucio.core import exporter
|
|
19
|
+
from rucio.core.rse import get_rse_name
|
|
20
|
+
from rucio.db.sqla.session import read_session
|
|
21
|
+
from rucio.gateway import permission
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from sqlalchemy.orm import Session
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@read_session
|
|
28
|
+
def export_data(issuer: str, distance: bool = True, vo: str = 'def', *, session: "Session") -> dict[str, Any]:
|
|
29
|
+
"""
|
|
30
|
+
Export data from Rucio.
|
|
31
|
+
|
|
32
|
+
:param issuer: the issuer.
|
|
33
|
+
:param distance: To enable the reporting of distance.
|
|
34
|
+
:param vo: the VO of the issuer.
|
|
35
|
+
:param session: The database session in use.
|
|
36
|
+
"""
|
|
37
|
+
kwargs = {'issuer': issuer}
|
|
38
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='export', kwargs=kwargs, session=session)
|
|
39
|
+
if not auth_result.allowed:
|
|
40
|
+
raise exception.AccessDenied('Account %s can not export data. %s' % (issuer, auth_result.message))
|
|
41
|
+
|
|
42
|
+
data = exporter.export_data(distance=distance, vo=vo, session=session)
|
|
43
|
+
rses = {}
|
|
44
|
+
distances = {}
|
|
45
|
+
|
|
46
|
+
for rse_id in data['rses']:
|
|
47
|
+
rse = data['rses'][rse_id]
|
|
48
|
+
rses[get_rse_name(rse_id=rse_id, session=session)] = rse
|
|
49
|
+
data['rses'] = rses
|
|
50
|
+
|
|
51
|
+
if distance:
|
|
52
|
+
for src_id in data['distances']:
|
|
53
|
+
dests = data['distances'][src_id]
|
|
54
|
+
src = get_rse_name(rse_id=src_id, session=session)
|
|
55
|
+
distances[src] = {}
|
|
56
|
+
for dest_id in dests:
|
|
57
|
+
dest = get_rse_name(rse_id=dest_id, session=session)
|
|
58
|
+
distances[src][dest] = dests[dest_id]
|
|
59
|
+
data['distances'] = distances
|
|
60
|
+
return data
|
|
@@ -0,0 +1,76 @@
|
|
|
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, Optional
|
|
16
|
+
|
|
17
|
+
from rucio.common import exception
|
|
18
|
+
from rucio.core import heartbeat
|
|
19
|
+
from rucio.db.sqla.session import read_session, transactional_session
|
|
20
|
+
from rucio.gateway import permission
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from threading import Thread
|
|
24
|
+
|
|
25
|
+
from sqlalchemy.orm import Session
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@read_session
|
|
29
|
+
def list_heartbeats(issuer: Optional[str] = None, vo: str = 'def', *, session: "Session") -> list["heartbeat.HeartbeatDict"]:
|
|
30
|
+
"""
|
|
31
|
+
Return a list of tuples of all heartbeats.
|
|
32
|
+
|
|
33
|
+
:param issuer: The issuer account.
|
|
34
|
+
:param vo: the VO for the issuer.
|
|
35
|
+
:param session: The database session in use.
|
|
36
|
+
:returns: List of tuples [('Executable', 'Hostname', ...), ...]
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
kwargs = {'issuer': issuer}
|
|
40
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='list_heartbeats', kwargs=kwargs, session=session)
|
|
41
|
+
if not auth_result.allowed:
|
|
42
|
+
raise exception.AccessDenied('%s cannot list heartbeats. %s' % (issuer, auth_result.message))
|
|
43
|
+
return heartbeat.list_heartbeats(session=session)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@transactional_session
|
|
47
|
+
def create_heartbeat(
|
|
48
|
+
executable: str,
|
|
49
|
+
hostname: str,
|
|
50
|
+
pid: int,
|
|
51
|
+
older_than: int,
|
|
52
|
+
payload: Optional[str],
|
|
53
|
+
thread: Optional["Thread"] = None,
|
|
54
|
+
issuer: Optional[str] = None,
|
|
55
|
+
vo: str = 'def',
|
|
56
|
+
*,
|
|
57
|
+
session: "Session"
|
|
58
|
+
) -> None:
|
|
59
|
+
"""
|
|
60
|
+
Creates a heartbeat.
|
|
61
|
+
:param issuer: The issuer account.
|
|
62
|
+
:param vo: the VO for the issuer.
|
|
63
|
+
:param executable: Executable name as a string, e.g., conveyor-submitter.
|
|
64
|
+
:param hostname: Hostname as a string, e.g., rucio-daemon-prod-01.cern.ch.
|
|
65
|
+
:param pid: UNIX Process ID as a number, e.g., 1234.
|
|
66
|
+
:param thread: Python Thread Object.
|
|
67
|
+
:param older_than: Ignore specified heartbeats older than specified nr of seconds.
|
|
68
|
+
:param payload: Payload identifier which can be further used to identify the work a certain thread is executing.
|
|
69
|
+
:param session: The database session in use.
|
|
70
|
+
|
|
71
|
+
"""
|
|
72
|
+
kwargs = {'issuer': issuer}
|
|
73
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='send_heartbeats', kwargs=kwargs, session=session)
|
|
74
|
+
if not auth_result.allowed:
|
|
75
|
+
raise exception.AccessDenied('%s cannot send heartbeats. %s' % (issuer, auth_result.message))
|
|
76
|
+
heartbeat.live(executable=executable, hostname=hostname, pid=pid, thread=thread, older_than=older_than, payload=payload, session=session)
|
|
@@ -0,0 +1,189 @@
|
|
|
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
|
+
"""
|
|
16
|
+
Interface for identity abstraction layer
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from typing import TYPE_CHECKING, Optional
|
|
20
|
+
|
|
21
|
+
from rucio.common import exception
|
|
22
|
+
from rucio.common.types import InternalAccount
|
|
23
|
+
from rucio.core import identity
|
|
24
|
+
from rucio.db.sqla.constants import DatabaseOperationType, IdentityType
|
|
25
|
+
from rucio.db.sqla.session import db_session
|
|
26
|
+
from rucio.gateway import permission
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from collections.abc import Sequence
|
|
30
|
+
|
|
31
|
+
from sqlalchemy import Row
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def add_identity(
|
|
35
|
+
identity_key: str,
|
|
36
|
+
id_type: str,
|
|
37
|
+
email: str,
|
|
38
|
+
password: Optional[str] = None,
|
|
39
|
+
) -> None:
|
|
40
|
+
"""
|
|
41
|
+
Creates a user identity.
|
|
42
|
+
|
|
43
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
44
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml)
|
|
45
|
+
:param email: The Email address associated with the identity.
|
|
46
|
+
:param password: If type==userpass, this sets the password.
|
|
47
|
+
"""
|
|
48
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
49
|
+
return identity.add_identity(identity_key, IdentityType[id_type.upper()], email, password=password, session=session)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def del_identity(
|
|
53
|
+
identity_key: str,
|
|
54
|
+
id_type: str,
|
|
55
|
+
issuer: str,
|
|
56
|
+
vo: str = 'def',
|
|
57
|
+
) -> None:
|
|
58
|
+
"""
|
|
59
|
+
Deletes a user identity.
|
|
60
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
61
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
62
|
+
:param issuer: The issuer account.
|
|
63
|
+
:param vo: the VO of the issuer.
|
|
64
|
+
"""
|
|
65
|
+
converted_id_type = IdentityType[id_type.upper()]
|
|
66
|
+
|
|
67
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
68
|
+
kwargs = {'accounts': identity.list_accounts_for_identity(identity_key, converted_id_type, session=session)}
|
|
69
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='del_identity', kwargs=kwargs, session=session)
|
|
70
|
+
if not auth_result.allowed:
|
|
71
|
+
raise exception.AccessDenied('Account %s can not delete identity. %s' % (issuer, auth_result.message))
|
|
72
|
+
|
|
73
|
+
return identity.del_identity(identity_key, converted_id_type, session=session)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def add_account_identity(
|
|
77
|
+
identity_key: str,
|
|
78
|
+
id_type: str,
|
|
79
|
+
account: str,
|
|
80
|
+
email: str,
|
|
81
|
+
issuer: str,
|
|
82
|
+
default: bool = False,
|
|
83
|
+
password: Optional[str] = None,
|
|
84
|
+
vo: str = 'def',
|
|
85
|
+
) -> None:
|
|
86
|
+
"""
|
|
87
|
+
Adds a membership association between identity and account.
|
|
88
|
+
|
|
89
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
90
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
91
|
+
:param account: The account name.
|
|
92
|
+
:param email: The Email address associated with the identity.
|
|
93
|
+
:param issuer: The issuer account.
|
|
94
|
+
:param default: If True, the account should be used by default with the provided identity.
|
|
95
|
+
:param password: Password if id_type is userpass.
|
|
96
|
+
:param vo: the VO to act on.
|
|
97
|
+
"""
|
|
98
|
+
kwargs = {'identity': identity_key, 'type': id_type, 'account': account}
|
|
99
|
+
|
|
100
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
101
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='add_account_identity', kwargs=kwargs, session=session)
|
|
102
|
+
if not auth_result.allowed:
|
|
103
|
+
raise exception.AccessDenied('Account %s can not add account identity. %s' % (issuer, auth_result.message))
|
|
104
|
+
|
|
105
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
106
|
+
|
|
107
|
+
return identity.add_account_identity(identity=identity_key, type_=IdentityType[id_type.upper()], default=default,
|
|
108
|
+
email=email, account=internal_account, password=password, session=session)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def verify_identity(identity_key: str, id_type: str, password: Optional[str] = None) -> bool:
|
|
112
|
+
"""
|
|
113
|
+
Verifies a user identity.
|
|
114
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
115
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml)
|
|
116
|
+
:param password: If type==userpass, verifies the identity_key, .
|
|
117
|
+
"""
|
|
118
|
+
with db_session(DatabaseOperationType.READ) as session:
|
|
119
|
+
return identity.verify_identity(identity_key, IdentityType[id_type.upper()], password=password, session=session)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def del_account_identity(
|
|
123
|
+
identity_key: str,
|
|
124
|
+
id_type: str,
|
|
125
|
+
account: str,
|
|
126
|
+
issuer: str,
|
|
127
|
+
vo: str = 'def',
|
|
128
|
+
) -> None:
|
|
129
|
+
"""
|
|
130
|
+
Removes a membership association between identity and account.
|
|
131
|
+
|
|
132
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
133
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
134
|
+
:param account: The account name.
|
|
135
|
+
:param issuer: The issuer account.
|
|
136
|
+
:param vo: the VO to act on.
|
|
137
|
+
"""
|
|
138
|
+
kwargs = {'account': account}
|
|
139
|
+
|
|
140
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
141
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='del_account_identity', kwargs=kwargs, session=session)
|
|
142
|
+
if not auth_result.allowed:
|
|
143
|
+
raise exception.AccessDenied('Account %s can not delete account identity. %s' % (issuer, auth_result.message))
|
|
144
|
+
|
|
145
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
146
|
+
|
|
147
|
+
return identity.del_account_identity(identity_key, IdentityType[id_type.upper()], internal_account, session=session)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def list_identities(**kwargs) -> "Sequence[Row[tuple[str, IdentityType]]]":
|
|
151
|
+
"""
|
|
152
|
+
Returns a list of all enabled identities.
|
|
153
|
+
|
|
154
|
+
returns: A list of all enabled identities.
|
|
155
|
+
"""
|
|
156
|
+
with db_session(DatabaseOperationType.READ) as session:
|
|
157
|
+
return identity.list_identities(session=session, **kwargs)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def get_default_account(
|
|
161
|
+
identity_key: str,
|
|
162
|
+
id_type: str,
|
|
163
|
+
) -> str:
|
|
164
|
+
"""
|
|
165
|
+
Returns the default account for this identity.
|
|
166
|
+
|
|
167
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
168
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
169
|
+
"""
|
|
170
|
+
with db_session(DatabaseOperationType.READ) as session:
|
|
171
|
+
account = identity.get_default_account(identity_key, IdentityType[id_type.upper()], session=session)
|
|
172
|
+
return account.external
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def list_accounts_for_identity(
|
|
176
|
+
identity_key: str,
|
|
177
|
+
id_type: str,
|
|
178
|
+
) -> list[str]:
|
|
179
|
+
"""
|
|
180
|
+
Returns a list of all accounts for an identity.
|
|
181
|
+
|
|
182
|
+
:param identity: The identity key name. For example x509 DN, or a username.
|
|
183
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
184
|
+
|
|
185
|
+
returns: A list of all accounts for the identity.
|
|
186
|
+
"""
|
|
187
|
+
with db_session(DatabaseOperationType.READ) as session:
|
|
188
|
+
accounts = identity.list_accounts_for_identity(identity_key, IdentityType[id_type.upper()], session=session)
|
|
189
|
+
return [account.external for account in accounts]
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
|
16
|
+
|
|
17
|
+
from rucio.common import exception
|
|
18
|
+
from rucio.common.schema import validate_schema
|
|
19
|
+
from rucio.common.types import InternalAccount
|
|
20
|
+
from rucio.core import importer
|
|
21
|
+
from rucio.db.sqla.session import transactional_session
|
|
22
|
+
from rucio.gateway import permission
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from sqlalchemy.orm import Session
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@transactional_session
|
|
29
|
+
def import_data(data: dict[str, Any], issuer: str, vo: str = 'def', *, session: "Session") -> None:
|
|
30
|
+
"""
|
|
31
|
+
Import data to add/update/delete records in Rucio.
|
|
32
|
+
|
|
33
|
+
:param data: data to be imported.
|
|
34
|
+
:param issuer: the issuer.
|
|
35
|
+
:param vo: the VO of the issuer.
|
|
36
|
+
:param session: The database session in use.
|
|
37
|
+
"""
|
|
38
|
+
kwargs = {'issuer': issuer}
|
|
39
|
+
validate_schema(name='import', obj=data, vo=vo)
|
|
40
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='import', kwargs=kwargs, session=session)
|
|
41
|
+
if not auth_result.allowed:
|
|
42
|
+
raise exception.AccessDenied('Account %s can not import data. %s' % (issuer, auth_result.message))
|
|
43
|
+
|
|
44
|
+
for account in data.get('accounts', []):
|
|
45
|
+
account['account'] = InternalAccount(account['account'], vo=vo)
|
|
46
|
+
return importer.import_data(data, vo=vo, session=session)
|
|
@@ -0,0 +1,121 @@
|
|
|
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
|
+
from rucio.common import exception
|
|
18
|
+
from rucio.common.types import InternalAccount, InternalScope
|
|
19
|
+
from rucio.common.utils import gateway_update_return_dict
|
|
20
|
+
from rucio.core import lifetime_exception
|
|
21
|
+
from rucio.db.sqla.session import stream_session, transactional_session
|
|
22
|
+
from rucio.gateway import permission
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from collections.abc import Iterable, Iterator
|
|
26
|
+
|
|
27
|
+
from sqlalchemy.orm import Session
|
|
28
|
+
|
|
29
|
+
from rucio.db.sqla.constants import LifetimeExceptionsState
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@stream_session
|
|
33
|
+
def list_exceptions(
|
|
34
|
+
exception_id: Optional[str] = None,
|
|
35
|
+
states: Optional["Iterable[LifetimeExceptionsState]"] = None,
|
|
36
|
+
vo: str = 'def',
|
|
37
|
+
*,
|
|
38
|
+
session: "Session"
|
|
39
|
+
) -> 'Iterator[dict[str, Any]]':
|
|
40
|
+
"""
|
|
41
|
+
List exceptions to Lifetime Model.
|
|
42
|
+
|
|
43
|
+
:param id: The id of the exception
|
|
44
|
+
:param states: The states to filter
|
|
45
|
+
:param vo: The VO to act on
|
|
46
|
+
:param session: The database session in use.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
exceptions = lifetime_exception.list_exceptions(exception_id=exception_id, states=states, session=session)
|
|
50
|
+
for e in exceptions:
|
|
51
|
+
if vo == e['scope'].vo:
|
|
52
|
+
yield gateway_update_return_dict(e, session=session)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@transactional_session
|
|
56
|
+
def add_exception(
|
|
57
|
+
dids: "Iterable[dict[str, Any]]",
|
|
58
|
+
account: str,
|
|
59
|
+
pattern: str,
|
|
60
|
+
comments: str,
|
|
61
|
+
expires_at: str,
|
|
62
|
+
vo: str = 'def',
|
|
63
|
+
*,
|
|
64
|
+
session: "Session"
|
|
65
|
+
) -> dict[str, Any]:
|
|
66
|
+
"""
|
|
67
|
+
Add exceptions to Lifetime Model.
|
|
68
|
+
|
|
69
|
+
:param dids: The list of dids
|
|
70
|
+
:param account: The account of the requester.
|
|
71
|
+
:param pattern: The account.
|
|
72
|
+
:param comments: The comments associated to the exception.
|
|
73
|
+
:param expires_at: The expiration date of the exception.
|
|
74
|
+
:param vo: The VO to act on.
|
|
75
|
+
:param session: The database session in use.
|
|
76
|
+
|
|
77
|
+
returns: The id of the exception.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
81
|
+
for did in dids:
|
|
82
|
+
did['scope'] = InternalScope(did['scope'], vo=vo)
|
|
83
|
+
exceptions = lifetime_exception.add_exception(dids=dids, account=internal_account, pattern=pattern, comments=comments, expires_at=expires_at, session=session)
|
|
84
|
+
|
|
85
|
+
for key in exceptions:
|
|
86
|
+
if key == 'exceptions':
|
|
87
|
+
for reqid in exceptions[key]:
|
|
88
|
+
for did in exceptions[key][reqid]:
|
|
89
|
+
did['scope'] = did['scope'].external
|
|
90
|
+
did['did_type'] = did['did_type'].name
|
|
91
|
+
else:
|
|
92
|
+
for did in exceptions[key]:
|
|
93
|
+
did['scope'] = did['scope'].external
|
|
94
|
+
did['did_type'] = did['did_type'].name
|
|
95
|
+
|
|
96
|
+
return exceptions
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@transactional_session
|
|
100
|
+
def update_exception(
|
|
101
|
+
exception_id: str,
|
|
102
|
+
state: 'LifetimeExceptionsState',
|
|
103
|
+
issuer: str,
|
|
104
|
+
vo: str = 'def',
|
|
105
|
+
*,
|
|
106
|
+
session: "Session"
|
|
107
|
+
) -> None:
|
|
108
|
+
"""
|
|
109
|
+
Update exceptions state to Lifetime Model.
|
|
110
|
+
|
|
111
|
+
:param id: The id of the exception.
|
|
112
|
+
:param state: The states to filter.
|
|
113
|
+
:param issuer: The issuer account.
|
|
114
|
+
:param vo: The VO to act on.
|
|
115
|
+
:param session: The database session in use.
|
|
116
|
+
"""
|
|
117
|
+
kwargs = {'exception_id': exception_id, 'vo': vo}
|
|
118
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='update_lifetime_exceptions', kwargs=kwargs, session=session)
|
|
119
|
+
if not auth_result.allowed:
|
|
120
|
+
raise exception.AccessDenied('Account %s can not update lifetime exceptions. %s' % (issuer, auth_result.message))
|
|
121
|
+
return lifetime_exception.update_exception(exception_id=exception_id, state=state, session=session)
|