rucio 32.8.6__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 +18 -0
- rucio/alembicrevision.py +16 -0
- rucio/api/__init__.py +14 -0
- rucio/api/account.py +266 -0
- rucio/api/account_limit.py +287 -0
- rucio/api/authentication.py +302 -0
- rucio/api/config.py +218 -0
- rucio/api/credential.py +60 -0
- rucio/api/did.py +726 -0
- rucio/api/dirac.py +71 -0
- rucio/api/exporter.py +60 -0
- rucio/api/heartbeat.py +62 -0
- rucio/api/identity.py +160 -0
- rucio/api/importer.py +46 -0
- rucio/api/lifetime_exception.py +95 -0
- rucio/api/lock.py +131 -0
- rucio/api/meta.py +85 -0
- rucio/api/permission.py +72 -0
- rucio/api/quarantined_replica.py +69 -0
- rucio/api/replica.py +528 -0
- rucio/api/request.py +220 -0
- rucio/api/rse.py +601 -0
- rucio/api/rule.py +335 -0
- rucio/api/scope.py +89 -0
- rucio/api/subscription.py +255 -0
- rucio/api/temporary_did.py +49 -0
- rucio/api/vo.py +112 -0
- rucio/client/__init__.py +16 -0
- rucio/client/accountclient.py +413 -0
- rucio/client/accountlimitclient.py +155 -0
- rucio/client/baseclient.py +929 -0
- rucio/client/client.py +77 -0
- rucio/client/configclient.py +113 -0
- rucio/client/credentialclient.py +54 -0
- rucio/client/didclient.py +691 -0
- rucio/client/diracclient.py +48 -0
- rucio/client/downloadclient.py +1674 -0
- rucio/client/exportclient.py +44 -0
- rucio/client/fileclient.py +51 -0
- rucio/client/importclient.py +42 -0
- rucio/client/lifetimeclient.py +74 -0
- rucio/client/lockclient.py +99 -0
- rucio/client/metaclient.py +137 -0
- rucio/client/pingclient.py +45 -0
- rucio/client/replicaclient.py +444 -0
- rucio/client/requestclient.py +109 -0
- rucio/client/rseclient.py +664 -0
- rucio/client/ruleclient.py +287 -0
- rucio/client/scopeclient.py +88 -0
- rucio/client/subscriptionclient.py +161 -0
- rucio/client/touchclient.py +78 -0
- rucio/client/uploadclient.py +871 -0
- rucio/common/__init__.py +14 -0
- rucio/common/cache.py +74 -0
- rucio/common/config.py +796 -0
- rucio/common/constants.py +92 -0
- rucio/common/constraints.py +18 -0
- rucio/common/didtype.py +187 -0
- rucio/common/dumper/__init__.py +306 -0
- rucio/common/dumper/consistency.py +449 -0
- rucio/common/dumper/data_models.py +325 -0
- rucio/common/dumper/path_parsing.py +65 -0
- rucio/common/exception.py +1092 -0
- rucio/common/extra.py +37 -0
- rucio/common/logging.py +404 -0
- rucio/common/pcache.py +1387 -0
- rucio/common/policy.py +84 -0
- rucio/common/schema/__init__.py +143 -0
- rucio/common/schema/atlas.py +411 -0
- rucio/common/schema/belleii.py +406 -0
- rucio/common/schema/cms.py +478 -0
- rucio/common/schema/domatpc.py +399 -0
- rucio/common/schema/escape.py +424 -0
- rucio/common/schema/generic.py +431 -0
- rucio/common/schema/generic_multi_vo.py +410 -0
- rucio/common/schema/icecube.py +404 -0
- rucio/common/schema/lsst.py +423 -0
- rucio/common/stomp_utils.py +160 -0
- rucio/common/stopwatch.py +56 -0
- rucio/common/test_rucio_server.py +148 -0
- rucio/common/types.py +158 -0
- rucio/common/utils.py +1946 -0
- rucio/core/__init__.py +14 -0
- rucio/core/account.py +426 -0
- rucio/core/account_counter.py +171 -0
- rucio/core/account_limit.py +357 -0
- rucio/core/authentication.py +563 -0
- rucio/core/config.py +386 -0
- rucio/core/credential.py +218 -0
- rucio/core/did.py +3102 -0
- rucio/core/did_meta_plugins/__init__.py +250 -0
- rucio/core/did_meta_plugins/did_column_meta.py +326 -0
- rucio/core/did_meta_plugins/did_meta_plugin_interface.py +116 -0
- rucio/core/did_meta_plugins/filter_engine.py +573 -0
- rucio/core/did_meta_plugins/json_meta.py +215 -0
- rucio/core/did_meta_plugins/mongo_meta.py +199 -0
- rucio/core/did_meta_plugins/postgres_meta.py +317 -0
- rucio/core/dirac.py +208 -0
- rucio/core/distance.py +164 -0
- rucio/core/exporter.py +59 -0
- rucio/core/heartbeat.py +263 -0
- rucio/core/identity.py +290 -0
- rucio/core/importer.py +248 -0
- rucio/core/lifetime_exception.py +377 -0
- rucio/core/lock.py +474 -0
- rucio/core/message.py +241 -0
- rucio/core/meta.py +190 -0
- rucio/core/monitor.py +441 -0
- rucio/core/naming_convention.py +154 -0
- rucio/core/nongrid_trace.py +124 -0
- rucio/core/oidc.py +1339 -0
- rucio/core/permission/__init__.py +107 -0
- rucio/core/permission/atlas.py +1333 -0
- rucio/core/permission/belleii.py +1076 -0
- rucio/core/permission/cms.py +1166 -0
- rucio/core/permission/escape.py +1076 -0
- rucio/core/permission/generic.py +1128 -0
- rucio/core/permission/generic_multi_vo.py +1148 -0
- rucio/core/quarantined_replica.py +190 -0
- rucio/core/replica.py +3627 -0
- rucio/core/replica_sorter.py +368 -0
- rucio/core/request.py +2241 -0
- rucio/core/rse.py +1835 -0
- rucio/core/rse_counter.py +155 -0
- rucio/core/rse_expression_parser.py +460 -0
- rucio/core/rse_selector.py +277 -0
- rucio/core/rule.py +3419 -0
- rucio/core/rule_grouping.py +1473 -0
- rucio/core/scope.py +152 -0
- rucio/core/subscription.py +316 -0
- rucio/core/temporary_did.py +188 -0
- rucio/core/topology.py +448 -0
- rucio/core/trace.py +361 -0
- rucio/core/transfer.py +1233 -0
- rucio/core/vo.py +151 -0
- rucio/core/volatile_replica.py +123 -0
- rucio/daemons/__init__.py +14 -0
- rucio/daemons/abacus/__init__.py +14 -0
- rucio/daemons/abacus/account.py +106 -0
- rucio/daemons/abacus/collection_replica.py +113 -0
- rucio/daemons/abacus/rse.py +107 -0
- rucio/daemons/atropos/__init__.py +14 -0
- rucio/daemons/atropos/atropos.py +243 -0
- rucio/daemons/auditor/__init__.py +261 -0
- rucio/daemons/auditor/hdfs.py +86 -0
- rucio/daemons/auditor/srmdumps.py +284 -0
- rucio/daemons/automatix/__init__.py +14 -0
- rucio/daemons/automatix/automatix.py +281 -0
- rucio/daemons/badreplicas/__init__.py +14 -0
- rucio/daemons/badreplicas/minos.py +311 -0
- rucio/daemons/badreplicas/minos_temporary_expiration.py +173 -0
- rucio/daemons/badreplicas/necromancer.py +200 -0
- rucio/daemons/bb8/__init__.py +14 -0
- rucio/daemons/bb8/bb8.py +356 -0
- rucio/daemons/bb8/common.py +762 -0
- rucio/daemons/bb8/nuclei_background_rebalance.py +147 -0
- rucio/daemons/bb8/t2_background_rebalance.py +146 -0
- rucio/daemons/c3po/__init__.py +14 -0
- rucio/daemons/c3po/algorithms/__init__.py +14 -0
- rucio/daemons/c3po/algorithms/simple.py +131 -0
- rucio/daemons/c3po/algorithms/t2_free_space.py +125 -0
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +127 -0
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +279 -0
- rucio/daemons/c3po/c3po.py +342 -0
- rucio/daemons/c3po/collectors/__init__.py +14 -0
- rucio/daemons/c3po/collectors/agis.py +108 -0
- rucio/daemons/c3po/collectors/free_space.py +62 -0
- rucio/daemons/c3po/collectors/jedi_did.py +48 -0
- rucio/daemons/c3po/collectors/mock_did.py +46 -0
- rucio/daemons/c3po/collectors/network_metrics.py +63 -0
- rucio/daemons/c3po/collectors/workload.py +110 -0
- rucio/daemons/c3po/utils/__init__.py +14 -0
- rucio/daemons/c3po/utils/dataset_cache.py +40 -0
- rucio/daemons/c3po/utils/expiring_dataset_cache.py +45 -0
- rucio/daemons/c3po/utils/expiring_list.py +63 -0
- rucio/daemons/c3po/utils/popularity.py +82 -0
- rucio/daemons/c3po/utils/timeseries.py +76 -0
- rucio/daemons/cache/__init__.py +14 -0
- rucio/daemons/cache/consumer.py +191 -0
- rucio/daemons/common.py +391 -0
- rucio/daemons/conveyor/__init__.py +14 -0
- rucio/daemons/conveyor/common.py +530 -0
- rucio/daemons/conveyor/finisher.py +492 -0
- rucio/daemons/conveyor/poller.py +372 -0
- rucio/daemons/conveyor/preparer.py +198 -0
- rucio/daemons/conveyor/receiver.py +206 -0
- rucio/daemons/conveyor/stager.py +127 -0
- rucio/daemons/conveyor/submitter.py +379 -0
- rucio/daemons/conveyor/throttler.py +468 -0
- rucio/daemons/follower/__init__.py +14 -0
- rucio/daemons/follower/follower.py +97 -0
- rucio/daemons/hermes/__init__.py +14 -0
- rucio/daemons/hermes/hermes.py +738 -0
- rucio/daemons/judge/__init__.py +14 -0
- rucio/daemons/judge/cleaner.py +149 -0
- rucio/daemons/judge/evaluator.py +172 -0
- rucio/daemons/judge/injector.py +154 -0
- rucio/daemons/judge/repairer.py +144 -0
- rucio/daemons/oauthmanager/__init__.py +14 -0
- rucio/daemons/oauthmanager/oauthmanager.py +199 -0
- rucio/daemons/reaper/__init__.py +14 -0
- rucio/daemons/reaper/dark_reaper.py +272 -0
- rucio/daemons/reaper/light_reaper.py +255 -0
- rucio/daemons/reaper/reaper.py +701 -0
- rucio/daemons/replicarecoverer/__init__.py +14 -0
- rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +487 -0
- rucio/daemons/storage/__init__.py +14 -0
- rucio/daemons/storage/consistency/__init__.py +14 -0
- rucio/daemons/storage/consistency/actions.py +753 -0
- rucio/daemons/tracer/__init__.py +14 -0
- rucio/daemons/tracer/kronos.py +513 -0
- rucio/daemons/transmogrifier/__init__.py +14 -0
- rucio/daemons/transmogrifier/transmogrifier.py +753 -0
- rucio/daemons/undertaker/__init__.py +14 -0
- rucio/daemons/undertaker/undertaker.py +137 -0
- rucio/db/__init__.py +14 -0
- rucio/db/sqla/__init__.py +38 -0
- rucio/db/sqla/constants.py +192 -0
- rucio/db/sqla/migrate_repo/__init__.py +14 -0
- rucio/db/sqla/migrate_repo/env.py +111 -0
- rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +71 -0
- rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +50 -0
- rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +61 -0
- rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +46 -0
- rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +93 -0
- rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +78 -0
- rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +46 -0
- rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +53 -0
- rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +69 -0
- rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +42 -0
- rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +46 -0
- rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +61 -0
- rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +42 -0
- rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +141 -0
- rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +75 -0
- rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +75 -0
- rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +46 -0
- rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +51 -0
- rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +135 -0
- rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +65 -0
- rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +42 -0
- rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +66 -0
- rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +54 -0
- rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +43 -0
- rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +46 -0
- rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +47 -0
- rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +54 -0
- rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +39 -0
- rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +48 -0
- rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +47 -0
- rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +48 -0
- rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +59 -0
- rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +47 -0
- rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +72 -0
- rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +46 -0
- rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +48 -0
- rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +48 -0
- rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +42 -0
- rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +69 -0
- rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +46 -0
- rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +78 -0
- rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +62 -0
- rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +74 -0
- rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +44 -0
- rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +67 -0
- rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +134 -0
- rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +58 -0
- rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +79 -0
- rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +61 -0
- rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +45 -0
- rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +46 -0
- rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +65 -0
- rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +42 -0
- rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +46 -0
- rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +46 -0
- rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +80 -0
- rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +43 -0
- rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +61 -0
- rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +47 -0
- rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +46 -0
- rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +52 -0
- rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +42 -0
- rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +65 -0
- rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +46 -0
- rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +47 -0
- rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +45 -0
- rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +46 -0
- rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +48 -0
- rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +50 -0
- rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +59 -0
- rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +48 -0
- rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +108 -0
- rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +57 -0
- rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +51 -0
- rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +50 -0
- rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +46 -0
- rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +42 -0
- rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +93 -0
- rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +73 -0
- rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +52 -0
- rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +45 -0
- rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +46 -0
- rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +54 -0
- rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +48 -0
- rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +70 -0
- rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +48 -0
- rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +95 -0
- rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +74 -0
- rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +78 -0
- rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +49 -0
- rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +124 -0
- rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +60 -0
- rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +53 -0
- rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +56 -0
- rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +67 -0
- rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +50 -0
- rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +46 -0
- rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +92 -0
- rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +42 -0
- rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +46 -0
- rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +147 -0
- rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +78 -0
- rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +53 -0
- rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +74 -0
- rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +56 -0
- rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +46 -0
- rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +68 -0
- rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +48 -0
- rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +149 -0
- rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +106 -0
- rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +47 -0
- rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +45 -0
- rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +105 -0
- rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +52 -0
- rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +106 -0
- rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +30 -0
- rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +75 -0
- rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +49 -0
- rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +45 -0
- rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +38 -0
- rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +44 -0
- rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +46 -0
- rucio/db/sqla/models.py +1834 -0
- rucio/db/sqla/sautils.py +48 -0
- rucio/db/sqla/session.py +470 -0
- rucio/db/sqla/types.py +207 -0
- rucio/db/sqla/util.py +521 -0
- rucio/rse/__init__.py +97 -0
- rucio/rse/protocols/__init__.py +14 -0
- rucio/rse/protocols/cache.py +123 -0
- rucio/rse/protocols/dummy.py +112 -0
- rucio/rse/protocols/gfal.py +701 -0
- rucio/rse/protocols/globus.py +243 -0
- rucio/rse/protocols/gsiftp.py +93 -0
- rucio/rse/protocols/http_cache.py +83 -0
- rucio/rse/protocols/mock.py +124 -0
- rucio/rse/protocols/ngarc.py +210 -0
- rucio/rse/protocols/posix.py +251 -0
- rucio/rse/protocols/protocol.py +530 -0
- rucio/rse/protocols/rclone.py +365 -0
- rucio/rse/protocols/rfio.py +137 -0
- rucio/rse/protocols/srm.py +339 -0
- rucio/rse/protocols/ssh.py +414 -0
- rucio/rse/protocols/storm.py +207 -0
- rucio/rse/protocols/webdav.py +547 -0
- rucio/rse/protocols/xrootd.py +295 -0
- rucio/rse/rsemanager.py +752 -0
- rucio/tests/__init__.py +14 -0
- rucio/tests/common.py +244 -0
- rucio/tests/common_server.py +132 -0
- rucio/transfertool/__init__.py +14 -0
- rucio/transfertool/fts3.py +1484 -0
- rucio/transfertool/globus.py +200 -0
- rucio/transfertool/globus_library.py +182 -0
- rucio/transfertool/mock.py +81 -0
- rucio/transfertool/transfertool.py +212 -0
- rucio/vcsversion.py +11 -0
- rucio/version.py +46 -0
- rucio/web/__init__.py +14 -0
- rucio/web/rest/__init__.py +14 -0
- rucio/web/rest/flaskapi/__init__.py +14 -0
- rucio/web/rest/flaskapi/authenticated_bp.py +28 -0
- rucio/web/rest/flaskapi/v1/__init__.py +14 -0
- rucio/web/rest/flaskapi/v1/accountlimits.py +234 -0
- rucio/web/rest/flaskapi/v1/accounts.py +1088 -0
- rucio/web/rest/flaskapi/v1/archives.py +100 -0
- rucio/web/rest/flaskapi/v1/auth.py +1642 -0
- rucio/web/rest/flaskapi/v1/common.py +385 -0
- rucio/web/rest/flaskapi/v1/config.py +305 -0
- rucio/web/rest/flaskapi/v1/credentials.py +213 -0
- rucio/web/rest/flaskapi/v1/dids.py +2204 -0
- rucio/web/rest/flaskapi/v1/dirac.py +116 -0
- rucio/web/rest/flaskapi/v1/export.py +77 -0
- rucio/web/rest/flaskapi/v1/heartbeats.py +129 -0
- rucio/web/rest/flaskapi/v1/identities.py +263 -0
- rucio/web/rest/flaskapi/v1/import.py +133 -0
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +315 -0
- rucio/web/rest/flaskapi/v1/locks.py +360 -0
- rucio/web/rest/flaskapi/v1/main.py +83 -0
- rucio/web/rest/flaskapi/v1/meta.py +226 -0
- rucio/web/rest/flaskapi/v1/metrics.py +37 -0
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +97 -0
- rucio/web/rest/flaskapi/v1/ping.py +89 -0
- rucio/web/rest/flaskapi/v1/redirect.py +366 -0
- rucio/web/rest/flaskapi/v1/replicas.py +1866 -0
- rucio/web/rest/flaskapi/v1/requests.py +841 -0
- rucio/web/rest/flaskapi/v1/rses.py +2204 -0
- rucio/web/rest/flaskapi/v1/rules.py +824 -0
- rucio/web/rest/flaskapi/v1/scopes.py +161 -0
- rucio/web/rest/flaskapi/v1/subscriptions.py +646 -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/tmp_dids.py +115 -0
- rucio/web/rest/flaskapi/v1/traces.py +100 -0
- rucio/web/rest/flaskapi/v1/vos.py +280 -0
- rucio/web/rest/main.py +19 -0
- rucio/web/rest/metrics.py +28 -0
- rucio-32.8.6.data/data/rucio/etc/alembic.ini.template +71 -0
- rucio-32.8.6.data/data/rucio/etc/alembic_offline.ini.template +74 -0
- rucio-32.8.6.data/data/rucio/etc/globus-config.yml.template +5 -0
- rucio-32.8.6.data/data/rucio/etc/ldap.cfg.template +30 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approval_request.tmpl +38 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +4 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approved_user.tmpl +17 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +6 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_denied_user.tmpl +17 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +19 -0
- rucio-32.8.6.data/data/rucio/etc/rse-accounts.cfg.template +25 -0
- rucio-32.8.6.data/data/rucio/etc/rucio.cfg.atlas.client.template +42 -0
- rucio-32.8.6.data/data/rucio/etc/rucio.cfg.template +257 -0
- rucio-32.8.6.data/data/rucio/etc/rucio_multi_vo.cfg.template +234 -0
- rucio-32.8.6.data/data/rucio/requirements.txt +55 -0
- rucio-32.8.6.data/data/rucio/tools/bootstrap.py +34 -0
- rucio-32.8.6.data/data/rucio/tools/merge_rucio_configs.py +147 -0
- rucio-32.8.6.data/data/rucio/tools/reset_database.py +40 -0
- rucio-32.8.6.data/scripts/rucio +2540 -0
- rucio-32.8.6.data/scripts/rucio-abacus-account +75 -0
- rucio-32.8.6.data/scripts/rucio-abacus-collection-replica +47 -0
- rucio-32.8.6.data/scripts/rucio-abacus-rse +79 -0
- rucio-32.8.6.data/scripts/rucio-admin +2434 -0
- rucio-32.8.6.data/scripts/rucio-atropos +61 -0
- rucio-32.8.6.data/scripts/rucio-auditor +199 -0
- rucio-32.8.6.data/scripts/rucio-automatix +51 -0
- rucio-32.8.6.data/scripts/rucio-bb8 +58 -0
- rucio-32.8.6.data/scripts/rucio-c3po +86 -0
- rucio-32.8.6.data/scripts/rucio-cache-client +135 -0
- rucio-32.8.6.data/scripts/rucio-cache-consumer +43 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-finisher +59 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-poller +67 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-preparer +38 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-receiver +44 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-stager +77 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-submitter +140 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-throttler +105 -0
- rucio-32.8.6.data/scripts/rucio-dark-reaper +54 -0
- rucio-32.8.6.data/scripts/rucio-dumper +159 -0
- rucio-32.8.6.data/scripts/rucio-follower +45 -0
- rucio-32.8.6.data/scripts/rucio-hermes +55 -0
- rucio-32.8.6.data/scripts/rucio-judge-cleaner +90 -0
- rucio-32.8.6.data/scripts/rucio-judge-evaluator +138 -0
- rucio-32.8.6.data/scripts/rucio-judge-injector +45 -0
- rucio-32.8.6.data/scripts/rucio-judge-repairer +45 -0
- rucio-32.8.6.data/scripts/rucio-kronos +45 -0
- rucio-32.8.6.data/scripts/rucio-light-reaper +53 -0
- rucio-32.8.6.data/scripts/rucio-minos +54 -0
- rucio-32.8.6.data/scripts/rucio-minos-temporary-expiration +51 -0
- rucio-32.8.6.data/scripts/rucio-necromancer +121 -0
- rucio-32.8.6.data/scripts/rucio-oauth-manager +64 -0
- rucio-32.8.6.data/scripts/rucio-reaper +84 -0
- rucio-32.8.6.data/scripts/rucio-replica-recoverer +249 -0
- rucio-32.8.6.data/scripts/rucio-storage-consistency-actions +75 -0
- rucio-32.8.6.data/scripts/rucio-transmogrifier +78 -0
- rucio-32.8.6.data/scripts/rucio-undertaker +77 -0
- rucio-32.8.6.dist-info/METADATA +83 -0
- rucio-32.8.6.dist-info/RECORD +481 -0
- rucio-32.8.6.dist-info/WHEEL +5 -0
- rucio-32.8.6.dist-info/licenses/AUTHORS.rst +94 -0
- rucio-32.8.6.dist-info/licenses/LICENSE +201 -0
- rucio-32.8.6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
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
|
+
from flask import Flask, request
|
|
17
|
+
|
|
18
|
+
from rucio.api.dirac import add_files
|
|
19
|
+
from rucio.common.exception import AccessDenied, DataIdentifierAlreadyExists, DatabaseException, \
|
|
20
|
+
Duplicate, InvalidPath, ResourceTemporaryUnavailable, RSENotFound, UnsupportedOperation
|
|
21
|
+
from rucio.common.utils import parse_response
|
|
22
|
+
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
23
|
+
from rucio.web.rest.flaskapi.v1.common import response_headers, generate_http_error_flask, \
|
|
24
|
+
ErrorHandlingMethodView, json_parameters, param_get
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class AddFiles(ErrorHandlingMethodView):
|
|
28
|
+
|
|
29
|
+
def post(self):
|
|
30
|
+
"""
|
|
31
|
+
---
|
|
32
|
+
summary: Add files
|
|
33
|
+
description: |
|
|
34
|
+
Atomic method used by the RucioFileCatalog plugin in Dirac that:
|
|
35
|
+
- Creates files and their replicas
|
|
36
|
+
- Creates the dataset containing the files and attach the files to the dataset
|
|
37
|
+
- Creates a rule on the dataset with RSE expression ANY and grouping NONE
|
|
38
|
+
- Creates all the container hierarchy containing the dataset
|
|
39
|
+
tags:
|
|
40
|
+
- Dirac
|
|
41
|
+
requestBody:
|
|
42
|
+
content:
|
|
43
|
+
'application/json':
|
|
44
|
+
schema:
|
|
45
|
+
type: object
|
|
46
|
+
required:
|
|
47
|
+
- lfns
|
|
48
|
+
properties:
|
|
49
|
+
lfns:
|
|
50
|
+
description: "List of lfn (dictionary {'lfn': <lfn>, 'rse': <rse>, 'bytes': <bytes>, 'adler32': <adler32>, 'guid': <guid>, 'pfn': <pfn>}."
|
|
51
|
+
type: array
|
|
52
|
+
items:
|
|
53
|
+
type: object
|
|
54
|
+
ignore_availability:
|
|
55
|
+
description: If the availability should be ignored.
|
|
56
|
+
type: boolean
|
|
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
|
+
|
|
82
|
+
try:
|
|
83
|
+
add_files(lfns=lfns, issuer=request.environ.get('issuer'), ignore_availability=ignore_availability,
|
|
84
|
+
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,77 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
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
|
+
from flask import Flask, request, Response
|
|
17
|
+
|
|
18
|
+
from rucio.api.exporter import export_data
|
|
19
|
+
from rucio.common.utils import render_json
|
|
20
|
+
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
21
|
+
from rucio.web.rest.flaskapi.v1.common import response_headers, check_accept_header_wrapper_flask, \
|
|
22
|
+
ErrorHandlingMethodView
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Export(ErrorHandlingMethodView):
|
|
26
|
+
""" Export data. """
|
|
27
|
+
|
|
28
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
29
|
+
def get(self):
|
|
30
|
+
"""
|
|
31
|
+
---
|
|
32
|
+
summary: Export data
|
|
33
|
+
description: Export data from rucio.
|
|
34
|
+
tags:
|
|
35
|
+
- Export
|
|
36
|
+
parameters:
|
|
37
|
+
- name: distance
|
|
38
|
+
in: query
|
|
39
|
+
description: Should the distance be enabled?
|
|
40
|
+
schema:
|
|
41
|
+
type: boolean
|
|
42
|
+
required: false
|
|
43
|
+
responses:
|
|
44
|
+
200:
|
|
45
|
+
description: OK
|
|
46
|
+
content:
|
|
47
|
+
application/json:
|
|
48
|
+
schema:
|
|
49
|
+
type: object
|
|
50
|
+
description: Dictionary with rucio data.
|
|
51
|
+
401:
|
|
52
|
+
description: Invalid Auth Token
|
|
53
|
+
406:
|
|
54
|
+
description: Not acceptable
|
|
55
|
+
"""
|
|
56
|
+
distance = request.args.get('distance', default='True') == 'True'
|
|
57
|
+
return Response(render_json(**export_data(issuer=request.environ.get('issuer'), distance=distance, vo=request.environ.get('vo'))), content_type='application/json')
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def blueprint(with_doc=False):
|
|
61
|
+
bp = AuthenticatedBlueprint('export', __name__, url_prefix='/export')
|
|
62
|
+
|
|
63
|
+
export_view = Export.as_view('scope')
|
|
64
|
+
if not with_doc:
|
|
65
|
+
# rule without trailing slash needs to be added before rule with trailing slash
|
|
66
|
+
bp.add_url_rule('', view_func=export_view, methods=['get', ])
|
|
67
|
+
bp.add_url_rule('/', view_func=export_view, methods=['get', ])
|
|
68
|
+
|
|
69
|
+
bp.after_request(response_headers)
|
|
70
|
+
return bp
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def make_doc():
|
|
74
|
+
""" Only used for sphinx documentation to add the prefix """
|
|
75
|
+
doc_app = Flask(__name__)
|
|
76
|
+
doc_app.register_blueprint(blueprint(with_doc=True))
|
|
77
|
+
return doc_app
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
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 json
|
|
17
|
+
|
|
18
|
+
from flask import Flask, Response, request
|
|
19
|
+
|
|
20
|
+
from rucio.api.heartbeat import list_heartbeats, create_heartbeat
|
|
21
|
+
from rucio.common.exception import UnsupportedValueType, UnsupportedKeyType, KeyNotFound, AccessDenied
|
|
22
|
+
from rucio.common.utils import APIEncoder
|
|
23
|
+
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
24
|
+
from rucio.web.rest.flaskapi.v1.common import response_headers, check_accept_header_wrapper_flask, \
|
|
25
|
+
ErrorHandlingMethodView, json_parameters, param_get, generate_http_error_flask
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Heartbeat(ErrorHandlingMethodView):
|
|
29
|
+
""" REST API for Heartbeats. """
|
|
30
|
+
|
|
31
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
32
|
+
def get(self):
|
|
33
|
+
"""
|
|
34
|
+
---
|
|
35
|
+
summary: List
|
|
36
|
+
description: List all heartbeats.
|
|
37
|
+
tags:
|
|
38
|
+
- Heartbeat
|
|
39
|
+
responses:
|
|
40
|
+
200:
|
|
41
|
+
description: OK
|
|
42
|
+
content:
|
|
43
|
+
application/json:
|
|
44
|
+
schema:
|
|
45
|
+
type: array
|
|
46
|
+
items:
|
|
47
|
+
type: object
|
|
48
|
+
description: List of tuples [('Executable', 'Hostname', ...), ...]
|
|
49
|
+
401:
|
|
50
|
+
description: Invalid Auth Token
|
|
51
|
+
406:
|
|
52
|
+
description: Not acceptable
|
|
53
|
+
"""
|
|
54
|
+
return Response(json.dumps(list_heartbeats(issuer=request.environ.get('issuer'), vo=request.environ.get('vo')), cls=APIEncoder), content_type='application/json')
|
|
55
|
+
|
|
56
|
+
def post(self):
|
|
57
|
+
"""
|
|
58
|
+
---
|
|
59
|
+
summary: Create
|
|
60
|
+
tags:
|
|
61
|
+
- Heartbeat
|
|
62
|
+
requestBody:
|
|
63
|
+
content:
|
|
64
|
+
'application/json':
|
|
65
|
+
schema:
|
|
66
|
+
type: object
|
|
67
|
+
required:
|
|
68
|
+
- bytes
|
|
69
|
+
properties:
|
|
70
|
+
executable:
|
|
71
|
+
description: Name of the executable.
|
|
72
|
+
type: string
|
|
73
|
+
hostname:
|
|
74
|
+
description: Name of the host.
|
|
75
|
+
type: string
|
|
76
|
+
pid:
|
|
77
|
+
description: UNIX Process ID as a number, e.g., 1234.
|
|
78
|
+
type: integer
|
|
79
|
+
older_than:
|
|
80
|
+
description: Ignore specified heartbeats older than specified nr of seconds.
|
|
81
|
+
type: integer
|
|
82
|
+
payload:
|
|
83
|
+
description: Payload identifier which can be further used to identify the work a certain thread is executing.
|
|
84
|
+
type: string
|
|
85
|
+
responses:
|
|
86
|
+
200:
|
|
87
|
+
description: OK
|
|
88
|
+
400:
|
|
89
|
+
description: Cannot decode json parameter list.
|
|
90
|
+
401:
|
|
91
|
+
description: Invalid Auth Token
|
|
92
|
+
404:
|
|
93
|
+
description: Key not found.
|
|
94
|
+
"""
|
|
95
|
+
parameters = json_parameters()
|
|
96
|
+
try:
|
|
97
|
+
create_heartbeat(
|
|
98
|
+
executable=param_get(parameters, 'executable'),
|
|
99
|
+
hostname=param_get(parameters, 'hostname'),
|
|
100
|
+
pid=param_get(parameters, 'pid'),
|
|
101
|
+
older_than=param_get(parameters, 'older_than', default=None),
|
|
102
|
+
payload=param_get(parameters, 'payload', default=None),
|
|
103
|
+
issuer=request.environ.get('issuer'),
|
|
104
|
+
vo=request.environ.get('vo'),
|
|
105
|
+
)
|
|
106
|
+
except (UnsupportedValueType, UnsupportedKeyType) as error:
|
|
107
|
+
return generate_http_error_flask(400, error)
|
|
108
|
+
except AccessDenied as error:
|
|
109
|
+
return generate_http_error_flask(401, error)
|
|
110
|
+
except KeyNotFound as error:
|
|
111
|
+
return generate_http_error_flask(404, error)
|
|
112
|
+
return 'OK', 200
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def blueprint():
|
|
116
|
+
bp = AuthenticatedBlueprint('heartbeats', __name__, url_prefix='/heartbeats')
|
|
117
|
+
|
|
118
|
+
heartbeat_view = Heartbeat.as_view('heartbeat')
|
|
119
|
+
bp.add_url_rule('', view_func=heartbeat_view, methods=['get', 'post'])
|
|
120
|
+
|
|
121
|
+
bp.after_request(response_headers)
|
|
122
|
+
return bp
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def make_doc():
|
|
126
|
+
""" Only used for sphinx documentation """
|
|
127
|
+
doc_app = Flask(__name__)
|
|
128
|
+
doc_app.register_blueprint(blueprint())
|
|
129
|
+
return doc_app
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
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
|
+
from flask import Flask, request, jsonify
|
|
17
|
+
|
|
18
|
+
from rucio.api.identity import add_identity, add_account_identity, list_accounts_for_identity
|
|
19
|
+
from rucio.web.rest.flaskapi.authenticated_bp import AuthenticatedBlueprint
|
|
20
|
+
from rucio.web.rest.flaskapi.v1.common import response_headers, check_accept_header_wrapper_flask, \
|
|
21
|
+
ErrorHandlingMethodView
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class UserPass(ErrorHandlingMethodView):
|
|
25
|
+
""" Manage a username/password identity for an account. """
|
|
26
|
+
|
|
27
|
+
def put(self, account):
|
|
28
|
+
"""
|
|
29
|
+
---
|
|
30
|
+
summary: Create UserPass identity
|
|
31
|
+
description: Creates a new UserPass identity and maps it to an account.
|
|
32
|
+
tags:
|
|
33
|
+
- Identity
|
|
34
|
+
parameters:
|
|
35
|
+
- name: account
|
|
36
|
+
in: path
|
|
37
|
+
description: The account for the identity.
|
|
38
|
+
schema:
|
|
39
|
+
type: string
|
|
40
|
+
style: simple
|
|
41
|
+
- name: X-Rucio-Username
|
|
42
|
+
in: query
|
|
43
|
+
description: Username for the identity.
|
|
44
|
+
schema:
|
|
45
|
+
type: string
|
|
46
|
+
style: simple
|
|
47
|
+
required: true
|
|
48
|
+
- name: X-Rucio-Password
|
|
49
|
+
in: query
|
|
50
|
+
description: The password for the identity.
|
|
51
|
+
schema:
|
|
52
|
+
type: string
|
|
53
|
+
style: simple
|
|
54
|
+
required: true
|
|
55
|
+
- name: X-Rucio-Email
|
|
56
|
+
in: query
|
|
57
|
+
description: The email for the identity.
|
|
58
|
+
schema:
|
|
59
|
+
type: string
|
|
60
|
+
style: simple
|
|
61
|
+
required: false
|
|
62
|
+
responses:
|
|
63
|
+
201:
|
|
64
|
+
description: OK
|
|
65
|
+
content:
|
|
66
|
+
application/json:
|
|
67
|
+
schema:
|
|
68
|
+
type: string
|
|
69
|
+
enum: ['Created']
|
|
70
|
+
401:
|
|
71
|
+
description: Invalid Auth Token
|
|
72
|
+
400:
|
|
73
|
+
description: Missing username or password.
|
|
74
|
+
"""
|
|
75
|
+
username = request.headers.get('X-Rucio-Username', default=None)
|
|
76
|
+
password = request.headers.get('X-Rucio-Password', default=None)
|
|
77
|
+
email = request.headers.get('X-Rucio-Email', default=None)
|
|
78
|
+
|
|
79
|
+
if not username or not password:
|
|
80
|
+
return 'Username and Password must be set.', 400
|
|
81
|
+
|
|
82
|
+
add_identity(username, 'userpass', email, password)
|
|
83
|
+
|
|
84
|
+
add_account_identity(
|
|
85
|
+
identity_key=username,
|
|
86
|
+
id_type='userpass',
|
|
87
|
+
account=account,
|
|
88
|
+
email=email,
|
|
89
|
+
password=password,
|
|
90
|
+
issuer=request.environ.get('issuer'),
|
|
91
|
+
vo=request.environ.get('vo'),
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
return 'Created', 201
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class X509(ErrorHandlingMethodView):
|
|
98
|
+
""" Manage an x509 identity for an account. """
|
|
99
|
+
|
|
100
|
+
def put(self, account):
|
|
101
|
+
"""
|
|
102
|
+
---
|
|
103
|
+
summary: Create X509 identity
|
|
104
|
+
description: Creates a new X509 identity and maps it to an account.
|
|
105
|
+
tags:
|
|
106
|
+
- Identity
|
|
107
|
+
parameters:
|
|
108
|
+
- name: account
|
|
109
|
+
in: path
|
|
110
|
+
description: The account for the identity.
|
|
111
|
+
schema:
|
|
112
|
+
type: string
|
|
113
|
+
style: simple
|
|
114
|
+
- name: X-Rucio-Email
|
|
115
|
+
in: query
|
|
116
|
+
description: The email for the identity.
|
|
117
|
+
schema:
|
|
118
|
+
type: string
|
|
119
|
+
style: simple
|
|
120
|
+
required: false
|
|
121
|
+
responses:
|
|
122
|
+
201:
|
|
123
|
+
description: OK
|
|
124
|
+
content:
|
|
125
|
+
application/json:
|
|
126
|
+
schema:
|
|
127
|
+
type: string
|
|
128
|
+
enum: ['Created']
|
|
129
|
+
401:
|
|
130
|
+
description: Invalid Auth Token
|
|
131
|
+
"""
|
|
132
|
+
dn = request.environ.get('SSL_CLIENT_S_DN')
|
|
133
|
+
email = request.headers.get('X-Rucio-Email', default=None)
|
|
134
|
+
|
|
135
|
+
add_identity(dn, 'x509', email=email)
|
|
136
|
+
add_account_identity(
|
|
137
|
+
identity_key=dn,
|
|
138
|
+
id_type='x509',
|
|
139
|
+
account=account,
|
|
140
|
+
email=email,
|
|
141
|
+
issuer=request.environ.get('issuer'),
|
|
142
|
+
vo=request.environ.get('vo'),
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
return 'Created', 201
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class GSS(ErrorHandlingMethodView):
|
|
149
|
+
""" Manage a GSS identity for an account. """
|
|
150
|
+
|
|
151
|
+
def put(self, account):
|
|
152
|
+
"""
|
|
153
|
+
---
|
|
154
|
+
summary: Create GSS identity
|
|
155
|
+
description: Creates a new GSS identity and maps it to an account.
|
|
156
|
+
tags:
|
|
157
|
+
- Identity
|
|
158
|
+
parameters:
|
|
159
|
+
- name: account
|
|
160
|
+
in: path
|
|
161
|
+
description: The account for the identity.
|
|
162
|
+
schema:
|
|
163
|
+
type: string
|
|
164
|
+
style: simple
|
|
165
|
+
- name: X-Rucio-Email
|
|
166
|
+
in: query
|
|
167
|
+
description: The email for the identity.
|
|
168
|
+
schema:
|
|
169
|
+
type: string
|
|
170
|
+
style: simple
|
|
171
|
+
required: false
|
|
172
|
+
responses:
|
|
173
|
+
201:
|
|
174
|
+
description: OK
|
|
175
|
+
content:
|
|
176
|
+
application/json:
|
|
177
|
+
schema:
|
|
178
|
+
type: string
|
|
179
|
+
enum: ['Created']
|
|
180
|
+
401:
|
|
181
|
+
description: Invalid Auth Token
|
|
182
|
+
"""
|
|
183
|
+
gsscred = request.environ.get('REMOTE_USER')
|
|
184
|
+
email = request.headers.get('X-Rucio-Email', default=None)
|
|
185
|
+
|
|
186
|
+
add_identity(gsscred, 'gss', email=email)
|
|
187
|
+
add_account_identity(
|
|
188
|
+
identity_key=gsscred,
|
|
189
|
+
id_type='gss',
|
|
190
|
+
account=account,
|
|
191
|
+
email=email,
|
|
192
|
+
issuer=request.environ.get('issuer'),
|
|
193
|
+
vo=request.environ.get('vo'),
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
return 'Created', 201
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class Accounts(ErrorHandlingMethodView):
|
|
200
|
+
""" Retrieve list of accounts mapped to an identity. """
|
|
201
|
+
|
|
202
|
+
@check_accept_header_wrapper_flask(['application/json'])
|
|
203
|
+
def get(self, identity_key, type_):
|
|
204
|
+
"""
|
|
205
|
+
---
|
|
206
|
+
summary: List
|
|
207
|
+
description: List all identities mapped to an account.
|
|
208
|
+
tags:
|
|
209
|
+
- Identity
|
|
210
|
+
parameters:
|
|
211
|
+
- name: identity_key
|
|
212
|
+
in: path
|
|
213
|
+
description: Identity string.
|
|
214
|
+
schema:
|
|
215
|
+
type: string
|
|
216
|
+
style: simple
|
|
217
|
+
- name: type
|
|
218
|
+
in: path
|
|
219
|
+
description: Identity type.
|
|
220
|
+
schema:
|
|
221
|
+
type: string
|
|
222
|
+
style: simple
|
|
223
|
+
required: false
|
|
224
|
+
responses:
|
|
225
|
+
200:
|
|
226
|
+
description: OK
|
|
227
|
+
content:
|
|
228
|
+
application/json:
|
|
229
|
+
schema:
|
|
230
|
+
type: array
|
|
231
|
+
items:
|
|
232
|
+
type: object
|
|
233
|
+
description: Account for the identity.
|
|
234
|
+
401:
|
|
235
|
+
description: Invalid Auth Token
|
|
236
|
+
401:
|
|
237
|
+
description: Not acceptable
|
|
238
|
+
"""
|
|
239
|
+
accounts = list_accounts_for_identity(identity_key, type_)
|
|
240
|
+
return jsonify(accounts)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def blueprint():
|
|
244
|
+
bp = AuthenticatedBlueprint('identities', __name__, url_prefix='/identities')
|
|
245
|
+
|
|
246
|
+
userpass_view = UserPass.as_view('userpass')
|
|
247
|
+
bp.add_url_rule('/<account>/userpass', view_func=userpass_view, methods=['put', ])
|
|
248
|
+
x509_view = X509.as_view('x509')
|
|
249
|
+
bp.add_url_rule('/<account>/x509', view_func=x509_view, methods=['put', ])
|
|
250
|
+
gss_view = GSS.as_view('gss')
|
|
251
|
+
bp.add_url_rule('/<account>/gss', view_func=gss_view, methods=['put', ])
|
|
252
|
+
accounts_view = Accounts.as_view('accounts')
|
|
253
|
+
bp.add_url_rule('/<identity_key>/<type>/accounts', view_func=accounts_view, methods=['get', ])
|
|
254
|
+
|
|
255
|
+
bp.after_request(response_headers)
|
|
256
|
+
return bp
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def make_doc():
|
|
260
|
+
""" Only used for sphinx documentation """
|
|
261
|
+
doc_app = Flask(__name__)
|
|
262
|
+
doc_app.register_blueprint(blueprint())
|
|
263
|
+
return doc_app
|