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,116 @@
|
|
|
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, request
|
|
16
|
+
|
|
17
|
+
from rucio.common.exception import AccessDenied, DatabaseException, DataIdentifierAlreadyExists, Duplicate, InvalidPath, ResourceTemporaryUnavailable, RSENotFound, UnsupportedOperation
|
|
18
|
+
from rucio.common.utils import parse_response
|
|
19
|
+
from rucio.gateway.dirac import add_files
|
|
20
|
+
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
21
|
+
from rucio.web.rest.flaskapi.v1.common import ErrorHandlingMethodView, generate_http_error_flask, json_parameters, param_get, response_headers
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class AddFiles(ErrorHandlingMethodView):
|
|
25
|
+
|
|
26
|
+
def post(self):
|
|
27
|
+
"""
|
|
28
|
+
---
|
|
29
|
+
summary: Add files
|
|
30
|
+
description: |
|
|
31
|
+
Atomic method used by the RucioFileCatalog plugin in Dirac that:
|
|
32
|
+
- Creates files and their replicas
|
|
33
|
+
- Creates the dataset containing the files and attach the files to the dataset
|
|
34
|
+
- Creates a rule on the dataset with RSE expression ANY and grouping NONE
|
|
35
|
+
- Creates all the container hierarchy containing the dataset
|
|
36
|
+
tags:
|
|
37
|
+
- Dirac
|
|
38
|
+
requestBody:
|
|
39
|
+
content:
|
|
40
|
+
'application/json':
|
|
41
|
+
schema:
|
|
42
|
+
type: object
|
|
43
|
+
required:
|
|
44
|
+
- lfns
|
|
45
|
+
properties:
|
|
46
|
+
lfns:
|
|
47
|
+
description: "List of lfn (dictionary {'lfn': <lfn>, 'rse': <rse>, 'bytes': <bytes>, 'adler32': <adler32>, 'guid': <guid>, 'pfn': <pfn>}."
|
|
48
|
+
type: array
|
|
49
|
+
items:
|
|
50
|
+
type: object
|
|
51
|
+
ignore_availability:
|
|
52
|
+
description: If the availability should be ignored.
|
|
53
|
+
type: boolean
|
|
54
|
+
parents_metadata:
|
|
55
|
+
description: "Metadata for selected hierarchy DIDs."
|
|
56
|
+
type: object
|
|
57
|
+
responses:
|
|
58
|
+
201:
|
|
59
|
+
description: OK
|
|
60
|
+
content:
|
|
61
|
+
application/json:
|
|
62
|
+
schema:
|
|
63
|
+
type: string
|
|
64
|
+
enum: ["Created"]
|
|
65
|
+
400:
|
|
66
|
+
description: Cannot decode json parameter list.
|
|
67
|
+
401:
|
|
68
|
+
description: Invalid Auth Token
|
|
69
|
+
404:
|
|
70
|
+
description: DID not found
|
|
71
|
+
405:
|
|
72
|
+
description: Unsupported Operation
|
|
73
|
+
409:
|
|
74
|
+
description: Duplicate
|
|
75
|
+
503:
|
|
76
|
+
description: Temporary error.
|
|
77
|
+
"""
|
|
78
|
+
parameters = json_parameters(parse_response)
|
|
79
|
+
lfns = param_get(parameters, 'lfns')
|
|
80
|
+
ignore_availability = param_get(parameters, 'ignore_availability', default=False)
|
|
81
|
+
parents_metadata = param_get(parameters, 'parents_metadata', default=None)
|
|
82
|
+
try:
|
|
83
|
+
add_files(lfns=lfns, issuer=request.environ.get('issuer'), ignore_availability=ignore_availability,
|
|
84
|
+
parents_metadata=parents_metadata, vo=request.environ.get('vo'))
|
|
85
|
+
except InvalidPath as error:
|
|
86
|
+
return generate_http_error_flask(400, error)
|
|
87
|
+
except AccessDenied as error:
|
|
88
|
+
return generate_http_error_flask(401, error)
|
|
89
|
+
except UnsupportedOperation as error:
|
|
90
|
+
return generate_http_error_flask(405, error)
|
|
91
|
+
except (Duplicate, DataIdentifierAlreadyExists) as error:
|
|
92
|
+
return generate_http_error_flask(409, error)
|
|
93
|
+
except RSENotFound as error:
|
|
94
|
+
return generate_http_error_flask(404, error)
|
|
95
|
+
except (DatabaseException, ResourceTemporaryUnavailable) as error:
|
|
96
|
+
return generate_http_error_flask(503, error)
|
|
97
|
+
|
|
98
|
+
return 'Created', 201
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def blueprint(with_doc=False):
|
|
102
|
+
bp = AuthenticatedBlueprint('dirac', __name__, url_prefix='/dirac')
|
|
103
|
+
|
|
104
|
+
add_file_view = AddFiles.as_view('addfiles')
|
|
105
|
+
bp.add_url_rule('/addfiles', view_func=add_file_view, methods=['post', ])
|
|
106
|
+
bp.add_url_rule('/addfiles/', view_func=add_file_view, methods=['post', ])
|
|
107
|
+
|
|
108
|
+
bp.after_request(response_headers)
|
|
109
|
+
return bp
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def make_doc():
|
|
113
|
+
""" Only used for sphinx documentation """
|
|
114
|
+
doc_app = Flask(__name__)
|
|
115
|
+
doc_app.register_blueprint(blueprint(with_doc=True))
|
|
116
|
+
return doc_app
|
|
@@ -0,0 +1,75 @@
|
|
|
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, Response, request
|
|
16
|
+
|
|
17
|
+
from rucio.common.utils import render_json
|
|
18
|
+
from rucio.gateway.exporter import export_data
|
|
19
|
+
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
20
|
+
from rucio.web.rest.flaskapi.v1.common import ErrorHandlingMethodView, check_accept_header_wrapper_flask, response_headers
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class Export(ErrorHandlingMethodView):
|
|
24
|
+
""" Export data. """
|
|
25
|
+
|
|
26
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
27
|
+
def get(self):
|
|
28
|
+
"""
|
|
29
|
+
---
|
|
30
|
+
summary: Export data
|
|
31
|
+
description: Export data from rucio.
|
|
32
|
+
tags:
|
|
33
|
+
- Export
|
|
34
|
+
parameters:
|
|
35
|
+
- name: distance
|
|
36
|
+
in: query
|
|
37
|
+
description: Should the distance be enabled?
|
|
38
|
+
schema:
|
|
39
|
+
type: boolean
|
|
40
|
+
required: false
|
|
41
|
+
responses:
|
|
42
|
+
200:
|
|
43
|
+
description: OK
|
|
44
|
+
content:
|
|
45
|
+
application/json:
|
|
46
|
+
schema:
|
|
47
|
+
type: object
|
|
48
|
+
description: Dictionary with rucio data.
|
|
49
|
+
401:
|
|
50
|
+
description: Invalid Auth Token
|
|
51
|
+
406:
|
|
52
|
+
description: Not acceptable
|
|
53
|
+
"""
|
|
54
|
+
distance = request.args.get('distance', default='True') == 'True'
|
|
55
|
+
return Response(render_json(**export_data(issuer=request.environ.get('issuer'), distance=distance, vo=request.environ.get('vo'))), content_type='application/json')
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def blueprint(with_doc=False):
|
|
59
|
+
bp = AuthenticatedBlueprint('export', __name__, url_prefix='/export')
|
|
60
|
+
|
|
61
|
+
export_view = Export.as_view('scope')
|
|
62
|
+
if not with_doc:
|
|
63
|
+
# rule without trailing slash needs to be added before rule with trailing slash
|
|
64
|
+
bp.add_url_rule('', view_func=export_view, methods=['get', ])
|
|
65
|
+
bp.add_url_rule('/', view_func=export_view, methods=['get', ])
|
|
66
|
+
|
|
67
|
+
bp.after_request(response_headers)
|
|
68
|
+
return bp
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def make_doc():
|
|
72
|
+
""" Only used for sphinx documentation to add the prefix """
|
|
73
|
+
doc_app = Flask(__name__)
|
|
74
|
+
doc_app.register_blueprint(blueprint(with_doc=True))
|
|
75
|
+
return doc_app
|
|
@@ -0,0 +1,127 @@
|
|
|
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
|
+
import json
|
|
16
|
+
|
|
17
|
+
from flask import Flask, Response, request
|
|
18
|
+
|
|
19
|
+
from rucio.common.exception import AccessDenied, KeyNotFound, UnsupportedKeyType, UnsupportedValueType
|
|
20
|
+
from rucio.common.utils import APIEncoder
|
|
21
|
+
from rucio.gateway.heartbeat import create_heartbeat, list_heartbeats
|
|
22
|
+
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
23
|
+
from rucio.web.rest.flaskapi.v1.common import ErrorHandlingMethodView, check_accept_header_wrapper_flask, generate_http_error_flask, json_parameters, param_get, response_headers
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Heartbeat(ErrorHandlingMethodView):
|
|
27
|
+
""" REST API for Heartbeats. """
|
|
28
|
+
|
|
29
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
30
|
+
def get(self):
|
|
31
|
+
"""
|
|
32
|
+
---
|
|
33
|
+
summary: List
|
|
34
|
+
description: List all heartbeats.
|
|
35
|
+
tags:
|
|
36
|
+
- Heartbeat
|
|
37
|
+
responses:
|
|
38
|
+
200:
|
|
39
|
+
description: OK
|
|
40
|
+
content:
|
|
41
|
+
application/json:
|
|
42
|
+
schema:
|
|
43
|
+
type: array
|
|
44
|
+
items:
|
|
45
|
+
type: object
|
|
46
|
+
description: List of tuples [('Executable', 'Hostname', ...), ...]
|
|
47
|
+
401:
|
|
48
|
+
description: Invalid Auth Token
|
|
49
|
+
406:
|
|
50
|
+
description: Not acceptable
|
|
51
|
+
"""
|
|
52
|
+
return Response(json.dumps(list_heartbeats(issuer=request.environ.get('issuer'), vo=request.environ.get('vo')), cls=APIEncoder), content_type='application/json')
|
|
53
|
+
|
|
54
|
+
def post(self):
|
|
55
|
+
"""
|
|
56
|
+
---
|
|
57
|
+
summary: Create
|
|
58
|
+
tags:
|
|
59
|
+
- Heartbeat
|
|
60
|
+
requestBody:
|
|
61
|
+
content:
|
|
62
|
+
'application/json':
|
|
63
|
+
schema:
|
|
64
|
+
type: object
|
|
65
|
+
required:
|
|
66
|
+
- bytes
|
|
67
|
+
properties:
|
|
68
|
+
executable:
|
|
69
|
+
description: Name of the executable.
|
|
70
|
+
type: string
|
|
71
|
+
hostname:
|
|
72
|
+
description: Name of the host.
|
|
73
|
+
type: string
|
|
74
|
+
pid:
|
|
75
|
+
description: UNIX Process ID as a number, e.g., 1234.
|
|
76
|
+
type: integer
|
|
77
|
+
older_than:
|
|
78
|
+
description: Ignore specified heartbeats older than specified nr of seconds.
|
|
79
|
+
type: integer
|
|
80
|
+
payload:
|
|
81
|
+
description: Payload identifier which can be further used to identify the work a certain thread is executing.
|
|
82
|
+
type: string
|
|
83
|
+
responses:
|
|
84
|
+
200:
|
|
85
|
+
description: OK
|
|
86
|
+
400:
|
|
87
|
+
description: Cannot decode json parameter list.
|
|
88
|
+
401:
|
|
89
|
+
description: Invalid Auth Token
|
|
90
|
+
404:
|
|
91
|
+
description: Key not found.
|
|
92
|
+
"""
|
|
93
|
+
parameters = json_parameters()
|
|
94
|
+
try:
|
|
95
|
+
create_heartbeat(
|
|
96
|
+
executable=param_get(parameters, 'executable'),
|
|
97
|
+
hostname=param_get(parameters, 'hostname'),
|
|
98
|
+
pid=param_get(parameters, 'pid'),
|
|
99
|
+
older_than=param_get(parameters, 'older_than', default=None),
|
|
100
|
+
payload=param_get(parameters, 'payload', default=None),
|
|
101
|
+
issuer=request.environ.get('issuer'),
|
|
102
|
+
vo=request.environ.get('vo'),
|
|
103
|
+
)
|
|
104
|
+
except (UnsupportedValueType, UnsupportedKeyType) as error:
|
|
105
|
+
return generate_http_error_flask(400, error)
|
|
106
|
+
except AccessDenied as error:
|
|
107
|
+
return generate_http_error_flask(401, error)
|
|
108
|
+
except KeyNotFound as error:
|
|
109
|
+
return generate_http_error_flask(404, error)
|
|
110
|
+
return 'OK', 200
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def blueprint():
|
|
114
|
+
bp = AuthenticatedBlueprint('heartbeats', __name__, url_prefix='/heartbeats')
|
|
115
|
+
|
|
116
|
+
heartbeat_view = Heartbeat.as_view('heartbeat')
|
|
117
|
+
bp.add_url_rule('', view_func=heartbeat_view, methods=['get', 'post'])
|
|
118
|
+
|
|
119
|
+
bp.after_request(response_headers)
|
|
120
|
+
return bp
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def make_doc():
|
|
124
|
+
""" Only used for sphinx documentation """
|
|
125
|
+
doc_app = Flask(__name__)
|
|
126
|
+
doc_app.register_blueprint(blueprint())
|
|
127
|
+
return doc_app
|
|
@@ -0,0 +1,285 @@
|
|
|
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, request
|
|
16
|
+
|
|
17
|
+
from rucio.gateway.identity import add_account_identity, add_identity, list_accounts_for_identity
|
|
18
|
+
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
19
|
+
from rucio.web.rest.flaskapi.v1.common import ErrorHandlingMethodView, check_accept_header_wrapper_flask, generate_http_error_flask, response_headers
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class UserPass(ErrorHandlingMethodView):
|
|
23
|
+
""" Manage a username/password identity for an account. """
|
|
24
|
+
|
|
25
|
+
def put(self, account):
|
|
26
|
+
"""
|
|
27
|
+
---
|
|
28
|
+
summary: Create UserPass identity
|
|
29
|
+
description: Creates a new UserPass identity and maps it to an account.
|
|
30
|
+
tags:
|
|
31
|
+
- Identity
|
|
32
|
+
parameters:
|
|
33
|
+
- name: account
|
|
34
|
+
in: path
|
|
35
|
+
description: The account for the identity.
|
|
36
|
+
schema:
|
|
37
|
+
type: string
|
|
38
|
+
style: simple
|
|
39
|
+
- name: X-Rucio-Username
|
|
40
|
+
in: query
|
|
41
|
+
description: Username for the identity.
|
|
42
|
+
schema:
|
|
43
|
+
type: string
|
|
44
|
+
style: simple
|
|
45
|
+
required: true
|
|
46
|
+
- name: X-Rucio-Password
|
|
47
|
+
in: query
|
|
48
|
+
description: The password for the identity.
|
|
49
|
+
schema:
|
|
50
|
+
type: string
|
|
51
|
+
style: simple
|
|
52
|
+
required: true
|
|
53
|
+
- name: X-Rucio-Email
|
|
54
|
+
in: query
|
|
55
|
+
description: The email for the identity.
|
|
56
|
+
schema:
|
|
57
|
+
type: string
|
|
58
|
+
style: simple
|
|
59
|
+
required: false
|
|
60
|
+
responses:
|
|
61
|
+
201:
|
|
62
|
+
description: OK
|
|
63
|
+
content:
|
|
64
|
+
application/json:
|
|
65
|
+
schema:
|
|
66
|
+
type: string
|
|
67
|
+
enum: ['Created']
|
|
68
|
+
401:
|
|
69
|
+
description: Invalid Auth Token
|
|
70
|
+
400:
|
|
71
|
+
description: Missing username or password.
|
|
72
|
+
"""
|
|
73
|
+
username = request.headers.get('X-Rucio-Username', default=None)
|
|
74
|
+
password = request.headers.get('X-Rucio-Password', default=None)
|
|
75
|
+
email = request.headers.get('X-Rucio-Email', default=None)
|
|
76
|
+
|
|
77
|
+
if not username or not password or not email:
|
|
78
|
+
return generate_http_error_flask(400, ValueError.__name__, 'Username, Email and Password must be set.')
|
|
79
|
+
|
|
80
|
+
issuer = request.environ.get('issuer')
|
|
81
|
+
vo = request.environ.get('vo')
|
|
82
|
+
|
|
83
|
+
if not issuer or not vo:
|
|
84
|
+
return generate_http_error_flask(400, ValueError.__name__, 'Issuer and VO must be set.')
|
|
85
|
+
|
|
86
|
+
add_identity(username, 'userpass', email, password)
|
|
87
|
+
|
|
88
|
+
add_account_identity(
|
|
89
|
+
identity_key=username,
|
|
90
|
+
id_type='userpass',
|
|
91
|
+
account=account,
|
|
92
|
+
email=email,
|
|
93
|
+
password=password,
|
|
94
|
+
issuer=issuer,
|
|
95
|
+
vo=vo,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return 'Created', 201
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class X509(ErrorHandlingMethodView):
|
|
102
|
+
""" Manage an x509 identity for an account. """
|
|
103
|
+
|
|
104
|
+
def put(self, account):
|
|
105
|
+
"""
|
|
106
|
+
---
|
|
107
|
+
summary: Create X509 identity
|
|
108
|
+
description: Creates a new X509 identity and maps it to an account.
|
|
109
|
+
tags:
|
|
110
|
+
- Identity
|
|
111
|
+
parameters:
|
|
112
|
+
- name: account
|
|
113
|
+
in: path
|
|
114
|
+
description: The account for the identity.
|
|
115
|
+
schema:
|
|
116
|
+
type: string
|
|
117
|
+
style: simple
|
|
118
|
+
- name: X-Rucio-Email
|
|
119
|
+
in: query
|
|
120
|
+
description: The email for the identity.
|
|
121
|
+
schema:
|
|
122
|
+
type: string
|
|
123
|
+
style: simple
|
|
124
|
+
required: false
|
|
125
|
+
responses:
|
|
126
|
+
201:
|
|
127
|
+
description: OK
|
|
128
|
+
content:
|
|
129
|
+
application/json:
|
|
130
|
+
schema:
|
|
131
|
+
type: string
|
|
132
|
+
enum: ['Created']
|
|
133
|
+
401:
|
|
134
|
+
description: Invalid Auth Token
|
|
135
|
+
"""
|
|
136
|
+
dn = request.environ.get('SSL_CLIENT_S_DN')
|
|
137
|
+
email = request.headers.get('X-Rucio-Email', default=None)
|
|
138
|
+
|
|
139
|
+
if not dn or not email:
|
|
140
|
+
return generate_http_error_flask(400, ValueError.__name__, 'SSL_CLIENT_S_DN and email must be set.')
|
|
141
|
+
|
|
142
|
+
issuer = request.environ.get('issuer')
|
|
143
|
+
vo = request.environ.get('vo')
|
|
144
|
+
|
|
145
|
+
if not issuer or not vo:
|
|
146
|
+
return generate_http_error_flask(400, ValueError.__name__, 'Issuer and VO must be set.')
|
|
147
|
+
|
|
148
|
+
add_identity(dn, 'x509', email=email)
|
|
149
|
+
add_account_identity(
|
|
150
|
+
identity_key=dn,
|
|
151
|
+
id_type='x509',
|
|
152
|
+
account=account,
|
|
153
|
+
email=email,
|
|
154
|
+
issuer=issuer,
|
|
155
|
+
vo=vo,
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
return 'Created', 201
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class GSS(ErrorHandlingMethodView):
|
|
162
|
+
""" Manage a GSS identity for an account. """
|
|
163
|
+
|
|
164
|
+
def put(self, account):
|
|
165
|
+
"""
|
|
166
|
+
---
|
|
167
|
+
summary: Create GSS identity
|
|
168
|
+
description: Creates a new GSS identity and maps it to an account.
|
|
169
|
+
tags:
|
|
170
|
+
- Identity
|
|
171
|
+
parameters:
|
|
172
|
+
- name: account
|
|
173
|
+
in: path
|
|
174
|
+
description: The account for the identity.
|
|
175
|
+
schema:
|
|
176
|
+
type: string
|
|
177
|
+
style: simple
|
|
178
|
+
- name: X-Rucio-Email
|
|
179
|
+
in: query
|
|
180
|
+
description: The email for the identity.
|
|
181
|
+
schema:
|
|
182
|
+
type: string
|
|
183
|
+
style: simple
|
|
184
|
+
required: false
|
|
185
|
+
responses:
|
|
186
|
+
201:
|
|
187
|
+
description: OK
|
|
188
|
+
content:
|
|
189
|
+
application/json:
|
|
190
|
+
schema:
|
|
191
|
+
type: string
|
|
192
|
+
enum: ['Created']
|
|
193
|
+
401:
|
|
194
|
+
description: Invalid Auth Token
|
|
195
|
+
"""
|
|
196
|
+
gsscred = request.environ.get('REMOTE_USER')
|
|
197
|
+
email = request.headers.get('X-Rucio-Email', default=None)
|
|
198
|
+
|
|
199
|
+
if not gsscred or not email:
|
|
200
|
+
return generate_http_error_flask(400, ValueError.__name__, 'REMOTE_USER and email must be set.')
|
|
201
|
+
|
|
202
|
+
issuer = request.environ.get('issuer')
|
|
203
|
+
vo = request.environ.get('vo')
|
|
204
|
+
|
|
205
|
+
if not issuer or not vo:
|
|
206
|
+
return generate_http_error_flask(400, ValueError.__name__, 'Issuer and VO must be set.')
|
|
207
|
+
|
|
208
|
+
add_identity(gsscred, 'gss', email=email)
|
|
209
|
+
add_account_identity(
|
|
210
|
+
identity_key=gsscred,
|
|
211
|
+
id_type='gss',
|
|
212
|
+
account=account,
|
|
213
|
+
email=email,
|
|
214
|
+
issuer=issuer,
|
|
215
|
+
vo=vo,
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
return 'Created', 201
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class Accounts(ErrorHandlingMethodView):
|
|
222
|
+
""" Retrieve list of accounts mapped to an identity. """
|
|
223
|
+
|
|
224
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
225
|
+
def get(self, identity_key, type_):
|
|
226
|
+
"""
|
|
227
|
+
---
|
|
228
|
+
summary: List
|
|
229
|
+
description: List all identities mapped to an account.
|
|
230
|
+
tags:
|
|
231
|
+
- Identity
|
|
232
|
+
parameters:
|
|
233
|
+
- name: identity_key
|
|
234
|
+
in: path
|
|
235
|
+
description: Identity string.
|
|
236
|
+
schema:
|
|
237
|
+
type: string
|
|
238
|
+
style: simple
|
|
239
|
+
- name: type
|
|
240
|
+
in: path
|
|
241
|
+
description: Identity type.
|
|
242
|
+
schema:
|
|
243
|
+
type: string
|
|
244
|
+
style: simple
|
|
245
|
+
required: false
|
|
246
|
+
responses:
|
|
247
|
+
200:
|
|
248
|
+
description: OK
|
|
249
|
+
content:
|
|
250
|
+
application/json:
|
|
251
|
+
schema:
|
|
252
|
+
type: array
|
|
253
|
+
items:
|
|
254
|
+
type: object
|
|
255
|
+
description: Account for the identity.
|
|
256
|
+
401:
|
|
257
|
+
description: Invalid Auth Token
|
|
258
|
+
401:
|
|
259
|
+
description: Not acceptable
|
|
260
|
+
"""
|
|
261
|
+
accounts = list_accounts_for_identity(identity_key, type_)
|
|
262
|
+
return jsonify(accounts)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def blueprint():
|
|
266
|
+
bp = AuthenticatedBlueprint('identities', __name__, url_prefix='/identities')
|
|
267
|
+
|
|
268
|
+
userpass_view = UserPass.as_view('userpass')
|
|
269
|
+
bp.add_url_rule('/<account>/userpass', view_func=userpass_view, methods=['put', ])
|
|
270
|
+
x509_view = X509.as_view('x509')
|
|
271
|
+
bp.add_url_rule('/<account>/x509', view_func=x509_view, methods=['put', ])
|
|
272
|
+
gss_view = GSS.as_view('gss')
|
|
273
|
+
bp.add_url_rule('/<account>/gss', view_func=gss_view, methods=['put', ])
|
|
274
|
+
accounts_view = Accounts.as_view('accounts')
|
|
275
|
+
bp.add_url_rule('/<identity_key>/<type>/accounts', view_func=accounts_view, methods=['get', ])
|
|
276
|
+
|
|
277
|
+
bp.after_request(response_headers)
|
|
278
|
+
return bp
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def make_doc():
|
|
282
|
+
""" Only used for sphinx documentation """
|
|
283
|
+
doc_app = Flask(__name__)
|
|
284
|
+
doc_app.register_blueprint(blueprint())
|
|
285
|
+
return doc_app
|