rucio 37.0.0rc2__tar.gz → 37.0.0rc4__tar.gz
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-37.0.0rc2 → rucio-37.0.0rc4}/PKG-INFO +1 -1
- rucio-37.0.0rc4/lib/rucio/common/stomp_utils.py +159 -0
- rucio-37.0.0rc4/lib/rucio/daemons/cache/consumer.py +197 -0
- rucio-37.0.0rc4/lib/rucio/daemons/conveyor/receiver.py +249 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/hermes/hermes.py +344 -43
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/tracer/kronos.py +139 -114
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/vcsversion.py +3 -3
- rucio-37.0.0rc2/lib/rucio/common/stomp_utils.py +0 -423
- rucio-37.0.0rc2/lib/rucio/daemons/cache/consumer.py +0 -133
- rucio-37.0.0rc2/lib/rucio/daemons/conveyor/receiver.py +0 -179
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/AUTHORS.rst +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/ChangeLog +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/LICENSE +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/MANIFEST.in +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/README.md +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-abacus-account +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-abacus-collection-replica +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-abacus-rse +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-admin +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-atropos +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-auditor +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-automatix +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-bb8 +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-cache-client +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-cache-consumer +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-conveyor-finisher +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-conveyor-poller +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-conveyor-preparer +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-conveyor-receiver +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-conveyor-stager +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-conveyor-submitter +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-conveyor-throttler +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-dark-reaper +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-dumper +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-follower +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-hermes +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-judge-cleaner +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-judge-evaluator +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-judge-injector +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-judge-repairer +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-kronos +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-minos +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-minos-temporary-expiration +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-necromancer +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-oauth-manager +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-reaper +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-replica-recoverer +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-rse-decommissioner +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-storage-consistency-actions +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-transmogrifier +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/bin/rucio-undertaker +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/alembic.ini.template +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/alembic_offline.ini.template +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/globus-config.yml.template +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/ldap.cfg.template +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/rse-accounts.cfg.template +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/rucio.cfg.template +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/alembicrevision.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/account.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/bin_legacy/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/bin_legacy/rucio.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/bin_legacy/rucio_admin.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/command.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/config.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/did.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/download.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/lifetime_exception.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/rse.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/rule.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/scope.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/subscription.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/upload.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/cli/utils.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/accountclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/baseclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/client.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/configclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/credentialclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/didclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/diracclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/downloadclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/exportclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/fileclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/importclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/lockclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/metaconventionsclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/pingclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/replicaclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/requestclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/richclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/rseclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/ruleclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/scopeclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/subscriptionclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/touchclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/client/uploadclient.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/bittorrent.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/cache.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/checksum.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/client.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/config.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/constants.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/constraints.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/didtype.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/dumper/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/dumper/consistency.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/dumper/data_models.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/dumper/path_parsing.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/exception.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/extra.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/logging.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/pcache.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/plugins.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/policy.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/schema/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/schema/generic.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/stopwatch.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/types.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/common/utils.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/account.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/account_counter.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/account_limit.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/authentication.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/config.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/credential.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/did.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/did_meta_plugins/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/did_meta_plugins/did_column_meta.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/did_meta_plugins/elasticsearch_meta.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/did_meta_plugins/filter_engine.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/did_meta_plugins/json_meta.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/did_meta_plugins/mongo_meta.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/did_meta_plugins/postgres_meta.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/dirac.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/distance.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/exporter.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/heartbeat.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/identity.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/importer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/lifetime_exception.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/lock.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/message.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/meta_conventions.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/monitor.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/naming_convention.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/nongrid_trace.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/oidc.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/permission/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/permission/generic.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/quarantined_replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/replica_sorter.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/request.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/rse.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/rse_counter.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/rse_expression_parser.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/rse_selector.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/rule.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/rule_grouping.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/scope.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/subscription.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/topology.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/trace.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/transfer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/vo.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/core/volatile_replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/abacus/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/abacus/account.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/abacus/rse.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/atropos/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/atropos/atropos.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/auditor/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/auditor/hdfs.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/automatix/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/automatix/automatix.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/badreplicas/minos.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/bb8/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/bb8/bb8.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/bb8/common.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/cache/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/common.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/conveyor/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/conveyor/common.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/conveyor/finisher.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/conveyor/poller.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/conveyor/preparer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/conveyor/stager.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/conveyor/submitter.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/conveyor/throttler.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/follower/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/follower/follower.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/hermes/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/judge/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/judge/cleaner.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/judge/evaluator.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/judge/injector.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/judge/repairer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/reaper/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/reaper/reaper.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/rsedecommissioner/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/rsedecommissioner/config.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/rsedecommissioner/profiles/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/rsedecommissioner/profiles/atlas.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/rsedecommissioner/profiles/generic.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/rsedecommissioner/profiles/types.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/rsedecommissioner/rse_decommissioner.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/storage/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/storage/consistency/actions.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/tracer/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/undertaker/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/constants.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/30d5206e9cad_increase_oauthrequest_redirect_msg_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/models.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/sautils.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/session.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/types.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/db/sqla/util.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/account.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/account_limit.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/authentication.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/config.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/credential.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/did.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/dirac.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/exporter.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/heartbeat.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/identity.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/importer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/lifetime_exception.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/lock.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/meta_conventions.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/permission.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/quarantined_replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/request.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/rse.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/rule.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/scope.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/subscription.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/gateway/vo.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/bittorrent.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/gfal.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/webdav.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/protocols/xrootd.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/rse/translation.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/tests/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/tests/common.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/tests/common_server.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/transfertool/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/transfertool/bittorrent.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/transfertool/bittorrent_driver.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/transfertool/bittorrent_driver_qbittorrent.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/transfertool/fts3.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/transfertool/fts3_plugins.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/transfertool/globus.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/transfertool/globus_library.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/transfertool/mock.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/transfertool/transfertool.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/version.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/accounts.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/archives.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/auth.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/common.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/config.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/credentials.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/dids.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/dirac.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/export.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/identities.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/import.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/locks.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/main.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/meta_conventions.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/metrics.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/ping.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/redirect.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/replicas.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/requests.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/rses.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/rules.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/scopes.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/traces.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/types.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/flaskapi/v1/vos.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/main.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/metrics.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio/web/rest/ping.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/lib/rucio.egg-info/SOURCES.txt +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/pyproject.toml +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/requirements/requirements.server.txt +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/setup.cfg +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/setup.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/setuputil.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_abacus_account.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_abacus_collection_replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_abacus_rse.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_account.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_account_limits.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_archive.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_auditor.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_auditor_hdfs.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_auditor_srmdumps.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_authentication.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_automatix.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_bad_replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_bb8.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_belleii.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_bin_rucio.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_boolean.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_cli_client_structure.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_clients.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_config.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_conveyor.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_conveyor_submitter.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_counter.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_credential.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_curl.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_daemons.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_dataset_replicas.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_db.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_did.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_did_meta_plugins.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_download.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_dumper.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_filter_engine.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_gateway_external_representation.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_heartbeat.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_hermes.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_identity.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_impl_upload_download.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_import_export.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_judge_cleaner.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_judge_evaluator.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_judge_injector.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_judge_repairer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_lifetime.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_message.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_meta_conventions.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_meta_did.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_module_import.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_monitor.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_multi_vo.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_naming_convention.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_oauthmanager.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_oidc.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_permission.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_pfns.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_ping.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_policy_package.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_preparer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_qos.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_quarantined_replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_reaper.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_redirect.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_replica.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_replica_recoverer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_replica_sorting.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_request.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_root_proxy.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_expression_parser.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_lfn2path.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_protocol_posix.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_protocol_srm.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rse_selector.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rucio_server.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_rule.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_scope.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_subscription.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_throttler.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_tpc.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_trace.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_transfer.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_transfer_plugins.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_undertaker.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_upload.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tests/test_utils.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tools/bootstrap.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tools/merge_rucio_configs.py +0 -0
- {rucio-37.0.0rc2 → rucio-37.0.0rc4}/tools/reset_database.py +0 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""
|
|
16
|
+
Common utility functions for stomp connections
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import logging
|
|
20
|
+
import socket
|
|
21
|
+
from time import monotonic
|
|
22
|
+
from typing import TYPE_CHECKING
|
|
23
|
+
|
|
24
|
+
from stomp import Connection
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from collections.abc import Callable, Sequence
|
|
28
|
+
from typing import Any
|
|
29
|
+
|
|
30
|
+
LoggerFunction = Callable[..., Any]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def resolve_ips(fqdns: "Sequence[str]", logger: "LoggerFunction" = logging.log):
|
|
34
|
+
logger(logging.DEBUG, 'resolving dns aliases: %s' % fqdns)
|
|
35
|
+
resolved = []
|
|
36
|
+
for fqdn in fqdns:
|
|
37
|
+
addrinfos = socket.getaddrinfo(fqdn, 0, socket.AF_INET, 0, socket.IPPROTO_TCP)
|
|
38
|
+
resolved.extend(ai[4][0] for ai in addrinfos)
|
|
39
|
+
logger(logging.DEBUG, 'dns aliases resolved to %s', resolved)
|
|
40
|
+
return resolved
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class StompConnectionManager:
|
|
44
|
+
|
|
45
|
+
def __init__(self):
|
|
46
|
+
self._brokers = None
|
|
47
|
+
self._port = None
|
|
48
|
+
self._use_ssl = None
|
|
49
|
+
self._vhost = None
|
|
50
|
+
self._reconnect_attempts = None
|
|
51
|
+
self._ssl_key_file = None
|
|
52
|
+
self._timeout = None
|
|
53
|
+
self._heartbeats = None
|
|
54
|
+
|
|
55
|
+
self._connections = {}
|
|
56
|
+
|
|
57
|
+
def is_stalled(self, connection: Connection, *, logger: "LoggerFunction" = logging.log):
|
|
58
|
+
if not connection.is_connected():
|
|
59
|
+
return True
|
|
60
|
+
|
|
61
|
+
if self._heartbeats and getattr(connection, 'received_heartbeat') and connection.received_heartbeat:
|
|
62
|
+
heartbeat_period_seconds = max(0, self._heartbeats[0], self._heartbeats[1]) / 1000
|
|
63
|
+
|
|
64
|
+
if not heartbeat_period_seconds:
|
|
65
|
+
return False
|
|
66
|
+
|
|
67
|
+
now = monotonic()
|
|
68
|
+
if connection.received_heartbeat + 10 * heartbeat_period_seconds < now:
|
|
69
|
+
logger(logging.WARNING, "Stomp connection missed heartbeats for a long time")
|
|
70
|
+
return True
|
|
71
|
+
|
|
72
|
+
return False
|
|
73
|
+
|
|
74
|
+
def disconnect(self):
|
|
75
|
+
for conn in self._connections.values():
|
|
76
|
+
if not conn.is_connected():
|
|
77
|
+
conn.disconnect()
|
|
78
|
+
|
|
79
|
+
def re_configure(
|
|
80
|
+
self,
|
|
81
|
+
brokers: "Sequence[str]",
|
|
82
|
+
port: int,
|
|
83
|
+
use_ssl: bool,
|
|
84
|
+
vhost,
|
|
85
|
+
reconnect_attempts: int,
|
|
86
|
+
ssl_key_file,
|
|
87
|
+
ssl_cert_file,
|
|
88
|
+
timeout,
|
|
89
|
+
heartbeats=(0, 1000),
|
|
90
|
+
*,
|
|
91
|
+
logger: "LoggerFunction" = logging.log
|
|
92
|
+
) -> tuple[list, list]:
|
|
93
|
+
|
|
94
|
+
configuration_changed = any([
|
|
95
|
+
self._brokers != brokers,
|
|
96
|
+
self._port != port,
|
|
97
|
+
self._use_ssl != use_ssl,
|
|
98
|
+
self._vhost != vhost,
|
|
99
|
+
self._reconnect_attempts != reconnect_attempts,
|
|
100
|
+
self._ssl_key_file != ssl_key_file,
|
|
101
|
+
self._timeout != timeout,
|
|
102
|
+
self._heartbeats != heartbeats,
|
|
103
|
+
])
|
|
104
|
+
if configuration_changed:
|
|
105
|
+
self._brokers = brokers
|
|
106
|
+
self._port = port
|
|
107
|
+
self._use_ssl = use_ssl
|
|
108
|
+
self._vhost = vhost
|
|
109
|
+
self._reconnect_attempts = reconnect_attempts
|
|
110
|
+
self._ssl_key_file = ssl_key_file
|
|
111
|
+
self._timeout = timeout
|
|
112
|
+
self._heartbeats = heartbeats
|
|
113
|
+
|
|
114
|
+
current_remotes = set(self._connections)
|
|
115
|
+
desired_remotes = set((ip, port) for ip in resolve_ips(brokers, logger=logger))
|
|
116
|
+
|
|
117
|
+
if configuration_changed:
|
|
118
|
+
# Re-create all connections
|
|
119
|
+
to_delete = current_remotes
|
|
120
|
+
to_create = desired_remotes
|
|
121
|
+
else:
|
|
122
|
+
to_delete = current_remotes.difference(desired_remotes)
|
|
123
|
+
to_create = desired_remotes.difference(current_remotes)
|
|
124
|
+
|
|
125
|
+
for remote in current_remotes.intersection(desired_remotes):
|
|
126
|
+
conn = self._connections[remote]
|
|
127
|
+
|
|
128
|
+
if self.is_stalled(conn, logger=logger):
|
|
129
|
+
# Re-create stalled connections
|
|
130
|
+
to_delete.add(remote)
|
|
131
|
+
to_create.add(remote)
|
|
132
|
+
|
|
133
|
+
deleted_conns = []
|
|
134
|
+
for remote in to_delete:
|
|
135
|
+
conn = self._connections.pop(remote)
|
|
136
|
+
if conn.is_connected():
|
|
137
|
+
conn.disconnect()
|
|
138
|
+
deleted_conns.append(to_delete)
|
|
139
|
+
|
|
140
|
+
created_conns = []
|
|
141
|
+
for remote in to_create:
|
|
142
|
+
conn = Connection(
|
|
143
|
+
host_and_ports=[remote],
|
|
144
|
+
vhost=vhost,
|
|
145
|
+
timeout=timeout,
|
|
146
|
+
heartbeats=heartbeats,
|
|
147
|
+
reconnect_attempts_max=reconnect_attempts
|
|
148
|
+
)
|
|
149
|
+
if use_ssl:
|
|
150
|
+
conn.set_ssl(key_file=ssl_key_file, cert_file=ssl_cert_file)
|
|
151
|
+
self._connections[remote] = conn
|
|
152
|
+
created_conns.append(conn)
|
|
153
|
+
|
|
154
|
+
if not to_delete and not to_create:
|
|
155
|
+
logger(logging.INFO, "Stomp connections didn't change")
|
|
156
|
+
else:
|
|
157
|
+
logger(logging.INFO, f"Stomp connections refreshed. Deleted: {list(to_delete)}. Added: {list(to_create)}")
|
|
158
|
+
|
|
159
|
+
return created_conns, deleted_conns
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""
|
|
16
|
+
Cache consumer is a daemon to retrieve rucio cache operation information to synchronize rucio catalog.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import json
|
|
20
|
+
import logging
|
|
21
|
+
import threading
|
|
22
|
+
import time
|
|
23
|
+
from traceback import format_exc
|
|
24
|
+
from typing import TYPE_CHECKING, Optional
|
|
25
|
+
|
|
26
|
+
import rucio.db.sqla.util
|
|
27
|
+
from rucio.common import exception
|
|
28
|
+
from rucio.common.config import config_get, config_get_bool, config_get_int, config_get_list
|
|
29
|
+
from rucio.common.logging import formatted_logger, setup_logging
|
|
30
|
+
from rucio.common.stomp_utils import StompConnectionManager
|
|
31
|
+
from rucio.common.types import InternalScope, LoggerFunction
|
|
32
|
+
from rucio.core.monitor import MetricManager
|
|
33
|
+
from rucio.core.rse import get_rse_id
|
|
34
|
+
from rucio.core.volatile_replica import add_volatile_replicas, delete_volatile_replicas
|
|
35
|
+
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
from types import FrameType
|
|
38
|
+
|
|
39
|
+
from stomp import Connection
|
|
40
|
+
from stomp.utils import Frame
|
|
41
|
+
|
|
42
|
+
logging.getLogger("stomp").setLevel(logging.CRITICAL)
|
|
43
|
+
|
|
44
|
+
METRICS = MetricManager(module=__name__)
|
|
45
|
+
GRACEFUL_STOP = threading.Event()
|
|
46
|
+
DAEMON_NAME = 'cache-consumer'
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class AMQConsumer:
|
|
50
|
+
"""
|
|
51
|
+
class Consumer
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def __init__(
|
|
55
|
+
self,
|
|
56
|
+
broker: str,
|
|
57
|
+
conn: "Connection",
|
|
58
|
+
logger: "LoggerFunction"
|
|
59
|
+
):
|
|
60
|
+
"""
|
|
61
|
+
__init__
|
|
62
|
+
"""
|
|
63
|
+
self.__broker = broker
|
|
64
|
+
self.__conn = conn
|
|
65
|
+
self.__logger = logger
|
|
66
|
+
|
|
67
|
+
@METRICS.count_it
|
|
68
|
+
def on_heartbeat_timeout(self) -> None:
|
|
69
|
+
self.__conn.disconnect()
|
|
70
|
+
|
|
71
|
+
@METRICS.count_it
|
|
72
|
+
def on_error(self, frame: "Frame") -> None:
|
|
73
|
+
"""
|
|
74
|
+
on_error
|
|
75
|
+
"""
|
|
76
|
+
self.__logger(logging.ERROR, 'Message receive error: [%s] %s' % (self.__broker, frame.body))
|
|
77
|
+
|
|
78
|
+
@METRICS.count_it
|
|
79
|
+
def on_message(self, frame: "Frame") -> None:
|
|
80
|
+
"""
|
|
81
|
+
on_message
|
|
82
|
+
"""
|
|
83
|
+
try:
|
|
84
|
+
msg = json.loads(frame.body) # type: ignore
|
|
85
|
+
self.__logger(logging.DEBUG, 'Message received: %s ' % msg)
|
|
86
|
+
if isinstance(msg, dict) and 'operation' in msg.keys():
|
|
87
|
+
for f in msg['files']:
|
|
88
|
+
f['scope'] = InternalScope(f['scope'])
|
|
89
|
+
if 'rse_id' in msg:
|
|
90
|
+
rse_id = msg['rse_id']
|
|
91
|
+
else:
|
|
92
|
+
rse_id = get_rse_id(rse=msg['rse'], vo=msg.get('vo', 'def'))
|
|
93
|
+
|
|
94
|
+
rse_vo_str = msg['rse']
|
|
95
|
+
if 'vo' in msg and msg['vo'] != 'def':
|
|
96
|
+
rse_vo_str = '{} on {}'.format(rse_vo_str, msg['vo'])
|
|
97
|
+
if msg['operation'] == 'add_replicas':
|
|
98
|
+
self.__logger(logging.INFO, 'add_replicas to RSE %s: %s ' % (rse_vo_str, str(msg['files'])))
|
|
99
|
+
add_volatile_replicas(rse_id=rse_id, replicas=msg['files'])
|
|
100
|
+
elif msg['operation'] == 'delete_replicas':
|
|
101
|
+
self.__logger(logging.INFO, 'delete_replicas to RSE %s: %s ' % (rse_vo_str, str(msg['files'])))
|
|
102
|
+
delete_volatile_replicas(rse_id=rse_id, replicas=msg['files'])
|
|
103
|
+
else:
|
|
104
|
+
self.__logger(logging.DEBUG, 'Check failed: %s %s '
|
|
105
|
+
% (isinstance(msg, dict), 'operation' in msg.keys()))
|
|
106
|
+
except:
|
|
107
|
+
self.__logger(logging.ERROR, str(format_exc()))
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def consumer(id_: int, num_thread: int = 1) -> None:
|
|
111
|
+
"""
|
|
112
|
+
Main loop to consume messages from the Rucio Cache producer.
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
logger = formatted_logger(logging.log, DAEMON_NAME + ' %s')
|
|
116
|
+
|
|
117
|
+
logger(logging.INFO, 'Rucio Cache consumer starting')
|
|
118
|
+
|
|
119
|
+
brokers = config_get_list('messaging-cache', 'brokers')
|
|
120
|
+
|
|
121
|
+
use_ssl = config_get_bool('messaging-cache', 'use_ssl', default=True, raise_exception=False)
|
|
122
|
+
if not use_ssl:
|
|
123
|
+
username = config_get('messaging-cache', 'username')
|
|
124
|
+
password = config_get('messaging-cache', 'password')
|
|
125
|
+
destination = config_get('messaging-cache', 'destination')
|
|
126
|
+
subscription_id = 'rucio-cache-messaging'
|
|
127
|
+
|
|
128
|
+
vhost = config_get('messaging-cache', 'broker_virtual_host', raise_exception=False)
|
|
129
|
+
port = config_get_int('messaging-cache', 'port')
|
|
130
|
+
reconnect_attempts = config_get_int('messaging-cache', 'reconnect_attempts', default=100)
|
|
131
|
+
ssl_key_file = config_get('messaging-cache', 'ssl_key_file', raise_exception=False)
|
|
132
|
+
ssl_cert_file = config_get('messaging-cache', 'ssl_cert_file', raise_exception=False)
|
|
133
|
+
|
|
134
|
+
stomp_conn_mngr = StompConnectionManager()
|
|
135
|
+
conns, _ = stomp_conn_mngr.re_configure(
|
|
136
|
+
brokers=brokers,
|
|
137
|
+
port=port,
|
|
138
|
+
use_ssl=use_ssl,
|
|
139
|
+
vhost=vhost,
|
|
140
|
+
reconnect_attempts=reconnect_attempts,
|
|
141
|
+
ssl_key_file=ssl_key_file,
|
|
142
|
+
ssl_cert_file=ssl_cert_file,
|
|
143
|
+
timeout=None,
|
|
144
|
+
logger=logger
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
logger(logging.INFO, 'consumer started')
|
|
148
|
+
|
|
149
|
+
while not GRACEFUL_STOP.is_set():
|
|
150
|
+
for conn in conns:
|
|
151
|
+
if not conn.is_connected():
|
|
152
|
+
host_port = conn.transport._Transport__host_and_ports[0]
|
|
153
|
+
|
|
154
|
+
logger(logging.INFO, 'connecting to %s' % host_port[0])
|
|
155
|
+
METRICS.counter('reconnect.{host}').labels(host=host_port[0]).inc()
|
|
156
|
+
conn.set_listener('rucio-cache-consumer', AMQConsumer(broker=host_port, conn=conn, logger=logger))
|
|
157
|
+
if not use_ssl:
|
|
158
|
+
conn.connect(username, password)
|
|
159
|
+
else:
|
|
160
|
+
conn.connect()
|
|
161
|
+
|
|
162
|
+
conn.subscribe(destination=destination, ack='auto', id=subscription_id)
|
|
163
|
+
time.sleep(1)
|
|
164
|
+
|
|
165
|
+
logger(logging.INFO, 'graceful stop requested')
|
|
166
|
+
stomp_conn_mngr.disconnect()
|
|
167
|
+
logger(logging.INFO, 'graceful stop done')
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def stop(signum: Optional[int] = None, frame: Optional["FrameType"] = None) -> None:
|
|
171
|
+
"""
|
|
172
|
+
Graceful exit.
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
GRACEFUL_STOP.set()
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def run(num_thread: int = 1) -> None:
|
|
179
|
+
"""
|
|
180
|
+
Starts up the rucio cache consumer thread
|
|
181
|
+
"""
|
|
182
|
+
setup_logging(process_name=DAEMON_NAME)
|
|
183
|
+
|
|
184
|
+
if rucio.db.sqla.util.is_old_db():
|
|
185
|
+
raise exception.DatabaseException('Database was not updated, daemon won\'t start')
|
|
186
|
+
|
|
187
|
+
logging.info('starting consumer thread')
|
|
188
|
+
threads = [threading.Thread(target=consumer, kwargs={'id_': i, 'num_thread': num_thread})
|
|
189
|
+
for i in range(0, num_thread)]
|
|
190
|
+
|
|
191
|
+
[t.start() for t in threads]
|
|
192
|
+
|
|
193
|
+
logging.info('waiting for interrupts')
|
|
194
|
+
|
|
195
|
+
# Interruptible joins require a timeout.
|
|
196
|
+
while threads[0].is_alive():
|
|
197
|
+
[t.join(timeout=3.14) for t in threads]
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""
|
|
16
|
+
Conveyor is a daemon to manage file transfers.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import json
|
|
20
|
+
import logging
|
|
21
|
+
import socket
|
|
22
|
+
import threading
|
|
23
|
+
import time
|
|
24
|
+
import traceback
|
|
25
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
26
|
+
|
|
27
|
+
import stomp
|
|
28
|
+
|
|
29
|
+
import rucio.db.sqla.util
|
|
30
|
+
from rucio.common import exception
|
|
31
|
+
from rucio.common.config import config_get, config_get_bool, config_get_int, config_get_list
|
|
32
|
+
from rucio.common.logging import setup_logging
|
|
33
|
+
from rucio.common.policy import get_policy
|
|
34
|
+
from rucio.core import request as request_core
|
|
35
|
+
from rucio.core import transfer as transfer_core
|
|
36
|
+
from rucio.core.monitor import MetricManager
|
|
37
|
+
from rucio.daemons.common import HeartbeatHandler
|
|
38
|
+
from rucio.db.sqla.session import transactional_session
|
|
39
|
+
from rucio.transfertool.fts3 import FTS3CompletionMessageTransferStatusReport
|
|
40
|
+
|
|
41
|
+
if TYPE_CHECKING:
|
|
42
|
+
from types import FrameType
|
|
43
|
+
|
|
44
|
+
from sqlalchemy.orm import Session
|
|
45
|
+
from stomp.utils import Frame
|
|
46
|
+
|
|
47
|
+
from rucio.common.types import LoggerFunction
|
|
48
|
+
|
|
49
|
+
logging.getLogger("stomp").setLevel(logging.CRITICAL)
|
|
50
|
+
|
|
51
|
+
METRICS = MetricManager(module=__name__)
|
|
52
|
+
GRACEFUL_STOP = threading.Event()
|
|
53
|
+
DAEMON_NAME = 'conveyor-receiver'
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class Receiver:
|
|
57
|
+
|
|
58
|
+
def __init__(
|
|
59
|
+
self,
|
|
60
|
+
broker: str,
|
|
61
|
+
id_: str,
|
|
62
|
+
total_threads: int,
|
|
63
|
+
transfer_stats_manager: request_core.TransferStatsManager,
|
|
64
|
+
all_vos: bool = False
|
|
65
|
+
):
|
|
66
|
+
self.__all_vos = all_vos
|
|
67
|
+
self.__broker = broker
|
|
68
|
+
self.__id = id_
|
|
69
|
+
self.__total_threads = total_threads
|
|
70
|
+
self._transfer_stats_manager = transfer_stats_manager
|
|
71
|
+
|
|
72
|
+
@METRICS.count_it
|
|
73
|
+
def on_error(self, frame: "Frame") -> None:
|
|
74
|
+
logging.error('[%s] %s' % (self.__broker, frame.body))
|
|
75
|
+
|
|
76
|
+
@METRICS.count_it
|
|
77
|
+
def on_message(self, frame: "Frame") -> None:
|
|
78
|
+
msg = json.loads(frame.body) # type: ignore
|
|
79
|
+
|
|
80
|
+
if not self.__all_vos:
|
|
81
|
+
if 'vo' not in msg or msg['vo'] != get_policy():
|
|
82
|
+
return
|
|
83
|
+
|
|
84
|
+
if 'job_metadata' in msg.keys() \
|
|
85
|
+
and isinstance(msg['job_metadata'], dict) \
|
|
86
|
+
and 'issuer' in msg['job_metadata'].keys() \
|
|
87
|
+
and str(msg['job_metadata']['issuer']) == 'rucio':
|
|
88
|
+
|
|
89
|
+
if 'job_state' in msg.keys() and (str(msg['job_state']) != 'ACTIVE' or msg.get('job_multihop', False) is True):
|
|
90
|
+
METRICS.counter('message_rucio').inc()
|
|
91
|
+
|
|
92
|
+
self._perform_request_update(msg)
|
|
93
|
+
|
|
94
|
+
@transactional_session
|
|
95
|
+
def _perform_request_update(
|
|
96
|
+
self,
|
|
97
|
+
msg: dict[str, Any],
|
|
98
|
+
*,
|
|
99
|
+
session: Optional["Session"] = None,
|
|
100
|
+
logger: "LoggerFunction" = logging.log
|
|
101
|
+
) -> None:
|
|
102
|
+
external_host = msg.get('endpnt', None)
|
|
103
|
+
request_id = msg['file_metadata'].get('request_id', None)
|
|
104
|
+
try:
|
|
105
|
+
tt_status_report = FTS3CompletionMessageTransferStatusReport(external_host, request_id=request_id, fts_message=msg)
|
|
106
|
+
if tt_status_report.get_db_fields_to_update(session=session, logger=logger): # type: ignore
|
|
107
|
+
logging.info('RECEIVED %s', tt_status_report)
|
|
108
|
+
|
|
109
|
+
ret = transfer_core.update_transfer_state(
|
|
110
|
+
tt_status_report=tt_status_report,
|
|
111
|
+
stats_manager=self._transfer_stats_manager,
|
|
112
|
+
session=session,
|
|
113
|
+
logger=logger,
|
|
114
|
+
)
|
|
115
|
+
if ret:
|
|
116
|
+
METRICS.counter('update_request_state.{updated}').labels(updated=True).inc(delta=ret)
|
|
117
|
+
else:
|
|
118
|
+
METRICS.counter('update_request_state.{updated}').labels(updated=False).inc()
|
|
119
|
+
except Exception:
|
|
120
|
+
logging.critical(traceback.format_exc())
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def receiver(
|
|
124
|
+
id_: str,
|
|
125
|
+
total_threads: int = 1,
|
|
126
|
+
all_vos: bool = False
|
|
127
|
+
) -> None:
|
|
128
|
+
"""
|
|
129
|
+
Main loop to consume messages from the FTS3 producer.
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
logging.info('receiver starting')
|
|
133
|
+
|
|
134
|
+
brokers_alias = []
|
|
135
|
+
brokers_resolved = []
|
|
136
|
+
try:
|
|
137
|
+
brokers_alias = config_get_list('messaging-fts3', 'brokers')
|
|
138
|
+
except Exception:
|
|
139
|
+
raise Exception('Could not load brokers from configuration')
|
|
140
|
+
|
|
141
|
+
logging.info('resolving broker dns alias: %s' % brokers_alias)
|
|
142
|
+
|
|
143
|
+
brokers_resolved = []
|
|
144
|
+
for broker in brokers_alias:
|
|
145
|
+
addrinfos = socket.getaddrinfo(broker, 0, socket.AF_INET, 0, socket.IPPROTO_TCP)
|
|
146
|
+
brokers_resolved.extend(ai[4][0] for ai in addrinfos)
|
|
147
|
+
|
|
148
|
+
logging.info('brokers resolved to %s', brokers_resolved)
|
|
149
|
+
|
|
150
|
+
logging.info('checking authentication method')
|
|
151
|
+
use_ssl = True
|
|
152
|
+
try:
|
|
153
|
+
use_ssl = config_get_bool('messaging-fts3', 'use_ssl')
|
|
154
|
+
except:
|
|
155
|
+
logging.info('could not find use_ssl in configuration -- please update your rucio.cfg')
|
|
156
|
+
|
|
157
|
+
port = config_get_int('messaging-fts3', 'port')
|
|
158
|
+
vhost = config_get('messaging-fts3', 'broker_virtual_host', raise_exception=False)
|
|
159
|
+
if not use_ssl:
|
|
160
|
+
username = config_get('messaging-fts3', 'username')
|
|
161
|
+
password = config_get('messaging-fts3', 'password')
|
|
162
|
+
port = config_get_int('messaging-fts3', 'nonssl_port')
|
|
163
|
+
|
|
164
|
+
conns = []
|
|
165
|
+
for broker in brokers_resolved:
|
|
166
|
+
if not use_ssl:
|
|
167
|
+
logging.info('setting up username/password authentication: %s' % broker)
|
|
168
|
+
else:
|
|
169
|
+
logging.info('setting up ssl cert/key authentication: %s' % broker)
|
|
170
|
+
con = stomp.Connection12(host_and_ports=[(broker, port)],
|
|
171
|
+
vhost=vhost,
|
|
172
|
+
reconnect_attempts_max=999)
|
|
173
|
+
if use_ssl:
|
|
174
|
+
con.set_ssl(
|
|
175
|
+
key_file=config_get('messaging-fts3', 'ssl_key_file'),
|
|
176
|
+
cert_file=config_get('messaging-fts3', 'ssl_cert_file'),
|
|
177
|
+
)
|
|
178
|
+
conns.append(con)
|
|
179
|
+
|
|
180
|
+
logging.info('receiver started')
|
|
181
|
+
|
|
182
|
+
with (HeartbeatHandler(executable=DAEMON_NAME, renewal_interval=30) as heartbeat_handler,
|
|
183
|
+
request_core.TransferStatsManager() as transfer_stats_manager):
|
|
184
|
+
while not GRACEFUL_STOP.is_set():
|
|
185
|
+
|
|
186
|
+
_, _, logger = heartbeat_handler.live()
|
|
187
|
+
|
|
188
|
+
for conn in conns:
|
|
189
|
+
|
|
190
|
+
if not conn.is_connected():
|
|
191
|
+
logger(logging.INFO, 'connecting to %s' % conn.transport._Transport__host_and_ports[0][0])
|
|
192
|
+
METRICS.counter('reconnect.{host}').labels(host=conn.transport._Transport__host_and_ports[0][0].split('.')[0]).inc()
|
|
193
|
+
|
|
194
|
+
conn.set_listener(
|
|
195
|
+
'rucio-messaging-fts3',
|
|
196
|
+
Receiver(
|
|
197
|
+
broker=conn.transport._Transport__host_and_ports[0],
|
|
198
|
+
id_=id_,
|
|
199
|
+
total_threads=total_threads,
|
|
200
|
+
transfer_stats_manager=transfer_stats_manager,
|
|
201
|
+
all_vos=all_vos
|
|
202
|
+
))
|
|
203
|
+
if not use_ssl:
|
|
204
|
+
conn.connect(username, password, wait=True)
|
|
205
|
+
else:
|
|
206
|
+
conn.connect(wait=True)
|
|
207
|
+
conn.subscribe(destination=config_get('messaging-fts3', 'destination'),
|
|
208
|
+
id='rucio-messaging-fts3',
|
|
209
|
+
ack='auto')
|
|
210
|
+
time.sleep(1)
|
|
211
|
+
|
|
212
|
+
for conn in conns:
|
|
213
|
+
try:
|
|
214
|
+
conn.disconnect()
|
|
215
|
+
except Exception:
|
|
216
|
+
pass
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def stop(signum: Optional[int] = None, frame: Optional["FrameType"] = None) -> None:
|
|
220
|
+
"""
|
|
221
|
+
Graceful exit.
|
|
222
|
+
"""
|
|
223
|
+
|
|
224
|
+
GRACEFUL_STOP.set()
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def run(
|
|
228
|
+
once: bool = False,
|
|
229
|
+
total_threads: int = 1
|
|
230
|
+
) -> None:
|
|
231
|
+
"""
|
|
232
|
+
Starts up the receiver thread
|
|
233
|
+
"""
|
|
234
|
+
setup_logging(process_name=DAEMON_NAME)
|
|
235
|
+
|
|
236
|
+
if rucio.db.sqla.util.is_old_db():
|
|
237
|
+
raise exception.DatabaseException('Database was not updated, daemon won\'t start')
|
|
238
|
+
|
|
239
|
+
logging.info('starting receiver thread')
|
|
240
|
+
threads = [threading.Thread(target=receiver, kwargs={'id_': i,
|
|
241
|
+
'total_threads': total_threads}) for i in range(0, total_threads)]
|
|
242
|
+
|
|
243
|
+
[thread.start() for thread in threads]
|
|
244
|
+
|
|
245
|
+
logging.info('waiting for interrupts')
|
|
246
|
+
|
|
247
|
+
# Interruptible joins require a timeout.
|
|
248
|
+
while threads:
|
|
249
|
+
threads = [thread.join(timeout=3.14) for thread in threads if thread and thread.is_alive()]
|