rucio 37.0.0rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rucio might be problematic. Click here for more details.
- rucio/__init__.py +17 -0
- rucio/alembicrevision.py +15 -0
- rucio/cli/__init__.py +14 -0
- rucio/cli/account.py +216 -0
- rucio/cli/bin_legacy/__init__.py +13 -0
- rucio/cli/bin_legacy/rucio.py +2825 -0
- rucio/cli/bin_legacy/rucio_admin.py +2500 -0
- rucio/cli/command.py +272 -0
- rucio/cli/config.py +72 -0
- rucio/cli/did.py +191 -0
- rucio/cli/download.py +128 -0
- rucio/cli/lifetime_exception.py +33 -0
- rucio/cli/replica.py +162 -0
- rucio/cli/rse.py +293 -0
- rucio/cli/rule.py +158 -0
- rucio/cli/scope.py +40 -0
- rucio/cli/subscription.py +73 -0
- rucio/cli/upload.py +60 -0
- rucio/cli/utils.py +226 -0
- rucio/client/__init__.py +15 -0
- rucio/client/accountclient.py +432 -0
- rucio/client/accountlimitclient.py +183 -0
- rucio/client/baseclient.py +983 -0
- rucio/client/client.py +120 -0
- rucio/client/configclient.py +126 -0
- rucio/client/credentialclient.py +59 -0
- rucio/client/didclient.py +868 -0
- rucio/client/diracclient.py +56 -0
- rucio/client/downloadclient.py +1783 -0
- rucio/client/exportclient.py +44 -0
- rucio/client/fileclient.py +50 -0
- rucio/client/importclient.py +42 -0
- rucio/client/lifetimeclient.py +90 -0
- rucio/client/lockclient.py +109 -0
- rucio/client/metaconventionsclient.py +140 -0
- rucio/client/pingclient.py +44 -0
- rucio/client/replicaclient.py +452 -0
- rucio/client/requestclient.py +125 -0
- rucio/client/richclient.py +317 -0
- rucio/client/rseclient.py +746 -0
- rucio/client/ruleclient.py +294 -0
- rucio/client/scopeclient.py +90 -0
- rucio/client/subscriptionclient.py +173 -0
- rucio/client/touchclient.py +82 -0
- rucio/client/uploadclient.py +969 -0
- rucio/common/__init__.py +13 -0
- rucio/common/bittorrent.py +234 -0
- rucio/common/cache.py +111 -0
- rucio/common/checksum.py +168 -0
- rucio/common/client.py +122 -0
- rucio/common/config.py +788 -0
- rucio/common/constants.py +217 -0
- rucio/common/constraints.py +17 -0
- rucio/common/didtype.py +237 -0
- rucio/common/dumper/__init__.py +342 -0
- rucio/common/dumper/consistency.py +497 -0
- rucio/common/dumper/data_models.py +362 -0
- rucio/common/dumper/path_parsing.py +75 -0
- rucio/common/exception.py +1208 -0
- rucio/common/extra.py +31 -0
- rucio/common/logging.py +420 -0
- rucio/common/pcache.py +1409 -0
- rucio/common/plugins.py +185 -0
- rucio/common/policy.py +93 -0
- rucio/common/schema/__init__.py +200 -0
- rucio/common/schema/generic.py +416 -0
- rucio/common/schema/generic_multi_vo.py +395 -0
- rucio/common/stomp_utils.py +423 -0
- rucio/common/stopwatch.py +55 -0
- rucio/common/test_rucio_server.py +154 -0
- rucio/common/types.py +483 -0
- rucio/common/utils.py +1688 -0
- rucio/core/__init__.py +13 -0
- rucio/core/account.py +496 -0
- rucio/core/account_counter.py +236 -0
- rucio/core/account_limit.py +425 -0
- rucio/core/authentication.py +620 -0
- rucio/core/config.py +437 -0
- rucio/core/credential.py +224 -0
- rucio/core/did.py +3004 -0
- rucio/core/did_meta_plugins/__init__.py +252 -0
- rucio/core/did_meta_plugins/did_column_meta.py +331 -0
- rucio/core/did_meta_plugins/did_meta_plugin_interface.py +165 -0
- rucio/core/did_meta_plugins/elasticsearch_meta.py +407 -0
- rucio/core/did_meta_plugins/filter_engine.py +672 -0
- rucio/core/did_meta_plugins/json_meta.py +240 -0
- rucio/core/did_meta_plugins/mongo_meta.py +229 -0
- rucio/core/did_meta_plugins/postgres_meta.py +352 -0
- rucio/core/dirac.py +237 -0
- rucio/core/distance.py +187 -0
- rucio/core/exporter.py +59 -0
- rucio/core/heartbeat.py +363 -0
- rucio/core/identity.py +301 -0
- rucio/core/importer.py +260 -0
- rucio/core/lifetime_exception.py +377 -0
- rucio/core/lock.py +577 -0
- rucio/core/message.py +288 -0
- rucio/core/meta_conventions.py +203 -0
- rucio/core/monitor.py +448 -0
- rucio/core/naming_convention.py +195 -0
- rucio/core/nongrid_trace.py +136 -0
- rucio/core/oidc.py +1463 -0
- rucio/core/permission/__init__.py +161 -0
- rucio/core/permission/generic.py +1124 -0
- rucio/core/permission/generic_multi_vo.py +1144 -0
- rucio/core/quarantined_replica.py +224 -0
- rucio/core/replica.py +4483 -0
- rucio/core/replica_sorter.py +362 -0
- rucio/core/request.py +3091 -0
- rucio/core/rse.py +2079 -0
- rucio/core/rse_counter.py +185 -0
- rucio/core/rse_expression_parser.py +459 -0
- rucio/core/rse_selector.py +304 -0
- rucio/core/rule.py +4484 -0
- rucio/core/rule_grouping.py +1620 -0
- rucio/core/scope.py +181 -0
- rucio/core/subscription.py +362 -0
- rucio/core/topology.py +490 -0
- rucio/core/trace.py +375 -0
- rucio/core/transfer.py +1531 -0
- rucio/core/vo.py +169 -0
- rucio/core/volatile_replica.py +151 -0
- rucio/daemons/__init__.py +13 -0
- rucio/daemons/abacus/__init__.py +13 -0
- rucio/daemons/abacus/account.py +116 -0
- rucio/daemons/abacus/collection_replica.py +124 -0
- rucio/daemons/abacus/rse.py +117 -0
- rucio/daemons/atropos/__init__.py +13 -0
- rucio/daemons/atropos/atropos.py +242 -0
- rucio/daemons/auditor/__init__.py +289 -0
- rucio/daemons/auditor/hdfs.py +97 -0
- rucio/daemons/auditor/srmdumps.py +355 -0
- rucio/daemons/automatix/__init__.py +13 -0
- rucio/daemons/automatix/automatix.py +304 -0
- rucio/daemons/badreplicas/__init__.py +13 -0
- rucio/daemons/badreplicas/minos.py +322 -0
- rucio/daemons/badreplicas/minos_temporary_expiration.py +171 -0
- rucio/daemons/badreplicas/necromancer.py +196 -0
- rucio/daemons/bb8/__init__.py +13 -0
- rucio/daemons/bb8/bb8.py +353 -0
- rucio/daemons/bb8/common.py +759 -0
- rucio/daemons/bb8/nuclei_background_rebalance.py +153 -0
- rucio/daemons/bb8/t2_background_rebalance.py +153 -0
- rucio/daemons/cache/__init__.py +13 -0
- rucio/daemons/cache/consumer.py +133 -0
- rucio/daemons/common.py +405 -0
- rucio/daemons/conveyor/__init__.py +13 -0
- rucio/daemons/conveyor/common.py +562 -0
- rucio/daemons/conveyor/finisher.py +529 -0
- rucio/daemons/conveyor/poller.py +394 -0
- rucio/daemons/conveyor/preparer.py +205 -0
- rucio/daemons/conveyor/receiver.py +179 -0
- rucio/daemons/conveyor/stager.py +133 -0
- rucio/daemons/conveyor/submitter.py +403 -0
- rucio/daemons/conveyor/throttler.py +532 -0
- rucio/daemons/follower/__init__.py +13 -0
- rucio/daemons/follower/follower.py +101 -0
- rucio/daemons/hermes/__init__.py +13 -0
- rucio/daemons/hermes/hermes.py +534 -0
- rucio/daemons/judge/__init__.py +13 -0
- rucio/daemons/judge/cleaner.py +159 -0
- rucio/daemons/judge/evaluator.py +185 -0
- rucio/daemons/judge/injector.py +162 -0
- rucio/daemons/judge/repairer.py +154 -0
- rucio/daemons/oauthmanager/__init__.py +13 -0
- rucio/daemons/oauthmanager/oauthmanager.py +198 -0
- rucio/daemons/reaper/__init__.py +13 -0
- rucio/daemons/reaper/dark_reaper.py +282 -0
- rucio/daemons/reaper/reaper.py +739 -0
- rucio/daemons/replicarecoverer/__init__.py +13 -0
- rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +626 -0
- rucio/daemons/rsedecommissioner/__init__.py +13 -0
- rucio/daemons/rsedecommissioner/config.py +81 -0
- rucio/daemons/rsedecommissioner/profiles/__init__.py +24 -0
- rucio/daemons/rsedecommissioner/profiles/atlas.py +60 -0
- rucio/daemons/rsedecommissioner/profiles/generic.py +452 -0
- rucio/daemons/rsedecommissioner/profiles/types.py +93 -0
- rucio/daemons/rsedecommissioner/rse_decommissioner.py +280 -0
- rucio/daemons/storage/__init__.py +13 -0
- rucio/daemons/storage/consistency/__init__.py +13 -0
- rucio/daemons/storage/consistency/actions.py +848 -0
- rucio/daemons/tracer/__init__.py +13 -0
- rucio/daemons/tracer/kronos.py +511 -0
- rucio/daemons/transmogrifier/__init__.py +13 -0
- rucio/daemons/transmogrifier/transmogrifier.py +762 -0
- rucio/daemons/undertaker/__init__.py +13 -0
- rucio/daemons/undertaker/undertaker.py +137 -0
- rucio/db/__init__.py +13 -0
- rucio/db/sqla/__init__.py +52 -0
- rucio/db/sqla/constants.py +206 -0
- rucio/db/sqla/migrate_repo/__init__.py +13 -0
- rucio/db/sqla/migrate_repo/env.py +110 -0
- rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +70 -0
- rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +47 -0
- rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +59 -0
- rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +43 -0
- rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +91 -0
- rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +76 -0
- rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +43 -0
- rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +50 -0
- rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +68 -0
- rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +40 -0
- rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +45 -0
- rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +60 -0
- rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +40 -0
- rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +140 -0
- rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +73 -0
- rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +74 -0
- rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +43 -0
- rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +50 -0
- rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +134 -0
- rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +64 -0
- rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +39 -0
- rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +64 -0
- rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +51 -0
- rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +41 -0
- rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +43 -0
- rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +44 -0
- rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +53 -0
- rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +38 -0
- rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +47 -0
- rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +57 -0
- rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +69 -0
- rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +43 -0
- rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +42 -0
- rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +47 -0
- rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +46 -0
- rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +40 -0
- rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +67 -0
- rucio/db/sqla/migrate_repo/versions/30d5206e9cad_increase_oauthrequest_redirect_msg_.py +37 -0
- rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +44 -0
- rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +77 -0
- rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +60 -0
- rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +72 -0
- rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +42 -0
- rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +65 -0
- rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +133 -0
- rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +76 -0
- rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +60 -0
- rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +44 -0
- rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +43 -0
- rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +64 -0
- rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +40 -0
- rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +43 -0
- rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +44 -0
- rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +78 -0
- rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +41 -0
- rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +59 -0
- rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +44 -0
- rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +49 -0
- rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +40 -0
- rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +63 -0
- rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +43 -0
- rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +55 -0
- rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +45 -0
- rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +43 -0
- rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +43 -0
- rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +45 -0
- rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +47 -0
- rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +58 -0
- rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +45 -0
- rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +106 -0
- rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +55 -0
- rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +50 -0
- rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +47 -0
- rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +43 -0
- rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +41 -0
- rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +91 -0
- rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +72 -0
- rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +49 -0
- rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +43 -0
- rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +53 -0
- rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +45 -0
- rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +68 -0
- rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +45 -0
- rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +94 -0
- rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +54 -0
- rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +72 -0
- rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +76 -0
- rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +47 -0
- rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +121 -0
- rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +59 -0
- rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +52 -0
- rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +54 -0
- rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +64 -0
- rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +49 -0
- rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +57 -0
- rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +43 -0
- rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +41 -0
- rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +91 -0
- rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +40 -0
- rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +143 -0
- rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +76 -0
- rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +50 -0
- rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +72 -0
- rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +43 -0
- rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +65 -0
- rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +47 -0
- rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +146 -0
- rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +104 -0
- rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +44 -0
- rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +43 -0
- rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +103 -0
- rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +49 -0
- rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +104 -0
- rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +29 -0
- rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +74 -0
- rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +47 -0
- rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +43 -0
- rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +37 -0
- rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +43 -0
- rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +43 -0
- rucio/db/sqla/models.py +1743 -0
- rucio/db/sqla/sautils.py +55 -0
- rucio/db/sqla/session.py +529 -0
- rucio/db/sqla/types.py +206 -0
- rucio/db/sqla/util.py +543 -0
- rucio/gateway/__init__.py +13 -0
- rucio/gateway/account.py +345 -0
- rucio/gateway/account_limit.py +363 -0
- rucio/gateway/authentication.py +381 -0
- rucio/gateway/config.py +227 -0
- rucio/gateway/credential.py +70 -0
- rucio/gateway/did.py +987 -0
- rucio/gateway/dirac.py +83 -0
- rucio/gateway/exporter.py +60 -0
- rucio/gateway/heartbeat.py +76 -0
- rucio/gateway/identity.py +189 -0
- rucio/gateway/importer.py +46 -0
- rucio/gateway/lifetime_exception.py +121 -0
- rucio/gateway/lock.py +153 -0
- rucio/gateway/meta_conventions.py +98 -0
- rucio/gateway/permission.py +74 -0
- rucio/gateway/quarantined_replica.py +79 -0
- rucio/gateway/replica.py +538 -0
- rucio/gateway/request.py +330 -0
- rucio/gateway/rse.py +632 -0
- rucio/gateway/rule.py +437 -0
- rucio/gateway/scope.py +100 -0
- rucio/gateway/subscription.py +280 -0
- rucio/gateway/vo.py +126 -0
- rucio/rse/__init__.py +96 -0
- rucio/rse/protocols/__init__.py +13 -0
- rucio/rse/protocols/bittorrent.py +194 -0
- rucio/rse/protocols/cache.py +111 -0
- rucio/rse/protocols/dummy.py +100 -0
- rucio/rse/protocols/gfal.py +708 -0
- rucio/rse/protocols/globus.py +243 -0
- rucio/rse/protocols/http_cache.py +82 -0
- rucio/rse/protocols/mock.py +123 -0
- rucio/rse/protocols/ngarc.py +209 -0
- rucio/rse/protocols/posix.py +250 -0
- rucio/rse/protocols/protocol.py +361 -0
- rucio/rse/protocols/rclone.py +365 -0
- rucio/rse/protocols/rfio.py +145 -0
- rucio/rse/protocols/srm.py +338 -0
- rucio/rse/protocols/ssh.py +414 -0
- rucio/rse/protocols/storm.py +195 -0
- rucio/rse/protocols/webdav.py +594 -0
- rucio/rse/protocols/xrootd.py +302 -0
- rucio/rse/rsemanager.py +881 -0
- rucio/rse/translation.py +260 -0
- rucio/tests/__init__.py +13 -0
- rucio/tests/common.py +280 -0
- rucio/tests/common_server.py +149 -0
- rucio/transfertool/__init__.py +13 -0
- rucio/transfertool/bittorrent.py +200 -0
- rucio/transfertool/bittorrent_driver.py +50 -0
- rucio/transfertool/bittorrent_driver_qbittorrent.py +134 -0
- rucio/transfertool/fts3.py +1600 -0
- rucio/transfertool/fts3_plugins.py +152 -0
- rucio/transfertool/globus.py +201 -0
- rucio/transfertool/globus_library.py +181 -0
- rucio/transfertool/mock.py +89 -0
- rucio/transfertool/transfertool.py +221 -0
- rucio/vcsversion.py +11 -0
- rucio/version.py +45 -0
- rucio/web/__init__.py +13 -0
- rucio/web/rest/__init__.py +13 -0
- rucio/web/rest/flaskapi/__init__.py +13 -0
- rucio/web/rest/flaskapi/authenticated_bp.py +27 -0
- rucio/web/rest/flaskapi/v1/__init__.py +13 -0
- rucio/web/rest/flaskapi/v1/accountlimits.py +236 -0
- rucio/web/rest/flaskapi/v1/accounts.py +1103 -0
- rucio/web/rest/flaskapi/v1/archives.py +102 -0
- rucio/web/rest/flaskapi/v1/auth.py +1644 -0
- rucio/web/rest/flaskapi/v1/common.py +426 -0
- rucio/web/rest/flaskapi/v1/config.py +304 -0
- rucio/web/rest/flaskapi/v1/credentials.py +213 -0
- rucio/web/rest/flaskapi/v1/dids.py +2340 -0
- rucio/web/rest/flaskapi/v1/dirac.py +116 -0
- rucio/web/rest/flaskapi/v1/export.py +75 -0
- rucio/web/rest/flaskapi/v1/heartbeats.py +127 -0
- rucio/web/rest/flaskapi/v1/identities.py +285 -0
- rucio/web/rest/flaskapi/v1/import.py +132 -0
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +312 -0
- rucio/web/rest/flaskapi/v1/locks.py +358 -0
- rucio/web/rest/flaskapi/v1/main.py +91 -0
- rucio/web/rest/flaskapi/v1/meta_conventions.py +241 -0
- rucio/web/rest/flaskapi/v1/metrics.py +36 -0
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +97 -0
- rucio/web/rest/flaskapi/v1/ping.py +88 -0
- rucio/web/rest/flaskapi/v1/redirect.py +366 -0
- rucio/web/rest/flaskapi/v1/replicas.py +1894 -0
- rucio/web/rest/flaskapi/v1/requests.py +998 -0
- rucio/web/rest/flaskapi/v1/rses.py +2250 -0
- rucio/web/rest/flaskapi/v1/rules.py +854 -0
- rucio/web/rest/flaskapi/v1/scopes.py +159 -0
- rucio/web/rest/flaskapi/v1/subscriptions.py +650 -0
- rucio/web/rest/flaskapi/v1/templates/auth_crash.html +80 -0
- rucio/web/rest/flaskapi/v1/templates/auth_granted.html +82 -0
- rucio/web/rest/flaskapi/v1/traces.py +137 -0
- rucio/web/rest/flaskapi/v1/types.py +20 -0
- rucio/web/rest/flaskapi/v1/vos.py +278 -0
- rucio/web/rest/main.py +18 -0
- rucio/web/rest/metrics.py +27 -0
- rucio/web/rest/ping.py +27 -0
- rucio-37.0.0rc1.data/data/rucio/etc/alembic.ini.template +71 -0
- rucio-37.0.0rc1.data/data/rucio/etc/alembic_offline.ini.template +74 -0
- rucio-37.0.0rc1.data/data/rucio/etc/globus-config.yml.template +5 -0
- rucio-37.0.0rc1.data/data/rucio/etc/ldap.cfg.template +30 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_approval_request.tmpl +38 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +4 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_approved_user.tmpl +17 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +6 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_denied_user.tmpl +17 -0
- rucio-37.0.0rc1.data/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +19 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rse-accounts.cfg.template +25 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rucio.cfg.atlas.client.template +43 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rucio.cfg.template +241 -0
- rucio-37.0.0rc1.data/data/rucio/etc/rucio_multi_vo.cfg.template +217 -0
- rucio-37.0.0rc1.data/data/rucio/requirements.server.txt +297 -0
- rucio-37.0.0rc1.data/data/rucio/tools/bootstrap.py +34 -0
- rucio-37.0.0rc1.data/data/rucio/tools/merge_rucio_configs.py +144 -0
- rucio-37.0.0rc1.data/data/rucio/tools/reset_database.py +40 -0
- rucio-37.0.0rc1.data/scripts/rucio +133 -0
- rucio-37.0.0rc1.data/scripts/rucio-abacus-account +74 -0
- rucio-37.0.0rc1.data/scripts/rucio-abacus-collection-replica +46 -0
- rucio-37.0.0rc1.data/scripts/rucio-abacus-rse +78 -0
- rucio-37.0.0rc1.data/scripts/rucio-admin +97 -0
- rucio-37.0.0rc1.data/scripts/rucio-atropos +60 -0
- rucio-37.0.0rc1.data/scripts/rucio-auditor +206 -0
- rucio-37.0.0rc1.data/scripts/rucio-automatix +50 -0
- rucio-37.0.0rc1.data/scripts/rucio-bb8 +57 -0
- rucio-37.0.0rc1.data/scripts/rucio-cache-client +141 -0
- rucio-37.0.0rc1.data/scripts/rucio-cache-consumer +42 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-finisher +58 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-poller +66 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-preparer +37 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-receiver +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-stager +76 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-submitter +139 -0
- rucio-37.0.0rc1.data/scripts/rucio-conveyor-throttler +104 -0
- rucio-37.0.0rc1.data/scripts/rucio-dark-reaper +53 -0
- rucio-37.0.0rc1.data/scripts/rucio-dumper +160 -0
- rucio-37.0.0rc1.data/scripts/rucio-follower +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-hermes +54 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-cleaner +89 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-evaluator +137 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-injector +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-judge-repairer +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-kronos +44 -0
- rucio-37.0.0rc1.data/scripts/rucio-minos +53 -0
- rucio-37.0.0rc1.data/scripts/rucio-minos-temporary-expiration +50 -0
- rucio-37.0.0rc1.data/scripts/rucio-necromancer +120 -0
- rucio-37.0.0rc1.data/scripts/rucio-oauth-manager +63 -0
- rucio-37.0.0rc1.data/scripts/rucio-reaper +83 -0
- rucio-37.0.0rc1.data/scripts/rucio-replica-recoverer +248 -0
- rucio-37.0.0rc1.data/scripts/rucio-rse-decommissioner +66 -0
- rucio-37.0.0rc1.data/scripts/rucio-storage-consistency-actions +74 -0
- rucio-37.0.0rc1.data/scripts/rucio-transmogrifier +77 -0
- rucio-37.0.0rc1.data/scripts/rucio-undertaker +76 -0
- rucio-37.0.0rc1.dist-info/METADATA +92 -0
- rucio-37.0.0rc1.dist-info/RECORD +487 -0
- rucio-37.0.0rc1.dist-info/WHEEL +5 -0
- rucio-37.0.0rc1.dist-info/licenses/AUTHORS.rst +100 -0
- rucio-37.0.0rc1.dist-info/licenses/LICENSE +201 -0
- rucio-37.0.0rc1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from abc import ABCMeta, abstractmethod
|
|
16
|
+
from typing import TYPE_CHECKING, Literal
|
|
17
|
+
|
|
18
|
+
from rucio.db.sqla.session import transactional_session
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from collections.abc import Iterator
|
|
22
|
+
from typing import Any, Optional, Union
|
|
23
|
+
|
|
24
|
+
from sqlalchemy.orm import Session
|
|
25
|
+
|
|
26
|
+
from rucio.common.types import InternalScope
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class DidMetaPlugin(metaclass=ABCMeta):
|
|
30
|
+
"""
|
|
31
|
+
Interface for plugins managing metadata of DIDs
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(self):
|
|
35
|
+
"""
|
|
36
|
+
Initializes the plugin
|
|
37
|
+
"""
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
@abstractmethod
|
|
41
|
+
def get_metadata(
|
|
42
|
+
self,
|
|
43
|
+
scope: "InternalScope",
|
|
44
|
+
name: str,
|
|
45
|
+
*,
|
|
46
|
+
session: "Optional[Session]" = None
|
|
47
|
+
) -> "Any":
|
|
48
|
+
"""
|
|
49
|
+
Get data identifier metadata
|
|
50
|
+
|
|
51
|
+
:param scope: The scope name.
|
|
52
|
+
:param name: The data identifier name.
|
|
53
|
+
:param session: The database session in use.
|
|
54
|
+
"""
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
@abstractmethod
|
|
58
|
+
def set_metadata(
|
|
59
|
+
self,
|
|
60
|
+
scope: "InternalScope",
|
|
61
|
+
name: str,
|
|
62
|
+
key: str,
|
|
63
|
+
value: str,
|
|
64
|
+
recursive: bool = False,
|
|
65
|
+
*,
|
|
66
|
+
session: "Optional[Session]" = None
|
|
67
|
+
) -> None:
|
|
68
|
+
"""
|
|
69
|
+
Add metadata to data identifier.
|
|
70
|
+
|
|
71
|
+
:param scope: The scope name.
|
|
72
|
+
:param name: The data identifier name.
|
|
73
|
+
:param key: the key.
|
|
74
|
+
:param value: the value.
|
|
75
|
+
:param did: The data identifier info.
|
|
76
|
+
:param recursive: Option to propagate the metadata change to content.
|
|
77
|
+
:param session: The database session in use.
|
|
78
|
+
"""
|
|
79
|
+
pass
|
|
80
|
+
|
|
81
|
+
@transactional_session
|
|
82
|
+
def set_metadata_bulk(
|
|
83
|
+
self,
|
|
84
|
+
scope: "InternalScope",
|
|
85
|
+
name: str,
|
|
86
|
+
meta: dict[str, "Any"],
|
|
87
|
+
recursive: bool = False,
|
|
88
|
+
*,
|
|
89
|
+
session: "Optional[Session]" = None
|
|
90
|
+
) -> None:
|
|
91
|
+
"""
|
|
92
|
+
Add metadata to data identifier in bulk.
|
|
93
|
+
|
|
94
|
+
:param scope: The scope name.
|
|
95
|
+
:param name: The data identifier name.
|
|
96
|
+
:param meta: all key-values to set.
|
|
97
|
+
:type meta: dict
|
|
98
|
+
:param recursive: Option to propagate the metadata change to content.
|
|
99
|
+
:param session: The database session in use.
|
|
100
|
+
"""
|
|
101
|
+
for key, value in meta.items():
|
|
102
|
+
self.set_metadata(scope, name, key, value, recursive=recursive, session=session)
|
|
103
|
+
|
|
104
|
+
@abstractmethod
|
|
105
|
+
def delete_metadata(
|
|
106
|
+
self,
|
|
107
|
+
scope: "InternalScope",
|
|
108
|
+
name: str,
|
|
109
|
+
key: str,
|
|
110
|
+
*,
|
|
111
|
+
session: "Optional[Session]" = None
|
|
112
|
+
) -> None:
|
|
113
|
+
"""
|
|
114
|
+
Deletes the metadata stored for the given key.
|
|
115
|
+
|
|
116
|
+
:param scope: The scope of the did.
|
|
117
|
+
:param name: The name of the did.
|
|
118
|
+
:param key: Key of the metadata.
|
|
119
|
+
:param session: The database session in use.
|
|
120
|
+
"""
|
|
121
|
+
pass
|
|
122
|
+
|
|
123
|
+
@abstractmethod
|
|
124
|
+
def list_dids(
|
|
125
|
+
self,
|
|
126
|
+
scope: "InternalScope",
|
|
127
|
+
filters: dict[str, "Any"],
|
|
128
|
+
did_type: Literal['all', 'collection', 'dataset', 'container', 'file'] = 'collection',
|
|
129
|
+
ignore_case: bool = False,
|
|
130
|
+
limit: "Optional[int]" = None,
|
|
131
|
+
offset: "Optional[int]" = None,
|
|
132
|
+
long: bool = False,
|
|
133
|
+
recursive: bool = False,
|
|
134
|
+
*,
|
|
135
|
+
session: "Optional[Session]" = None
|
|
136
|
+
) -> "Iterator[Union[str, dict[str, Any]]]":
|
|
137
|
+
"""
|
|
138
|
+
Search data identifiers
|
|
139
|
+
|
|
140
|
+
:param scope: the scope name.
|
|
141
|
+
:param filters: dictionary of attributes by which the results should be filtered.
|
|
142
|
+
:param did_type: the type of the did: all(container, dataset, file), collection(dataset or container), dataset, container, file.
|
|
143
|
+
:param ignore_case: ignore case distinctions.
|
|
144
|
+
:param limit: limit number.
|
|
145
|
+
:param offset: offset number.
|
|
146
|
+
:param long: Long format option to display more information for each DID.
|
|
147
|
+
:param session: The database session in use.
|
|
148
|
+
:param recursive: Recursively list DIDs content.
|
|
149
|
+
"""
|
|
150
|
+
pass
|
|
151
|
+
|
|
152
|
+
@abstractmethod
|
|
153
|
+
def manages_key(
|
|
154
|
+
self,
|
|
155
|
+
key: str,
|
|
156
|
+
*,
|
|
157
|
+
session: "Optional[Session]" = None
|
|
158
|
+
) -> bool:
|
|
159
|
+
"""
|
|
160
|
+
Returns whether key is managed by this plugin or not.
|
|
161
|
+
:param key: Key of the metadata.
|
|
162
|
+
:param session: The database session in use.
|
|
163
|
+
:returns (Boolean)
|
|
164
|
+
"""
|
|
165
|
+
pass
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
'''
|
|
17
|
+
Elasticsearch based metadata plugin.
|
|
18
|
+
'''
|
|
19
|
+
|
|
20
|
+
import datetime
|
|
21
|
+
import operator
|
|
22
|
+
from typing import TYPE_CHECKING, Any, Literal, Optional, Union
|
|
23
|
+
|
|
24
|
+
from elasticsearch import Elasticsearch
|
|
25
|
+
from elasticsearch import exceptions as elastic_exceptions
|
|
26
|
+
|
|
27
|
+
from rucio.common import config, exception
|
|
28
|
+
from rucio.core.did_meta_plugins.did_meta_plugin_interface import DidMetaPlugin
|
|
29
|
+
from rucio.core.did_meta_plugins.filter_engine import FilterEngine
|
|
30
|
+
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
from collections.abc import Iterator
|
|
33
|
+
|
|
34
|
+
from sqlalchemy.orm import Session
|
|
35
|
+
|
|
36
|
+
from rucio.common.types import InternalScope
|
|
37
|
+
|
|
38
|
+
IMMUTABLE_KEYS = [
|
|
39
|
+
'scope', # generated on insert
|
|
40
|
+
'name', # generated on insert
|
|
41
|
+
'vo' # generated on insert
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class ElasticDidMeta(DidMetaPlugin):
|
|
46
|
+
def __init__(
|
|
47
|
+
self,
|
|
48
|
+
hosts: Optional[list[str]] = None,
|
|
49
|
+
user: Optional[str] = None,
|
|
50
|
+
password: Optional[str] = None,
|
|
51
|
+
index: Optional[str] = None,
|
|
52
|
+
archive_index: Optional[str] = None,
|
|
53
|
+
use_ssl: Optional[bool] = False,
|
|
54
|
+
verify_certs: bool = True,
|
|
55
|
+
ca_certs: Optional[str] = None,
|
|
56
|
+
client_cert: Optional[str] = None,
|
|
57
|
+
client_key: Optional[str] = None,
|
|
58
|
+
request_timeout: int = 100,
|
|
59
|
+
max_retries: int = 3,
|
|
60
|
+
retry_on_timeout: bool = False
|
|
61
|
+
) -> None:
|
|
62
|
+
super(ElasticDidMeta, self).__init__()
|
|
63
|
+
hosts = hosts or [config.config_get('metadata', 'elastic_service_hosts')]
|
|
64
|
+
user = user or config.config_get('metadata', 'elastic_user', False, None)
|
|
65
|
+
password = password or config.config_get('metadata', 'elastic_password', False, None)
|
|
66
|
+
self.index = index or config.config_get('metadata', 'meta_index', False, 'rucio_did_meta')
|
|
67
|
+
self.archive_index = archive_index or config.config_get('metadata', 'archive_index', False, 'archive_meta')
|
|
68
|
+
use_ssl = use_ssl or config.config_get_bool('metadata', 'use_ssl', False, False)
|
|
69
|
+
ca_certs = ca_certs or config.config_get('metadata', 'ca_certs', False, None)
|
|
70
|
+
client_cert = client_cert or config.config_get('metadata', 'client_cert', False, None)
|
|
71
|
+
client_key = client_key or config.config_get('metadata', 'client_key', False, None)
|
|
72
|
+
|
|
73
|
+
self.es_config = {
|
|
74
|
+
'hosts': hosts,
|
|
75
|
+
'timeout': request_timeout,
|
|
76
|
+
'max_retries': max_retries,
|
|
77
|
+
'retry_on_timeout': retry_on_timeout
|
|
78
|
+
}
|
|
79
|
+
if user and password:
|
|
80
|
+
self.es_config['basic_auth'] = (user, password)
|
|
81
|
+
|
|
82
|
+
if use_ssl:
|
|
83
|
+
self.es_config.update({
|
|
84
|
+
'ca_certs': ca_certs,
|
|
85
|
+
'verify_certs': verify_certs,
|
|
86
|
+
})
|
|
87
|
+
if client_cert and client_key:
|
|
88
|
+
self.es_config.update({
|
|
89
|
+
'client_cert': client_cert,
|
|
90
|
+
'client_key': client_key
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
self.client = Elasticsearch(**self.es_config)
|
|
94
|
+
self.plugin_name = "ELASTIC"
|
|
95
|
+
|
|
96
|
+
def drop_index(self) -> None:
|
|
97
|
+
self.client.indices.delete(index=self.index)
|
|
98
|
+
|
|
99
|
+
def get_metadata(
|
|
100
|
+
self,
|
|
101
|
+
scope: "InternalScope",
|
|
102
|
+
name: str,
|
|
103
|
+
*,
|
|
104
|
+
session: "Optional[Session]" = None
|
|
105
|
+
) -> dict[str, Any]:
|
|
106
|
+
"""
|
|
107
|
+
Get data identifier metadata.
|
|
108
|
+
|
|
109
|
+
:param scope: The scope name
|
|
110
|
+
:param name: The data identifier name
|
|
111
|
+
:param session: The database session in use
|
|
112
|
+
:returns: The metadata for the did
|
|
113
|
+
:raises DataIdentifierNotFound: If the DID metadata is not found.
|
|
114
|
+
:raises RucioException: If another error occurs during the process.
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
doc_id = f"{scope.internal}{name}"
|
|
118
|
+
try:
|
|
119
|
+
doc = self.client.get(index=self.index, id=doc_id)["_source"]
|
|
120
|
+
except elastic_exceptions.NotFoundError as err:
|
|
121
|
+
raise exception.DataIdentifierNotFound(f"No metadata found for DID '{scope}:{name}' not found") from err
|
|
122
|
+
except Exception as err:
|
|
123
|
+
raise exception.RucioException(err)
|
|
124
|
+
return doc
|
|
125
|
+
|
|
126
|
+
def set_metadata(
|
|
127
|
+
self,
|
|
128
|
+
scope: "InternalScope",
|
|
129
|
+
name: str,
|
|
130
|
+
key: str,
|
|
131
|
+
value: str,
|
|
132
|
+
recursive: bool = False,
|
|
133
|
+
*,
|
|
134
|
+
session: "Optional[Session]" = None
|
|
135
|
+
) -> None:
|
|
136
|
+
"""
|
|
137
|
+
Set single metadata key.
|
|
138
|
+
|
|
139
|
+
:param scope: the scope of did
|
|
140
|
+
:param name: the name of the did
|
|
141
|
+
:param key: the key to be added
|
|
142
|
+
:param value: the value of the key to be added
|
|
143
|
+
:param recursive: recurse into DIDs (not supported)
|
|
144
|
+
:param session: The database session in use
|
|
145
|
+
:raises DataIdentifierNotFound: If the DID is not found.
|
|
146
|
+
:raises RucioException: If an error occurs while setting the metadata.
|
|
147
|
+
"""
|
|
148
|
+
self.set_metadata_bulk(scope=scope, name=name, meta={key: value}, recursive=recursive, session=session)
|
|
149
|
+
|
|
150
|
+
def set_metadata_bulk(
|
|
151
|
+
self,
|
|
152
|
+
scope: "InternalScope",
|
|
153
|
+
name: str,
|
|
154
|
+
meta: dict[str, Any],
|
|
155
|
+
recursive: bool = False,
|
|
156
|
+
*,
|
|
157
|
+
session: "Optional[Session]" = None
|
|
158
|
+
) -> None:
|
|
159
|
+
"""
|
|
160
|
+
Bulk set metadata keys.
|
|
161
|
+
|
|
162
|
+
:param scope: the scope of did
|
|
163
|
+
:param name: the name of the did
|
|
164
|
+
:param meta: dictionary of metadata keypairs to be added
|
|
165
|
+
:param recursive: recurse into DIDs (not supported)
|
|
166
|
+
:param session: The database session in use
|
|
167
|
+
:raises DataIdentifierNotFound: If the DID is not found.
|
|
168
|
+
:raises UnsupportedOperation: If recursive inserts are requested (currently unsupported).
|
|
169
|
+
:raises RucioException: If an error occurs while setting the metadata.
|
|
170
|
+
"""
|
|
171
|
+
doc_id = f"{scope.internal}{name}"
|
|
172
|
+
try:
|
|
173
|
+
# Try to get existing metadata
|
|
174
|
+
existing_meta = self.get_metadata(scope, name)
|
|
175
|
+
except exception.DataIdentifierNotFound:
|
|
176
|
+
existing_meta = {
|
|
177
|
+
'scope': str(scope.external),
|
|
178
|
+
'name': name,
|
|
179
|
+
'vo': scope.vo
|
|
180
|
+
}
|
|
181
|
+
for key, value in meta.items():
|
|
182
|
+
if key not in IMMUTABLE_KEYS:
|
|
183
|
+
existing_meta[key] = value
|
|
184
|
+
|
|
185
|
+
try:
|
|
186
|
+
self.client.index(index=self.index, body=existing_meta, id=doc_id, refresh="true")
|
|
187
|
+
except Exception as err:
|
|
188
|
+
raise exception.RucioException(err)
|
|
189
|
+
|
|
190
|
+
if recursive:
|
|
191
|
+
raise exception.UnsupportedOperation(f"'{self.plugin_name.lower()}' metadata module does not currently support recursive inserts of metadata")
|
|
192
|
+
|
|
193
|
+
def delete_metadata(
|
|
194
|
+
self,
|
|
195
|
+
scope: "InternalScope",
|
|
196
|
+
name: str,
|
|
197
|
+
key: str,
|
|
198
|
+
*,
|
|
199
|
+
session: "Optional[Session]" = None
|
|
200
|
+
) -> None:
|
|
201
|
+
"""
|
|
202
|
+
Delete a key from metadata.
|
|
203
|
+
|
|
204
|
+
:param scope: the scope of did
|
|
205
|
+
:param name: the name of the did
|
|
206
|
+
:param key: the key to be deleted
|
|
207
|
+
:raises DataIdentifierNotFound: If the DID is not found.
|
|
208
|
+
:raises RucioException: If an error occurs while setting the metadata.
|
|
209
|
+
"""
|
|
210
|
+
doc_id = f"{scope.internal}{name}"
|
|
211
|
+
try:
|
|
212
|
+
# First, get the current document
|
|
213
|
+
doc = self.client.get(index=self.index, id=doc_id)
|
|
214
|
+
|
|
215
|
+
# Check if the key exists in the document
|
|
216
|
+
if key in doc['_source']:
|
|
217
|
+
# Use script to remove the field
|
|
218
|
+
script = {
|
|
219
|
+
"script": {
|
|
220
|
+
"source": f"ctx._source.remove('{key}')",
|
|
221
|
+
"lang": "painless"
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
self.client.update(index=self.index, id=doc_id, body=script)
|
|
225
|
+
except elastic_exceptions.NotFoundError as err:
|
|
226
|
+
raise exception.DataIdentifierNotFound(f"No metadata found for DID '{scope}:{name}' not found") from err
|
|
227
|
+
except Exception as err:
|
|
228
|
+
raise exception.RucioException(err)
|
|
229
|
+
|
|
230
|
+
def list_dids(
|
|
231
|
+
self,
|
|
232
|
+
scope: "InternalScope",
|
|
233
|
+
filters: Union[list[dict[str, Any]], dict[str, Any]],
|
|
234
|
+
did_type: Literal['all', 'collection', 'dataset', 'container', 'file'] = 'collection',
|
|
235
|
+
ignore_case: bool = False,
|
|
236
|
+
limit: Optional[int] = None,
|
|
237
|
+
offset: Optional[int] = None,
|
|
238
|
+
long: bool = False,
|
|
239
|
+
recursive: bool = False,
|
|
240
|
+
ignore_dids: Optional[list] = None,
|
|
241
|
+
*,
|
|
242
|
+
session: "Optional[Session]" = None
|
|
243
|
+
) -> "Iterator[dict[str, Any]]":
|
|
244
|
+
"""
|
|
245
|
+
List DIDs (Data Identifier).
|
|
246
|
+
|
|
247
|
+
:param scope: The scope of the DIDs to search.
|
|
248
|
+
:param filters: The filters to apply to the DID search.
|
|
249
|
+
:param did_type: The type of DID (default is 'collection').
|
|
250
|
+
:param ignore_case: Whether to ignore case (default is False).
|
|
251
|
+
:param limit: The maximum number of DIDs to return.
|
|
252
|
+
:param offset: The starting point for the search (used for pagination).
|
|
253
|
+
:param long: Whether to return extended information (scope, name, did_type, bytes, length) (default is False).
|
|
254
|
+
:param recursive: Whether to search recursively (currently unsupported).
|
|
255
|
+
:param ignore_dids: A list of DIDs to ignore (default is an empty list).
|
|
256
|
+
:param session: The database session in use.
|
|
257
|
+
:returns: A generator yielding DIDs as strings (when `long` is False) or dictionaries (when `long` is True).
|
|
258
|
+
:raises UnsupportedOperation: If recursive searches are requested (currently unsupported).
|
|
259
|
+
:raises RucioException: If an error occurs during the search.
|
|
260
|
+
"""
|
|
261
|
+
|
|
262
|
+
if not ignore_dids:
|
|
263
|
+
ignore_dids = []
|
|
264
|
+
|
|
265
|
+
# backwards compatibility for filters as single {}.
|
|
266
|
+
if isinstance(filters, dict):
|
|
267
|
+
filters = [filters]
|
|
268
|
+
|
|
269
|
+
# Create Elasticsearch query
|
|
270
|
+
fe = FilterEngine(filters, model_class=None, strict_coerce=False)
|
|
271
|
+
elastic_query_str = fe.create_elastic_query(
|
|
272
|
+
additional_filters=[
|
|
273
|
+
('scope', operator.eq, str(scope.external)),
|
|
274
|
+
('vo', operator.eq, scope.vo)
|
|
275
|
+
]
|
|
276
|
+
)
|
|
277
|
+
pit = self.client.open_point_in_time(index=self.index, keep_alive="2m")
|
|
278
|
+
pit_id = pit["id"]
|
|
279
|
+
# Base query with point in time (pit) paramter.
|
|
280
|
+
# sort is needed for search_after, so we use scope sort (random choice)
|
|
281
|
+
query = {
|
|
282
|
+
"query": elastic_query_str,
|
|
283
|
+
"sort": [{"scope.keyword": "asc"}],
|
|
284
|
+
"_source": ["scope", "name"] if not long else ["scope", "name", "did_type", "bytes", "length"],
|
|
285
|
+
"pit": {"id": pit_id, "keep_alive": "2m"}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
# Add sorting and pagination
|
|
289
|
+
if offset:
|
|
290
|
+
query["from"] = offset
|
|
291
|
+
size = limit if limit else 10000
|
|
292
|
+
query["size"] = size
|
|
293
|
+
search_after = None
|
|
294
|
+
total_processed = 0
|
|
295
|
+
try:
|
|
296
|
+
while True:
|
|
297
|
+
if search_after:
|
|
298
|
+
query["search_after"] = search_after
|
|
299
|
+
query.pop("from", None)
|
|
300
|
+
# Execute search
|
|
301
|
+
results = self.client.search(body=query)
|
|
302
|
+
hits = results['hits']['hits']
|
|
303
|
+
if not hits:
|
|
304
|
+
break
|
|
305
|
+
|
|
306
|
+
for hit in hits:
|
|
307
|
+
did_full = f"{hit['_source']['scope']}:{hit['_source']['name']}"
|
|
308
|
+
if did_full not in ignore_dids:
|
|
309
|
+
ignore_dids.append(did_full)
|
|
310
|
+
if long:
|
|
311
|
+
yield {
|
|
312
|
+
'scope': (hit['_source']['scope']),
|
|
313
|
+
'name': hit['_source']['name'],
|
|
314
|
+
'did_type': hit['_source'].get('did_type', 'N/A'),
|
|
315
|
+
'bytes': hit['_source'].get('bytes', 'N/A'),
|
|
316
|
+
'length': hit['_source'].get('length', 'N/A')
|
|
317
|
+
}
|
|
318
|
+
else:
|
|
319
|
+
yield hit['_source']['name']
|
|
320
|
+
|
|
321
|
+
total_processed += 1
|
|
322
|
+
if limit and total_processed >= limit:
|
|
323
|
+
break
|
|
324
|
+
|
|
325
|
+
# Update search_after for the next iteration
|
|
326
|
+
search_after = hits[-1]["sort"]
|
|
327
|
+
|
|
328
|
+
finally:
|
|
329
|
+
# Always delete the point in time when done
|
|
330
|
+
self.client.close_point_in_time(body={"id": pit_id})
|
|
331
|
+
|
|
332
|
+
if recursive:
|
|
333
|
+
raise exception.UnsupportedOperation(f"'{self.plugin_name.lower()}' metadata module does not currently support recursive searches")
|
|
334
|
+
|
|
335
|
+
def on_delete(
|
|
336
|
+
self,
|
|
337
|
+
scope: "InternalScope",
|
|
338
|
+
name: str,
|
|
339
|
+
archive: bool = False,
|
|
340
|
+
session: "Optional[Session]" = None
|
|
341
|
+
) -> None:
|
|
342
|
+
"""
|
|
343
|
+
Delete a document and optionally archive it.
|
|
344
|
+
|
|
345
|
+
:param scope: The scope of the document
|
|
346
|
+
:param name: The name of the document
|
|
347
|
+
:param archive: Whether to archive the document before deletion
|
|
348
|
+
:raises DataIdentifierNotFound: If the DID is not found.
|
|
349
|
+
:raises RucioException: If an error occurs while setting the metadata.
|
|
350
|
+
"""
|
|
351
|
+
doc_id = f"{scope}{name}"
|
|
352
|
+
|
|
353
|
+
try:
|
|
354
|
+
doc = self.client.get(index=self.index, id=doc_id)
|
|
355
|
+
|
|
356
|
+
if archive:
|
|
357
|
+
archived_doc = doc['_source']
|
|
358
|
+
archived_doc['deleted_at'] = datetime.datetime.now(datetime.timezone.utc).isoformat()
|
|
359
|
+
self.client.index(index=self.archive_index, id=doc_id, body=archived_doc)
|
|
360
|
+
|
|
361
|
+
self.client.delete(index=self.index, id=doc_id)
|
|
362
|
+
|
|
363
|
+
except elastic_exceptions.NotFoundError as err:
|
|
364
|
+
raise exception.DataIdentifierNotFound(f"No metadata found for DID '{scope}:{name}' not found") from err
|
|
365
|
+
except Exception as err:
|
|
366
|
+
raise exception.RucioException(err)
|
|
367
|
+
|
|
368
|
+
def get_metadata_archived(
|
|
369
|
+
self,
|
|
370
|
+
scope: "InternalScope",
|
|
371
|
+
name: str,
|
|
372
|
+
session: "Optional[Session]" = None
|
|
373
|
+
) -> None:
|
|
374
|
+
"""
|
|
375
|
+
Retrieve archived metadata for a given scope and name.
|
|
376
|
+
|
|
377
|
+
:param scope: The scope of the document
|
|
378
|
+
:param name: The name of the document
|
|
379
|
+
:return: The archived metadata or None if not found
|
|
380
|
+
:raises DataIdentifierNotFound: If the DID is not found.
|
|
381
|
+
:raises RucioException: If an error occurs while setting the metadata.
|
|
382
|
+
"""
|
|
383
|
+
doc_id = f"{scope}{name}"
|
|
384
|
+
|
|
385
|
+
try:
|
|
386
|
+
doc = self.client.get(index=self.archive_index, id=doc_id)["_source"]
|
|
387
|
+
return doc
|
|
388
|
+
except elastic_exceptions.NotFoundError as err:
|
|
389
|
+
raise exception.DataIdentifierNotFound(f"No metadata found for DID '{scope}:{name}' not found") from err
|
|
390
|
+
except Exception as err:
|
|
391
|
+
raise exception.RucioException(err)
|
|
392
|
+
|
|
393
|
+
def manages_key(
|
|
394
|
+
self,
|
|
395
|
+
key: str,
|
|
396
|
+
*,
|
|
397
|
+
session: "Optional[Session]" = None
|
|
398
|
+
) -> bool:
|
|
399
|
+
return True
|
|
400
|
+
|
|
401
|
+
def get_plugin_name(self) -> str:
|
|
402
|
+
"""
|
|
403
|
+
Returns a unique identifier for this plugin. This can be later used for filtering down results to this plugin only.
|
|
404
|
+
|
|
405
|
+
:returns: The name of the plugin
|
|
406
|
+
"""
|
|
407
|
+
return self.plugin_name
|