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,304 @@
|
|
|
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 flask import Flask, jsonify
|
|
16
|
+
from flask import request as request
|
|
17
|
+
|
|
18
|
+
from rucio.common.exception import AccessDenied, ConfigNotFound, ConfigurationError
|
|
19
|
+
from rucio.gateway import config
|
|
20
|
+
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
21
|
+
from rucio.web.rest.flaskapi.v1.common import ErrorHandlingMethodView, check_accept_header_wrapper_flask, generate_http_error_flask, json_parameters, response_headers
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Config(ErrorHandlingMethodView):
|
|
25
|
+
""" REST API for full configuration. """
|
|
26
|
+
|
|
27
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
28
|
+
def get(self):
|
|
29
|
+
"""
|
|
30
|
+
---
|
|
31
|
+
summary: List
|
|
32
|
+
description: List the full configuration.
|
|
33
|
+
tags:
|
|
34
|
+
- Config
|
|
35
|
+
responses:
|
|
36
|
+
200:
|
|
37
|
+
description: OK
|
|
38
|
+
content:
|
|
39
|
+
application/json:
|
|
40
|
+
schema:
|
|
41
|
+
description: A dict with the sections as keys and a dict with the configuration as value.
|
|
42
|
+
type: object
|
|
43
|
+
401:
|
|
44
|
+
description: Invalid Auth Token
|
|
45
|
+
406:
|
|
46
|
+
description: Not acceptable
|
|
47
|
+
"""
|
|
48
|
+
res = {}
|
|
49
|
+
for section in config.sections(issuer=request.environ.get('issuer'), vo=request.environ.get('vo')):
|
|
50
|
+
res[section] = {}
|
|
51
|
+
for item in config.items(section, issuer=request.environ.get('issuer'), vo=request.environ.get('vo')):
|
|
52
|
+
res[section][item[0]] = item[1]
|
|
53
|
+
|
|
54
|
+
return jsonify(res), 200
|
|
55
|
+
|
|
56
|
+
def post(self):
|
|
57
|
+
"""
|
|
58
|
+
---
|
|
59
|
+
summary: Create
|
|
60
|
+
description: Create or set the configuration option in the requested section.
|
|
61
|
+
tags:
|
|
62
|
+
- Config
|
|
63
|
+
requestBody:
|
|
64
|
+
content:
|
|
65
|
+
'application/json':
|
|
66
|
+
schema:
|
|
67
|
+
description: "The request body is expected to contain a json {'section': {'option': 'value'}}."
|
|
68
|
+
type: object
|
|
69
|
+
responses:
|
|
70
|
+
201:
|
|
71
|
+
description: OK
|
|
72
|
+
content:
|
|
73
|
+
application/json:
|
|
74
|
+
schema:
|
|
75
|
+
type: string
|
|
76
|
+
enum: ['Created']
|
|
77
|
+
401:
|
|
78
|
+
description: Invalid Auth Token
|
|
79
|
+
400:
|
|
80
|
+
description: The input data was incomplete or invalid
|
|
81
|
+
500:
|
|
82
|
+
description: Configuration error
|
|
83
|
+
"""
|
|
84
|
+
parameters = json_parameters()
|
|
85
|
+
for section, section_config in parameters.items():
|
|
86
|
+
if not isinstance(section_config, dict):
|
|
87
|
+
return generate_http_error_flask(400, ValueError.__name__, '')
|
|
88
|
+
for option, value in section_config.items():
|
|
89
|
+
try:
|
|
90
|
+
config.set(section=section, option=option, value=value, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
|
|
91
|
+
except ConfigurationError:
|
|
92
|
+
return generate_http_error_flask(400, 'ConfigurationError', f"Could not set value '{value}' for section '{section}' option '{option}'")
|
|
93
|
+
return 'Created', 201
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class Section(ErrorHandlingMethodView):
|
|
97
|
+
""" REST API for the sections in the configuration. """
|
|
98
|
+
|
|
99
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
100
|
+
def get(self, section):
|
|
101
|
+
"""
|
|
102
|
+
---
|
|
103
|
+
summary: List Sections
|
|
104
|
+
tags:
|
|
105
|
+
- Config
|
|
106
|
+
parameters:
|
|
107
|
+
- name: section
|
|
108
|
+
in: path
|
|
109
|
+
description: The section to return.
|
|
110
|
+
schema:
|
|
111
|
+
type: string
|
|
112
|
+
style: simple
|
|
113
|
+
requestBody:
|
|
114
|
+
content:
|
|
115
|
+
'application/json':
|
|
116
|
+
schema:
|
|
117
|
+
type: object
|
|
118
|
+
required:
|
|
119
|
+
- bytes
|
|
120
|
+
properties:
|
|
121
|
+
bytes:
|
|
122
|
+
description: The new limit in bytes.
|
|
123
|
+
type: integer
|
|
124
|
+
responses:
|
|
125
|
+
200:
|
|
126
|
+
description: OK
|
|
127
|
+
content:
|
|
128
|
+
application/json:
|
|
129
|
+
schema:
|
|
130
|
+
description: Dictionary of section options.
|
|
131
|
+
type: object
|
|
132
|
+
401:
|
|
133
|
+
description: Invalid Auth Token
|
|
134
|
+
404:
|
|
135
|
+
description: Config not found
|
|
136
|
+
406:
|
|
137
|
+
description: Not acceptable
|
|
138
|
+
"""
|
|
139
|
+
res = {}
|
|
140
|
+
for item in config.items(section, issuer=request.environ.get('issuer'), vo=request.environ.get('vo')):
|
|
141
|
+
res[item[0]] = item[1]
|
|
142
|
+
|
|
143
|
+
if res == {}:
|
|
144
|
+
return generate_http_error_flask(
|
|
145
|
+
status_code=404,
|
|
146
|
+
exc=ConfigNotFound.__name__,
|
|
147
|
+
exc_msg=f"No configuration found for section '{section}'"
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
return jsonify(res), 200
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class OptionGetDel(ErrorHandlingMethodView):
|
|
154
|
+
""" REST API for reading or deleting the options in the configuration. """
|
|
155
|
+
|
|
156
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
157
|
+
def get(self, section, option):
|
|
158
|
+
"""
|
|
159
|
+
---
|
|
160
|
+
summary: Get option
|
|
161
|
+
description: Returns the value of an option
|
|
162
|
+
tags:
|
|
163
|
+
- Config
|
|
164
|
+
parameters:
|
|
165
|
+
- name: section
|
|
166
|
+
in: path
|
|
167
|
+
description: The section.
|
|
168
|
+
schema:
|
|
169
|
+
type: string
|
|
170
|
+
style: simple
|
|
171
|
+
- name: option
|
|
172
|
+
in: path
|
|
173
|
+
description: The option of the section.
|
|
174
|
+
schema:
|
|
175
|
+
type: string
|
|
176
|
+
style: simple
|
|
177
|
+
responses:
|
|
178
|
+
200:
|
|
179
|
+
description: OK
|
|
180
|
+
content:
|
|
181
|
+
application/json:
|
|
182
|
+
schema:
|
|
183
|
+
description: The value of the option
|
|
184
|
+
type: string
|
|
185
|
+
401:
|
|
186
|
+
description: Invalid Auth Token
|
|
187
|
+
404:
|
|
188
|
+
description: Config not found
|
|
189
|
+
406:
|
|
190
|
+
description: Not acceptable
|
|
191
|
+
"""
|
|
192
|
+
try:
|
|
193
|
+
result = config.get(section=section, option=option, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
|
|
194
|
+
return jsonify(result), 200
|
|
195
|
+
except AccessDenied as error:
|
|
196
|
+
return generate_http_error_flask(401, error, f"Access to '{section}' option '{option}' denied")
|
|
197
|
+
except ConfigNotFound as error:
|
|
198
|
+
return generate_http_error_flask(404, error, f"No configuration found for section '{section}' option '{option}'")
|
|
199
|
+
|
|
200
|
+
def delete(self, section, option):
|
|
201
|
+
"""
|
|
202
|
+
---
|
|
203
|
+
summary: Delete option
|
|
204
|
+
description: Delete an option of a section.
|
|
205
|
+
tags:
|
|
206
|
+
- Config
|
|
207
|
+
parameters:
|
|
208
|
+
- name: section
|
|
209
|
+
in: path
|
|
210
|
+
description: The section.
|
|
211
|
+
schema:
|
|
212
|
+
type: string
|
|
213
|
+
style: simple
|
|
214
|
+
- name: option
|
|
215
|
+
in: path
|
|
216
|
+
description: The option of the section.
|
|
217
|
+
schema:
|
|
218
|
+
type: string
|
|
219
|
+
style: simple
|
|
220
|
+
responses:
|
|
221
|
+
200:
|
|
222
|
+
description: OK
|
|
223
|
+
401:
|
|
224
|
+
description: Invalid Auth Token
|
|
225
|
+
"""
|
|
226
|
+
config.remove_option(section=section, option=option, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
|
|
227
|
+
return '', 200
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
class OptionSet(ErrorHandlingMethodView):
|
|
231
|
+
""" REST API for setting the options in the configuration. """
|
|
232
|
+
|
|
233
|
+
def put(self, section, option, value):
|
|
234
|
+
"""
|
|
235
|
+
---
|
|
236
|
+
summary: Create value
|
|
237
|
+
description: Create or set the value of an option.
|
|
238
|
+
tags:
|
|
239
|
+
- Config
|
|
240
|
+
parameters:
|
|
241
|
+
- name: section
|
|
242
|
+
in: path
|
|
243
|
+
description: The section.
|
|
244
|
+
schema:
|
|
245
|
+
type: string
|
|
246
|
+
style: simple
|
|
247
|
+
- name: option
|
|
248
|
+
in: path
|
|
249
|
+
description: The option of the section.
|
|
250
|
+
schema:
|
|
251
|
+
type: string
|
|
252
|
+
style: simple
|
|
253
|
+
- name: value
|
|
254
|
+
in: path
|
|
255
|
+
description: The value to set.
|
|
256
|
+
schema:
|
|
257
|
+
type: string
|
|
258
|
+
style: simple
|
|
259
|
+
responses:
|
|
260
|
+
201:
|
|
261
|
+
description: OK
|
|
262
|
+
content:
|
|
263
|
+
application/json:
|
|
264
|
+
schema:
|
|
265
|
+
type: string
|
|
266
|
+
enum: ['Created']
|
|
267
|
+
401:
|
|
268
|
+
description: Invalid Auth Token
|
|
269
|
+
500:
|
|
270
|
+
description: Value could not be set
|
|
271
|
+
content:
|
|
272
|
+
application/json:
|
|
273
|
+
schema:
|
|
274
|
+
type: string
|
|
275
|
+
enum: ['Could not set value {} for section {} option {}']
|
|
276
|
+
"""
|
|
277
|
+
try:
|
|
278
|
+
config.set(section=section, option=option, value=value, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
|
|
279
|
+
return 'Created', 201
|
|
280
|
+
except ConfigurationError as error:
|
|
281
|
+
return generate_http_error_flask(500, error, f"Could not set value '{value}' for section '{section}' option '{option}'")
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def blueprint():
|
|
285
|
+
bp = AuthenticatedBlueprint('config', __name__, url_prefix='/config')
|
|
286
|
+
|
|
287
|
+
option_set_view = OptionSet.as_view('option_set')
|
|
288
|
+
bp.add_url_rule('/<section>/<option>/<value>', view_func=option_set_view, methods=['put', ])
|
|
289
|
+
option_get_del_view = OptionGetDel.as_view('option_get_del')
|
|
290
|
+
bp.add_url_rule('/<section>/<option>', view_func=option_get_del_view, methods=['get', 'delete'])
|
|
291
|
+
section_view = Section.as_view('section')
|
|
292
|
+
bp.add_url_rule('/<section>', view_func=section_view, methods=['get', ])
|
|
293
|
+
config_view = Config.as_view('config')
|
|
294
|
+
bp.add_url_rule('', view_func=config_view, methods=['get', 'post'])
|
|
295
|
+
|
|
296
|
+
bp.after_request(response_headers)
|
|
297
|
+
return bp
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def make_doc():
|
|
301
|
+
""" Only used for sphinx documentation """
|
|
302
|
+
doc_app = Flask(__name__)
|
|
303
|
+
doc_app.register_blueprint(blueprint())
|
|
304
|
+
return doc_app
|
|
@@ -0,0 +1,213 @@
|
|
|
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
|
|
16
|
+
|
|
17
|
+
from flask import Flask, request
|
|
18
|
+
from werkzeug.datastructures import Headers
|
|
19
|
+
|
|
20
|
+
from rucio.common.constants import RSE_BASE_SUPPORTED_PROTOCOL_OPERATIONS, SUPPORTED_SIGN_URL_SERVICES
|
|
21
|
+
from rucio.common.exception import CannotAuthenticate
|
|
22
|
+
from rucio.gateway.credential import get_signed_url
|
|
23
|
+
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
24
|
+
from rucio.web.rest.flaskapi.v1.common import ErrorHandlingMethodView, check_accept_header_wrapper_flask, extract_vo, generate_http_error_flask, response_headers
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from typing import Optional
|
|
28
|
+
|
|
29
|
+
from rucio.web.rest.flaskapi.v1.types import HeadersType
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SignURL(ErrorHandlingMethodView):
|
|
33
|
+
"""
|
|
34
|
+
Request a signed URL.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def get_headers(self) -> "Optional[HeadersType]":
|
|
38
|
+
headers = Headers()
|
|
39
|
+
headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN')
|
|
40
|
+
headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')
|
|
41
|
+
headers['Access-Control-Allow-Methods'] = '*'
|
|
42
|
+
headers['Access-Control-Allow-Credentials'] = 'true'
|
|
43
|
+
headers['Access-Control-Expose-Headers'] = 'X-Rucio-Auth-Token'
|
|
44
|
+
return headers
|
|
45
|
+
|
|
46
|
+
def options(self):
|
|
47
|
+
"""
|
|
48
|
+
---
|
|
49
|
+
summary: Cross-Site Scripting
|
|
50
|
+
description: Allow cross-site scripting. Explicit for Authentication.
|
|
51
|
+
tags:
|
|
52
|
+
- Credentials
|
|
53
|
+
responses:
|
|
54
|
+
200:
|
|
55
|
+
description: OK
|
|
56
|
+
headers:
|
|
57
|
+
Access-Control-Allow-Origin:
|
|
58
|
+
schema:
|
|
59
|
+
type: string
|
|
60
|
+
description: The http origin.
|
|
61
|
+
Access-Control-Allow-Headers:
|
|
62
|
+
schema:
|
|
63
|
+
type: string
|
|
64
|
+
description: The http access control request headers.
|
|
65
|
+
Access-Control-Allow-Methods:
|
|
66
|
+
schema:
|
|
67
|
+
type: string
|
|
68
|
+
enum: ['*']
|
|
69
|
+
description: The allowed methods.
|
|
70
|
+
Access-Control-Allow-Credentials:
|
|
71
|
+
schema:
|
|
72
|
+
type: string
|
|
73
|
+
enum: ['true']
|
|
74
|
+
description: If credentials are allowed.
|
|
75
|
+
Access-Control-Expose-Headers:
|
|
76
|
+
schema:
|
|
77
|
+
type: string
|
|
78
|
+
enum: ['X-Rucio-Auth-Token']
|
|
79
|
+
description: The exposed access control header.
|
|
80
|
+
404:
|
|
81
|
+
description: Not found
|
|
82
|
+
"""
|
|
83
|
+
return '', 200, self.get_headers()
|
|
84
|
+
|
|
85
|
+
@check_accept_header_wrapper_flask(['application/octet-stream'])
|
|
86
|
+
def get(self):
|
|
87
|
+
"""
|
|
88
|
+
---
|
|
89
|
+
summary: Sign URL
|
|
90
|
+
description: Sign a url for a limited lifetime for a particular srevice.
|
|
91
|
+
tags:
|
|
92
|
+
- Credentials
|
|
93
|
+
parameters:
|
|
94
|
+
- name: rse
|
|
95
|
+
in: query
|
|
96
|
+
description: The RSE to authenticate against.
|
|
97
|
+
schema:
|
|
98
|
+
type: string
|
|
99
|
+
required: true
|
|
100
|
+
- name: lifetime
|
|
101
|
+
in: query
|
|
102
|
+
description: The lifetime, default 600s.
|
|
103
|
+
schema:
|
|
104
|
+
type: string
|
|
105
|
+
required: false
|
|
106
|
+
- name: svc
|
|
107
|
+
in: query
|
|
108
|
+
description: The service, default gcs.
|
|
109
|
+
schema:
|
|
110
|
+
type: string
|
|
111
|
+
required: false
|
|
112
|
+
- name: op
|
|
113
|
+
in: query
|
|
114
|
+
description: The operation.
|
|
115
|
+
schema:
|
|
116
|
+
type: string
|
|
117
|
+
required: false
|
|
118
|
+
- name: url
|
|
119
|
+
in: query
|
|
120
|
+
description: The Url of the authentication.
|
|
121
|
+
schema:
|
|
122
|
+
type: string
|
|
123
|
+
required: true
|
|
124
|
+
requestBody:
|
|
125
|
+
content:
|
|
126
|
+
'application/octet-stream':
|
|
127
|
+
schema:
|
|
128
|
+
type: object
|
|
129
|
+
properties:
|
|
130
|
+
X-Rucio-Account:
|
|
131
|
+
description: Account identifier.
|
|
132
|
+
type: string
|
|
133
|
+
X-Rucio-VO:
|
|
134
|
+
description: VO name (Multi-VO only).
|
|
135
|
+
type: string
|
|
136
|
+
X-Rucio-AppID:
|
|
137
|
+
description: Application identifier.
|
|
138
|
+
type: string
|
|
139
|
+
responses:
|
|
140
|
+
200:
|
|
141
|
+
description: OK
|
|
142
|
+
content:
|
|
143
|
+
application/json:
|
|
144
|
+
schema:
|
|
145
|
+
type: array
|
|
146
|
+
items:
|
|
147
|
+
type: object
|
|
148
|
+
description: An account attribute.
|
|
149
|
+
properties:
|
|
150
|
+
key:
|
|
151
|
+
description: The key of the account attribute.
|
|
152
|
+
type: string
|
|
153
|
+
value:
|
|
154
|
+
description: The value of the account attribute.
|
|
155
|
+
type: string
|
|
156
|
+
401:
|
|
157
|
+
description: Invalid Auth Token
|
|
158
|
+
400:
|
|
159
|
+
description: bad request, no rse or url found.
|
|
160
|
+
406:
|
|
161
|
+
description: Not acceptable.
|
|
162
|
+
"""
|
|
163
|
+
headers = self.get_headers()
|
|
164
|
+
vo = extract_vo(request.headers)
|
|
165
|
+
account = request.headers.get('X-Rucio-Account', default=None)
|
|
166
|
+
appid = request.headers.get('X-Rucio-AppID', default='unknown')
|
|
167
|
+
ip = request.headers.get('X-Forwarded-For', default=request.remote_addr)
|
|
168
|
+
|
|
169
|
+
if 'rse' not in request.args:
|
|
170
|
+
return generate_http_error_flask(400, ValueError.__name__, 'Parameter "rse" not found', headers=headers)
|
|
171
|
+
rse = request.args.get('rse')
|
|
172
|
+
|
|
173
|
+
lifetime = request.args.get('lifetime', type=int, default=600)
|
|
174
|
+
service = request.args.get('svc', default='gcs')
|
|
175
|
+
operation = request.args.get('op', default='read')
|
|
176
|
+
|
|
177
|
+
if 'url' not in request.args:
|
|
178
|
+
return generate_http_error_flask(400, ValueError.__name__, 'Parameter "url" not found', headers=headers)
|
|
179
|
+
url = request.args.get('url')
|
|
180
|
+
|
|
181
|
+
if service not in SUPPORTED_SIGN_URL_SERVICES:
|
|
182
|
+
return generate_http_error_flask(400, ValueError.__name__, 'Parameter "svc" must be either empty(=gcs), gcs, s3 or swift', headers=headers)
|
|
183
|
+
|
|
184
|
+
if operation not in RSE_BASE_SUPPORTED_PROTOCOL_OPERATIONS:
|
|
185
|
+
return generate_http_error_flask(400, ValueError.__name__, 'Parameter "op" must be either empty(=read), read, write, or delete.', headers=headers)
|
|
186
|
+
|
|
187
|
+
result = get_signed_url(account, appid, ip, rse=rse, service=service, operation=operation, url=url, lifetime=lifetime, vo=vo)
|
|
188
|
+
|
|
189
|
+
if not result:
|
|
190
|
+
return generate_http_error_flask(401, CannotAuthenticate.__name__, f'Cannot generate signed URL for account {account}', headers=headers)
|
|
191
|
+
|
|
192
|
+
return str(result), 200, headers
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def blueprint(with_doc=False):
|
|
196
|
+
bp = AuthenticatedBlueprint('credentials', __name__, url_prefix='/credentials')
|
|
197
|
+
|
|
198
|
+
signurl_view = SignURL.as_view('signurl')
|
|
199
|
+
bp.add_url_rule('/signurl', view_func=signurl_view, methods=['get', 'options'])
|
|
200
|
+
if not with_doc:
|
|
201
|
+
# yes, /signur ~= '/signurl?$'
|
|
202
|
+
bp.add_url_rule('/signur', view_func=signurl_view, methods=['get', 'options'])
|
|
203
|
+
|
|
204
|
+
bp.after_request(response_headers)
|
|
205
|
+
|
|
206
|
+
return bp
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def make_doc():
|
|
210
|
+
""" Only used for sphinx documentation to add the prefix """
|
|
211
|
+
doc_app = Flask(__name__)
|
|
212
|
+
doc_app.register_blueprint(blueprint(with_doc=True))
|
|
213
|
+
return doc_app
|