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,44 @@
|
|
|
1
|
+
#!python
|
|
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
|
+
Conveyor is a daemon to manage file transfers.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import signal
|
|
22
|
+
|
|
23
|
+
from rucio.daemons.conveyor.receiver import run, stop
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser(description="Conveyor is a daemon to manage file transfers. The conveyor-receiver is similar to conveyor-poller, but instead of poll the transfer tool, conveyor-receiver gets knowledge about the state of submitted transfers by listening to the transfer tool messages.") # noqa E501
|
|
31
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='One iteration only')
|
|
32
|
+
parser.add_argument("--total-threads", action="store", default=1, type=int, help='Concurrency control: total number of threads per process')
|
|
33
|
+
return parser
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
if __name__ == "__main__":
|
|
37
|
+
|
|
38
|
+
signal.signal(signal.SIGTERM, stop)
|
|
39
|
+
parser = get_parser()
|
|
40
|
+
args = parser.parse_args()
|
|
41
|
+
try:
|
|
42
|
+
run(once=args.run_once, total_threads=args.total_threads)
|
|
43
|
+
except KeyboardInterrupt:
|
|
44
|
+
stop()
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!python
|
|
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
|
+
Conveyor is a daemon to manage file transfers.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import signal
|
|
22
|
+
|
|
23
|
+
from rucio.daemons.conveyor.stager import run, stop
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser(description="The conveyor-stager is responsible for issuing staging requests to the tape system.")
|
|
31
|
+
parser.add_argument("--run-once", action="store_true", default=False,
|
|
32
|
+
help='One iteration only')
|
|
33
|
+
parser.add_argument("--total-threads", action="store", default=1, type=int,
|
|
34
|
+
help='Concurrency control: total number of threads per process')
|
|
35
|
+
parser.add_argument("--bulk", action="store", default=100, type=int,
|
|
36
|
+
help='Bulk control: number of requests')
|
|
37
|
+
parser.add_argument("--group-bulk", action="store", default=1, type=int,
|
|
38
|
+
help='Group control: number of requests per group')
|
|
39
|
+
parser.add_argument("--group-policy", action="store", default='rule', type=str,
|
|
40
|
+
help='Group control: policy used to group. enum{rule, dest, src_dest, rule_src_dest}')
|
|
41
|
+
parser.add_argument('--source-strategy', action="store", default=None, type=str,
|
|
42
|
+
help='Source strategy. Overload the strategy defined in config DB.')
|
|
43
|
+
parser.add_argument('--exclude-rses', action="store", default=None, type=str,
|
|
44
|
+
help='RSE expression to exclude')
|
|
45
|
+
parser.add_argument('--include-rses', action="store", default=None, type=str,
|
|
46
|
+
help='RSE expression to include')
|
|
47
|
+
parser.add_argument('--rses', nargs='+', type=str,
|
|
48
|
+
help='Explicit list of RSEs to include')
|
|
49
|
+
parser.add_argument('--vos', nargs='+', type=str,
|
|
50
|
+
help='Optional list of VOs to consider. Only used in multi-VO mode.')
|
|
51
|
+
parser.add_argument('--activities', nargs='+', type=str,
|
|
52
|
+
help='Explicit list of activities to include')
|
|
53
|
+
parser.add_argument('--sleep-time', action="store", default=600, type=int,
|
|
54
|
+
help='Seconds to sleep if few requests')
|
|
55
|
+
return parser
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
if __name__ == "__main__":
|
|
59
|
+
|
|
60
|
+
signal.signal(signal.SIGTERM, stop)
|
|
61
|
+
parser = get_parser()
|
|
62
|
+
args = parser.parse_args()
|
|
63
|
+
try:
|
|
64
|
+
run(once=args.run_once,
|
|
65
|
+
total_threads=args.total_threads,
|
|
66
|
+
bulk=args.bulk,
|
|
67
|
+
group_bulk=args.group_bulk,
|
|
68
|
+
include_rses=args.include_rses,
|
|
69
|
+
exclude_rses=args.exclude_rses,
|
|
70
|
+
rses=args.rses,
|
|
71
|
+
vos=args.vos,
|
|
72
|
+
source_strategy=args.source_strategy,
|
|
73
|
+
activities=args.activities,
|
|
74
|
+
sleep_time=args.sleep_time)
|
|
75
|
+
except KeyboardInterrupt:
|
|
76
|
+
stop()
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#!python
|
|
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
|
+
Conveyor is a daemon to manage file transfers.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import signal
|
|
22
|
+
|
|
23
|
+
from rucio.daemons.conveyor.submitter import run, stop
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser(description="The Conveyor-Submitter daemon is responsible for managing non-tape file transfers. It prepares transfer jobs and submits them to the transfertool.", epilog='''
|
|
31
|
+
Upload a file and create a replication rule::
|
|
32
|
+
|
|
33
|
+
$ rucio upload --scope mock --rse MOCK --name file filename.txt
|
|
34
|
+
$ rucio add-rule mock:file 1 MOCK2
|
|
35
|
+
$ rucio-admin rse add-distance MOCK2 MOCK --distance 1
|
|
36
|
+
|
|
37
|
+
The rule should replicate the file from RSE MOCK to RSE MOCK2. Therefore a distance between these RSEs is needed.
|
|
38
|
+
|
|
39
|
+
Check transfer requests for the DID::
|
|
40
|
+
|
|
41
|
+
$ python
|
|
42
|
+
from rucio.db.sqla import session,models
|
|
43
|
+
session.get_session().query(models.Request).filter_by(scope='mock', name='file').first()
|
|
44
|
+
# {'request_type': TRANSFER, 'state': QUEUED', ...}
|
|
45
|
+
|
|
46
|
+
A queued request was created which can be picked uped by the Conveyor-Submiter daemon.
|
|
47
|
+
|
|
48
|
+
Run the daemon::
|
|
49
|
+
|
|
50
|
+
$ rucio-conveyor-submitter --run-once
|
|
51
|
+
|
|
52
|
+
Check again the transfer requests for the DID::
|
|
53
|
+
|
|
54
|
+
$ python
|
|
55
|
+
from rucio.db.sqla import session,models
|
|
56
|
+
session.get_session().query(models.Request).filter_by(scope='mock', name='file').first()
|
|
57
|
+
# {'request_type': TRANSFER, 'state': SUBMITTED', ...}
|
|
58
|
+
|
|
59
|
+
A transfer request got created by executing the transfer. Depending on the transfer submission, the request state can be different. In this example the transfer got submitted successfully.
|
|
60
|
+
|
|
61
|
+
When run in multi-VO mode, by default the daemon will run on RSEs from all VOs::
|
|
62
|
+
|
|
63
|
+
$ rucio-conveyor-submitter --run-once
|
|
64
|
+
2020-07-29 13:51:09,436 5784 INFO This instance will work on VOs: def, abc, xyz, 123
|
|
65
|
+
2020-07-29 13:51:13,315 5784 INFO RSE selection: automatic for relevant VOs
|
|
66
|
+
2020-07-29 13:51:13,316 5784 INFO starting submitter threads
|
|
67
|
+
|
|
68
|
+
By using the ``--vos`` argument only the VO or VOs specified will be affected::
|
|
69
|
+
|
|
70
|
+
$ rucio-conveyor-submitter --run-once --vos abc xyz
|
|
71
|
+
2020-07-29 13:51:09,436 5784 INFO This instance will work on VOs: abc, xyz
|
|
72
|
+
2020-07-29 13:51:13,315 5784 INFO RSE selection: automatic for relevant VOs
|
|
73
|
+
2020-07-29 13:51:13,316 5784 INFO starting submitter threads
|
|
74
|
+
|
|
75
|
+
Note that attempting the use the ``--vos`` argument when in single-VO mode will have no affect::
|
|
76
|
+
|
|
77
|
+
$ rucio-conveyor-submitter --run-once --vos abc xyz
|
|
78
|
+
2020-07-29 13:39:37,263 5752 INFO RSE selection: automatic
|
|
79
|
+
2020-07-29 13:39:37,264 5752 INFO starting submitter threads
|
|
80
|
+
''', formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
81
|
+
parser.add_argument("--run-once", action="store_true", default=False,
|
|
82
|
+
help='One iteration only')
|
|
83
|
+
parser.add_argument("--total-threads", action="store", default=1, type=int,
|
|
84
|
+
help='Concurrency control: total number of threads per process')
|
|
85
|
+
parser.add_argument("--bulk", action="store", default=100, type=int,
|
|
86
|
+
help='Bulk control: number of requests')
|
|
87
|
+
parser.add_argument("--group-bulk", action="store", default=1, type=int,
|
|
88
|
+
help='Group control: number of requests per group')
|
|
89
|
+
parser.add_argument("--group-policy", action="store", default='rule', type=str,
|
|
90
|
+
help='Group control: policy used to group. enum{rule, dest, src_dest, rule_src_dest, activity_dest, activity_src_dest}')
|
|
91
|
+
parser.add_argument('--source-strategy', action="store", default=None, type=str,
|
|
92
|
+
help='Source strategy. Overload the strategy defined in config DB.')
|
|
93
|
+
parser.add_argument('--exclude-rses', action="store", default=None, type=str,
|
|
94
|
+
help='RSE expression to exclude')
|
|
95
|
+
parser.add_argument('--include-rses', action="store", default=None, type=str,
|
|
96
|
+
help='RSE expression to include')
|
|
97
|
+
parser.add_argument('--rses', nargs='+', type=str,
|
|
98
|
+
help='Explicit list of RSEs to include')
|
|
99
|
+
parser.add_argument('--vos', nargs='+', type=str,
|
|
100
|
+
help='Optional list of VOs to consider. Only used in multi-VO mode.')
|
|
101
|
+
parser.add_argument('--activities', nargs='+', type=str,
|
|
102
|
+
help='Explicit list of activities to include')
|
|
103
|
+
parser.add_argument('--exclude-activities', nargs='+', type=str,
|
|
104
|
+
help='Explicit list of activities to exclude')
|
|
105
|
+
parser.add_argument('--ignore-availability', action="store_true", default=False,
|
|
106
|
+
help='If True, will also try to submit transfers having blocklisted RSEs as sources')
|
|
107
|
+
parser.add_argument('--sleep-time', action="store", default=600, type=int,
|
|
108
|
+
help='Seconds to sleep if few requests')
|
|
109
|
+
parser.add_argument('--max-sources', action="store", default=5, type=int,
|
|
110
|
+
help='Maximum source replicas per multi-source FTS job')
|
|
111
|
+
parser.add_argument('--archive-timeout-override', action="store", default=None, type=int, metavar="INTEGER_SECONDS",
|
|
112
|
+
help='Override the archive_timeout parameter for any transfers with it set (0 to unset)')
|
|
113
|
+
return parser
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
if __name__ == "__main__":
|
|
117
|
+
|
|
118
|
+
signal.signal(signal.SIGTERM, stop)
|
|
119
|
+
parser = get_parser()
|
|
120
|
+
args = parser.parse_args()
|
|
121
|
+
try:
|
|
122
|
+
run(once=args.run_once,
|
|
123
|
+
bulk=args.bulk,
|
|
124
|
+
group_bulk=args.group_bulk,
|
|
125
|
+
group_policy=args.group_policy,
|
|
126
|
+
include_rses=args.include_rses,
|
|
127
|
+
exclude_rses=args.exclude_rses,
|
|
128
|
+
rses=args.rses,
|
|
129
|
+
vos=args.vos,
|
|
130
|
+
source_strategy=args.source_strategy,
|
|
131
|
+
activities=args.activities,
|
|
132
|
+
exclude_activities=args.exclude_activities,
|
|
133
|
+
ignore_availability=args.ignore_availability,
|
|
134
|
+
sleep_time=args.sleep_time,
|
|
135
|
+
max_sources=args.max_sources,
|
|
136
|
+
archive_timeout_override=args.archive_timeout_override,
|
|
137
|
+
total_threads=args.total_threads)
|
|
138
|
+
except KeyboardInterrupt:
|
|
139
|
+
stop()
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!python
|
|
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
|
+
Conveyor is a daemon to manage file transfers.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import signal
|
|
22
|
+
|
|
23
|
+
from rucio.daemons.conveyor.throttler import run, stop
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser(description="The Conveyor-Throttler daemon is responsible for managing the internal queue of transfer requests. Depending on transfer limits of current and waiting transfers, it decides whether a transfer should be put in the queue or not.", epilog='''
|
|
31
|
+
In this example, the transfer limit will be one transfer which means that there should be only one active transfer at the time.
|
|
32
|
+
There will be two waiting transfer requests and no current active transfer.
|
|
33
|
+
After running the daemon, there will be one transfer in the queue which can then be started.
|
|
34
|
+
|
|
35
|
+
Setup the transfer limit::
|
|
36
|
+
|
|
37
|
+
$ python
|
|
38
|
+
from rucio.core.rse import set_rse_transfer_limits
|
|
39
|
+
set_rse_transfer_limits('MOCK2', 'User Subscriptions', max_transfers=1)
|
|
40
|
+
$ rucio-admin config set --section throttler --option 'User Subscriptions,MOCK2' --value 1
|
|
41
|
+
|
|
42
|
+
If Rucio is running in multi-VO mode, then the RSE ID should be used in place of its name when setting the config::
|
|
43
|
+
|
|
44
|
+
$ rucio-admin rse info MOCK2
|
|
45
|
+
Settings:
|
|
46
|
+
=========
|
|
47
|
+
...
|
|
48
|
+
Attributes:
|
|
49
|
+
===========
|
|
50
|
+
...
|
|
51
|
+
Protocols:
|
|
52
|
+
==========
|
|
53
|
+
...
|
|
54
|
+
Usage:
|
|
55
|
+
======
|
|
56
|
+
...
|
|
57
|
+
rse_id: 9c54c73cbd534450b2202a576f809f1f
|
|
58
|
+
$ rucio-admin config set --section throttler --option 'User Subscriptions,9c54c73cbd534450b2202a576f809f1f' --value 1
|
|
59
|
+
|
|
60
|
+
Upload two files and create replication rules to the same RSE::
|
|
61
|
+
|
|
62
|
+
$ rucio upload --scope mock --rse MOCK --name file1 filename.txt
|
|
63
|
+
$ rucio add-rule mock:file 1 MOCK2
|
|
64
|
+
$ rucio upload --scope mock --rse MOCK --name file2 filename.txt
|
|
65
|
+
$ rucio add-rule mock:file2 1 MOCK2
|
|
66
|
+
|
|
67
|
+
Check transfer requests::
|
|
68
|
+
|
|
69
|
+
$ python
|
|
70
|
+
from rucio.db.sqla import session,models
|
|
71
|
+
[request.to_dict() for request in session.get_session().query(models.Request).all()]
|
|
72
|
+
# [{'state': WAITING, ...}, {'state': WAITING, ...}
|
|
73
|
+
|
|
74
|
+
Two transfer requests with the state 'WAITING' got created.
|
|
75
|
+
|
|
76
|
+
Run the daemon::
|
|
77
|
+
|
|
78
|
+
$ rucio-conveyor-throttler --run-once
|
|
79
|
+
|
|
80
|
+
Check transfer requests::
|
|
81
|
+
|
|
82
|
+
$ python
|
|
83
|
+
from rucio.db.sqla import session,models
|
|
84
|
+
[request.to_dict() for request in session.get_session().query(models.Request).all()]
|
|
85
|
+
# [{'state': WAITING, ...}, {'state': QUEUED, ...}
|
|
86
|
+
|
|
87
|
+
Finally one of the transfer requests got put in the queue and can be picked up by the Conyevor-Submitter daemon to submit the transfer job to the transfertool.
|
|
88
|
+
The other request will have to wait until one of the queued requests is done or until the transfer limit changes.
|
|
89
|
+
''', formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
90
|
+
parser.add_argument("--run-once", action="store_true", default=False,
|
|
91
|
+
help='One iteration only')
|
|
92
|
+
parser.add_argument('--sleep-time', action="store", default=600, type=int,
|
|
93
|
+
help='Seconds to sleep if few requests')
|
|
94
|
+
return parser
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
if __name__ == "__main__":
|
|
98
|
+
signal.signal(signal.SIGTERM, stop)
|
|
99
|
+
parser = get_parser()
|
|
100
|
+
args = parser.parse_args()
|
|
101
|
+
try:
|
|
102
|
+
run(once=args.run_once, sleep_time=args.sleep_time)
|
|
103
|
+
except KeyboardInterrupt:
|
|
104
|
+
stop()
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!python
|
|
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
|
+
Reaper is a daemon to manage file on disk but not in Rucio(dark data) deletion
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import signal
|
|
22
|
+
|
|
23
|
+
from rucio.daemons.reaper.dark_reaper import run, stop
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser(description="The Dark-Reaper daemon is responsible for the deletion of quarantined replicas.")
|
|
31
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='One iteration only')
|
|
32
|
+
parser.add_argument("--total-workers", action="store", default=1, type=int, help='Total number of workers per process')
|
|
33
|
+
parser.add_argument("--chunk-size", action="store", default=10, type=int, help='Chunk size')
|
|
34
|
+
parser.add_argument("--scheme", action="store", default=None, type=str, help='Force the reaper to use a particular protocol, e.g., mock.')
|
|
35
|
+
parser.add_argument('--rses', nargs='+', type=str, help='List of RSEs')
|
|
36
|
+
parser.add_argument('--exclude-rses', action="store", default=None, type=str, help='RSEs expression to exclude RSEs')
|
|
37
|
+
parser.add_argument('--include-rses', action="store", default=None, type=str, help='RSEs expression to include RSEs')
|
|
38
|
+
parser.add_argument('--vos', nargs='+', type=str, help='Optional list of VOs to consider. Only used in multi-VO mode.')
|
|
39
|
+
parser.add_argument('--sleep-time', action="store", default=60, type=int, help='Concurrency control: thread sleep time after each chunk of work')
|
|
40
|
+
return parser
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
if __name__ == '__main__':
|
|
44
|
+
signal.signal(signal.SIGTERM, stop)
|
|
45
|
+
parser = get_parser()
|
|
46
|
+
args = parser.parse_args()
|
|
47
|
+
try:
|
|
48
|
+
run(total_workers=args.total_workers, chunk_size=args.chunk_size,
|
|
49
|
+
once=args.run_once, scheme=args.scheme, rses=args.rses,
|
|
50
|
+
exclude_rses=args.exclude_rses, include_rses=args.include_rses, vos=args.vos,
|
|
51
|
+
sleep_time=args.sleep_time)
|
|
52
|
+
except KeyboardInterrupt:
|
|
53
|
+
stop()
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!python
|
|
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 argparse
|
|
17
|
+
import datetime
|
|
18
|
+
import logging
|
|
19
|
+
import sys
|
|
20
|
+
|
|
21
|
+
import tabulate
|
|
22
|
+
|
|
23
|
+
import rucio.common.dumper.consistency as consistency
|
|
24
|
+
import rucio.common.dumper.data_models as data_models
|
|
25
|
+
from rucio.common.dumper import error
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger('rucio-dumper')
|
|
28
|
+
libs_logger = logging.getLogger('dumper')
|
|
29
|
+
logger.setLevel(logging.WARNING)
|
|
30
|
+
libs_logger.setLevel(logging.WARNING)
|
|
31
|
+
|
|
32
|
+
handler = logging.StreamHandler(sys.stderr)
|
|
33
|
+
logger.addHandler(handler)
|
|
34
|
+
libs_logger.addHandler(handler)
|
|
35
|
+
|
|
36
|
+
formatter = logging.Formatter(
|
|
37
|
+
"%(asctime)s %(name)-22s %(levelname)-8s %(message)s"
|
|
38
|
+
)
|
|
39
|
+
handler.setFormatter(formatter)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def get_parser():
|
|
43
|
+
"""
|
|
44
|
+
Returns the argparse parser.
|
|
45
|
+
"""
|
|
46
|
+
parser = argparse.ArgumentParser(description="This daemon is responsible to make file list dumps. The rucio-auditor daemon use these dumps to discover dark data and check Rucio database consistency.")
|
|
47
|
+
format_args = parser.add_mutually_exclusive_group(required=False)
|
|
48
|
+
|
|
49
|
+
fields_or_hide = parser.add_mutually_exclusive_group(required=False)
|
|
50
|
+
fields_or_hide.add_argument('--fields', help='Comma separated list of fields that should be printed')
|
|
51
|
+
fields_or_hide.add_argument('--hide', help='Comma separated list of fields that should not be printed')
|
|
52
|
+
fields_or_hide.add_argument('--group-by', help='Group records, according to the the indicated fields FIXME')
|
|
53
|
+
|
|
54
|
+
# FIXME: Check that --group-by is given in order to use sum
|
|
55
|
+
parser.add_argument('--sum', help='Summatory of the values of the given fields (only numerical fields and should be used in combination with --group-by)')
|
|
56
|
+
|
|
57
|
+
common_args = (
|
|
58
|
+
('rse', 'Name of the RSE (Rucio endpoint)'),
|
|
59
|
+
('--date', 'Date of the dump (format dd-mm-yyyy or "latest") [defaults to "latest"]'),
|
|
60
|
+
('--filter', 'Filter by field value field=value,field2=value2,... (see --valid-fields)'),
|
|
61
|
+
('--valid-fields', 'Prints the valid fields for the selected dump and exits'),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
format_args.add_argument('--csv', action='store_true', help='Format the output as a CSV with headers')
|
|
65
|
+
format_args.add_argument('--csv-nohead', action='store_true', help='Format the output as a CSV without headers (default)', default=True)
|
|
66
|
+
format_args.add_argument('--tabulate', help='Format the output as a table (printing large tables can take several minutes)', choices=[str(fmt) for fmt in tabulate.tabulate_formats])
|
|
67
|
+
|
|
68
|
+
subparser = parser.add_subparsers(title='dump', help='dump data FIXME', dest='subcommand')
|
|
69
|
+
|
|
70
|
+
dds_parser = subparser.add_parser('dump-datasets', help='List the dump of all datasets for a given RSE')
|
|
71
|
+
dcdds_parser = subparser.add_parser('dump-complete-datasets', help='List the dump of all complete datasets for a given RSE')
|
|
72
|
+
dreplicas_parser = subparser.add_parser('dump-replicas', help='List the dump of all replicas for a given RSE')
|
|
73
|
+
consistency.populate_args(subparser)
|
|
74
|
+
|
|
75
|
+
for arg in common_args:
|
|
76
|
+
dds_parser.add_argument(arg[0], help=arg[1])
|
|
77
|
+
dcdds_parser.add_argument(arg[0], help=arg[1])
|
|
78
|
+
dreplicas_parser.add_argument(arg[0], help=arg[1])
|
|
79
|
+
return parser
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
if __name__ == "__main__":
|
|
83
|
+
parser = get_parser()
|
|
84
|
+
args = parser.parse_args()
|
|
85
|
+
|
|
86
|
+
if 'date' in args:
|
|
87
|
+
if args.date is None or args.date == 'latest':
|
|
88
|
+
args.date = 'latest'
|
|
89
|
+
else:
|
|
90
|
+
args.date = datetime.datetime.strptime(args.date, '%d-%m-%Y')
|
|
91
|
+
|
|
92
|
+
if args.subcommand == 'dump-datasets':
|
|
93
|
+
record_type = data_models.Dataset
|
|
94
|
+
elif args.subcommand == 'dump-complete-datasets':
|
|
95
|
+
record_type = data_models.CompleteDataset
|
|
96
|
+
elif args.subcommand == 'dump-replicas':
|
|
97
|
+
record_type = data_models.Replica
|
|
98
|
+
elif args.subcommand in consistency.subcommands:
|
|
99
|
+
record_type = consistency.Consistency
|
|
100
|
+
else:
|
|
101
|
+
raise ValueError("Record type not set! Cannot dump files.")
|
|
102
|
+
|
|
103
|
+
if 'filter' in args and args.filter:
|
|
104
|
+
user_filter = data_models.Filter(args.filter, record_type).match
|
|
105
|
+
else:
|
|
106
|
+
user_filter = None
|
|
107
|
+
|
|
108
|
+
if args.subcommand.startswith('dump-'):
|
|
109
|
+
data = record_type.dump(args.rse, args.date, filter_=user_filter)
|
|
110
|
+
else:
|
|
111
|
+
args_dict = consistency.parse_args(args)
|
|
112
|
+
data = record_type.dump(**args_dict)
|
|
113
|
+
|
|
114
|
+
fields = set(record_type.get_fieldnames())
|
|
115
|
+
|
|
116
|
+
if 'group_by' in args and args.group_by:
|
|
117
|
+
if args.group_by not in fields:
|
|
118
|
+
raise ValueError("Group_by option %s not supported." % args.group_by)
|
|
119
|
+
fields = [args.group_by]
|
|
120
|
+
data_iter = data
|
|
121
|
+
data_dict = {}
|
|
122
|
+
for record in data_iter:
|
|
123
|
+
key = getattr(record, args.group_by)
|
|
124
|
+
if key not in data_dict:
|
|
125
|
+
data_dict[key] = []
|
|
126
|
+
data_dict[key].append(record)
|
|
127
|
+
|
|
128
|
+
if 'sum' in args and args.sum:
|
|
129
|
+
if args.sum not in set(record_type.get_fieldnames()):
|
|
130
|
+
raise ValueError("Sum option %s for record type %s not supported.\nChoice from %s" % (args.sum, args.record_type, set(record_type.get_fieldnames())))
|
|
131
|
+
fields.append(args.sum)
|
|
132
|
+
data = []
|
|
133
|
+
for key, value in data_dict.items():
|
|
134
|
+
total = sum(getattr(x, args.sum) for x in value)
|
|
135
|
+
# FIXME: Ugly hack to have some result
|
|
136
|
+
setattr(value[0], args.sum, total)
|
|
137
|
+
data.append(value[0])
|
|
138
|
+
else:
|
|
139
|
+
data = data_dict.values()
|
|
140
|
+
|
|
141
|
+
if args.fields:
|
|
142
|
+
_show_fields = args.fields.split(',')
|
|
143
|
+
if not all(f in fields for f in _show_fields):
|
|
144
|
+
error('Invalid field in --fields argument')
|
|
145
|
+
fields = _show_fields
|
|
146
|
+
elif args.hide:
|
|
147
|
+
_hide_fields = args.hide.split(',')
|
|
148
|
+
if not all(f in fields for f in _hide_fields):
|
|
149
|
+
error('Invalid field in --hide argument')
|
|
150
|
+
fields = [f for f in fields if f not in _hide_fields]
|
|
151
|
+
|
|
152
|
+
if args.csv:
|
|
153
|
+
print(record_type.csv_header(fields))
|
|
154
|
+
for record in data:
|
|
155
|
+
print(record.csv(fields))
|
|
156
|
+
elif args.csv_nohead:
|
|
157
|
+
for record in data:
|
|
158
|
+
print(record.csv(fields))
|
|
159
|
+
elif args.tabulate:
|
|
160
|
+
print(record_type.tabulate_from(data, format_=args.tabulate, fields=fields))
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!python
|
|
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
|
+
Follower is a daemon to aggregate all the events affecting the dids
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import signal
|
|
22
|
+
|
|
23
|
+
from rucio.daemons.follower.follower import run, stop
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser()
|
|
31
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='Runs one loop iteration')
|
|
32
|
+
parser.add_argument("--threads", action="store", default=1, type=int, help='Concurrency control: total number of threads on this process')
|
|
33
|
+
return parser
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
if __name__ == "__main__":
|
|
37
|
+
signal.signal(signal.SIGTERM, stop)
|
|
38
|
+
|
|
39
|
+
parser = get_parser()
|
|
40
|
+
args = parser.parse_args()
|
|
41
|
+
try:
|
|
42
|
+
run(once=args.run_once, threads=args.threads)
|
|
43
|
+
except KeyboardInterrupt:
|
|
44
|
+
stop()
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!python
|
|
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
|
+
Hermes is a daemon that gets the messages and sends them to external services (influxDB, ES, ActiveMQ).
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import signal
|
|
22
|
+
|
|
23
|
+
from rucio.daemons.hermes.hermes import run, stop
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser(description="Hermes is a daemon that get the messages and sends them to external services (influxDB, ES, ActiveMQ).", formatter_class=argparse.RawDescriptionHelpFormatter, epilog='''
|
|
31
|
+
Run the daemon::
|
|
32
|
+
|
|
33
|
+
$ rucio-hermes --run-once
|
|
34
|
+
''')
|
|
35
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='One iteration only')
|
|
36
|
+
parser.add_argument("--threads", action="store", default=1, type=int, help='Concurrency control: number of threads')
|
|
37
|
+
parser.add_argument("--bulk", action="store", default=1000, type=int, help='Bulk control: number of requests per cycle')
|
|
38
|
+
parser.add_argument("--sleep-time", action="store", default=10, type=int, help='Delay control: second control per cycle')
|
|
39
|
+
return parser
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
if __name__ == "__main__":
|
|
43
|
+
|
|
44
|
+
signal.signal(signal.SIGTERM, stop)
|
|
45
|
+
|
|
46
|
+
parser = get_parser()
|
|
47
|
+
args = parser.parse_args()
|
|
48
|
+
try:
|
|
49
|
+
run(once=args.run_once,
|
|
50
|
+
threads=args.threads,
|
|
51
|
+
bulk=args.bulk,
|
|
52
|
+
sleep_time=args.sleep_time)
|
|
53
|
+
except KeyboardInterrupt:
|
|
54
|
+
stop()
|