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,206 @@
|
|
|
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 logging
|
|
18
|
+
import logging.handlers
|
|
19
|
+
import os
|
|
20
|
+
import signal
|
|
21
|
+
import sys
|
|
22
|
+
import textwrap
|
|
23
|
+
import time
|
|
24
|
+
from configparser import NoSectionError
|
|
25
|
+
from datetime import datetime
|
|
26
|
+
from functools import partial
|
|
27
|
+
from multiprocessing import Event, Pipe, Process, Queue
|
|
28
|
+
|
|
29
|
+
import rucio.common.config as config
|
|
30
|
+
import rucio.common.dumper as dumper
|
|
31
|
+
import rucio.daemons.auditor
|
|
32
|
+
from rucio.client.rseclient import RSEClient
|
|
33
|
+
from rucio.common.exception import RSENotFound
|
|
34
|
+
|
|
35
|
+
RETRY_AFTER = 60 * 60 * 24 * 14 # Two weeks
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def setup_pipe_logger(pipe, loglevel):
|
|
39
|
+
logger = logging.getLogger('auditor')
|
|
40
|
+
logger.setLevel(loglevel)
|
|
41
|
+
handler = dumper.LogPipeHandler(pipe)
|
|
42
|
+
logger.addHandler(handler)
|
|
43
|
+
|
|
44
|
+
formatter = logging.Formatter(
|
|
45
|
+
"%(asctime)s %(name)-22s %(levelname)-8s %(message)s"
|
|
46
|
+
)
|
|
47
|
+
handler.setFormatter(formatter)
|
|
48
|
+
return logger
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def main(args):
|
|
52
|
+
|
|
53
|
+
nprocs = args.nprocs
|
|
54
|
+
if nprocs < 1:
|
|
55
|
+
raise RuntimeError("No Processes to Run")
|
|
56
|
+
|
|
57
|
+
if args.rses is None:
|
|
58
|
+
rses_gen = RSEClient().list_rses()
|
|
59
|
+
else:
|
|
60
|
+
rses_gen = RSEClient().list_rses(args.rses)
|
|
61
|
+
|
|
62
|
+
rses = [entry['rse'] for entry in rses_gen]
|
|
63
|
+
if len(rses) <= 0:
|
|
64
|
+
raise RSENotFound("No RSEs found to audit.")
|
|
65
|
+
|
|
66
|
+
procs = []
|
|
67
|
+
queue = Queue()
|
|
68
|
+
retry = Queue()
|
|
69
|
+
terminate = Event()
|
|
70
|
+
logpipes = []
|
|
71
|
+
|
|
72
|
+
loglevel = logging.getLevelName(config.config_get('common', 'loglevel'))
|
|
73
|
+
|
|
74
|
+
mainlogr, mainlogw = Pipe(duplex=False)
|
|
75
|
+
logpipes.append(mainlogr)
|
|
76
|
+
logger = setup_pipe_logger(mainlogw, loglevel)
|
|
77
|
+
|
|
78
|
+
if not config.config_has_section('auditor'):
|
|
79
|
+
raise NoSectionError("Auditor section required in config to run the auditor daemon.")
|
|
80
|
+
|
|
81
|
+
cache_dir = config.config_get('auditor', 'cache')
|
|
82
|
+
results_dir = config.config_get('auditor', 'results')
|
|
83
|
+
|
|
84
|
+
logfilename = os.path.join(config.config_get('common', 'logdir'), 'auditor.log')
|
|
85
|
+
logger.info('Starting auditor')
|
|
86
|
+
|
|
87
|
+
def termhandler(sign, trace):
|
|
88
|
+
logger.error('Main process received signal %d, terminating child processes', sign)
|
|
89
|
+
terminate.set()
|
|
90
|
+
for proc in procs:
|
|
91
|
+
proc.join()
|
|
92
|
+
|
|
93
|
+
signal.signal(signal.SIGTERM, termhandler)
|
|
94
|
+
|
|
95
|
+
for n in range(nprocs):
|
|
96
|
+
logpiper, logpipew = Pipe(duplex=False)
|
|
97
|
+
p = Process(
|
|
98
|
+
target=partial(
|
|
99
|
+
rucio.daemons.auditor.check,
|
|
100
|
+
queue,
|
|
101
|
+
retry,
|
|
102
|
+
terminate,
|
|
103
|
+
logpipew,
|
|
104
|
+
cache_dir,
|
|
105
|
+
results_dir,
|
|
106
|
+
args.keep_dumps,
|
|
107
|
+
args.delta,
|
|
108
|
+
),
|
|
109
|
+
name='auditor-worker'
|
|
110
|
+
)
|
|
111
|
+
p.start()
|
|
112
|
+
procs.append(p)
|
|
113
|
+
logpipes.append(logpiper)
|
|
114
|
+
|
|
115
|
+
p = Process(
|
|
116
|
+
target=partial(
|
|
117
|
+
rucio.daemons.auditor.activity_logger,
|
|
118
|
+
logpipes,
|
|
119
|
+
logfilename,
|
|
120
|
+
terminate
|
|
121
|
+
),
|
|
122
|
+
name='auditor-logger'
|
|
123
|
+
)
|
|
124
|
+
p.start()
|
|
125
|
+
procs.append(p)
|
|
126
|
+
|
|
127
|
+
last_run_month = None # Don't check more than once per month. FIXME: Save on DB or file...
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
while all(p.is_alive() for p in procs):
|
|
131
|
+
while last_run_month == datetime.utcnow().month:
|
|
132
|
+
time.sleep(60 * 60 * 24)
|
|
133
|
+
|
|
134
|
+
for rse in rses:
|
|
135
|
+
queue.put((rse, 1))
|
|
136
|
+
|
|
137
|
+
time.sleep(RETRY_AFTER)
|
|
138
|
+
|
|
139
|
+
# Avoid infinite loop if an alternative check() implementation doesn't
|
|
140
|
+
# decrement the number of attempts and keeps pushing failed checks.
|
|
141
|
+
tmp_list = []
|
|
142
|
+
while not retry.empty():
|
|
143
|
+
tmp_list.append(retry.get())
|
|
144
|
+
|
|
145
|
+
for each in tmp_list:
|
|
146
|
+
queue.put(each)
|
|
147
|
+
|
|
148
|
+
except:
|
|
149
|
+
logging.error('Main process failed: %s', sys.exc_info()[0])
|
|
150
|
+
|
|
151
|
+
terminate.set()
|
|
152
|
+
for proc in procs:
|
|
153
|
+
proc.join()
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def get_parser():
|
|
157
|
+
"""
|
|
158
|
+
Returns the argparse parser.
|
|
159
|
+
"""
|
|
160
|
+
parser = argparse.ArgumentParser(description="The auditor daemon is the one responsible for the detection of inconsistencies on storage, i.e.: dark data discovery.",
|
|
161
|
+
formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
162
|
+
parser.add_argument(
|
|
163
|
+
'--nprocs',
|
|
164
|
+
help='Number subprocess, each subprocess check a fraction of the DDM '
|
|
165
|
+
'Endpoints in sequence (default: 1).',
|
|
166
|
+
default=1,
|
|
167
|
+
type=int,
|
|
168
|
+
)
|
|
169
|
+
parser.add_argument(
|
|
170
|
+
'--rses',
|
|
171
|
+
help='RSEs to check specified as a RSE expression, defaults to check '
|
|
172
|
+
'all the RSEs known to Rucio (default: check all RSEs).',
|
|
173
|
+
default=None,
|
|
174
|
+
type=str,
|
|
175
|
+
)
|
|
176
|
+
parser.add_argument(
|
|
177
|
+
'--keep-dumps',
|
|
178
|
+
help='Keep RSE and Rucio Replica Dumps on cache '
|
|
179
|
+
'(default: False).',
|
|
180
|
+
action='store_true',
|
|
181
|
+
)
|
|
182
|
+
parser.add_argument(
|
|
183
|
+
'--delta',
|
|
184
|
+
help='How many days older/newer than the RSE dump must the Rucio replica dumps be '
|
|
185
|
+
'(default: 3).',
|
|
186
|
+
default=3,
|
|
187
|
+
type=int,
|
|
188
|
+
)
|
|
189
|
+
parser.epilog = textwrap.dedent(r"""
|
|
190
|
+
examples:
|
|
191
|
+
# Check all RSEs using only 1 subprocess
|
|
192
|
+
%(prog)s
|
|
193
|
+
|
|
194
|
+
# Check all SCRATCHDISKs with 4 subprocesses
|
|
195
|
+
%(prog)s --nprocs 4 --rses "type=SCRATCHDISK"
|
|
196
|
+
|
|
197
|
+
# Check all Tier 2 DATADISKs, except "BLUE_DATADISK" and "RED_DATADISK"
|
|
198
|
+
%(prog)s --rses "tier=1&type=DATADISK\(BLUE_DATADISK|RED_DATADISK)"
|
|
199
|
+
""")
|
|
200
|
+
return parser
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
if __name__ == '__main__':
|
|
204
|
+
parser = get_parser()
|
|
205
|
+
args = parser.parse_args()
|
|
206
|
+
main(args)
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
Automatix (Dataset injector) Daemon
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import signal
|
|
22
|
+
|
|
23
|
+
from rucio.daemons.automatix.automatix import run, stop
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser(description="Automatix is a daemon used to inject random generated files to an RSE. It is used to continuously check that an RSE is reachable and operating as expected.")
|
|
31
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='Runs one loop iteration')
|
|
32
|
+
parser.add_argument("--input-file", action="store", default="/opt/rucio/etc/automatix.json", type=str, help='Automatix configuration')
|
|
33
|
+
parser.add_argument("--threads-per-process", action="store", default=1, type=int, help='Total number of workers per process')
|
|
34
|
+
parser.add_argument('--sleep-time', action="store", default=-1, type=int, help='Concurrency control: thread sleep time after each chunk of work')
|
|
35
|
+
return parser
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
if __name__ == "__main__":
|
|
39
|
+
|
|
40
|
+
# Bind our callback to the SIGTERM signal and run the daemon:
|
|
41
|
+
signal.signal(signal.SIGTERM, stop)
|
|
42
|
+
|
|
43
|
+
parser = get_parser()
|
|
44
|
+
args = parser.parse_args()
|
|
45
|
+
print('Start Automatix')
|
|
46
|
+
try:
|
|
47
|
+
run(total_workers=args.threads_per_process, once=args.run_once, inputfile=args.input_file,
|
|
48
|
+
sleep_time=args.sleep_time)
|
|
49
|
+
except KeyboardInterrupt:
|
|
50
|
+
stop()
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
BB8 is a daemon to rebalance data.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
|
|
22
|
+
from rucio.daemons.bb8.bb8 import run
|
|
23
|
+
from rucio.daemons.bb8.common import rebalance_rse
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser(description='The BB8 daemon is responsible for rebalancing data between RSEs.')
|
|
31
|
+
parser.add_argument('--rse', action='store', help='RSE to rebalance. Can be either a RSE or RSE expression.')
|
|
32
|
+
parser.add_argument('--bytes', action='store', type=int, help='Number of bytes to expected to be rebalanced. It is a goal without guarantees')
|
|
33
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='One iteration only')
|
|
34
|
+
parser.add_argument('--sleep-time', action="store", default=30, type=int, help='Concurrency control: thread sleep time after each chunk of work')
|
|
35
|
+
parser.add_argument("--threads", action="store", default=1, type=int, help='Concurrency control: total number of threads for this process')
|
|
36
|
+
parser.add_argument('--dry-run', action='store_true', default=False, help='Only run in dry-run mode')
|
|
37
|
+
parser.add_argument('--exclude-expression', action='store', help='Exclude these rse_expression from being destinations')
|
|
38
|
+
parser.add_argument('--comment', action='store', help='Add a comment to the new rules')
|
|
39
|
+
parser.add_argument('--force-expression', action='store', help='For this rse_expression for rebalanced rules instead of letting BB8 decide')
|
|
40
|
+
parser.add_argument('--decommission', action='store_true', help='Run BB8 in decommission mode')
|
|
41
|
+
parser.add_argument('--priority', action='store', help='Priority for the newly created rules', type=int, default=3)
|
|
42
|
+
parser.add_argument('--source-replica-expression', action='store', help='Source replica expression for the newly created rules')
|
|
43
|
+
return parser
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
if __name__ == "__main__":
|
|
47
|
+
parser = get_parser()
|
|
48
|
+
args = parser.parse_args()
|
|
49
|
+
|
|
50
|
+
if args.decommission:
|
|
51
|
+
rebalance_rse(rse_id=args.rse, max_bytes=args.bytes, dry_run=args.dry_run,
|
|
52
|
+
comment=args.comment, force_expression=args.force_expression,
|
|
53
|
+
priority=args.priority,
|
|
54
|
+
source_replica_expression=args.source_replica_expression,
|
|
55
|
+
mode='decommission')
|
|
56
|
+
else:
|
|
57
|
+
run(once=args.run_once, rse_expression=args.rse, move_subscriptions=False, use_dump=False, sleep_time=args.sleep_time, threads=args.threads, dry_run=args.dry_run)
|
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
Rucio Cache client.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import json
|
|
22
|
+
import os
|
|
23
|
+
import secrets
|
|
24
|
+
import ssl
|
|
25
|
+
import sys
|
|
26
|
+
|
|
27
|
+
import stomp
|
|
28
|
+
from jsonschema import validate
|
|
29
|
+
|
|
30
|
+
from rucio.client.didclient import DIDClient
|
|
31
|
+
from rucio.client.rseclient import RSEClient
|
|
32
|
+
from rucio.common.config import config_get_items, config_has_section
|
|
33
|
+
from rucio.common.exception import DataIdentifierNotFound
|
|
34
|
+
from rucio.common.schema import get_schema_value
|
|
35
|
+
|
|
36
|
+
SUCCESS = 0
|
|
37
|
+
FAILURE = 1
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def validate_files(files):
|
|
41
|
+
""" validate files metadata"""
|
|
42
|
+
client = DIDClient()
|
|
43
|
+
for file in files:
|
|
44
|
+
try:
|
|
45
|
+
metadata = client.get_metadata(file["scope"], file["name"])
|
|
46
|
+
except DataIdentifierNotFound:
|
|
47
|
+
err = "%s:%s not found in rucio catalog" % (file["scope"], file["name"])
|
|
48
|
+
raise Exception(err)
|
|
49
|
+
if int(metadata["bytes"]) != int(file["bytes"]) or metadata["adler32"] != file["adler32"]:
|
|
50
|
+
err = "%s:%s(bytes:%s, adler32:%s) has different size or checksum with metadata(bytes:%s, adler32:%s)" % (file["scope"], file["name"], file["bytes"], file["adler32"], metadata["bytes"], metadata["adler32"])
|
|
51
|
+
raise Exception(err)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def validate_rse(rse):
|
|
55
|
+
""" validate rse"""
|
|
56
|
+
# the rse should be volatile
|
|
57
|
+
client = RSEClient()
|
|
58
|
+
try:
|
|
59
|
+
rse_attributes = client.get_rse(rse)
|
|
60
|
+
except Exception as error:
|
|
61
|
+
raise Exception(error)
|
|
62
|
+
|
|
63
|
+
if not rse_attributes["volatile"]:
|
|
64
|
+
err = "%s volatile is not True, Rucio Cache should not update it." % (rse)
|
|
65
|
+
raise Exception(err)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def cache_operation(args):
|
|
69
|
+
""" cache operation"""
|
|
70
|
+
payload = json.loads(args.message)
|
|
71
|
+
validate(payload, get_schema_value('MESSAGE_OPERATION'))
|
|
72
|
+
validate_rse(payload["rse"])
|
|
73
|
+
if payload["operation"] == "add_replicas":
|
|
74
|
+
validate(payload, get_schema_value('CACHE_ADD_REPLICAS'))
|
|
75
|
+
validate_files(payload["files"])
|
|
76
|
+
else:
|
|
77
|
+
validate(payload, get_schema_value('CACHE_DELETE_REPLICAS'))
|
|
78
|
+
conn = stomp.Connection([(args.broker, args.port)])
|
|
79
|
+
conn.set_ssl(key_file=args.ssl_key_file, cert_file=args.ssl_cert_file, ssl_version=ssl.PROTOCOL_TLSv1)
|
|
80
|
+
|
|
81
|
+
conn.connect()
|
|
82
|
+
message = {'id': secrets.randbelow(1001), 'payload': payload}
|
|
83
|
+
conn.send(destination=args.destination, body=json.dumps(message), id='rucio-cache-messaging', ack='auto', headers={'vo': 'atlas'})
|
|
84
|
+
conn.disconnect()
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def get_parser():
|
|
88
|
+
"""
|
|
89
|
+
Returns the argparse parser.
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
message_help = """
|
|
93
|
+
Add replicas message:
|
|
94
|
+
{'files': [{'scope': scope, 'name': name, 'bytes': 1L, 'adler32': ''},
|
|
95
|
+
{'scope': scope, 'name': name, 'bytes': 1L, 'adler32': ''}, ...],
|
|
96
|
+
'rse': rse_cache_name,
|
|
97
|
+
'lifetime': seconds,
|
|
98
|
+
'operation': 'add_replicas'
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
Delete replicas message:
|
|
102
|
+
{'files': [{'scope': scope, 'name': name}, {'scope': scope, 'name': name}, ...],
|
|
103
|
+
'rse': rse_cache_name,
|
|
104
|
+
'operation': 'delete_replicas'
|
|
105
|
+
}
|
|
106
|
+
"""
|
|
107
|
+
description = "This daemon is used to populate information of replicas on volatile storage."
|
|
108
|
+
|
|
109
|
+
if not config_has_section("message-cache"):
|
|
110
|
+
defaults = {}
|
|
111
|
+
message_append = "WARNING: section 'messaging-cache' not present in config! All arguments must be manually set!\n"
|
|
112
|
+
description = message_append + description
|
|
113
|
+
else:
|
|
114
|
+
defaults = config_get_items("message-cache")
|
|
115
|
+
|
|
116
|
+
oparser = argparse.ArgumentParser(description=description, prog=os.path.basename(sys.argv[0]), add_help=True)
|
|
117
|
+
|
|
118
|
+
# Main arguments
|
|
119
|
+
oparser.add_argument('-b', '--broker', dest='broker', default=defaults.get('brokers', '').split(',')[0], help='Message broker name')
|
|
120
|
+
oparser.add_argument('-p', '--port', dest='port', type=int, default=defaults.get('port'), help='Message broker port')
|
|
121
|
+
oparser.add_argument('-c', '--certificate', dest='ssl_cert_file', default=defaults.get('ssl_cert_file'), help='Certificate file')
|
|
122
|
+
oparser.add_argument('-k', '--certificate-key', dest='ssl_key_file', default=defaults.get('ssl_key_file'), help='Certificate key file')
|
|
123
|
+
oparser.add_argument('-d', '--destination', dest='destination', default=defaults.get('destination'), help="Message broker topic")
|
|
124
|
+
oparser.add_argument('-m', '--message', dest='message', default=None, help=message_help)
|
|
125
|
+
return oparser
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
if __name__ == '__main__':
|
|
129
|
+
|
|
130
|
+
oparser = get_parser()
|
|
131
|
+
if len(sys.argv) == 1:
|
|
132
|
+
oparser.print_help()
|
|
133
|
+
sys.exit(FAILURE)
|
|
134
|
+
|
|
135
|
+
args = oparser.parse_args(sys.argv[1:])
|
|
136
|
+
try:
|
|
137
|
+
result = cache_operation(args)
|
|
138
|
+
sys.exit(result)
|
|
139
|
+
except (RuntimeError, NotImplementedError) as e:
|
|
140
|
+
print("ERROR: ", e, file=sys.stderr)
|
|
141
|
+
sys.exit(FAILURE)
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
Rucio Cache Consumer is a daemon to add/delete cache replicas to Rucio catalog.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import signal
|
|
22
|
+
|
|
23
|
+
from rucio.daemons.cache.consumer import run, stop
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser(description="Rucio Cache Consumer is a daemon to add/delete cache replicas to Rucio catalog.")
|
|
31
|
+
parser.add_argument("--num-thread", action="store", default=1, type=int, help='Concurrency control: threads number')
|
|
32
|
+
return parser
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
if __name__ == "__main__":
|
|
36
|
+
signal.signal(signal.SIGTERM, stop)
|
|
37
|
+
parser = get_parser()
|
|
38
|
+
args = parser.parse_args()
|
|
39
|
+
try:
|
|
40
|
+
run(args.num_thread)
|
|
41
|
+
except KeyboardInterrupt:
|
|
42
|
+
stop()
|
|
@@ -0,0 +1,58 @@
|
|
|
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.finisher import run, stop
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_parser():
|
|
27
|
+
"""
|
|
28
|
+
Returns the argparse parser.
|
|
29
|
+
"""
|
|
30
|
+
parser = argparse.ArgumentParser(description="Conveyor is a group of daemons to manage file transfers. The conveyor-finisher is the responsible to update Rucio internal state after the transfer has finished.")
|
|
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("--db-bulk", action="store", default=1000, type=int,
|
|
36
|
+
help='Bulk control: number of transfers per db query')
|
|
37
|
+
parser.add_argument("--bulk", action="store", default=100, type=int,
|
|
38
|
+
help='Bulk control: number of requests')
|
|
39
|
+
parser.add_argument('--sleep-time', action="store", default=30, type=int,
|
|
40
|
+
help='Seconds to sleep if few requests')
|
|
41
|
+
parser.add_argument('--activities', nargs='+', type=str,
|
|
42
|
+
help='Explicit list of activities to include')
|
|
43
|
+
return parser
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
if __name__ == "__main__":
|
|
47
|
+
signal.signal(signal.SIGTERM, stop)
|
|
48
|
+
parser = get_parser()
|
|
49
|
+
args = parser.parse_args()
|
|
50
|
+
try:
|
|
51
|
+
run(once=args.run_once,
|
|
52
|
+
total_threads=args.total_threads,
|
|
53
|
+
sleep_time=args.sleep_time,
|
|
54
|
+
activities=args.activities,
|
|
55
|
+
db_bulk=args.db_bulk,
|
|
56
|
+
bulk=args.bulk)
|
|
57
|
+
except KeyboardInterrupt:
|
|
58
|
+
stop()
|
|
@@ -0,0 +1,66 @@
|
|
|
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.poller 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-poller is in charge of poll the transfer tool to check if the submitted transfers are already done.")
|
|
31
|
+
parser.add_argument("--run-once", action="store_true", default=False,
|
|
32
|
+
help='One iteration only')
|
|
33
|
+
parser.add_argument("--fts-bulk", action="store", default=100, type=int,
|
|
34
|
+
help='Bulk control: number of transfers per FTS query')
|
|
35
|
+
parser.add_argument("--db-bulk", action="store", default=1000, type=int,
|
|
36
|
+
help='Bulk control: number of transfers per db query')
|
|
37
|
+
parser.add_argument("--older-than", action="store", default=60, type=int,
|
|
38
|
+
help='Poll control: older request more than this value to poll')
|
|
39
|
+
parser.add_argument('--sleep-time', action="store", default=300, type=int,
|
|
40
|
+
help='Seconds to sleep if few requests')
|
|
41
|
+
parser.add_argument('--activities', nargs='+', type=str,
|
|
42
|
+
help='Explicit list of activities to include')
|
|
43
|
+
parser.add_argument('--activity-shares', action='store', default=None, type=str,
|
|
44
|
+
help='JSON-encoded string of an activity shares dictionary {"act_1": 0.2, "act_2": 0.4, ...}')
|
|
45
|
+
parser.add_argument('--total-threads', action="store", default=1, type=int,
|
|
46
|
+
help='Concurrency control: total number of threads for this process')
|
|
47
|
+
|
|
48
|
+
return parser
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
if __name__ == "__main__":
|
|
52
|
+
|
|
53
|
+
signal.signal(signal.SIGTERM, stop)
|
|
54
|
+
parser = get_parser()
|
|
55
|
+
args = parser.parse_args()
|
|
56
|
+
try:
|
|
57
|
+
run(once=args.run_once,
|
|
58
|
+
fts_bulk=args.fts_bulk,
|
|
59
|
+
db_bulk=args.db_bulk,
|
|
60
|
+
older_than=args.older_than,
|
|
61
|
+
sleep_time=args.sleep_time,
|
|
62
|
+
activities=args.activities,
|
|
63
|
+
activity_shares=args.activity_shares,
|
|
64
|
+
total_threads=args.total_threads)
|
|
65
|
+
except KeyboardInterrupt:
|
|
66
|
+
stop()
|
|
@@ -0,0 +1,37 @@
|
|
|
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 signal
|
|
18
|
+
|
|
19
|
+
from rucio.daemons.conveyor.preparer import run, stop
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def main(args):
|
|
23
|
+
signal.signal(signal.SIGTERM, stop)
|
|
24
|
+
try:
|
|
25
|
+
run(once=args.run_once, threads=args.threads, sleep_time=args.sleep_time, bulk=args.bulk, ignore_availability=args.ignore_availability)
|
|
26
|
+
except KeyboardInterrupt:
|
|
27
|
+
stop()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
if __name__ == "__main__":
|
|
31
|
+
parser = argparse.ArgumentParser()
|
|
32
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='One iteration only')
|
|
33
|
+
parser.add_argument("--threads", action="store", default=1, type=int, help='Concurrency control: total number of threads on this process')
|
|
34
|
+
parser.add_argument("--sleep-time", action="store", default=60, type=int, help='Concurrency control: thread sleep time after each chunk of work')
|
|
35
|
+
parser.add_argument("--bulk", action="store", default=100, type=int, help='Limit of requests per chunk')
|
|
36
|
+
parser.add_argument('--ignore-availability', action="store_true", default=False, help='If True, will also try to submit transfers having blocklisted RSEs as sources')
|
|
37
|
+
main(args=parser.parse_args())
|