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
rucio/api/dirac.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
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 typing import TYPE_CHECKING
|
|
17
|
+
|
|
18
|
+
from rucio.api.permission import has_permission
|
|
19
|
+
from rucio.api.scope import list_scopes
|
|
20
|
+
from rucio.common.exception import AccessDenied
|
|
21
|
+
from rucio.common.utils import extract_scope
|
|
22
|
+
from rucio.core import dirac
|
|
23
|
+
from rucio.core.rse import get_rse_id
|
|
24
|
+
from rucio.db.sqla.session import transactional_session
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from sqlalchemy.orm import Session
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@transactional_session
|
|
31
|
+
def add_files(lfns, issuer, ignore_availability, vo='def', *, session: "Session"):
|
|
32
|
+
"""
|
|
33
|
+
Bulk add files :
|
|
34
|
+
- Create the file and replica.
|
|
35
|
+
- If doesn't exist create the dataset containing the file as well as a rule on the dataset on ANY sites.
|
|
36
|
+
- Create all the ascendants of the dataset if they do not exist
|
|
37
|
+
|
|
38
|
+
:param lfns: List of lfn (dictionary {'lfn': <lfn>, 'rse': <rse>, 'bytes': <bytes>, 'adler32': <adler32>, 'guid': <guid>, 'pfn': <pfn>}
|
|
39
|
+
:param issuer: The issuer account.
|
|
40
|
+
:param ignore_availability: A boolean to ignore blocked sites.
|
|
41
|
+
:param vo: The VO to act on.
|
|
42
|
+
:param session: The database session in use.
|
|
43
|
+
|
|
44
|
+
"""
|
|
45
|
+
scopes = list_scopes(vo=vo, session=session)
|
|
46
|
+
dids = []
|
|
47
|
+
rses = {}
|
|
48
|
+
for lfn in lfns:
|
|
49
|
+
scope, name = extract_scope(lfn['lfn'], scopes)
|
|
50
|
+
dids.append({'scope': scope, 'name': name})
|
|
51
|
+
rse = lfn['rse']
|
|
52
|
+
if rse not in rses:
|
|
53
|
+
rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
54
|
+
rses[rse] = rse_id
|
|
55
|
+
lfn['rse_id'] = rses[rse]
|
|
56
|
+
|
|
57
|
+
# Check if the issuer can add dids and use skip_availabitlity
|
|
58
|
+
for rse in rses:
|
|
59
|
+
rse_id = rses[rse]
|
|
60
|
+
kwargs = {'rse': rse, 'rse_id': rse_id}
|
|
61
|
+
if not has_permission(issuer=issuer, action='add_replicas', kwargs=kwargs, vo=vo, session=session):
|
|
62
|
+
raise AccessDenied('Account %s can not add file replicas on %s for VO %s' % (issuer, rse, vo))
|
|
63
|
+
if not has_permission(issuer=issuer, action='skip_availability_check', kwargs=kwargs, vo=vo, session=session):
|
|
64
|
+
ignore_availability = False
|
|
65
|
+
|
|
66
|
+
# Check if the issuer can add the files
|
|
67
|
+
kwargs = {'issuer': issuer, 'dids': dids}
|
|
68
|
+
if not has_permission(issuer=issuer, action='add_dids', kwargs=kwargs, vo=vo, session=session):
|
|
69
|
+
raise AccessDenied('Account %s can not bulk add data identifier for VO %s' % (issuer, vo))
|
|
70
|
+
|
|
71
|
+
dirac.add_files(lfns=lfns, account=issuer, ignore_availability=ignore_availability, vo=vo, session=session)
|
rucio/api/exporter.py
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
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 typing import TYPE_CHECKING
|
|
17
|
+
|
|
18
|
+
from rucio.api import permission
|
|
19
|
+
from rucio.common import exception
|
|
20
|
+
from rucio.core import exporter
|
|
21
|
+
from rucio.core.rse import get_rse_name
|
|
22
|
+
from rucio.db.sqla.session import read_session
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from sqlalchemy.orm import Session
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@read_session
|
|
29
|
+
def export_data(issuer, distance=True, vo='def', *, session: "Session"):
|
|
30
|
+
"""
|
|
31
|
+
Export data from Rucio.
|
|
32
|
+
|
|
33
|
+
:param issuer: the issuer.
|
|
34
|
+
:param distance: To enable the reporting of distance.
|
|
35
|
+
:param vo: the VO of the issuer.
|
|
36
|
+
:param session: The database session in use.
|
|
37
|
+
"""
|
|
38
|
+
kwargs = {'issuer': issuer}
|
|
39
|
+
if not permission.has_permission(issuer=issuer, vo=vo, action='export', kwargs=kwargs, session=session):
|
|
40
|
+
raise exception.AccessDenied('Account %s can not export data' % issuer)
|
|
41
|
+
|
|
42
|
+
data = exporter.export_data(distance=distance, vo=vo, session=session)
|
|
43
|
+
rses = {}
|
|
44
|
+
distances = {}
|
|
45
|
+
|
|
46
|
+
for rse_id in data['rses']:
|
|
47
|
+
rse = data['rses'][rse_id]
|
|
48
|
+
rses[get_rse_name(rse_id=rse_id, session=session)] = rse
|
|
49
|
+
data['rses'] = rses
|
|
50
|
+
|
|
51
|
+
if distance:
|
|
52
|
+
for src_id in data['distances']:
|
|
53
|
+
dests = data['distances'][src_id]
|
|
54
|
+
src = get_rse_name(rse_id=src_id, session=session)
|
|
55
|
+
distances[src] = {}
|
|
56
|
+
for dest_id in dests:
|
|
57
|
+
dest = get_rse_name(rse_id=dest_id, session=session)
|
|
58
|
+
distances[src][dest] = dests[dest_id]
|
|
59
|
+
data['distances'] = distances
|
|
60
|
+
return data
|
rucio/api/heartbeat.py
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
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 typing import TYPE_CHECKING
|
|
17
|
+
|
|
18
|
+
from rucio.api import permission
|
|
19
|
+
from rucio.common import exception
|
|
20
|
+
from rucio.core import heartbeat
|
|
21
|
+
from rucio.db.sqla.session import read_session, transactional_session
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from sqlalchemy.orm import Session
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@read_session
|
|
28
|
+
def list_heartbeats(issuer=None, vo='def', *, session: "Session"):
|
|
29
|
+
"""
|
|
30
|
+
Return a list of tuples of all heartbeats.
|
|
31
|
+
|
|
32
|
+
:param issuer: The issuer account.
|
|
33
|
+
:param vo: the VO for the issuer.
|
|
34
|
+
:param session: The database session in use.
|
|
35
|
+
:returns: List of tuples [('Executable', 'Hostname', ...), ...]
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
kwargs = {'issuer': issuer}
|
|
39
|
+
if not permission.has_permission(issuer=issuer, vo=vo, action='list_heartbeats', kwargs=kwargs, session=session):
|
|
40
|
+
raise exception.AccessDenied('%s cannot list heartbeats' % issuer)
|
|
41
|
+
return heartbeat.list_heartbeats(session=session)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@transactional_session
|
|
45
|
+
def create_heartbeat(executable, hostname, pid, older_than, payload, thread=None, issuer=None, vo='def', *, session: "Session"):
|
|
46
|
+
"""
|
|
47
|
+
Creates a heartbeat.
|
|
48
|
+
:param issuer: The issuer account.
|
|
49
|
+
:param vo: the VO for the issuer.
|
|
50
|
+
:param executable: Executable name as a string, e.g., conveyor-submitter.
|
|
51
|
+
:param hostname: Hostname as a string, e.g., rucio-daemon-prod-01.cern.ch.
|
|
52
|
+
:param pid: UNIX Process ID as a number, e.g., 1234.
|
|
53
|
+
:param thread: Python Thread Object.
|
|
54
|
+
:param older_than: Ignore specified heartbeats older than specified nr of seconds.
|
|
55
|
+
:param payload: Payload identifier which can be further used to identify the work a certain thread is executing.
|
|
56
|
+
:param session: The database session in use.
|
|
57
|
+
|
|
58
|
+
"""
|
|
59
|
+
kwargs = {'issuer': issuer}
|
|
60
|
+
if not permission.has_permission(issuer=issuer, vo=vo, action='send_heartbeats', kwargs=kwargs, session=session):
|
|
61
|
+
raise exception.AccessDenied('%s cannot send heartbeats' % issuer)
|
|
62
|
+
heartbeat.live(executable=executable, hostname=hostname, pid=pid, thread=thread, older_than=older_than, payload=payload, session=session)
|
rucio/api/identity.py
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
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
|
+
"""
|
|
17
|
+
Interface for identity abstraction layer
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from typing import TYPE_CHECKING
|
|
21
|
+
|
|
22
|
+
from rucio.api import permission
|
|
23
|
+
from rucio.common import exception
|
|
24
|
+
from rucio.common.types import InternalAccount
|
|
25
|
+
from rucio.core import identity
|
|
26
|
+
from rucio.db.sqla.constants import IdentityType
|
|
27
|
+
from rucio.db.sqla.session import read_session, transactional_session
|
|
28
|
+
|
|
29
|
+
if TYPE_CHECKING:
|
|
30
|
+
from typing import Optional
|
|
31
|
+
from sqlalchemy.orm import Session
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@transactional_session
|
|
35
|
+
def add_identity(identity_key, id_type, email, password=None, *, session: "Session"):
|
|
36
|
+
"""
|
|
37
|
+
Creates a user identity.
|
|
38
|
+
|
|
39
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
40
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml)
|
|
41
|
+
:param email: The Email address associated with the identity.
|
|
42
|
+
:param password: If type==userpass, this sets the password.
|
|
43
|
+
:param session: The database session in use.
|
|
44
|
+
"""
|
|
45
|
+
return identity.add_identity(identity_key, IdentityType[id_type.upper()], email, password=password, session=session)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@transactional_session
|
|
49
|
+
def del_identity(identity_key, id_type, issuer, vo='def', *, session: "Session"):
|
|
50
|
+
"""
|
|
51
|
+
Deletes a user identity.
|
|
52
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
53
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
54
|
+
:param issuer: The issuer account.
|
|
55
|
+
:param vo: the VO of the issuer.
|
|
56
|
+
:param session: The database session in use.
|
|
57
|
+
"""
|
|
58
|
+
id_type = IdentityType[id_type.upper()]
|
|
59
|
+
kwargs = {'accounts': identity.list_accounts_for_identity(identity_key, id_type, session=session)}
|
|
60
|
+
if not permission.has_permission(issuer=issuer, vo=vo, action='del_identity', kwargs=kwargs, session=session):
|
|
61
|
+
raise exception.AccessDenied('Account %s can not delete identity' % (issuer))
|
|
62
|
+
|
|
63
|
+
return identity.del_identity(identity_key, id_type, session=session)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@transactional_session
|
|
67
|
+
def add_account_identity(identity_key, id_type, account, email, issuer, default=False, password=None, vo='def', *, session: "Session"):
|
|
68
|
+
"""
|
|
69
|
+
Adds a membership association between identity and account.
|
|
70
|
+
|
|
71
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
72
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
73
|
+
:param account: The account name.
|
|
74
|
+
:param email: The Email address associated with the identity.
|
|
75
|
+
:param issuer: The issuer account.
|
|
76
|
+
:param default: If True, the account should be used by default with the provided identity.
|
|
77
|
+
:param password: Password if id_type is userpass.
|
|
78
|
+
:param vo: the VO to act on.
|
|
79
|
+
:param session: The database session in use.
|
|
80
|
+
"""
|
|
81
|
+
kwargs = {'identity': identity_key, 'type': id_type, 'account': account}
|
|
82
|
+
if not permission.has_permission(issuer=issuer, vo=vo, action='add_account_identity', kwargs=kwargs, session=session):
|
|
83
|
+
raise exception.AccessDenied('Account %s can not add account identity' % (issuer))
|
|
84
|
+
|
|
85
|
+
account = InternalAccount(account, vo=vo)
|
|
86
|
+
|
|
87
|
+
return identity.add_account_identity(identity=identity_key, type_=IdentityType[id_type.upper()], default=default,
|
|
88
|
+
email=email, account=account, password=password, session=session)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@read_session
|
|
92
|
+
def verify_identity(identity_key: str, id_type: str, password: "Optional[str]" = None, *, session: "Session") -> bool:
|
|
93
|
+
"""
|
|
94
|
+
Verifies a user identity.
|
|
95
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
96
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml)
|
|
97
|
+
:param password: If type==userpass, verifies the identity_key, .
|
|
98
|
+
:param session: The database session in use.
|
|
99
|
+
"""
|
|
100
|
+
return identity.verify_identity(identity_key, IdentityType[id_type.upper()], password=password, session=session)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@transactional_session
|
|
104
|
+
def del_account_identity(identity_key, id_type, account, issuer, vo='def', *, session: "Session"):
|
|
105
|
+
"""
|
|
106
|
+
Removes a membership association between identity and account.
|
|
107
|
+
|
|
108
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
109
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
110
|
+
:param account: The account name.
|
|
111
|
+
:param issuer: The issuer account.
|
|
112
|
+
:param vo: the VO to act on.
|
|
113
|
+
:param session: The database session in use.
|
|
114
|
+
"""
|
|
115
|
+
kwargs = {'account': account}
|
|
116
|
+
if not permission.has_permission(issuer=issuer, vo=vo, action='del_account_identity', kwargs=kwargs, session=session):
|
|
117
|
+
raise exception.AccessDenied('Account %s can not delete account identity' % (issuer))
|
|
118
|
+
|
|
119
|
+
account = InternalAccount(account, vo=vo)
|
|
120
|
+
|
|
121
|
+
return identity.del_account_identity(identity_key, IdentityType[id_type.upper()], account, session=session)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@read_session
|
|
125
|
+
def list_identities(*, session: "Session", **kwargs):
|
|
126
|
+
"""
|
|
127
|
+
Returns a list of all enabled identities.
|
|
128
|
+
|
|
129
|
+
:param session: The database session in use.
|
|
130
|
+
returns: A list of all enabled identities.
|
|
131
|
+
"""
|
|
132
|
+
return identity.list_identities(session=session, **kwargs)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@read_session
|
|
136
|
+
def get_default_account(identity_key, id_type, *, session: "Session"):
|
|
137
|
+
"""
|
|
138
|
+
Returns the default account for this identity.
|
|
139
|
+
|
|
140
|
+
:param identity_key: The identity key name. For example x509 DN, or a username.
|
|
141
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
142
|
+
:param session: The database session in use.
|
|
143
|
+
"""
|
|
144
|
+
account = identity.get_default_account(identity_key, IdentityType[id_type.upper()], session=session)
|
|
145
|
+
return account.external
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
@read_session
|
|
149
|
+
def list_accounts_for_identity(identity_key, id_type, *, session: "Session"):
|
|
150
|
+
"""
|
|
151
|
+
Returns a list of all accounts for an identity.
|
|
152
|
+
|
|
153
|
+
:param identity: The identity key name. For example x509 DN, or a username.
|
|
154
|
+
:param id_type: The type of the authentication (x509, gss, userpass, ssh, saml).
|
|
155
|
+
:param session: The database session in use.
|
|
156
|
+
|
|
157
|
+
returns: A list of all accounts for the identity.
|
|
158
|
+
"""
|
|
159
|
+
accounts = identity.list_accounts_for_identity(identity_key, IdentityType[id_type.upper()], session=session)
|
|
160
|
+
return [account.external for account in accounts]
|
rucio/api/importer.py
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
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 typing import TYPE_CHECKING
|
|
17
|
+
|
|
18
|
+
from rucio.api import permission
|
|
19
|
+
from rucio.common import exception
|
|
20
|
+
from rucio.common.schema import validate_schema
|
|
21
|
+
from rucio.common.types import InternalAccount
|
|
22
|
+
from rucio.core import importer
|
|
23
|
+
from rucio.db.sqla.session import transactional_session
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from sqlalchemy.orm import Session
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@transactional_session
|
|
30
|
+
def import_data(data, issuer, vo='def', *, session: "Session"):
|
|
31
|
+
"""
|
|
32
|
+
Import data to add/update/delete records in Rucio.
|
|
33
|
+
|
|
34
|
+
:param data: data to be imported.
|
|
35
|
+
:param issuer: the issuer.
|
|
36
|
+
:param vo: the VO of the issuer.
|
|
37
|
+
:param session: The database session in use.
|
|
38
|
+
"""
|
|
39
|
+
kwargs = {'issuer': issuer}
|
|
40
|
+
validate_schema(name='import', obj=data, vo=vo)
|
|
41
|
+
if not permission.has_permission(issuer=issuer, vo=vo, action='import', kwargs=kwargs, session=session):
|
|
42
|
+
raise exception.AccessDenied('Account %s can not import data' % issuer)
|
|
43
|
+
|
|
44
|
+
for account in data.get('accounts', []):
|
|
45
|
+
account['account'] = InternalAccount(account['account'], vo=vo)
|
|
46
|
+
return importer.import_data(data, vo=vo, session=session)
|
|
@@ -0,0 +1,95 @@
|
|
|
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 typing import TYPE_CHECKING
|
|
17
|
+
|
|
18
|
+
from rucio.api import permission
|
|
19
|
+
from rucio.common import exception
|
|
20
|
+
from rucio.common.types import InternalAccount, InternalScope
|
|
21
|
+
from rucio.common.utils import api_update_return_dict
|
|
22
|
+
from rucio.core import lifetime_exception
|
|
23
|
+
from rucio.db.sqla.session import stream_session, transactional_session
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from sqlalchemy.orm import Session
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@stream_session
|
|
30
|
+
def list_exceptions(exception_id=None, states=None, vo='def', *, session: "Session"):
|
|
31
|
+
"""
|
|
32
|
+
List exceptions to Lifetime Model.
|
|
33
|
+
|
|
34
|
+
:param id: The id of the exception
|
|
35
|
+
:param states: The states to filter
|
|
36
|
+
:param vo: The VO to act on
|
|
37
|
+
:param session: The database session in use.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
exceptions = lifetime_exception.list_exceptions(exception_id=exception_id, states=states, session=session)
|
|
41
|
+
for e in exceptions:
|
|
42
|
+
if vo == e['scope'].vo:
|
|
43
|
+
yield api_update_return_dict(e, session=session)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@transactional_session
|
|
47
|
+
def add_exception(dids, account, pattern, comments, expires_at, vo='def', *, session: "Session"):
|
|
48
|
+
"""
|
|
49
|
+
Add exceptions to Lifetime Model.
|
|
50
|
+
|
|
51
|
+
:param dids: The list of dids
|
|
52
|
+
:param account: The account of the requester.
|
|
53
|
+
:param pattern: The account.
|
|
54
|
+
:param comments: The comments associated to the exception.
|
|
55
|
+
:param expires_at: The expiration date of the exception.
|
|
56
|
+
:param vo: The VO to act on.
|
|
57
|
+
:param session: The database session in use.
|
|
58
|
+
|
|
59
|
+
returns: The id of the exception.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
account = InternalAccount(account, vo=vo)
|
|
63
|
+
for did in dids:
|
|
64
|
+
did['scope'] = InternalScope(did['scope'], vo=vo)
|
|
65
|
+
exceptions = lifetime_exception.add_exception(dids=dids, account=account, pattern=pattern, comments=comments, expires_at=expires_at, session=session)
|
|
66
|
+
|
|
67
|
+
for key in exceptions:
|
|
68
|
+
if key == 'exceptions':
|
|
69
|
+
for reqid in exceptions[key]:
|
|
70
|
+
for did in exceptions[key][reqid]:
|
|
71
|
+
did['scope'] = did['scope'].external
|
|
72
|
+
did['did_type'] = did['did_type'].name
|
|
73
|
+
else:
|
|
74
|
+
for did in exceptions[key]:
|
|
75
|
+
did['scope'] = did['scope'].external
|
|
76
|
+
did['did_type'] = did['did_type'].name
|
|
77
|
+
|
|
78
|
+
return exceptions
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@transactional_session
|
|
82
|
+
def update_exception(exception_id, state, issuer, vo='def', *, session: "Session"):
|
|
83
|
+
"""
|
|
84
|
+
Update exceptions state to Lifetime Model.
|
|
85
|
+
|
|
86
|
+
:param id: The id of the exception.
|
|
87
|
+
:param state: The states to filter.
|
|
88
|
+
:param issuer: The issuer account.
|
|
89
|
+
:param vo: The VO to act on.
|
|
90
|
+
:param session: The database session in use.
|
|
91
|
+
"""
|
|
92
|
+
kwargs = {'exception_id': exception_id, 'vo': vo}
|
|
93
|
+
if not permission.has_permission(issuer=issuer, vo=vo, action='update_lifetime_exceptions', kwargs=kwargs, session=session):
|
|
94
|
+
raise exception.AccessDenied('Account %s can not update lifetime exceptions' % (issuer))
|
|
95
|
+
return lifetime_exception.update_exception(exception_id=exception_id, state=state, session=session)
|
rucio/api/lock.py
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
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 logging
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
18
|
+
|
|
19
|
+
from rucio.common.types import InternalScope
|
|
20
|
+
from rucio.common.utils import api_update_return_dict
|
|
21
|
+
from rucio.core import lock
|
|
22
|
+
from rucio.core.rse import get_rse_id
|
|
23
|
+
from rucio.db.sqla.constants import DIDType
|
|
24
|
+
from rucio.db.sqla.session import stream_session
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from sqlalchemy.orm import Session
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
LOGGER = logging.getLogger('lock')
|
|
31
|
+
LOGGER.setLevel(logging.DEBUG)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@stream_session
|
|
35
|
+
def get_dataset_locks(scope, name, vo='def', *, session: "Session"):
|
|
36
|
+
"""
|
|
37
|
+
Get the dataset locks of a dataset.
|
|
38
|
+
|
|
39
|
+
:param scope: Scope of the dataset.
|
|
40
|
+
:param name: Name of the dataset.
|
|
41
|
+
:param vo: The VO to act on.
|
|
42
|
+
:param session: The database session in use.
|
|
43
|
+
:return: List of dicts {'rse_id': ..., 'state': ...}
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
scope = InternalScope(scope, vo=vo)
|
|
47
|
+
|
|
48
|
+
locks = lock.get_dataset_locks(scope=scope, name=name, session=session)
|
|
49
|
+
|
|
50
|
+
for lock_object in locks:
|
|
51
|
+
yield api_update_return_dict(lock_object, session=session)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@stream_session
|
|
55
|
+
def get_dataset_locks_bulk(dids, vo='def', *, session: "Session"):
|
|
56
|
+
"""
|
|
57
|
+
Get the dataset locks for multiple datasets or containers.
|
|
58
|
+
|
|
59
|
+
:param dids: List of dataset or container DIDs as dictionaries {"scope":..., "name":..., "type":...}
|
|
60
|
+
"type" is optional. If present, will be either DIDType.DATASET or DIDType.CONTAINER,
|
|
61
|
+
or string "dataset" or "container"
|
|
62
|
+
:param vo: The VO to act on.
|
|
63
|
+
:param session: The database session in use.
|
|
64
|
+
:return: Generator of dicts describing found locks {'rse_id': ..., 'state': ...}. Duplicates are removed
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
if vo is None:
|
|
68
|
+
vo = "def"
|
|
69
|
+
|
|
70
|
+
dids_converted = []
|
|
71
|
+
for did_in in dids:
|
|
72
|
+
did = did_in.copy()
|
|
73
|
+
if isinstance(did.get("type"), str):
|
|
74
|
+
# convert DID type
|
|
75
|
+
try:
|
|
76
|
+
did["type"] = {
|
|
77
|
+
"dataset": DIDType.DATASET,
|
|
78
|
+
"container": DIDType.CONTAINER
|
|
79
|
+
}[did["type"]]
|
|
80
|
+
except KeyError:
|
|
81
|
+
raise ValueError("Unknown DID type %(type)s" % did)
|
|
82
|
+
if isinstance(did["scope"], str):
|
|
83
|
+
did["scope"] = InternalScope(did["scope"], vo=vo)
|
|
84
|
+
dids_converted.append(did)
|
|
85
|
+
|
|
86
|
+
seen = set()
|
|
87
|
+
for lock_info in lock.get_dataset_locks_bulk(dids_converted, session=session):
|
|
88
|
+
# filter duplicates - same scope, name, rse_id, rule_id
|
|
89
|
+
scope_str = str(lock_info["scope"])
|
|
90
|
+
key = (scope_str, lock_info["name"], lock_info["rse_id"], lock_info["rule_id"])
|
|
91
|
+
if key not in seen:
|
|
92
|
+
seen.add(key)
|
|
93
|
+
yield lock_info
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@stream_session
|
|
97
|
+
def get_dataset_locks_by_rse(rse, vo='def', *, session: "Session"):
|
|
98
|
+
"""
|
|
99
|
+
Get the dataset locks of an RSE.
|
|
100
|
+
|
|
101
|
+
:param rse: RSE name.
|
|
102
|
+
:param vo: The VO to act on.
|
|
103
|
+
:param session: The database session in use.
|
|
104
|
+
:return: List of dicts {'rse_id': ..., 'state': ...}
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
108
|
+
locks = lock.get_dataset_locks_by_rse_id(rse_id=rse_id, session=session)
|
|
109
|
+
|
|
110
|
+
for lock_object in locks:
|
|
111
|
+
yield api_update_return_dict(lock_object, session=session)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@stream_session
|
|
115
|
+
def get_replica_locks_for_rule_id(rule_id, vo='def', *, session: "Session"):
|
|
116
|
+
"""
|
|
117
|
+
Get the replica locks for a rule_id.
|
|
118
|
+
|
|
119
|
+
:param rule_id: Rule ID.
|
|
120
|
+
:param vo: The VO to act on.
|
|
121
|
+
:param session: The database session in use.
|
|
122
|
+
:return: List of dicts.
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
locks = lock.get_replica_locks_for_rule_id(rule_id=rule_id, session=session)
|
|
126
|
+
|
|
127
|
+
for lock_object in locks:
|
|
128
|
+
if lock_object['scope'].vo != vo: # rule is on a different VO, so don't return any locks
|
|
129
|
+
LOGGER.debug('rule id %s is not present on VO %s' % (rule_id, vo))
|
|
130
|
+
break
|
|
131
|
+
yield api_update_return_dict(lock_object, session=session)
|