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,358 @@
|
|
|
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 RSENotFound
|
|
18
|
+
from rucio.common.utils import render_json
|
|
19
|
+
from rucio.gateway.lock import get_dataset_locks, get_dataset_locks_bulk, get_dataset_locks_by_rse
|
|
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_parse, parse_scope_name, response_headers, try_stream
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class LockByRSE(ErrorHandlingMethodView):
|
|
25
|
+
""" REST APIs for dataset locks. """
|
|
26
|
+
|
|
27
|
+
@check_accept_header_wrapper_flask(['application/x-json-stream'])
|
|
28
|
+
def get(self, rse):
|
|
29
|
+
"""
|
|
30
|
+
---
|
|
31
|
+
summary: Get locks by rse
|
|
32
|
+
description: Get all dataset locks for an associated rse.
|
|
33
|
+
tags:
|
|
34
|
+
- Lock
|
|
35
|
+
parameters:
|
|
36
|
+
- name: rse
|
|
37
|
+
in: path
|
|
38
|
+
description: The rse name.
|
|
39
|
+
schema:
|
|
40
|
+
type: string
|
|
41
|
+
style: simple
|
|
42
|
+
requestBody:
|
|
43
|
+
content:
|
|
44
|
+
application/json:
|
|
45
|
+
schema:
|
|
46
|
+
type: object
|
|
47
|
+
properties:
|
|
48
|
+
did_type:
|
|
49
|
+
description: The did type to filter for.
|
|
50
|
+
type: string
|
|
51
|
+
enum: ['dataset']
|
|
52
|
+
responses:
|
|
53
|
+
200:
|
|
54
|
+
description: OK
|
|
55
|
+
content:
|
|
56
|
+
application/x-json-stream:
|
|
57
|
+
schema:
|
|
58
|
+
description: Locks associated with the rse.
|
|
59
|
+
type: array
|
|
60
|
+
items:
|
|
61
|
+
description: A lock
|
|
62
|
+
type: object
|
|
63
|
+
properties:
|
|
64
|
+
rse_id:
|
|
65
|
+
description: The id of the associated rse.
|
|
66
|
+
type: string
|
|
67
|
+
rse:
|
|
68
|
+
description: The name of the associated rse.
|
|
69
|
+
type: string
|
|
70
|
+
scope:
|
|
71
|
+
description: The scope of the associated rse.
|
|
72
|
+
type: string
|
|
73
|
+
name:
|
|
74
|
+
description: The name of the rule.
|
|
75
|
+
type: string
|
|
76
|
+
rule_id:
|
|
77
|
+
description: The id of the rule.
|
|
78
|
+
type: string
|
|
79
|
+
account:
|
|
80
|
+
description: The associated account.
|
|
81
|
+
type: string
|
|
82
|
+
state:
|
|
83
|
+
description: The state of the rule.
|
|
84
|
+
type: string
|
|
85
|
+
enum: ['R', 'O', 'S']
|
|
86
|
+
length:
|
|
87
|
+
description: The length of the rule.
|
|
88
|
+
type: integer
|
|
89
|
+
bytes:
|
|
90
|
+
description: The bytes limit for the lock.
|
|
91
|
+
type: integer
|
|
92
|
+
accessed_at:
|
|
93
|
+
description: The last time is was accessed.
|
|
94
|
+
type: string
|
|
95
|
+
401:
|
|
96
|
+
description: Invalid Auth Token
|
|
97
|
+
500:
|
|
98
|
+
description: Wrong did type
|
|
99
|
+
content:
|
|
100
|
+
application/json:
|
|
101
|
+
schema:
|
|
102
|
+
type: string
|
|
103
|
+
enum: ['wrong did_type specified']
|
|
104
|
+
406:
|
|
105
|
+
description: Not acceptable
|
|
106
|
+
"""
|
|
107
|
+
did_type = request.args.get('did_type', default=None)
|
|
108
|
+
if did_type != 'dataset':
|
|
109
|
+
return 'Wrong did_type specified', 500
|
|
110
|
+
|
|
111
|
+
try:
|
|
112
|
+
def generate(vo):
|
|
113
|
+
for lock in get_dataset_locks_by_rse(rse, vo=vo):
|
|
114
|
+
yield render_json(**lock) + '\n'
|
|
115
|
+
|
|
116
|
+
return try_stream(generate(vo=request.environ.get('vo')))
|
|
117
|
+
except RSENotFound as error:
|
|
118
|
+
return generate_http_error_flask(404, error)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class LocksByScopeName(ErrorHandlingMethodView):
|
|
122
|
+
""" REST APIs for dataset locks. """
|
|
123
|
+
|
|
124
|
+
@check_accept_header_wrapper_flask(['application/x-json-stream'])
|
|
125
|
+
def get(self, scope_name):
|
|
126
|
+
"""
|
|
127
|
+
---
|
|
128
|
+
summary: Get locks by scope
|
|
129
|
+
description: Get all dataset locks for an associated rse.
|
|
130
|
+
tags:
|
|
131
|
+
- Lock
|
|
132
|
+
parameters:
|
|
133
|
+
- name: scope_name
|
|
134
|
+
in: path
|
|
135
|
+
description: The scope name.
|
|
136
|
+
schema:
|
|
137
|
+
type: string
|
|
138
|
+
style: simple
|
|
139
|
+
requestBody:
|
|
140
|
+
content:
|
|
141
|
+
application/json:
|
|
142
|
+
schema:
|
|
143
|
+
type: object
|
|
144
|
+
properties:
|
|
145
|
+
did_type:
|
|
146
|
+
description: The did type to filter for.
|
|
147
|
+
type: string
|
|
148
|
+
enum: ['dataset']
|
|
149
|
+
responses:
|
|
150
|
+
200:
|
|
151
|
+
description: OK
|
|
152
|
+
content:
|
|
153
|
+
application/x-json-stream:
|
|
154
|
+
schema:
|
|
155
|
+
description: Locks associated with the rse.
|
|
156
|
+
type: array
|
|
157
|
+
items:
|
|
158
|
+
description: A lock
|
|
159
|
+
type: object
|
|
160
|
+
properties:
|
|
161
|
+
rse_id:
|
|
162
|
+
description: The id of the associated rse.
|
|
163
|
+
type: string
|
|
164
|
+
rse:
|
|
165
|
+
description: The name of the associated rse.
|
|
166
|
+
type: string
|
|
167
|
+
scope:
|
|
168
|
+
description: The scope of the associated rse.
|
|
169
|
+
type: string
|
|
170
|
+
name:
|
|
171
|
+
description: The name of the rule.
|
|
172
|
+
type: string
|
|
173
|
+
rule_id:
|
|
174
|
+
description: The id of the rule.
|
|
175
|
+
type: string
|
|
176
|
+
account:
|
|
177
|
+
description: The associated account.
|
|
178
|
+
type: string
|
|
179
|
+
state:
|
|
180
|
+
description: The state of the rule.
|
|
181
|
+
type: string
|
|
182
|
+
enum: ['R', 'O', 'S']
|
|
183
|
+
length:
|
|
184
|
+
description: The length of the rule.
|
|
185
|
+
type: integer
|
|
186
|
+
bytes:
|
|
187
|
+
description: The bytes limit for the lock.
|
|
188
|
+
type: integer
|
|
189
|
+
accessed_at:
|
|
190
|
+
description: The last time is was accessed.
|
|
191
|
+
type: string
|
|
192
|
+
401:
|
|
193
|
+
description: Invalid Auth Token
|
|
194
|
+
500:
|
|
195
|
+
description: Wrong did type
|
|
196
|
+
content:
|
|
197
|
+
application/json:
|
|
198
|
+
schema:
|
|
199
|
+
type: string
|
|
200
|
+
enum: ['wrong did_type specified']
|
|
201
|
+
406:
|
|
202
|
+
description: Not acceptable
|
|
203
|
+
"""
|
|
204
|
+
did_type = request.args.get('did_type', default=None)
|
|
205
|
+
if did_type != 'dataset':
|
|
206
|
+
return 'Wrong did_type specified', 500
|
|
207
|
+
|
|
208
|
+
try:
|
|
209
|
+
scope, name = parse_scope_name(scope_name, request.environ.get('vo'))
|
|
210
|
+
|
|
211
|
+
def generate(vo):
|
|
212
|
+
for lock in get_dataset_locks(scope, name, vo=vo):
|
|
213
|
+
yield render_json(**lock) + '\n'
|
|
214
|
+
|
|
215
|
+
return try_stream(generate(vo=request.environ.get('vo')))
|
|
216
|
+
except ValueError as error:
|
|
217
|
+
return generate_http_error_flask(400, error)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class DatasetLocksForDids(ErrorHandlingMethodView):
|
|
221
|
+
""" REST APIs for multiple dataset locks. """
|
|
222
|
+
|
|
223
|
+
@check_accept_header_wrapper_flask(['application/x-json-stream'])
|
|
224
|
+
def post(self):
|
|
225
|
+
""" get locks for a given scope, name.
|
|
226
|
+
|
|
227
|
+
:resheader Content-Type: application/x-json-stream
|
|
228
|
+
:status 200: OK.
|
|
229
|
+
:status 400: Wrong DID type.
|
|
230
|
+
:returns: Line separated list of dictionary with lock information.
|
|
231
|
+
---
|
|
232
|
+
summary: Get locks by dids
|
|
233
|
+
description: Get all dataset locks for the associated dids.
|
|
234
|
+
tags:
|
|
235
|
+
- Lock
|
|
236
|
+
requestBody:
|
|
237
|
+
content:
|
|
238
|
+
application/json:
|
|
239
|
+
schema:
|
|
240
|
+
type: object
|
|
241
|
+
properties:
|
|
242
|
+
dids:
|
|
243
|
+
description: The dids associated with the locks.
|
|
244
|
+
type: array
|
|
245
|
+
items:
|
|
246
|
+
type: object
|
|
247
|
+
description: A did
|
|
248
|
+
required:
|
|
249
|
+
- scope
|
|
250
|
+
- name
|
|
251
|
+
properties:
|
|
252
|
+
scope:
|
|
253
|
+
description: The scope of the did.
|
|
254
|
+
type: string
|
|
255
|
+
name:
|
|
256
|
+
description: The name of the did.
|
|
257
|
+
type: string
|
|
258
|
+
type:
|
|
259
|
+
description: The type of the did.
|
|
260
|
+
type: string
|
|
261
|
+
enum: ['dataset', 'container']
|
|
262
|
+
responses:
|
|
263
|
+
200:
|
|
264
|
+
description: OK
|
|
265
|
+
content:
|
|
266
|
+
application/x-json-stream:
|
|
267
|
+
schema:
|
|
268
|
+
description: Locks associated with the rse.
|
|
269
|
+
type: array
|
|
270
|
+
items:
|
|
271
|
+
description: A lock
|
|
272
|
+
type: object
|
|
273
|
+
properties:
|
|
274
|
+
rse_id:
|
|
275
|
+
description: The id of the associated rse.
|
|
276
|
+
type: string
|
|
277
|
+
rse:
|
|
278
|
+
description: The name of the associated rse.
|
|
279
|
+
type: string
|
|
280
|
+
scope:
|
|
281
|
+
description: The scope of the associated rse.
|
|
282
|
+
type: string
|
|
283
|
+
name:
|
|
284
|
+
description: The name of the rule.
|
|
285
|
+
type: string
|
|
286
|
+
rule_id:
|
|
287
|
+
description: The id of the rule.
|
|
288
|
+
type: string
|
|
289
|
+
account:
|
|
290
|
+
description: The associated account.
|
|
291
|
+
type: string
|
|
292
|
+
state:
|
|
293
|
+
description: The state of the rule.
|
|
294
|
+
type: string
|
|
295
|
+
enum: ['R', 'O', 'S']
|
|
296
|
+
length:
|
|
297
|
+
description: The length of the rule.
|
|
298
|
+
type: integer
|
|
299
|
+
bytes:
|
|
300
|
+
description: The bytes limit for the lock.
|
|
301
|
+
type: integer
|
|
302
|
+
accessed_at:
|
|
303
|
+
description: The last time is was accessed.
|
|
304
|
+
type: string
|
|
305
|
+
401:
|
|
306
|
+
description: Invalid Auth Token
|
|
307
|
+
400:
|
|
308
|
+
description: Wrong did type
|
|
309
|
+
content:
|
|
310
|
+
application/json:
|
|
311
|
+
schema:
|
|
312
|
+
type: string
|
|
313
|
+
enum: ['Can not find the list of DIDs in the data. Use "dids" keyword.']
|
|
314
|
+
406:
|
|
315
|
+
description: Not acceptable
|
|
316
|
+
|
|
317
|
+
"""
|
|
318
|
+
|
|
319
|
+
data = json_parse(types=(dict,))
|
|
320
|
+
try:
|
|
321
|
+
dids = data["dids"]
|
|
322
|
+
except KeyError:
|
|
323
|
+
return 'Can not find the list of DIDs in the data. Use "dids" keyword.', 400
|
|
324
|
+
vo = request.environ.get('vo')
|
|
325
|
+
try:
|
|
326
|
+
locks = get_dataset_locks_bulk(dids, vo) # removes duplicates
|
|
327
|
+
|
|
328
|
+
def generate(locks):
|
|
329
|
+
for lock in locks:
|
|
330
|
+
lock["scope"] = str(lock["scope"])
|
|
331
|
+
yield render_json(**lock) + '\n'
|
|
332
|
+
return try_stream(generate(locks))
|
|
333
|
+
|
|
334
|
+
except ValueError as error:
|
|
335
|
+
return generate_http_error_flask(400, error)
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def blueprint():
|
|
339
|
+
bp = AuthenticatedBlueprint('locks', __name__, url_prefix='/locks')
|
|
340
|
+
|
|
341
|
+
lock_by_rse_view = LockByRSE.as_view('lock_by_rse')
|
|
342
|
+
bp.add_url_rule('/<rse>', view_func=lock_by_rse_view, methods=['get', ])
|
|
343
|
+
|
|
344
|
+
lock_by_scope_name_view = LocksByScopeName.as_view('locks_by_scope_name')
|
|
345
|
+
bp.add_url_rule('/<path:scope_name>', view_func=lock_by_scope_name_view, methods=['get', ])
|
|
346
|
+
|
|
347
|
+
locks_for_dids_view = DatasetLocksForDids.as_view('locks_for_dids')
|
|
348
|
+
bp.add_url_rule('/bulk_locks_for_dids', view_func=locks_for_dids_view, methods=['post', ])
|
|
349
|
+
|
|
350
|
+
bp.after_request(response_headers)
|
|
351
|
+
return bp
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def make_doc():
|
|
355
|
+
""" Only used for sphinx documentation """
|
|
356
|
+
doc_app = Flask(__name__)
|
|
357
|
+
doc_app.register_blueprint(blueprint())
|
|
358
|
+
return doc_app
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import importlib
|
|
17
|
+
import logging
|
|
18
|
+
|
|
19
|
+
from flask import Flask
|
|
20
|
+
|
|
21
|
+
from rucio.common.config import config_get
|
|
22
|
+
from rucio.common.exception import ConfigurationError
|
|
23
|
+
from rucio.common.logging import setup_logging
|
|
24
|
+
from rucio.web.rest.flaskapi.v1.common import CORSMiddleware
|
|
25
|
+
|
|
26
|
+
DEFAULT_ENDPOINTS = [
|
|
27
|
+
'accountlimits',
|
|
28
|
+
'accounts',
|
|
29
|
+
'auth',
|
|
30
|
+
'config',
|
|
31
|
+
'credentials',
|
|
32
|
+
'dids',
|
|
33
|
+
'dirac',
|
|
34
|
+
'export',
|
|
35
|
+
'heartbeats',
|
|
36
|
+
'identities',
|
|
37
|
+
'import',
|
|
38
|
+
'lifetime_exceptions',
|
|
39
|
+
'locks',
|
|
40
|
+
'meta_conventions',
|
|
41
|
+
'ping',
|
|
42
|
+
'redirect',
|
|
43
|
+
'replicas',
|
|
44
|
+
'requests',
|
|
45
|
+
'rses',
|
|
46
|
+
'rules',
|
|
47
|
+
'scopes',
|
|
48
|
+
'subscriptions',
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def apply_endpoints(app, modules):
|
|
53
|
+
for blueprint_module in modules:
|
|
54
|
+
# Legacy patch - TODO Remove in 38.0.0
|
|
55
|
+
if blueprint_module == "meta":
|
|
56
|
+
logging.log(logging.WARNING, "Endpoint `meta` is depreciated and will be removed in future releases")
|
|
57
|
+
blueprint_module = "meta_conventions"
|
|
58
|
+
try:
|
|
59
|
+
# searches for module names locally
|
|
60
|
+
blueprint_module = importlib.import_module('.' + blueprint_module,
|
|
61
|
+
package='rucio.web.rest.flaskapi.v1')
|
|
62
|
+
except ImportError:
|
|
63
|
+
raise ConfigurationError(f'Could not load "{blueprint_module}" provided in the endpoints configuration value')
|
|
64
|
+
|
|
65
|
+
if hasattr(blueprint_module, 'blueprint'):
|
|
66
|
+
app.register_blueprint(blueprint_module.blueprint())
|
|
67
|
+
|
|
68
|
+
if hasattr(blueprint_module, "blueprint_legacy"):
|
|
69
|
+
app.register_blueprint(blueprint_module.blueprint_legacy())
|
|
70
|
+
|
|
71
|
+
else:
|
|
72
|
+
raise ConfigurationError(f'"{blueprint_module}" from the endpoints configuration value did not have a blueprint')
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
endpoints = config_get('api', 'endpoints', raise_exception=False, default='')
|
|
77
|
+
endpoints = list(filter(bool, map(str.strip, endpoints.split(sep=','))))
|
|
78
|
+
except RuntimeError:
|
|
79
|
+
endpoints = None
|
|
80
|
+
|
|
81
|
+
if not endpoints:
|
|
82
|
+
endpoints = DEFAULT_ENDPOINTS
|
|
83
|
+
|
|
84
|
+
application = Flask(__name__)
|
|
85
|
+
application.wsgi_app = CORSMiddleware(application.wsgi_app)
|
|
86
|
+
apply_endpoints(application, endpoints)
|
|
87
|
+
setup_logging(application)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if __name__ == '__main__':
|
|
91
|
+
application.run()
|
|
@@ -0,0 +1,241 @@
|
|
|
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.common.exception import Duplicate, InvalidValueForKey, KeyNotFound, UnsupportedKeyType, UnsupportedValueType
|
|
18
|
+
from rucio.gateway.meta_conventions import add_key, add_value, list_keys, list_values
|
|
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, generate_http_error_flask, json_parameters, param_get, response_headers
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class MetaConventions(ErrorHandlingMethodView):
|
|
24
|
+
""" REST APIs for managing data identifier attribute metadata key formats. """
|
|
25
|
+
|
|
26
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
27
|
+
def get(self):
|
|
28
|
+
"""
|
|
29
|
+
---
|
|
30
|
+
summary: List all data identifier keys.
|
|
31
|
+
tags:
|
|
32
|
+
- Meta
|
|
33
|
+
responses:
|
|
34
|
+
200:
|
|
35
|
+
description: OK
|
|
36
|
+
content:
|
|
37
|
+
application/json:
|
|
38
|
+
schema:
|
|
39
|
+
type: array
|
|
40
|
+
description: List of all DID keys.
|
|
41
|
+
items:
|
|
42
|
+
type: string
|
|
43
|
+
description: Data Itentifier key
|
|
44
|
+
401:
|
|
45
|
+
description: Invalid Auth Token
|
|
46
|
+
406:
|
|
47
|
+
description: Not acceptable
|
|
48
|
+
"""
|
|
49
|
+
return jsonify(list_keys())
|
|
50
|
+
|
|
51
|
+
def post(self, key):
|
|
52
|
+
"""
|
|
53
|
+
---
|
|
54
|
+
summary: Create key
|
|
55
|
+
description: Creates a new allowed key (value is NULL).
|
|
56
|
+
tags:
|
|
57
|
+
- Meta
|
|
58
|
+
parameters:
|
|
59
|
+
- name: key
|
|
60
|
+
in: path
|
|
61
|
+
description: The name of the key.
|
|
62
|
+
schema:
|
|
63
|
+
type: string
|
|
64
|
+
style: simple
|
|
65
|
+
requestBody:
|
|
66
|
+
content:
|
|
67
|
+
application/json:
|
|
68
|
+
schema:
|
|
69
|
+
type: object
|
|
70
|
+
properties:
|
|
71
|
+
key_type:
|
|
72
|
+
description: The key type.
|
|
73
|
+
type: string
|
|
74
|
+
value_type:
|
|
75
|
+
description: The value type.
|
|
76
|
+
type: string
|
|
77
|
+
value_regexp:
|
|
78
|
+
description: The value regexpression.
|
|
79
|
+
type: string
|
|
80
|
+
responses:
|
|
81
|
+
201:
|
|
82
|
+
description: OK
|
|
83
|
+
content:
|
|
84
|
+
application/json:
|
|
85
|
+
schema:
|
|
86
|
+
type: string
|
|
87
|
+
enum: ['Created']
|
|
88
|
+
400:
|
|
89
|
+
description: Cannot decode json parameter list / Unsupported value type.
|
|
90
|
+
401:
|
|
91
|
+
description: Invalid Auth Token.
|
|
92
|
+
409:
|
|
93
|
+
description: Key already exists.
|
|
94
|
+
"""
|
|
95
|
+
parameters = json_parameters()
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
add_key(
|
|
99
|
+
key=key,
|
|
100
|
+
key_type=param_get(parameters, 'key_type', default=None),
|
|
101
|
+
value_type=param_get(parameters, 'value_type', default=None),
|
|
102
|
+
value_regexp=param_get(parameters, 'value_regexp', default=None),
|
|
103
|
+
issuer=request.environ.get('issuer'),
|
|
104
|
+
vo=request.environ.get('vo'),
|
|
105
|
+
)
|
|
106
|
+
except Duplicate as error:
|
|
107
|
+
return generate_http_error_flask(409, error)
|
|
108
|
+
except (UnsupportedValueType, UnsupportedKeyType) as error:
|
|
109
|
+
return generate_http_error_flask(400, error)
|
|
110
|
+
|
|
111
|
+
return 'Created', 201
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class Values(ErrorHandlingMethodView):
|
|
115
|
+
""" REST APIs for data identifier attribute values. """
|
|
116
|
+
|
|
117
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
118
|
+
def get(self, key):
|
|
119
|
+
"""
|
|
120
|
+
---
|
|
121
|
+
summary: Get value for key
|
|
122
|
+
description: List all values for a key.
|
|
123
|
+
tags:
|
|
124
|
+
- Meta
|
|
125
|
+
parameters:
|
|
126
|
+
- name: key
|
|
127
|
+
in: path
|
|
128
|
+
description: The reference key.
|
|
129
|
+
schema:
|
|
130
|
+
type: string
|
|
131
|
+
style: simple
|
|
132
|
+
responses:
|
|
133
|
+
200:
|
|
134
|
+
description: OK
|
|
135
|
+
content:
|
|
136
|
+
application/json:
|
|
137
|
+
schema:
|
|
138
|
+
description: List of all key values.
|
|
139
|
+
type: array
|
|
140
|
+
items:
|
|
141
|
+
type: string
|
|
142
|
+
description: A value associated with a key.
|
|
143
|
+
401:
|
|
144
|
+
description: Invalid Auth Token
|
|
145
|
+
406:
|
|
146
|
+
description: Not acceptable
|
|
147
|
+
"""
|
|
148
|
+
return jsonify(list_values(key=key))
|
|
149
|
+
|
|
150
|
+
def post(self, key):
|
|
151
|
+
"""
|
|
152
|
+
---
|
|
153
|
+
summary: Create value for key
|
|
154
|
+
description: Creates a new value for a key.
|
|
155
|
+
tags:
|
|
156
|
+
- Meta
|
|
157
|
+
parameters:
|
|
158
|
+
- name: key
|
|
159
|
+
in: path
|
|
160
|
+
description: The reference key.
|
|
161
|
+
schema:
|
|
162
|
+
type: string
|
|
163
|
+
style: simple
|
|
164
|
+
requestBody:
|
|
165
|
+
content:
|
|
166
|
+
application/json:
|
|
167
|
+
schema:
|
|
168
|
+
type: object
|
|
169
|
+
required:
|
|
170
|
+
- value
|
|
171
|
+
properties:
|
|
172
|
+
value:
|
|
173
|
+
description: The new value associated with a key.
|
|
174
|
+
type: string
|
|
175
|
+
responses:
|
|
176
|
+
201:
|
|
177
|
+
description: OK
|
|
178
|
+
content:
|
|
179
|
+
application/json:
|
|
180
|
+
schema:
|
|
181
|
+
type: string
|
|
182
|
+
enum: ['Created']
|
|
183
|
+
400:
|
|
184
|
+
description: Cannot decode json parameter list / Invalid value for key.
|
|
185
|
+
401:
|
|
186
|
+
description: Invalid Auth Token
|
|
187
|
+
404:
|
|
188
|
+
description: Key not found
|
|
189
|
+
409:
|
|
190
|
+
description: Value already exists.
|
|
191
|
+
"""
|
|
192
|
+
parameters = json_parameters()
|
|
193
|
+
value = param_get(parameters, 'value')
|
|
194
|
+
|
|
195
|
+
try:
|
|
196
|
+
add_value(key=key, value=value, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
|
|
197
|
+
except Duplicate as error:
|
|
198
|
+
return generate_http_error_flask(409, error)
|
|
199
|
+
except InvalidValueForKey as error:
|
|
200
|
+
return generate_http_error_flask(400, error)
|
|
201
|
+
except KeyNotFound as error:
|
|
202
|
+
return generate_http_error_flask(404, error)
|
|
203
|
+
|
|
204
|
+
return 'Created', 201
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def blueprint():
|
|
208
|
+
bp = AuthenticatedBlueprint('meta_conventions', __name__, url_prefix='/meta_conventions')
|
|
209
|
+
|
|
210
|
+
meta_view = MetaConventions.as_view('meta_conventions')
|
|
211
|
+
bp.add_url_rule('/', view_func=meta_view, methods=['get', ])
|
|
212
|
+
bp.add_url_rule('/<key>', view_func=meta_view, methods=['post', ])
|
|
213
|
+
values_view = Values.as_view('values')
|
|
214
|
+
bp.add_url_rule('/<key>/', view_func=values_view, methods=['get', 'post'])
|
|
215
|
+
|
|
216
|
+
bp.after_request(response_headers)
|
|
217
|
+
return bp
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def blueprint_legacy():
|
|
221
|
+
# TODO: Remove in 38.0
|
|
222
|
+
bp = AuthenticatedBlueprint('meta', __name__, url_prefix='/meta')
|
|
223
|
+
|
|
224
|
+
meta_view = MetaConventions.as_view('meta')
|
|
225
|
+
bp.add_url_rule('/', view_func=meta_view, methods=['get', ])
|
|
226
|
+
bp.add_url_rule('/<key>', view_func=meta_view, methods=['post', ])
|
|
227
|
+
values_view = Values.as_view('values')
|
|
228
|
+
bp.add_url_rule('/<key>/', view_func=values_view, methods=['get', 'post'])
|
|
229
|
+
|
|
230
|
+
bp.after_request(response_headers)
|
|
231
|
+
return bp
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def make_doc():
|
|
235
|
+
""" Only used for sphinx documentation """
|
|
236
|
+
doc_app = Flask(__name__)
|
|
237
|
+
|
|
238
|
+
doc_app.register_blueprint(blueprint())
|
|
239
|
+
doc_app.register_blueprint(blueprint_legacy())
|
|
240
|
+
|
|
241
|
+
return doc_app
|