rucio 32.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rucio might be problematic. Click here for more details.
- rucio/__init__.py +18 -0
- rucio/alembicrevision.py +16 -0
- rucio/api/__init__.py +14 -0
- rucio/api/account.py +266 -0
- rucio/api/account_limit.py +287 -0
- rucio/api/authentication.py +302 -0
- rucio/api/config.py +218 -0
- rucio/api/credential.py +60 -0
- rucio/api/did.py +726 -0
- rucio/api/dirac.py +71 -0
- rucio/api/exporter.py +60 -0
- rucio/api/heartbeat.py +62 -0
- rucio/api/identity.py +160 -0
- rucio/api/importer.py +46 -0
- rucio/api/lifetime_exception.py +95 -0
- rucio/api/lock.py +131 -0
- rucio/api/meta.py +85 -0
- rucio/api/permission.py +72 -0
- rucio/api/quarantined_replica.py +69 -0
- rucio/api/replica.py +528 -0
- rucio/api/request.py +220 -0
- rucio/api/rse.py +601 -0
- rucio/api/rule.py +335 -0
- rucio/api/scope.py +89 -0
- rucio/api/subscription.py +255 -0
- rucio/api/temporary_did.py +49 -0
- rucio/api/vo.py +112 -0
- rucio/client/__init__.py +16 -0
- rucio/client/accountclient.py +413 -0
- rucio/client/accountlimitclient.py +155 -0
- rucio/client/baseclient.py +929 -0
- rucio/client/client.py +77 -0
- rucio/client/configclient.py +113 -0
- rucio/client/credentialclient.py +54 -0
- rucio/client/didclient.py +691 -0
- rucio/client/diracclient.py +48 -0
- rucio/client/downloadclient.py +1674 -0
- rucio/client/exportclient.py +44 -0
- rucio/client/fileclient.py +51 -0
- rucio/client/importclient.py +42 -0
- rucio/client/lifetimeclient.py +74 -0
- rucio/client/lockclient.py +99 -0
- rucio/client/metaclient.py +137 -0
- rucio/client/pingclient.py +45 -0
- rucio/client/replicaclient.py +444 -0
- rucio/client/requestclient.py +109 -0
- rucio/client/rseclient.py +664 -0
- rucio/client/ruleclient.py +287 -0
- rucio/client/scopeclient.py +88 -0
- rucio/client/subscriptionclient.py +161 -0
- rucio/client/touchclient.py +78 -0
- rucio/client/uploadclient.py +871 -0
- rucio/common/__init__.py +14 -0
- rucio/common/cache.py +74 -0
- rucio/common/config.py +796 -0
- rucio/common/constants.py +92 -0
- rucio/common/constraints.py +18 -0
- rucio/common/didtype.py +187 -0
- rucio/common/dumper/__init__.py +306 -0
- rucio/common/dumper/consistency.py +449 -0
- rucio/common/dumper/data_models.py +325 -0
- rucio/common/dumper/path_parsing.py +65 -0
- rucio/common/exception.py +1092 -0
- rucio/common/extra.py +37 -0
- rucio/common/logging.py +404 -0
- rucio/common/pcache.py +1387 -0
- rucio/common/policy.py +84 -0
- rucio/common/schema/__init__.py +143 -0
- rucio/common/schema/atlas.py +411 -0
- rucio/common/schema/belleii.py +406 -0
- rucio/common/schema/cms.py +478 -0
- rucio/common/schema/domatpc.py +399 -0
- rucio/common/schema/escape.py +424 -0
- rucio/common/schema/generic.py +431 -0
- rucio/common/schema/generic_multi_vo.py +410 -0
- rucio/common/schema/icecube.py +404 -0
- rucio/common/schema/lsst.py +423 -0
- rucio/common/stomp_utils.py +160 -0
- rucio/common/stopwatch.py +56 -0
- rucio/common/test_rucio_server.py +148 -0
- rucio/common/types.py +158 -0
- rucio/common/utils.py +1946 -0
- rucio/core/__init__.py +14 -0
- rucio/core/account.py +426 -0
- rucio/core/account_counter.py +171 -0
- rucio/core/account_limit.py +357 -0
- rucio/core/authentication.py +563 -0
- rucio/core/config.py +386 -0
- rucio/core/credential.py +218 -0
- rucio/core/did.py +3102 -0
- rucio/core/did_meta_plugins/__init__.py +250 -0
- rucio/core/did_meta_plugins/did_column_meta.py +326 -0
- rucio/core/did_meta_plugins/did_meta_plugin_interface.py +116 -0
- rucio/core/did_meta_plugins/filter_engine.py +573 -0
- rucio/core/did_meta_plugins/json_meta.py +215 -0
- rucio/core/did_meta_plugins/mongo_meta.py +199 -0
- rucio/core/did_meta_plugins/postgres_meta.py +317 -0
- rucio/core/dirac.py +208 -0
- rucio/core/distance.py +164 -0
- rucio/core/exporter.py +59 -0
- rucio/core/heartbeat.py +263 -0
- rucio/core/identity.py +290 -0
- rucio/core/importer.py +248 -0
- rucio/core/lifetime_exception.py +377 -0
- rucio/core/lock.py +474 -0
- rucio/core/message.py +241 -0
- rucio/core/meta.py +190 -0
- rucio/core/monitor.py +441 -0
- rucio/core/naming_convention.py +154 -0
- rucio/core/nongrid_trace.py +124 -0
- rucio/core/oidc.py +1339 -0
- rucio/core/permission/__init__.py +107 -0
- rucio/core/permission/atlas.py +1333 -0
- rucio/core/permission/belleii.py +1076 -0
- rucio/core/permission/cms.py +1166 -0
- rucio/core/permission/escape.py +1076 -0
- rucio/core/permission/generic.py +1128 -0
- rucio/core/permission/generic_multi_vo.py +1148 -0
- rucio/core/quarantined_replica.py +190 -0
- rucio/core/replica.py +3627 -0
- rucio/core/replica_sorter.py +368 -0
- rucio/core/request.py +2241 -0
- rucio/core/rse.py +1835 -0
- rucio/core/rse_counter.py +155 -0
- rucio/core/rse_expression_parser.py +460 -0
- rucio/core/rse_selector.py +277 -0
- rucio/core/rule.py +3419 -0
- rucio/core/rule_grouping.py +1473 -0
- rucio/core/scope.py +152 -0
- rucio/core/subscription.py +316 -0
- rucio/core/temporary_did.py +188 -0
- rucio/core/topology.py +448 -0
- rucio/core/trace.py +361 -0
- rucio/core/transfer.py +1233 -0
- rucio/core/vo.py +151 -0
- rucio/core/volatile_replica.py +123 -0
- rucio/daemons/__init__.py +14 -0
- rucio/daemons/abacus/__init__.py +14 -0
- rucio/daemons/abacus/account.py +106 -0
- rucio/daemons/abacus/collection_replica.py +113 -0
- rucio/daemons/abacus/rse.py +107 -0
- rucio/daemons/atropos/__init__.py +14 -0
- rucio/daemons/atropos/atropos.py +243 -0
- rucio/daemons/auditor/__init__.py +261 -0
- rucio/daemons/auditor/hdfs.py +86 -0
- rucio/daemons/auditor/srmdumps.py +284 -0
- rucio/daemons/automatix/__init__.py +14 -0
- rucio/daemons/automatix/automatix.py +281 -0
- rucio/daemons/badreplicas/__init__.py +14 -0
- rucio/daemons/badreplicas/minos.py +311 -0
- rucio/daemons/badreplicas/minos_temporary_expiration.py +173 -0
- rucio/daemons/badreplicas/necromancer.py +200 -0
- rucio/daemons/bb8/__init__.py +14 -0
- rucio/daemons/bb8/bb8.py +356 -0
- rucio/daemons/bb8/common.py +762 -0
- rucio/daemons/bb8/nuclei_background_rebalance.py +147 -0
- rucio/daemons/bb8/t2_background_rebalance.py +146 -0
- rucio/daemons/c3po/__init__.py +14 -0
- rucio/daemons/c3po/algorithms/__init__.py +14 -0
- rucio/daemons/c3po/algorithms/simple.py +131 -0
- rucio/daemons/c3po/algorithms/t2_free_space.py +125 -0
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +127 -0
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +279 -0
- rucio/daemons/c3po/c3po.py +342 -0
- rucio/daemons/c3po/collectors/__init__.py +14 -0
- rucio/daemons/c3po/collectors/agis.py +108 -0
- rucio/daemons/c3po/collectors/free_space.py +62 -0
- rucio/daemons/c3po/collectors/jedi_did.py +48 -0
- rucio/daemons/c3po/collectors/mock_did.py +46 -0
- rucio/daemons/c3po/collectors/network_metrics.py +63 -0
- rucio/daemons/c3po/collectors/workload.py +110 -0
- rucio/daemons/c3po/utils/__init__.py +14 -0
- rucio/daemons/c3po/utils/dataset_cache.py +40 -0
- rucio/daemons/c3po/utils/expiring_dataset_cache.py +45 -0
- rucio/daemons/c3po/utils/expiring_list.py +63 -0
- rucio/daemons/c3po/utils/popularity.py +82 -0
- rucio/daemons/c3po/utils/timeseries.py +76 -0
- rucio/daemons/cache/__init__.py +14 -0
- rucio/daemons/cache/consumer.py +191 -0
- rucio/daemons/common.py +391 -0
- rucio/daemons/conveyor/__init__.py +14 -0
- rucio/daemons/conveyor/common.py +530 -0
- rucio/daemons/conveyor/finisher.py +492 -0
- rucio/daemons/conveyor/poller.py +372 -0
- rucio/daemons/conveyor/preparer.py +198 -0
- rucio/daemons/conveyor/receiver.py +206 -0
- rucio/daemons/conveyor/stager.py +127 -0
- rucio/daemons/conveyor/submitter.py +379 -0
- rucio/daemons/conveyor/throttler.py +468 -0
- rucio/daemons/follower/__init__.py +14 -0
- rucio/daemons/follower/follower.py +97 -0
- rucio/daemons/hermes/__init__.py +14 -0
- rucio/daemons/hermes/hermes.py +738 -0
- rucio/daemons/judge/__init__.py +14 -0
- rucio/daemons/judge/cleaner.py +149 -0
- rucio/daemons/judge/evaluator.py +172 -0
- rucio/daemons/judge/injector.py +154 -0
- rucio/daemons/judge/repairer.py +144 -0
- rucio/daemons/oauthmanager/__init__.py +14 -0
- rucio/daemons/oauthmanager/oauthmanager.py +199 -0
- rucio/daemons/reaper/__init__.py +14 -0
- rucio/daemons/reaper/dark_reaper.py +272 -0
- rucio/daemons/reaper/light_reaper.py +255 -0
- rucio/daemons/reaper/reaper.py +701 -0
- rucio/daemons/replicarecoverer/__init__.py +14 -0
- rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +487 -0
- rucio/daemons/storage/__init__.py +14 -0
- rucio/daemons/storage/consistency/__init__.py +14 -0
- rucio/daemons/storage/consistency/actions.py +753 -0
- rucio/daemons/tracer/__init__.py +14 -0
- rucio/daemons/tracer/kronos.py +513 -0
- rucio/daemons/transmogrifier/__init__.py +14 -0
- rucio/daemons/transmogrifier/transmogrifier.py +753 -0
- rucio/daemons/undertaker/__init__.py +14 -0
- rucio/daemons/undertaker/undertaker.py +137 -0
- rucio/db/__init__.py +14 -0
- rucio/db/sqla/__init__.py +38 -0
- rucio/db/sqla/constants.py +192 -0
- rucio/db/sqla/migrate_repo/__init__.py +14 -0
- rucio/db/sqla/migrate_repo/env.py +111 -0
- rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +71 -0
- rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +50 -0
- rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +61 -0
- rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +46 -0
- rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +93 -0
- rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +78 -0
- rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +46 -0
- rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +53 -0
- rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +69 -0
- rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +42 -0
- rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +46 -0
- rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +61 -0
- rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +42 -0
- rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +141 -0
- rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +75 -0
- rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +75 -0
- rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +46 -0
- rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +51 -0
- rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +135 -0
- rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +65 -0
- rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +42 -0
- rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +66 -0
- rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +54 -0
- rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +43 -0
- rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +46 -0
- rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +47 -0
- rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +54 -0
- rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +39 -0
- rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +48 -0
- rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +47 -0
- rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +48 -0
- rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +59 -0
- rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +47 -0
- rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +72 -0
- rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +46 -0
- rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +45 -0
- rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +48 -0
- rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +48 -0
- rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +42 -0
- rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +69 -0
- rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +46 -0
- rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +78 -0
- rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +62 -0
- rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +74 -0
- rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +44 -0
- rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +67 -0
- rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +134 -0
- rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +58 -0
- rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +79 -0
- rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +61 -0
- rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +45 -0
- rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +46 -0
- rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +65 -0
- rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +42 -0
- rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +46 -0
- rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +46 -0
- rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +80 -0
- rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +43 -0
- rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +61 -0
- rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +47 -0
- rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +46 -0
- rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +52 -0
- rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +42 -0
- rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +65 -0
- rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +46 -0
- rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +47 -0
- rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +45 -0
- rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +46 -0
- rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +48 -0
- rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +50 -0
- rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +59 -0
- rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +48 -0
- rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +108 -0
- rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +57 -0
- rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +51 -0
- rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +50 -0
- rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +46 -0
- rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +42 -0
- rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +93 -0
- rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +73 -0
- rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +52 -0
- rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +45 -0
- rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +46 -0
- rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +54 -0
- rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +48 -0
- rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +70 -0
- rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +48 -0
- rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +95 -0
- rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +74 -0
- rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +78 -0
- rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +49 -0
- rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +124 -0
- rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +60 -0
- rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +53 -0
- rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +56 -0
- rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +67 -0
- rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +50 -0
- rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +46 -0
- rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +92 -0
- rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +42 -0
- rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +46 -0
- rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +147 -0
- rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +78 -0
- rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +53 -0
- rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +74 -0
- rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +56 -0
- rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +46 -0
- rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +68 -0
- rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +48 -0
- rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +149 -0
- rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +106 -0
- rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +47 -0
- rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +45 -0
- rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +105 -0
- rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +52 -0
- rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +106 -0
- rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +30 -0
- rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +75 -0
- rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +49 -0
- rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +45 -0
- rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +38 -0
- rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +44 -0
- rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +46 -0
- rucio/db/sqla/models.py +1834 -0
- rucio/db/sqla/sautils.py +48 -0
- rucio/db/sqla/session.py +470 -0
- rucio/db/sqla/types.py +207 -0
- rucio/db/sqla/util.py +521 -0
- rucio/rse/__init__.py +97 -0
- rucio/rse/protocols/__init__.py +14 -0
- rucio/rse/protocols/cache.py +123 -0
- rucio/rse/protocols/dummy.py +112 -0
- rucio/rse/protocols/gfal.py +701 -0
- rucio/rse/protocols/globus.py +243 -0
- rucio/rse/protocols/gsiftp.py +93 -0
- rucio/rse/protocols/http_cache.py +83 -0
- rucio/rse/protocols/mock.py +124 -0
- rucio/rse/protocols/ngarc.py +210 -0
- rucio/rse/protocols/posix.py +251 -0
- rucio/rse/protocols/protocol.py +530 -0
- rucio/rse/protocols/rclone.py +365 -0
- rucio/rse/protocols/rfio.py +137 -0
- rucio/rse/protocols/srm.py +339 -0
- rucio/rse/protocols/ssh.py +414 -0
- rucio/rse/protocols/storm.py +207 -0
- rucio/rse/protocols/webdav.py +547 -0
- rucio/rse/protocols/xrootd.py +295 -0
- rucio/rse/rsemanager.py +752 -0
- rucio/tests/__init__.py +14 -0
- rucio/tests/common.py +244 -0
- rucio/tests/common_server.py +132 -0
- rucio/transfertool/__init__.py +14 -0
- rucio/transfertool/fts3.py +1484 -0
- rucio/transfertool/globus.py +200 -0
- rucio/transfertool/globus_library.py +182 -0
- rucio/transfertool/mock.py +81 -0
- rucio/transfertool/transfertool.py +212 -0
- rucio/vcsversion.py +11 -0
- rucio/version.py +46 -0
- rucio/web/__init__.py +14 -0
- rucio/web/rest/__init__.py +14 -0
- rucio/web/rest/flaskapi/__init__.py +14 -0
- rucio/web/rest/flaskapi/authenticated_bp.py +28 -0
- rucio/web/rest/flaskapi/v1/__init__.py +14 -0
- rucio/web/rest/flaskapi/v1/accountlimits.py +234 -0
- rucio/web/rest/flaskapi/v1/accounts.py +1088 -0
- rucio/web/rest/flaskapi/v1/archives.py +100 -0
- rucio/web/rest/flaskapi/v1/auth.py +1642 -0
- rucio/web/rest/flaskapi/v1/common.py +385 -0
- rucio/web/rest/flaskapi/v1/config.py +305 -0
- rucio/web/rest/flaskapi/v1/credentials.py +213 -0
- rucio/web/rest/flaskapi/v1/dids.py +2204 -0
- rucio/web/rest/flaskapi/v1/dirac.py +116 -0
- rucio/web/rest/flaskapi/v1/export.py +77 -0
- rucio/web/rest/flaskapi/v1/heartbeats.py +129 -0
- rucio/web/rest/flaskapi/v1/identities.py +263 -0
- rucio/web/rest/flaskapi/v1/import.py +133 -0
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +315 -0
- rucio/web/rest/flaskapi/v1/locks.py +360 -0
- rucio/web/rest/flaskapi/v1/main.py +83 -0
- rucio/web/rest/flaskapi/v1/meta.py +226 -0
- rucio/web/rest/flaskapi/v1/metrics.py +37 -0
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +97 -0
- rucio/web/rest/flaskapi/v1/ping.py +89 -0
- rucio/web/rest/flaskapi/v1/redirect.py +366 -0
- rucio/web/rest/flaskapi/v1/replicas.py +1866 -0
- rucio/web/rest/flaskapi/v1/requests.py +841 -0
- rucio/web/rest/flaskapi/v1/rses.py +2204 -0
- rucio/web/rest/flaskapi/v1/rules.py +824 -0
- rucio/web/rest/flaskapi/v1/scopes.py +161 -0
- rucio/web/rest/flaskapi/v1/subscriptions.py +646 -0
- rucio/web/rest/flaskapi/v1/templates/auth_crash.html +80 -0
- rucio/web/rest/flaskapi/v1/templates/auth_granted.html +82 -0
- rucio/web/rest/flaskapi/v1/tmp_dids.py +115 -0
- rucio/web/rest/flaskapi/v1/traces.py +100 -0
- rucio/web/rest/flaskapi/v1/vos.py +280 -0
- rucio/web/rest/main.py +19 -0
- rucio/web/rest/metrics.py +28 -0
- rucio-32.8.6.data/data/rucio/etc/alembic.ini.template +71 -0
- rucio-32.8.6.data/data/rucio/etc/alembic_offline.ini.template +74 -0
- rucio-32.8.6.data/data/rucio/etc/globus-config.yml.template +5 -0
- rucio-32.8.6.data/data/rucio/etc/ldap.cfg.template +30 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approval_request.tmpl +38 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +4 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_approved_user.tmpl +17 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +6 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_denied_user.tmpl +17 -0
- rucio-32.8.6.data/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +19 -0
- rucio-32.8.6.data/data/rucio/etc/rse-accounts.cfg.template +25 -0
- rucio-32.8.6.data/data/rucio/etc/rucio.cfg.atlas.client.template +42 -0
- rucio-32.8.6.data/data/rucio/etc/rucio.cfg.template +257 -0
- rucio-32.8.6.data/data/rucio/etc/rucio_multi_vo.cfg.template +234 -0
- rucio-32.8.6.data/data/rucio/requirements.txt +55 -0
- rucio-32.8.6.data/data/rucio/tools/bootstrap.py +34 -0
- rucio-32.8.6.data/data/rucio/tools/merge_rucio_configs.py +147 -0
- rucio-32.8.6.data/data/rucio/tools/reset_database.py +40 -0
- rucio-32.8.6.data/scripts/rucio +2540 -0
- rucio-32.8.6.data/scripts/rucio-abacus-account +75 -0
- rucio-32.8.6.data/scripts/rucio-abacus-collection-replica +47 -0
- rucio-32.8.6.data/scripts/rucio-abacus-rse +79 -0
- rucio-32.8.6.data/scripts/rucio-admin +2434 -0
- rucio-32.8.6.data/scripts/rucio-atropos +61 -0
- rucio-32.8.6.data/scripts/rucio-auditor +199 -0
- rucio-32.8.6.data/scripts/rucio-automatix +51 -0
- rucio-32.8.6.data/scripts/rucio-bb8 +58 -0
- rucio-32.8.6.data/scripts/rucio-c3po +86 -0
- rucio-32.8.6.data/scripts/rucio-cache-client +135 -0
- rucio-32.8.6.data/scripts/rucio-cache-consumer +43 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-finisher +59 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-poller +67 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-preparer +38 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-receiver +44 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-stager +77 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-submitter +140 -0
- rucio-32.8.6.data/scripts/rucio-conveyor-throttler +105 -0
- rucio-32.8.6.data/scripts/rucio-dark-reaper +54 -0
- rucio-32.8.6.data/scripts/rucio-dumper +159 -0
- rucio-32.8.6.data/scripts/rucio-follower +45 -0
- rucio-32.8.6.data/scripts/rucio-hermes +55 -0
- rucio-32.8.6.data/scripts/rucio-judge-cleaner +90 -0
- rucio-32.8.6.data/scripts/rucio-judge-evaluator +138 -0
- rucio-32.8.6.data/scripts/rucio-judge-injector +45 -0
- rucio-32.8.6.data/scripts/rucio-judge-repairer +45 -0
- rucio-32.8.6.data/scripts/rucio-kronos +45 -0
- rucio-32.8.6.data/scripts/rucio-light-reaper +53 -0
- rucio-32.8.6.data/scripts/rucio-minos +54 -0
- rucio-32.8.6.data/scripts/rucio-minos-temporary-expiration +51 -0
- rucio-32.8.6.data/scripts/rucio-necromancer +121 -0
- rucio-32.8.6.data/scripts/rucio-oauth-manager +64 -0
- rucio-32.8.6.data/scripts/rucio-reaper +84 -0
- rucio-32.8.6.data/scripts/rucio-replica-recoverer +249 -0
- rucio-32.8.6.data/scripts/rucio-storage-consistency-actions +75 -0
- rucio-32.8.6.data/scripts/rucio-transmogrifier +78 -0
- rucio-32.8.6.data/scripts/rucio-undertaker +77 -0
- rucio-32.8.6.dist-info/METADATA +83 -0
- rucio-32.8.6.dist-info/RECORD +481 -0
- rucio-32.8.6.dist-info/WHEEL +5 -0
- rucio-32.8.6.dist-info/licenses/AUTHORS.rst +94 -0
- rucio-32.8.6.dist-info/licenses/LICENSE +201 -0
- rucio-32.8.6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
'''
|
|
18
|
+
Atropos Daemon : End the life of the rules according to the Lifetime Model
|
|
19
|
+
'''
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
import datetime
|
|
23
|
+
import signal
|
|
24
|
+
|
|
25
|
+
from rucio.daemons.atropos.atropos import run, stop
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_parser() -> argparse.ArgumentParser:
|
|
29
|
+
"""
|
|
30
|
+
Returns the argparse parser.
|
|
31
|
+
"""
|
|
32
|
+
parser = argparse.ArgumentParser(description='The Atropos Daemon is responsible for the deletion of rules with expired eol_at (end the life at), according to the Lifetime Model. Once the rule is deleted, the replicas covered by the rule will not be protected anymore and eventually, will be deleted by another daemon.') # noqa E501
|
|
33
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='Runs one loop iteration')
|
|
34
|
+
parser.add_argument("--dry-run", action="store_true", default=False, help='Dry run mode')
|
|
35
|
+
parser.add_argument("--threads", action="store", default=1, type=int, help='Concurrency control: number of threads')
|
|
36
|
+
parser.add_argument("--grace-period", action="store", default=86400, type=int, help='Grace period for the rules. In seconds !!!')
|
|
37
|
+
parser.add_argument("--date-check", action="store", help='Date when the lifetime model will be applied. Cannot be used for a date in the future if dry-run is not enabled',
|
|
38
|
+
default=datetime.datetime.utcnow(), type=lambda d: datetime.datetime.strptime(d, '%Y-%m-%d'))
|
|
39
|
+
parser.add_argument("--unlock-rules", action="store_true", default=False, help='Automatically unlock affected rules')
|
|
40
|
+
parser.add_argument("--spread-period", action="store", default=0, type=int, help='Set the rules to randomly expire over a period (in seconds). Uses a uniform distribution')
|
|
41
|
+
parser.add_argument("--purge-replicas", action="store_true", default=False, help='Set the replicas to be deleted instead of secondarised')
|
|
42
|
+
parser.add_argument('--sleep-time', action="store", default=60, type=int, help='Concurrency control: thread sleep time after each chunk of work')
|
|
43
|
+
return parser
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
if __name__ == "__main__":
|
|
47
|
+
|
|
48
|
+
# Bind our callback to the SIGTERM signal and run the daemon:
|
|
49
|
+
signal.signal(signal.SIGTERM, stop)
|
|
50
|
+
|
|
51
|
+
parser = get_parser()
|
|
52
|
+
args = parser.parse_args()
|
|
53
|
+
try:
|
|
54
|
+
run(threads=args.threads, date_check=args.date_check,
|
|
55
|
+
dry_run=args.dry_run, grace_period=args.grace_period,
|
|
56
|
+
once=args.run_once, unlock=args.unlock_rules,
|
|
57
|
+
spread_period=args.spread_period,
|
|
58
|
+
purge_replicas=args.purge_replicas,
|
|
59
|
+
sleep_time=args.sleep_time)
|
|
60
|
+
except KeyboardInterrupt:
|
|
61
|
+
stop()
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
import logging
|
|
19
|
+
import logging.handlers
|
|
20
|
+
import os
|
|
21
|
+
import signal
|
|
22
|
+
import sys
|
|
23
|
+
import textwrap
|
|
24
|
+
import time
|
|
25
|
+
from datetime import datetime
|
|
26
|
+
from functools import partial
|
|
27
|
+
from multiprocessing import Queue, Process, Event, Pipe
|
|
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
|
+
|
|
34
|
+
|
|
35
|
+
def setup_pipe_logger(pipe, loglevel):
|
|
36
|
+
logger = logging.getLogger('auditor')
|
|
37
|
+
logger.setLevel(loglevel)
|
|
38
|
+
handler = dumper.LogPipeHandler(pipe)
|
|
39
|
+
logger.addHandler(handler)
|
|
40
|
+
|
|
41
|
+
formatter = logging.Formatter(
|
|
42
|
+
"%(asctime)s %(name)-22s %(levelname)-8s %(message)s"
|
|
43
|
+
)
|
|
44
|
+
handler.setFormatter(formatter)
|
|
45
|
+
return logger
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def main(args):
|
|
49
|
+
RETRY_AFTER = 60 * 60 * 24 * 14 # Two weeks
|
|
50
|
+
|
|
51
|
+
nprocs = args.nprocs
|
|
52
|
+
assert nprocs >= 1
|
|
53
|
+
if args.rses is None:
|
|
54
|
+
rses_gen = RSEClient().list_rses()
|
|
55
|
+
else:
|
|
56
|
+
rses_gen = RSEClient().list_rses(args.rses)
|
|
57
|
+
|
|
58
|
+
rses = [entry['rse'] for entry in rses_gen]
|
|
59
|
+
assert len(rses) > 0
|
|
60
|
+
|
|
61
|
+
procs = []
|
|
62
|
+
queue = Queue()
|
|
63
|
+
retry = Queue()
|
|
64
|
+
terminate = Event()
|
|
65
|
+
logpipes = []
|
|
66
|
+
|
|
67
|
+
loglevel = logging.getLevelName(config.config_get('common', 'loglevel'))
|
|
68
|
+
|
|
69
|
+
mainlogr, mainlogw = Pipe(duplex=False)
|
|
70
|
+
logpipes.append(mainlogr)
|
|
71
|
+
logger = setup_pipe_logger(mainlogw, loglevel)
|
|
72
|
+
|
|
73
|
+
assert config.config_has_section('auditor')
|
|
74
|
+
cache_dir = config.config_get('auditor', 'cache')
|
|
75
|
+
results_dir = config.config_get('auditor', 'results')
|
|
76
|
+
|
|
77
|
+
logfilename = os.path.join(config.config_get('common', 'logdir'), 'auditor.log')
|
|
78
|
+
logger.info('Starting auditor')
|
|
79
|
+
|
|
80
|
+
def termhandler(sign, trace):
|
|
81
|
+
logger.error('Main process received signal %d, terminating child processes', sign)
|
|
82
|
+
terminate.set()
|
|
83
|
+
for proc in procs:
|
|
84
|
+
proc.join()
|
|
85
|
+
|
|
86
|
+
signal.signal(signal.SIGTERM, termhandler)
|
|
87
|
+
|
|
88
|
+
for n in range(nprocs):
|
|
89
|
+
logpiper, logpipew = Pipe(duplex=False)
|
|
90
|
+
p = Process(
|
|
91
|
+
target=partial(
|
|
92
|
+
rucio.daemons.auditor.check,
|
|
93
|
+
queue,
|
|
94
|
+
retry,
|
|
95
|
+
terminate,
|
|
96
|
+
logpipew,
|
|
97
|
+
cache_dir,
|
|
98
|
+
results_dir,
|
|
99
|
+
args.keep_dumps,
|
|
100
|
+
args.delta,
|
|
101
|
+
),
|
|
102
|
+
name='auditor-worker'
|
|
103
|
+
)
|
|
104
|
+
p.start()
|
|
105
|
+
procs.append(p)
|
|
106
|
+
logpipes.append(logpiper)
|
|
107
|
+
|
|
108
|
+
p = Process(
|
|
109
|
+
target=partial(
|
|
110
|
+
rucio.daemons.auditor.activity_logger,
|
|
111
|
+
logpipes,
|
|
112
|
+
logfilename,
|
|
113
|
+
terminate
|
|
114
|
+
),
|
|
115
|
+
name='auditor-logger'
|
|
116
|
+
)
|
|
117
|
+
p.start()
|
|
118
|
+
procs.append(p)
|
|
119
|
+
|
|
120
|
+
last_run_month = None # Don't check more than once per month. FIXME: Save on DB or file...
|
|
121
|
+
|
|
122
|
+
try:
|
|
123
|
+
while all(p.is_alive() for p in procs):
|
|
124
|
+
while last_run_month == datetime.utcnow().month:
|
|
125
|
+
time.sleep(60 * 60 * 24)
|
|
126
|
+
|
|
127
|
+
for rse in rses:
|
|
128
|
+
queue.put((rse, 1))
|
|
129
|
+
|
|
130
|
+
time.sleep(RETRY_AFTER)
|
|
131
|
+
|
|
132
|
+
# Avoid infinite loop if an alternative check() implementation doesn't
|
|
133
|
+
# decrement the number of attemps and keeps pushing failed checks.
|
|
134
|
+
tmp_list = []
|
|
135
|
+
while not retry.empty():
|
|
136
|
+
tmp_list.append(retry.get())
|
|
137
|
+
|
|
138
|
+
for each in tmp_list:
|
|
139
|
+
queue.put(each)
|
|
140
|
+
|
|
141
|
+
except:
|
|
142
|
+
logging.error('Main process failed: %s', sys.exc_info()[0])
|
|
143
|
+
|
|
144
|
+
terminate.set()
|
|
145
|
+
for proc in procs:
|
|
146
|
+
proc.join()
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def get_parser():
|
|
150
|
+
"""
|
|
151
|
+
Returns the argparse parser.
|
|
152
|
+
"""
|
|
153
|
+
parser = argparse.ArgumentParser(description="The auditor daemon is the one responsable for the detection of inconsistencies on storage, i.e.: dark data discovery.",
|
|
154
|
+
formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
155
|
+
parser.add_argument(
|
|
156
|
+
'--nprocs',
|
|
157
|
+
help='Number subprocess, each subprocess check a fraction of the DDM '
|
|
158
|
+
'Endpoints in sequence (default: 1).',
|
|
159
|
+
default=1,
|
|
160
|
+
type=int,
|
|
161
|
+
)
|
|
162
|
+
parser.add_argument(
|
|
163
|
+
'--rses',
|
|
164
|
+
help='RSEs to check specified as a RSE expression, defaults to check '
|
|
165
|
+
'all the RSEs known to Rucio (default: check all RSEs).',
|
|
166
|
+
default=None,
|
|
167
|
+
type=str,
|
|
168
|
+
)
|
|
169
|
+
parser.add_argument(
|
|
170
|
+
'--keep-dumps',
|
|
171
|
+
help='Keep RSE and Rucio Replica Dumps on cache '
|
|
172
|
+
'(default: False).',
|
|
173
|
+
action='store_true',
|
|
174
|
+
)
|
|
175
|
+
parser.add_argument(
|
|
176
|
+
'--delta',
|
|
177
|
+
help='How many days older/newer than the RSE dump must the Rucio replica dumps be '
|
|
178
|
+
'(default: 3).',
|
|
179
|
+
default=3,
|
|
180
|
+
type=int,
|
|
181
|
+
)
|
|
182
|
+
parser.epilog = textwrap.dedent(r"""
|
|
183
|
+
examples:
|
|
184
|
+
# Check all RSEs using only 1 subprocess
|
|
185
|
+
%(prog)s
|
|
186
|
+
|
|
187
|
+
# Check all SCRATCHDISKs with 4 subprocesses
|
|
188
|
+
%(prog)s --nprocs 4 --rses "type=SCRATCHDISK"
|
|
189
|
+
|
|
190
|
+
# Check all Tier 2 DATADISKs, except "BLUE_DATADISK" and "RED_DATADISK"
|
|
191
|
+
%(prog)s --rses "tier=1&type=DATADISK\(BLUE_DATADISK|RED_DATADISK)"
|
|
192
|
+
""")
|
|
193
|
+
return parser
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
if __name__ == '__main__':
|
|
197
|
+
parser = get_parser()
|
|
198
|
+
args = parser.parse_args()
|
|
199
|
+
main(args)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
'''
|
|
18
|
+
Automatix (Dataset injector) Daemon
|
|
19
|
+
'''
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
import signal
|
|
23
|
+
|
|
24
|
+
from rucio.daemons.automatix.automatix import run, stop
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_parser():
|
|
28
|
+
"""
|
|
29
|
+
Returns the argparse parser.
|
|
30
|
+
"""
|
|
31
|
+
parser = argparse.ArgumentParser(description="Automatix is a daemon used to inject random generated files to an RSE. It is used to continuosly check that an RSE is reachable and operating as spected.")
|
|
32
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='Runs one loop iteration')
|
|
33
|
+
parser.add_argument("--input-file", action="store", default="/opt/rucio/etc/automatix.json", type=str, help='Automatix configuration')
|
|
34
|
+
parser.add_argument("--threads-per-process", action="store", default=1, type=int, help='Total number of workers per process')
|
|
35
|
+
parser.add_argument('--sleep-time', action="store", default=-1, type=int, help='Concurrency control: thread sleep time after each chunk of work')
|
|
36
|
+
return parser
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
if __name__ == "__main__":
|
|
40
|
+
|
|
41
|
+
# Bind our callback to the SIGTERM signal and run the daemon:
|
|
42
|
+
signal.signal(signal.SIGTERM, stop)
|
|
43
|
+
|
|
44
|
+
parser = get_parser()
|
|
45
|
+
args = parser.parse_args()
|
|
46
|
+
print('Start Automatix')
|
|
47
|
+
try:
|
|
48
|
+
run(total_workers=args.threads_per_process, once=args.run_once, inputfile=args.input_file,
|
|
49
|
+
sleep_time=args.sleep_time)
|
|
50
|
+
except KeyboardInterrupt:
|
|
51
|
+
stop()
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
"""
|
|
18
|
+
BB8 is a daemon to rebalance data.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
|
|
23
|
+
from rucio.daemons.bb8.bb8 import run
|
|
24
|
+
from rucio.daemons.bb8.common import rebalance_rse
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_parser():
|
|
28
|
+
"""
|
|
29
|
+
Returns the argparse parser.
|
|
30
|
+
"""
|
|
31
|
+
parser = argparse.ArgumentParser(description='The BB8 daemon is responsible for rebalancing data between RSEs.')
|
|
32
|
+
parser.add_argument('--rse', action='store', help='RSE to rebalance. Can be either a RSE or RSE expression.')
|
|
33
|
+
parser.add_argument('--bytes', action='store', type=int, help='Number of bytes to expected to be rebalanced. It is a goal without guarantees')
|
|
34
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='One iteration only')
|
|
35
|
+
parser.add_argument('--sleep-time', action="store", default=30, type=int, help='Concurrency control: thread sleep time after each chunk of work')
|
|
36
|
+
parser.add_argument("--threads", action="store", default=1, type=int, help='Concurrency control: total number of threads for this process')
|
|
37
|
+
parser.add_argument('--dry-run', action='store_true', default=False, help='Only run in dry-run mode')
|
|
38
|
+
parser.add_argument('--exclude-expression', action='store', help='Exclude these rse_expression from being destinations')
|
|
39
|
+
parser.add_argument('--comment', action='store', help='Add a comment to the new rules')
|
|
40
|
+
parser.add_argument('--force-expression', action='store', help='For this rse_expression for rebalanced rules instead of letting BB8 decide')
|
|
41
|
+
parser.add_argument('--decommission', action='store_true', help='Run BB8 in decommission mode')
|
|
42
|
+
parser.add_argument('--priority', action='store', help='Priority for the newly created rules', type=int, default=3)
|
|
43
|
+
parser.add_argument('--source-replica-expression', action='store', help='Source replica expression for the newly created rules')
|
|
44
|
+
return parser
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
if __name__ == "__main__":
|
|
48
|
+
parser = get_parser()
|
|
49
|
+
args = parser.parse_args()
|
|
50
|
+
|
|
51
|
+
if args.decommission:
|
|
52
|
+
rebalance_rse(rse_id=args.rse, max_bytes=args.bytes, dry_run=args.dry_run,
|
|
53
|
+
comment=args.comment, force_expression=args.force_expression,
|
|
54
|
+
priority=args.priority,
|
|
55
|
+
source_replica_expression=args.source_replica_expression,
|
|
56
|
+
mode='decommission')
|
|
57
|
+
else:
|
|
58
|
+
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,86 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
"""
|
|
18
|
+
C-3PO is a dynamic data placement daemon.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
import signal
|
|
23
|
+
|
|
24
|
+
from rucio.common.utils import StoreAndDeprecateWarningAction
|
|
25
|
+
from rucio.daemons.c3po.c3po import run, stop
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_parser():
|
|
29
|
+
"""
|
|
30
|
+
Returns the argparse parser.
|
|
31
|
+
"""
|
|
32
|
+
parser = argparse.ArgumentParser(description="The C3PO daemon is responsible for dynamic data placement.")
|
|
33
|
+
parser.add_argument("--run-once", action="store_true", default=False, help='One iteration only')
|
|
34
|
+
parser.add_argument("--threads", action="store", default=1, type=int, help='Concurrency control: number of threads')
|
|
35
|
+
parser.add_argument("--only-workload", action="store_true", default=False, help='Only run the workload collector')
|
|
36
|
+
parser.add_argument("--dry_run", "--dry-run", new_option_string="--dry-run", action=StoreAndDeprecateWarningAction, default=False, help='Do not create any rules')
|
|
37
|
+
parser.add_argument("--sampling", action="store_true", default=False, help='In the end flip a to decide to create a rule or not')
|
|
38
|
+
parser.add_argument("--algorithms", action="store", default="t2_free_space_only_pop_with_network", type=str, help='The placement algorithm or, if in dry_run, a comma separated list of algorithms')
|
|
39
|
+
parser.add_argument("--datatypes", action="store", default="NTUP,DAOD", type=str, help='Comma separated list of datatype that should trigger the placement')
|
|
40
|
+
parser.add_argument("--dest_rse_expr", "--dest-rse-expr", new_option_string="--dest-rse-expr", action=StoreAndDeprecateWarningAction, default="type=DATADISK", type=str, help='RSE expression defining the allowed destination RSEs')
|
|
41
|
+
parser.add_argument("--max_bytes_hour", "--max-bytes-hour", new_option_string="--max-bytes-hour", action=StoreAndDeprecateWarningAction, default=100000000000000, type=int, help='Max number of bytes that c3po is allow to replicate per hour')
|
|
42
|
+
parser.add_argument("--max_files_hour", "--max-files-hour", new_option_string="--max-files-hour", action=StoreAndDeprecateWarningAction, default=100000, type=int, help='Max number of files that c3po is allow to replicate per hour')
|
|
43
|
+
parser.add_argument("--max_bytes_hour_rse", "--max-bytes-hour-rse", new_option_string="--max-bytes-hour-rse", action=StoreAndDeprecateWarningAction, default=50000000000000, type=int, help='Max number of bytes that c3po is allow to replicate per hour per rse') # NOQA: E501
|
|
44
|
+
parser.add_argument("--max_files_hour_rse", "--max-files-hour-rse", new_option_string="--max-files-hour-rse", action=StoreAndDeprecateWarningAction, default=10000, type=int, help='Max number of files that c3po is allow to replicate per hour prse_rse')
|
|
45
|
+
parser.add_argument("--min_popularity", "--min-popularity", new_option_string="--min-popularity", action=StoreAndDeprecateWarningAction, default=8, type=int, help='Min number of popularity accesses for a DID in the last 7 days to trigger')
|
|
46
|
+
parser.add_argument("--min_recent_requests", "--min-recent-requests", new_option_string="--min-recent-requests", action=StoreAndDeprecateWarningAction, default=5, type=int, help='Min number of times a DID has to be requested in the last hour to trigger') # NOQA: E501
|
|
47
|
+
parser.add_argument("--max_replicas", "--max-replicas", new_option_string="--max-replicas", action=StoreAndDeprecateWarningAction, default=5, type=int, help='Max number of replicas above which not to trigger anymore')
|
|
48
|
+
parser.add_argument('--waiting-time-read-free-space', action="store", default=1800, type=int, help='Waiting time for reading free space')
|
|
49
|
+
parser.add_argument('--waiting-time-read-workload', action="store", default=1800, type=int, help='Waiting time for reading workload')
|
|
50
|
+
parser.add_argument('--waiting-time-print-workload', action="store", default=600, type=int, help='Waiting time for printing workload')
|
|
51
|
+
parser.add_argument('--waiting-time-read-dids', action="store", default=60, type=int, help='Waiting time for reading dids')
|
|
52
|
+
parser.add_argument('--waiting-time-place-replica', action="store", default=100, type=int, help='Waiting time for placing replicas')
|
|
53
|
+
parser.add_argument('--sleep-time', action="store", default=10, type=int, help='Concurrency control: thread sleep time after each chunk of work')
|
|
54
|
+
return parser
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
if __name__ == "__main__":
|
|
58
|
+
|
|
59
|
+
signal.signal(signal.SIGTERM, stop)
|
|
60
|
+
parser = get_parser()
|
|
61
|
+
args = parser.parse_args()
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
run(once=args.run_once,
|
|
65
|
+
threads=args.threads,
|
|
66
|
+
only_workload=args.only_workload,
|
|
67
|
+
dry_run=args.dry_run,
|
|
68
|
+
sampling=args.sampling,
|
|
69
|
+
algorithms=args.algorithms,
|
|
70
|
+
datatypes=args.datatypes,
|
|
71
|
+
dest_rse_expr=args.dest_rse_expr,
|
|
72
|
+
max_bytes_hour=args.max_bytes_hour,
|
|
73
|
+
max_files_hour=args.max_files_hour,
|
|
74
|
+
max_bytes_hour_rse=args.max_bytes_hour_rse,
|
|
75
|
+
max_files_hour_rse=args.max_files_hour_rse,
|
|
76
|
+
min_popularity=args.min_popularity,
|
|
77
|
+
min_recent_requests=args.min_recent_requests,
|
|
78
|
+
max_replicas=args.max_replicas,
|
|
79
|
+
waiting_time_read_free_space=args.waiting_time_read_free_space,
|
|
80
|
+
waiting_time_read_workload=args.waiting_time_read_workload,
|
|
81
|
+
waiting_time_print_workload=args.waiting_time_print_workload,
|
|
82
|
+
waiting_time_read_dids=args.waiting_time_read_dids,
|
|
83
|
+
waiting_time_place_replica=args.waiting_time_place_replica,
|
|
84
|
+
sleep_time=args.sleep_time)
|
|
85
|
+
except KeyboardInterrupt:
|
|
86
|
+
stop()
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
"""
|
|
18
|
+
Rucio Cache client.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
import json
|
|
23
|
+
import os
|
|
24
|
+
import random
|
|
25
|
+
import ssl
|
|
26
|
+
import sys
|
|
27
|
+
|
|
28
|
+
import stomp
|
|
29
|
+
from jsonschema import validate
|
|
30
|
+
|
|
31
|
+
from rucio.client.didclient import DIDClient
|
|
32
|
+
from rucio.client.rseclient import RSEClient
|
|
33
|
+
from rucio.common.config import config_get, config_get_int
|
|
34
|
+
from rucio.common.exception import DataIdentifierNotFound
|
|
35
|
+
from rucio.common.schema import get_schema_value
|
|
36
|
+
|
|
37
|
+
SUCCESS = 0
|
|
38
|
+
FAILURE = 1
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def validate_files(files):
|
|
42
|
+
""" validate files metadata"""
|
|
43
|
+
client = DIDClient()
|
|
44
|
+
for file in files:
|
|
45
|
+
try:
|
|
46
|
+
metadata = client.get_metadata(file["scope"], file["name"])
|
|
47
|
+
except DataIdentifierNotFound:
|
|
48
|
+
err = "%s:%s not found in rucio catalog" % (file["scope"], file["name"])
|
|
49
|
+
raise Exception(err)
|
|
50
|
+
if int(metadata["bytes"]) != int(file["bytes"]) or metadata["adler32"] != file["adler32"]:
|
|
51
|
+
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"])
|
|
52
|
+
raise Exception(err)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def validate_rse(rse):
|
|
56
|
+
""" validate rse"""
|
|
57
|
+
# the rse should be volatile
|
|
58
|
+
client = RSEClient()
|
|
59
|
+
try:
|
|
60
|
+
rse_attributes = client.get_rse(rse)
|
|
61
|
+
except Exception as error:
|
|
62
|
+
raise Exception(error)
|
|
63
|
+
|
|
64
|
+
if not rse_attributes["volatile"]:
|
|
65
|
+
err = "%s volatile is not True, Rucio Cache should not update it." % (rse)
|
|
66
|
+
raise Exception(err)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def cache_operation(args):
|
|
70
|
+
""" cache operation"""
|
|
71
|
+
payload = json.loads(args.message)
|
|
72
|
+
validate(payload, get_schema_value('MESSAGE_OPERATION'))
|
|
73
|
+
validate_rse(payload["rse"])
|
|
74
|
+
if payload["operation"] == "add_replicas":
|
|
75
|
+
validate(payload, get_schema_value('CACHE_ADD_REPLICAS'))
|
|
76
|
+
validate_files(payload["files"])
|
|
77
|
+
else:
|
|
78
|
+
validate(payload, get_schema_value('CACHE_DELETE_REPLICAS'))
|
|
79
|
+
conn = stomp.Connection([(args.broker, args.port)])
|
|
80
|
+
conn.set_ssl(key_file=args.ssl_key_file, cert_file=args.ssl_cert_file, ssl_version=ssl.PROTOCOL_TLSv1)
|
|
81
|
+
|
|
82
|
+
conn.connect()
|
|
83
|
+
message = {'id': int(random.random() * 1000), 'payload': payload}
|
|
84
|
+
conn.send(destination=args.destination, body=json.dumps(message), id='rucio-cache-messaging', ack='auto', headers={'vo': 'atlas'})
|
|
85
|
+
conn.disconnect()
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def get_parser():
|
|
89
|
+
"""
|
|
90
|
+
Returns the argparse parser.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
message_help = """
|
|
94
|
+
Add replicas message:
|
|
95
|
+
{'files': [{'scope': scope, 'name': name, 'bytes': 1L, 'adler32': ''},
|
|
96
|
+
{'scope': scope, 'name': name, 'bytes': 1L, 'adler32': ''}, ...],
|
|
97
|
+
'rse': rse_cache_name,
|
|
98
|
+
'lifetime': seconds,
|
|
99
|
+
'operation': 'add_replicas'
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
Delete replicas message:
|
|
103
|
+
{'files': [{'scope': scope, 'name': name}, {'scope': scope, 'name': name}, ...],
|
|
104
|
+
'rse': rse_cache_name,
|
|
105
|
+
'operation': 'delete_replicas'
|
|
106
|
+
}
|
|
107
|
+
"""
|
|
108
|
+
oparser = argparse.ArgumentParser(description="This daemons is used to populate information of replicas on volatile storage.",
|
|
109
|
+
prog=os.path.basename(sys.argv[0]), add_help=True)
|
|
110
|
+
|
|
111
|
+
# Main arguments
|
|
112
|
+
oparser.add_argument('-b', '--broker', dest='broker', default=config_get('messaging-cache', 'brokers').split(',')[0], help='Message broker name')
|
|
113
|
+
oparser.add_argument('-p', '--port', dest='port', default=config_get_int('messaging-cache', 'port'), help='Message broker port')
|
|
114
|
+
oparser.add_argument('-c', '--certificate', dest='ssl_cert_file', default=config_get('messaging-cache', 'ssl_cert_file'), help='Certificate file')
|
|
115
|
+
oparser.add_argument('-k', '--certificate-key', dest='ssl_key_file', default=config_get('messaging-cache', 'ssl_key_file'), help='Certificate key file')
|
|
116
|
+
oparser.add_argument('-d', '--destination', dest='destination', default=config_get('messaging-cache', 'destination'), help="Message broker topic")
|
|
117
|
+
oparser.add_argument('-m', '--message', dest='message', default=None, help=message_help)
|
|
118
|
+
|
|
119
|
+
return oparser
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
if __name__ == '__main__':
|
|
123
|
+
|
|
124
|
+
oparser = get_parser()
|
|
125
|
+
if len(sys.argv) == 1:
|
|
126
|
+
oparser.print_help()
|
|
127
|
+
sys.exit(FAILURE)
|
|
128
|
+
|
|
129
|
+
args = oparser.parse_args(sys.argv[1:])
|
|
130
|
+
try:
|
|
131
|
+
result = cache_operation(args)
|
|
132
|
+
sys.exit(result)
|
|
133
|
+
except (RuntimeError, NotImplementedError) as e:
|
|
134
|
+
print("ERROR: ", e, file=sys.stderr)
|
|
135
|
+
sys.exit(FAILURE)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
"""
|
|
18
|
+
Rucio Cache Consumer is a daemon to add/delete cache replicas to Rucio catalog.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
import signal
|
|
23
|
+
|
|
24
|
+
from rucio.daemons.cache.consumer import run, stop
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_parser():
|
|
28
|
+
"""
|
|
29
|
+
Returns the argparse parser.
|
|
30
|
+
"""
|
|
31
|
+
parser = argparse.ArgumentParser(description="Rucio Cache Consumer is a daemon to add/delete cache replicas to Rucio catalog.")
|
|
32
|
+
parser.add_argument("--num-thread", action="store", default=1, type=int, help='Concurrency control: threads number')
|
|
33
|
+
return parser
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
if __name__ == "__main__":
|
|
37
|
+
signal.signal(signal.SIGTERM, stop)
|
|
38
|
+
parser = get_parser()
|
|
39
|
+
args = parser.parse_args()
|
|
40
|
+
try:
|
|
41
|
+
run(args.num_thread)
|
|
42
|
+
except KeyboardInterrupt:
|
|
43
|
+
stop()
|