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
|
@@ -0,0 +1,280 @@
|
|
|
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 collections import namedtuple
|
|
16
|
+
from json import dumps, loads
|
|
17
|
+
from typing import TYPE_CHECKING, Any, Literal, Optional, Union
|
|
18
|
+
|
|
19
|
+
from rucio.common.exception import AccessDenied, InvalidObject
|
|
20
|
+
from rucio.common.schema import validate_schema
|
|
21
|
+
from rucio.common.types import InternalAccount, InternalScope
|
|
22
|
+
from rucio.core import subscription
|
|
23
|
+
from rucio.db.sqla.session import read_session, stream_session, transactional_session
|
|
24
|
+
from rucio.gateway.permission import has_permission
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from collections.abc import Iterator
|
|
28
|
+
|
|
29
|
+
from sqlalchemy.orm import Session
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
SubscriptionRuleState = namedtuple('SubscriptionRuleState', ['account', 'name', 'state', 'count'])
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@transactional_session
|
|
36
|
+
def add_subscription(
|
|
37
|
+
name: str,
|
|
38
|
+
account: str,
|
|
39
|
+
filter_: dict[str, Any],
|
|
40
|
+
replication_rules: list[dict[str, Any]],
|
|
41
|
+
comments: str,
|
|
42
|
+
lifetime: Union[int, Literal[False]],
|
|
43
|
+
retroactive: bool,
|
|
44
|
+
dry_run: bool,
|
|
45
|
+
priority: Optional[int] = None,
|
|
46
|
+
issuer: Optional[str] = None,
|
|
47
|
+
vo: str = 'def',
|
|
48
|
+
*,
|
|
49
|
+
session: "Session"
|
|
50
|
+
) -> str:
|
|
51
|
+
"""
|
|
52
|
+
Adds a new subscription which will be verified against every new added file and dataset
|
|
53
|
+
|
|
54
|
+
:param account: Account identifier
|
|
55
|
+
:param name: Name of the subscription
|
|
56
|
+
:param filter_: Dictionary of attributes by which the input data should be filtered
|
|
57
|
+
**Example**: ``{'dsn': 'data11_hi*.express_express.*,data11_hi*physics_MinBiasOverlay*', 'account': 'tzero'}``
|
|
58
|
+
:param replication_rules: Replication rules to be set : Dictionary with keys copies, rse_expression, weight, rse_expression
|
|
59
|
+
:param comments: Comments for the subscription
|
|
60
|
+
:param lifetime: Subscription's lifetime (seconds); False if subscription has no lifetime
|
|
61
|
+
:param retroactive: Flag to know if the subscription should be applied on previous data
|
|
62
|
+
:param dry_run: Just print the subscriptions actions without actually executing them (Useful if retroactive flag is set)
|
|
63
|
+
:param priority: The priority of the subscription
|
|
64
|
+
:param issuer: The account issuing this operation.
|
|
65
|
+
:param vo: The VO to act on.
|
|
66
|
+
:param session: The database session in use.
|
|
67
|
+
:returns: subscription_id
|
|
68
|
+
"""
|
|
69
|
+
auth_result = has_permission(issuer=issuer, vo=vo, action='add_subscription', kwargs={'account': account}, session=session)
|
|
70
|
+
if not auth_result.allowed:
|
|
71
|
+
raise AccessDenied('Account %s can not add subscription. %s' % (issuer, auth_result.message))
|
|
72
|
+
try:
|
|
73
|
+
if filter_:
|
|
74
|
+
if not isinstance(filter_, dict):
|
|
75
|
+
raise TypeError('filter should be a dict')
|
|
76
|
+
validate_schema(name='subscription_filter', obj=filter_, vo=vo)
|
|
77
|
+
if replication_rules:
|
|
78
|
+
if not isinstance(replication_rules, list):
|
|
79
|
+
raise TypeError('replication_rules should be a list')
|
|
80
|
+
else:
|
|
81
|
+
for rule in replication_rules:
|
|
82
|
+
validate_schema(name='activity', obj=rule.get('activity', 'default'), vo=vo)
|
|
83
|
+
else:
|
|
84
|
+
raise InvalidObject('You must specify a rule')
|
|
85
|
+
except ValueError as error:
|
|
86
|
+
raise TypeError(error)
|
|
87
|
+
|
|
88
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
89
|
+
|
|
90
|
+
keys = ['scope', 'account']
|
|
91
|
+
types = [InternalScope, InternalAccount]
|
|
92
|
+
for _key, _type in zip(keys, types):
|
|
93
|
+
if _key in filter_:
|
|
94
|
+
if isinstance(filter_[_key], list):
|
|
95
|
+
filter_[_key] = [_type(val, vo=vo).internal for val in filter_[_key]]
|
|
96
|
+
else:
|
|
97
|
+
filter_[_key] = _type(filter_[_key], vo=vo).internal
|
|
98
|
+
|
|
99
|
+
return subscription.add_subscription(name=name, account=internal_account, filter_=dumps(filter_), replication_rules=dumps(replication_rules),
|
|
100
|
+
comments=comments, lifetime=lifetime, retroactive=retroactive, dry_run=dry_run, priority=priority,
|
|
101
|
+
session=session)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@transactional_session
|
|
105
|
+
def update_subscription(
|
|
106
|
+
name: str,
|
|
107
|
+
account: str,
|
|
108
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
109
|
+
issuer: Optional[str] = None,
|
|
110
|
+
vo: str = 'def',
|
|
111
|
+
*,
|
|
112
|
+
session: "Session"
|
|
113
|
+
) -> None:
|
|
114
|
+
"""
|
|
115
|
+
Updates a subscription
|
|
116
|
+
|
|
117
|
+
:param name: Name of the subscription
|
|
118
|
+
:param account: Account identifier
|
|
119
|
+
:param metadata: Dictionary of metadata to update. Supported keys : filter, replication_rules, comments, lifetime, retroactive, dry_run, priority, last_processed
|
|
120
|
+
:param issuer: The account issuing this operation.
|
|
121
|
+
:param vo: The VO to act on.
|
|
122
|
+
:param session: The database session in use.
|
|
123
|
+
:raises: SubscriptionNotFound if subscription is not found
|
|
124
|
+
"""
|
|
125
|
+
auth_result = has_permission(issuer=issuer, vo=vo, action='update_subscription', kwargs={'account': account}, session=session)
|
|
126
|
+
if not auth_result.allowed:
|
|
127
|
+
raise AccessDenied('Account %s can not update subscription. %s' % (issuer, auth_result.message))
|
|
128
|
+
try:
|
|
129
|
+
if not isinstance(metadata, dict):
|
|
130
|
+
raise TypeError('metadata should be a dict')
|
|
131
|
+
if 'filter' in metadata and metadata['filter']:
|
|
132
|
+
if not isinstance(metadata['filter'], dict):
|
|
133
|
+
raise TypeError('filter should be a dict')
|
|
134
|
+
validate_schema(name='subscription_filter', obj=metadata['filter'], vo=vo)
|
|
135
|
+
if 'replication_rules' in metadata and metadata['replication_rules']:
|
|
136
|
+
if not isinstance(metadata['replication_rules'], list):
|
|
137
|
+
raise TypeError('replication_rules should be a list')
|
|
138
|
+
else:
|
|
139
|
+
for rule in metadata['replication_rules']:
|
|
140
|
+
validate_schema(name='activity', obj=rule.get('activity', 'default'), vo=vo)
|
|
141
|
+
except ValueError as error:
|
|
142
|
+
raise TypeError(error)
|
|
143
|
+
|
|
144
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
145
|
+
|
|
146
|
+
if 'filter' in metadata and metadata['filter'] is not None:
|
|
147
|
+
filter_ = metadata['filter']
|
|
148
|
+
keys = ['scope', 'account']
|
|
149
|
+
types = [InternalScope, InternalAccount]
|
|
150
|
+
|
|
151
|
+
for _key, _type in zip(keys, types):
|
|
152
|
+
if _key in filter_ and filter_[_key] is not None:
|
|
153
|
+
if isinstance(filter_[_key], list):
|
|
154
|
+
filter_[_key] = [_type(val, vo=vo).internal for val in filter_[_key]]
|
|
155
|
+
else:
|
|
156
|
+
filter_[_key] = _type(filter_[_key], vo=vo).internal
|
|
157
|
+
|
|
158
|
+
return subscription.update_subscription(name=name, account=internal_account, metadata=metadata, session=session)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@stream_session
|
|
162
|
+
def list_subscriptions(
|
|
163
|
+
name: Optional[str] = None,
|
|
164
|
+
account: Optional[str] = None,
|
|
165
|
+
state: Optional[str] = None,
|
|
166
|
+
vo: str = 'def',
|
|
167
|
+
*,
|
|
168
|
+
session: "Session"
|
|
169
|
+
) -> 'Iterator[dict[str, Any]]':
|
|
170
|
+
"""
|
|
171
|
+
Returns a dictionary with the subscription information :
|
|
172
|
+
Examples: ``{'status': 'INACTIVE/ACTIVE/BROKEN', 'last_modified_date': ...}``
|
|
173
|
+
|
|
174
|
+
:param name: Name of the subscription
|
|
175
|
+
:param account: Account identifier
|
|
176
|
+
:param state: Filter for subscription state
|
|
177
|
+
:param vo: The VO to act on.
|
|
178
|
+
:param session: The database session in use.
|
|
179
|
+
:returns: Dictionary containing subscription parameter
|
|
180
|
+
:raises: exception.NotFound if subscription is not found
|
|
181
|
+
"""
|
|
182
|
+
|
|
183
|
+
if account:
|
|
184
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
185
|
+
else:
|
|
186
|
+
internal_account = InternalAccount('*', vo=vo)
|
|
187
|
+
|
|
188
|
+
subs = subscription.list_subscriptions(name, internal_account, state, session=session)
|
|
189
|
+
|
|
190
|
+
for sub in subs:
|
|
191
|
+
sub['account'] = sub['account'].external
|
|
192
|
+
|
|
193
|
+
if 'filter' in sub:
|
|
194
|
+
fil = loads(sub['filter'])
|
|
195
|
+
if 'account' in fil:
|
|
196
|
+
fil['account'] = [InternalAccount(acc, from_external=False).external for acc in fil['account']]
|
|
197
|
+
if 'scope' in fil:
|
|
198
|
+
fil['scope'] = [InternalScope(sco, from_external=False).external for sco in fil['scope']]
|
|
199
|
+
sub['filter'] = dumps(fil)
|
|
200
|
+
|
|
201
|
+
yield sub
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
@stream_session
|
|
205
|
+
def list_subscription_rule_states(
|
|
206
|
+
name: Optional[str] = None,
|
|
207
|
+
account: Optional[str] = None,
|
|
208
|
+
vo: str = 'def',
|
|
209
|
+
*,
|
|
210
|
+
session: "Session"
|
|
211
|
+
) -> 'Iterator[SubscriptionRuleState]':
|
|
212
|
+
"""Returns a list of with the number of rules per state for a subscription.
|
|
213
|
+
|
|
214
|
+
:param name: Name of the subscription
|
|
215
|
+
:param account: Account identifier
|
|
216
|
+
:param vo: The VO to act on.
|
|
217
|
+
:param session: The database session in use.
|
|
218
|
+
:returns: Sequence with SubscriptionRuleState named tuples (account, name, state, count)
|
|
219
|
+
"""
|
|
220
|
+
if account is not None:
|
|
221
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
222
|
+
else:
|
|
223
|
+
internal_account = InternalAccount('*', vo=vo)
|
|
224
|
+
subs = subscription.list_subscription_rule_states(name, internal_account, session=session)
|
|
225
|
+
for sub in subs:
|
|
226
|
+
# sub is an immutable Row so return new named tuple with edited entries
|
|
227
|
+
d = sub._asdict()
|
|
228
|
+
d['account'] = d['account'].external
|
|
229
|
+
yield SubscriptionRuleState(**d)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
@transactional_session
|
|
233
|
+
def delete_subscription(
|
|
234
|
+
subscription_id: str,
|
|
235
|
+
vo: str = 'def',
|
|
236
|
+
*,
|
|
237
|
+
session: "Session"
|
|
238
|
+
) -> None:
|
|
239
|
+
"""
|
|
240
|
+
Deletes a subscription
|
|
241
|
+
|
|
242
|
+
:param subscription_id: Subscription identifier
|
|
243
|
+
:param vo: The VO of the user issuing command
|
|
244
|
+
:param session: The database session in use.
|
|
245
|
+
"""
|
|
246
|
+
|
|
247
|
+
raise NotImplementedError
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
@read_session
|
|
251
|
+
def get_subscription_by_id(
|
|
252
|
+
subscription_id: str,
|
|
253
|
+
vo: str = 'def',
|
|
254
|
+
*,
|
|
255
|
+
session: "Session"
|
|
256
|
+
) -> dict[str, Any]:
|
|
257
|
+
"""
|
|
258
|
+
Get a specific subscription by id.
|
|
259
|
+
|
|
260
|
+
:param subscription_id: The subscription_id to select.
|
|
261
|
+
:param vo: The VO of the user issuing command.
|
|
262
|
+
:param session: The database session in use.
|
|
263
|
+
|
|
264
|
+
:raises: SubscriptionNotFound if no Subscription can be found.
|
|
265
|
+
"""
|
|
266
|
+
sub = subscription.get_subscription_by_id(subscription_id, session=session)
|
|
267
|
+
if sub['account'].vo != vo:
|
|
268
|
+
raise AccessDenied('Unable to get subscription')
|
|
269
|
+
|
|
270
|
+
sub['account'] = sub['account'].external
|
|
271
|
+
|
|
272
|
+
if 'filter' in sub:
|
|
273
|
+
fil = loads(sub['filter'])
|
|
274
|
+
if 'account' in fil:
|
|
275
|
+
fil['account'] = [InternalAccount(acc, from_external=False).external for acc in fil['account']]
|
|
276
|
+
if 'scope' in fil:
|
|
277
|
+
fil['scope'] = [InternalScope(sco, from_external=False).external for sco in fil['scope']]
|
|
278
|
+
sub['filter'] = dumps(fil)
|
|
279
|
+
|
|
280
|
+
return sub
|
rucio/gateway/vo.py
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
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.schema import validate_schema
|
|
19
|
+
from rucio.common.types import InternalAccount
|
|
20
|
+
from rucio.core import identity
|
|
21
|
+
from rucio.core import vo as vo_core
|
|
22
|
+
from rucio.db.sqla.constants import IdentityType
|
|
23
|
+
from rucio.db.sqla.session import read_session, transactional_session
|
|
24
|
+
from rucio.gateway.permission import has_permission
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from sqlalchemy.orm import Session
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@transactional_session
|
|
31
|
+
def add_vo(new_vo: str, issuer: str, description: Optional[str] = None, email: Optional[str] = None, vo: str = 'def', *, session: "Session") -> None:
|
|
32
|
+
'''
|
|
33
|
+
Add a new VO.
|
|
34
|
+
|
|
35
|
+
:param new_vo: The name/tag of the VO to add (3 characters).
|
|
36
|
+
:param description: A description of the VO. e.g the full name or a brief description
|
|
37
|
+
:param email: A contact for the VO.
|
|
38
|
+
:param issuer: The user issuing the command.
|
|
39
|
+
:param vo: The vo of the user issuing the command.
|
|
40
|
+
:param session: The database session in use.
|
|
41
|
+
'''
|
|
42
|
+
|
|
43
|
+
new_vo = vo_core.map_vo(new_vo)
|
|
44
|
+
validate_schema('vo', new_vo, vo=vo)
|
|
45
|
+
|
|
46
|
+
kwargs = {}
|
|
47
|
+
auth_result = has_permission(issuer=issuer, action='add_vo', kwargs=kwargs, vo=vo, session=session)
|
|
48
|
+
if not auth_result.allowed:
|
|
49
|
+
raise exception.AccessDenied('Account {} cannot add a VO. {}'.format(issuer, auth_result.message))
|
|
50
|
+
|
|
51
|
+
vo_core.add_vo(vo=new_vo, description=description, email=email, session=session)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@read_session
|
|
55
|
+
def list_vos(issuer: str, vo: str = 'def', *, session: "Session") -> list[dict[str, Any]]:
|
|
56
|
+
'''
|
|
57
|
+
List the VOs.
|
|
58
|
+
|
|
59
|
+
:param issuer: The user issuing the command.
|
|
60
|
+
:param vo: The vo of the user issuing the command.
|
|
61
|
+
:param session: The database session in use.
|
|
62
|
+
'''
|
|
63
|
+
kwargs = {}
|
|
64
|
+
auth_result = has_permission(issuer=issuer, action='list_vos', kwargs=kwargs, vo=vo, session=session)
|
|
65
|
+
if not auth_result.allowed:
|
|
66
|
+
raise exception.AccessDenied('Account {} cannot list VOs. {}'.format(issuer, auth_result.message))
|
|
67
|
+
|
|
68
|
+
return vo_core.list_vos(session=session)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@transactional_session
|
|
72
|
+
def recover_vo_root_identity(
|
|
73
|
+
root_vo: str,
|
|
74
|
+
identity_key: str,
|
|
75
|
+
id_type: str,
|
|
76
|
+
email: str,
|
|
77
|
+
issuer: str,
|
|
78
|
+
default: bool = False,
|
|
79
|
+
password: Optional[str] = None,
|
|
80
|
+
vo: str = 'def',
|
|
81
|
+
*,
|
|
82
|
+
session: "Session"
|
|
83
|
+
) -> None:
|
|
84
|
+
"""
|
|
85
|
+
Adds a membership association between identity and the root account for given VO.
|
|
86
|
+
|
|
87
|
+
:param root_vo: The VO whose root needs recovery
|
|
88
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
89
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
90
|
+
:param email: The Email address associated with the identity.
|
|
91
|
+
:param issuer: The issuer account.
|
|
92
|
+
:param default: If True, the account should be used by default with the provided identity.
|
|
93
|
+
:param password: Password if id_type is userpass.
|
|
94
|
+
:param vo: the VO to act on.
|
|
95
|
+
:param session: The database session in use.
|
|
96
|
+
"""
|
|
97
|
+
kwargs = {}
|
|
98
|
+
root_vo = vo_core.map_vo(root_vo)
|
|
99
|
+
auth_result = has_permission(issuer=issuer, vo=vo, action='recover_vo_root_identity', kwargs=kwargs, session=session)
|
|
100
|
+
if not auth_result.allowed:
|
|
101
|
+
raise exception.AccessDenied('Account %s can not recover root identity. %s' % (issuer, auth_result.message))
|
|
102
|
+
|
|
103
|
+
account = InternalAccount('root', vo=root_vo)
|
|
104
|
+
|
|
105
|
+
return identity.add_account_identity(identity=identity_key, type_=IdentityType[id_type.upper()], default=default,
|
|
106
|
+
email=email, account=account, password=password, session=session)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@transactional_session
|
|
110
|
+
def update_vo(updated_vo: str, parameters: dict[str, Any], issuer: str, vo: str = 'def', *, session: "Session") -> None:
|
|
111
|
+
"""
|
|
112
|
+
Update VO properties (email, description).
|
|
113
|
+
|
|
114
|
+
:param updated_vo: The VO to update.
|
|
115
|
+
:param parameters: A dictionary with the new properties.
|
|
116
|
+
:param issuer: The user issuing the command.
|
|
117
|
+
:param vo: The VO of the user issusing the command.
|
|
118
|
+
:param session: The database session in use.
|
|
119
|
+
"""
|
|
120
|
+
kwargs = {}
|
|
121
|
+
updated_vo = vo_core.map_vo(updated_vo)
|
|
122
|
+
auth_result = has_permission(issuer=issuer, action='update_vo', kwargs=kwargs, vo=vo, session=session)
|
|
123
|
+
if not auth_result.allowed:
|
|
124
|
+
raise exception.AccessDenied('Account {} cannot update VO. {}'.format(issuer, auth_result.message))
|
|
125
|
+
|
|
126
|
+
return vo_core.update_vo(vo=updated_vo, parameters=parameters, session=session)
|
rucio/rse/__init__.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
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 dogpile.cache import make_region
|
|
16
|
+
|
|
17
|
+
from rucio.common.client import is_client
|
|
18
|
+
from rucio.rse import rsemanager
|
|
19
|
+
|
|
20
|
+
if is_client():
|
|
21
|
+
setattr(rsemanager, 'CLIENT_MODE', True)
|
|
22
|
+
setattr(rsemanager, 'SERVER_MODE', False)
|
|
23
|
+
else:
|
|
24
|
+
setattr(rsemanager, 'CLIENT_MODE', False)
|
|
25
|
+
setattr(rsemanager, 'SERVER_MODE', True)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_rse_client(rse, vo='def', **kwarg):
|
|
29
|
+
'''
|
|
30
|
+
get_rse_client
|
|
31
|
+
'''
|
|
32
|
+
from rucio.client.rseclient import RSEClient
|
|
33
|
+
client = RSEClient(vo=vo)
|
|
34
|
+
return client.get_rse(rse)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_signed_url_client(rse, service, op, url, vo='def'):
|
|
38
|
+
'''
|
|
39
|
+
get_signed_url_client
|
|
40
|
+
'''
|
|
41
|
+
from rucio.client.credentialclient import CredentialClient
|
|
42
|
+
return CredentialClient(vo=vo).get_signed_url(rse, service, op, url)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def get_signed_url_server(rse, service, op, url, vo='def'):
|
|
46
|
+
'''
|
|
47
|
+
get_signed_url_server
|
|
48
|
+
'''
|
|
49
|
+
from rucio.core.credential import get_signed_url
|
|
50
|
+
from rucio.core.rse import get_rse_id
|
|
51
|
+
|
|
52
|
+
rse_id = get_rse_id(rse=rse, vo=vo)
|
|
53
|
+
return get_signed_url(rse_id, service, op, url)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def rse_key_generator(namespace, fn, **kwargs):
|
|
57
|
+
'''
|
|
58
|
+
Key generator for RSE
|
|
59
|
+
'''
|
|
60
|
+
def generate_key(rse, vo='def', session=None):
|
|
61
|
+
'''
|
|
62
|
+
generate_key
|
|
63
|
+
'''
|
|
64
|
+
return '{}:{}'.format(rse, vo)
|
|
65
|
+
return generate_key
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
if rsemanager.CLIENT_MODE: # pylint:disable=no-member
|
|
69
|
+
setattr(rsemanager, '__request_rse_info', get_rse_client)
|
|
70
|
+
setattr(rsemanager, '__get_signed_url', get_signed_url_client)
|
|
71
|
+
|
|
72
|
+
# Preparing region for dogpile.cache
|
|
73
|
+
RSE_REGION = make_region(function_key_generator=rse_key_generator).configure(
|
|
74
|
+
'dogpile.cache.memory',
|
|
75
|
+
expiration_time=900)
|
|
76
|
+
setattr(rsemanager, 'RSE_REGION', RSE_REGION)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
if rsemanager.SERVER_MODE: # pylint:disable=no-member
|
|
80
|
+
from rucio.common.cache import MemcacheRegion
|
|
81
|
+
from rucio.core.rse import get_rse_id, get_rse_protocols
|
|
82
|
+
from rucio.core.vo import map_vo
|
|
83
|
+
|
|
84
|
+
def tmp_rse_info(rse=None, vo='def', rse_id=None, session=None):
|
|
85
|
+
if rse_id is None:
|
|
86
|
+
# This can be called directly by client tools if they're co-located on a server
|
|
87
|
+
# i.e. running rucio cli on a server and during the test suite.
|
|
88
|
+
# We have to map to VO name here for this situations, despite this nominally
|
|
89
|
+
# not being a client interface.
|
|
90
|
+
rse_id = get_rse_id(rse=rse, vo=map_vo(vo))
|
|
91
|
+
return get_rse_protocols(rse_id=rse_id, session=session)
|
|
92
|
+
|
|
93
|
+
setattr(rsemanager, '__request_rse_info', tmp_rse_info)
|
|
94
|
+
setattr(rsemanager, '__get_signed_url', get_signed_url_server)
|
|
95
|
+
RSE_REGION = MemcacheRegion(expiration_time=900)
|
|
96
|
+
setattr(rsemanager, 'RSE_REGION', RSE_REGION)
|
|
@@ -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.
|