rucio 32.3.0__tar.gz → 32.4.0__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-32.3.0 → rucio-32.4.0}/PKG-INFO +1 -1
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +20 -18
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/webdav.py +1 -1
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/fts3.py +62 -1
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/vcsversion.py +3 -3
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/dids.py +10 -1
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/rses.py +6 -9
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_api_external_representation.py +80 -70
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_clients.py +1 -40
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_conveyor.py +24 -3
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_replica.py +11 -7
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_replica_recoverer.py +24 -4
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse.py +12 -15
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_undertaker.py +8 -8
- {rucio-32.3.0 → rucio-32.4.0}/AUTHORS.rst +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/ChangeLog +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/LICENSE +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/MANIFEST.in +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/README.rst +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-abacus-account +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-abacus-collection-replica +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-abacus-rse +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-admin +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-atropos +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-auditor +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-automatix +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-bb8 +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-c3po +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-cache-client +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-cache-consumer +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-finisher +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-poller +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-preparer +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-receiver +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-stager +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-submitter +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-conveyor-throttler +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-dark-reaper +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-dumper +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-follower +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-hermes +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-judge-cleaner +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-judge-evaluator +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-judge-injector +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-judge-repairer +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-kronos +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-light-reaper +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-minos +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-minos-temporary-expiration +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-necromancer +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-oauth-manager +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-reaper +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-replica-recoverer +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-storage-consistency-actions +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-transmogrifier +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/bin/rucio-undertaker +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/alembic.ini.template +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/alembic_offline.ini.template +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/globus-config.yml.template +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/ldap.cfg.template +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/rse-accounts.cfg.template +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/rucio.cfg.template +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/alembicrevision.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/account.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/account_limit.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/authentication.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/config.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/credential.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/did.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/dirac.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/exporter.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/heartbeat.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/identity.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/importer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/lifetime_exception.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/lock.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/meta.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/permission.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/quarantined_replica.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/replica.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/request.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/rse.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/rule.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/scope.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/subscription.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/temporary_did.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/api/vo.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/accountclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/baseclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/client.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/configclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/credentialclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/didclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/diracclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/downloadclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/exportclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/fileclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/importclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/lockclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/metaclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/pingclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/replicaclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/requestclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/rseclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/ruleclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/scopeclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/subscriptionclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/touchclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/client/uploadclient.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/cache.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/config.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/constants.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/constraints.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/didtype.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/dumper/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/dumper/consistency.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/dumper/data_models.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/dumper/path_parsing.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/exception.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/extra.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/logging.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/pcache.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/policy.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/atlas.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/belleii.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/cms.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/domatpc.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/escape.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/generic.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/icecube.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/schema/lsst.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/stomp_utils.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/stopwatch.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/types.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/common/utils.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/account.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/account_counter.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/account_limit.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/authentication.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/config.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/credential.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/did_column_meta.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/filter_engine.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/json_meta.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/mongo_meta.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/did_meta_plugins/postgres_meta.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/dirac.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/distance.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/exporter.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/heartbeat.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/identity.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/importer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/lifetime_exception.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/lock.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/message.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/meta.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/monitor.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/naming_convention.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/nongrid_trace.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/oidc.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/atlas.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/belleii.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/cms.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/escape.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/generic.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/quarantined_replica.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/replica.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/replica_sorter.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/request.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rse.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rse_counter.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rse_expression_parser.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rse_selector.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rule.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/rule_grouping.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/scope.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/subscription.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/temporary_did.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/topology.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/trace.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/transfer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/vo.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/core/volatile_replica.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/abacus/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/abacus/account.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/abacus/rse.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/atropos/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/atropos/atropos.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/auditor/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/auditor/hdfs.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/automatix/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/automatix/automatix.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/badreplicas/minos.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/bb8/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/bb8/bb8.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/bb8/common.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/algorithms/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/algorithms/simple.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/algorithms/t2_free_space.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/c3po.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/agis.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/free_space.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/jedi_did.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/mock_did.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/network_metrics.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/collectors/workload.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/dataset_cache.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/expiring_dataset_cache.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/expiring_list.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/popularity.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/c3po/utils/timeseries.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/cache/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/cache/consumer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/common.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/common.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/finisher.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/poller.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/preparer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/receiver.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/stager.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/submitter.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/conveyor/throttler.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/follower/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/follower/follower.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/hermes/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/hermes/hermes.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/judge/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/judge/cleaner.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/judge/evaluator.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/judge/injector.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/judge/repairer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/reaper/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/reaper/light_reaper.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/reaper/reaper.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/storage/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/storage/consistency/actions.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/tracer/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/tracer/kronos.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/undertaker/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/constants.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/models.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/sautils.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/session.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/types.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/db/sqla/util.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/gfal.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/gsiftp.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/protocols/xrootd.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/tests/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/tests/common.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/tests/common_server.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/globus.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/globus_library.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/mock.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/transfertool/transfertool.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/version.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/accounts.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/archives.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/auth.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/common.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/config.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/credentials.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/dirac.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/export.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/identities.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/import.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/locks.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/main.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/meta.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/metrics.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/ping.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/redirect.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/replicas.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/requests.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/rules.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/scopes.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/traces.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/flaskapi/v1/vos.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/main.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio/web/rest/metrics.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/lib/rucio.egg-info/SOURCES.txt +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/pylintrc +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/pyproject.toml +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/requirements.txt +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/setup.cfg +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/setup.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/setuputil.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_abacus_account.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_abacus_collection_replica.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_abacus_rse.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_account.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_account_limits.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_archive.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_auditor.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_auditor_hdfs.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_auditor_srmdumps.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_authentication.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_automatix.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_bad_replica.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_bb8.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_belleii.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_bin_rucio.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_boolean.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_common_types.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_config.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_conveyor_submitter.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_counter.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_credential.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_curl.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_daemons.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_dataset_replicas.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_db.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_did.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_did_meta_plugins.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_didtype.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_download.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_dumper.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_dumper_consistency.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_dumper_data_model.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_dumper_path_parsing.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_filter_engine.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_heartbeat.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_hermes.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_identity.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_impl_upload_download.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_import_export.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_judge_cleaner.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_judge_evaluator.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_judge_injector.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_judge_repairer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_lifetime.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_message.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_meta.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_meta_did.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_module_import.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_monitor.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_multi_vo.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_naming_convention.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_oauthmanager.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_oidc.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_permission.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_pfns.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_ping.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_preparer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_qos.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_quarantined_replica.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_reaper.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_redirect.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_replica_sorting.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_request.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_root_proxy.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_expression_parser.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_lfn2path.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_posix.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_srm.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rse_selector.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rucio_server.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_rule.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_schema_cms.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_scope.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_subscription.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_temporary_did.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_throttler.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_tpc.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_trace.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_transfer.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_upload.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tests/test_utils.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tools/bootstrap.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tools/merge_rucio_configs.py +0 -0
- {rucio-32.3.0 → rucio-32.4.0}/tools/reset_database.py +0 -0
{rucio-32.3.0 → rucio-32.4.0}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py
RENAMED
|
@@ -367,28 +367,30 @@ def run_once(heartbeat_handler: Any, younger_than: int, nattempts: int, vos: Opt
|
|
|
367
367
|
file_metadata_datatype = str(file_metadata["datatype"])
|
|
368
368
|
file_metadata_scope = str(file_metadata["scope"])
|
|
369
369
|
action = ""
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
if re.match(scope, file_metadata_scope):
|
|
370
|
+
if file_metadata_datatype:
|
|
371
|
+
# Some files don't have a datatype. They should be ignored.
|
|
372
|
+
for policy in json_data:
|
|
373
|
+
match_scope = False
|
|
374
|
+
match_datatype = False
|
|
375
|
+
|
|
376
|
+
if not policy.get("scope", []):
|
|
378
377
|
match_scope = True
|
|
379
|
-
|
|
378
|
+
for scope in policy.get("scope", []):
|
|
379
|
+
if re.match(scope, file_metadata_scope):
|
|
380
|
+
match_scope = True
|
|
381
|
+
break
|
|
380
382
|
|
|
381
|
-
|
|
382
|
-
match_datatype = True
|
|
383
|
-
for datatype in policy.get("datatype", []):
|
|
384
|
-
if re.match(datatype, file_metadata_datatype):
|
|
383
|
+
if not policy.get("datatype", []):
|
|
385
384
|
match_datatype = True
|
|
386
|
-
|
|
385
|
+
for datatype in policy.get("datatype", []):
|
|
386
|
+
if re.match(datatype, file_metadata_datatype):
|
|
387
|
+
match_datatype = True
|
|
388
|
+
break
|
|
387
389
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
390
|
+
if match_scope and match_datatype:
|
|
391
|
+
action = policy["action"]
|
|
392
|
+
logger(logging.INFO, "The action that will be performed is %s", action)
|
|
393
|
+
break
|
|
392
394
|
|
|
393
395
|
if not action:
|
|
394
396
|
logger(logging.WARNING, "No recognised actions (ignore/declare bad) found in policy file (etc/suspicious_replica_recoverer.json). Replica will be ignored by default.")
|
|
@@ -483,7 +483,7 @@ class Default(protocol.RSEProtocol):
|
|
|
483
483
|
:raises SourceNotFound: if the source file was not found on the referred storage.
|
|
484
484
|
:raises RSEAccessDenied: in case of permission issue.
|
|
485
485
|
|
|
486
|
-
:returns: a dict with
|
|
486
|
+
:returns: a dict with filesize of the file provided in path as a key.
|
|
487
487
|
"""
|
|
488
488
|
headers = {'Depth': '1'}
|
|
489
489
|
dict_ = {}
|
|
@@ -31,7 +31,7 @@ from requests.adapters import ReadTimeout
|
|
|
31
31
|
from requests.packages.urllib3 import disable_warnings # pylint: disable=import-error
|
|
32
32
|
|
|
33
33
|
from rucio.common.cache import make_region_memcached
|
|
34
|
-
from rucio.common.config import config_get, config_get_bool
|
|
34
|
+
from rucio.common.config import config_get, config_get_bool, config_get_int
|
|
35
35
|
from rucio.common.constants import FTS_JOB_TYPE, FTS_STATE, FTS_COMPLETE_STATE
|
|
36
36
|
from rucio.common.exception import TransferToolTimeout, TransferToolWrongAnswer, DuplicateFileTransferSubmission
|
|
37
37
|
from rucio.common.stopwatch import Stopwatch
|
|
@@ -104,6 +104,61 @@ PATH_CHECKSUM_VALIDATION_STRATEGY: dict[tuple[str, str], str] = {
|
|
|
104
104
|
('none', 'none'): 'none',
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
+
_SCITAGS_NEXT_REFRESH = datetime.datetime.utcnow()
|
|
108
|
+
_SCITAGS_EXP_ID = None
|
|
109
|
+
_SCITAGS_ACTIVITY_IDS = {}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _scitags_ids(logger: Callable[..., Any] = logging.log) -> "tuple[int | None, dict[str, int]]":
|
|
113
|
+
"""
|
|
114
|
+
Re-fetch if needed and return the scitags ids
|
|
115
|
+
"""
|
|
116
|
+
enabled = config_get_bool('packet-marking', 'enabled', default=False)
|
|
117
|
+
if not enabled:
|
|
118
|
+
return None, {}
|
|
119
|
+
|
|
120
|
+
now = datetime.datetime.utcnow()
|
|
121
|
+
global _SCITAGS_ACTIVITY_IDS
|
|
122
|
+
global _SCITAGS_EXP_ID
|
|
123
|
+
global _SCITAGS_NEXT_REFRESH
|
|
124
|
+
if _SCITAGS_NEXT_REFRESH < now:
|
|
125
|
+
exp_name = config_get('packet-marking', 'exp_name', default='')
|
|
126
|
+
fetch_url = config_get('packet-marking', 'fetch_url', default='https://www.scitags.org/api.json')
|
|
127
|
+
fetch_interval = config_get_int('packet-marking', 'fetch_interval', default=datetime.timedelta(hours=48).seconds)
|
|
128
|
+
fetch_timeout = config_get_int('packet-marking', 'fetch_timeout', default=5)
|
|
129
|
+
|
|
130
|
+
_SCITAGS_NEXT_REFRESH = now + datetime.timedelta(seconds=fetch_interval)
|
|
131
|
+
|
|
132
|
+
if exp_name:
|
|
133
|
+
had_exception = False
|
|
134
|
+
exp_id = None
|
|
135
|
+
activity_ids = {}
|
|
136
|
+
try:
|
|
137
|
+
result = requests.get(fetch_url, timeout=fetch_timeout)
|
|
138
|
+
if result and result.status_code == 200:
|
|
139
|
+
marks = result.json()
|
|
140
|
+
for experiment in marks.get('experiments', []):
|
|
141
|
+
if experiment.get('expName') == exp_name:
|
|
142
|
+
exp_id = experiment.get('expId')
|
|
143
|
+
for activity_dict in experiment.get('activities', []):
|
|
144
|
+
activity_name = activity_dict.get('activityName')
|
|
145
|
+
activity_id = activity_dict.get('activityId')
|
|
146
|
+
if activity_name and activity_id:
|
|
147
|
+
activity_ids[activity_name] = int(activity_id)
|
|
148
|
+
break
|
|
149
|
+
except (requests.exceptions.RequestException, TypeError, ValueError):
|
|
150
|
+
had_exception = True
|
|
151
|
+
logger(logging.WARNING, 'Failed to fetch the scitags markings', exc_info=True)
|
|
152
|
+
|
|
153
|
+
if had_exception:
|
|
154
|
+
# Retry quicker after fetch errors
|
|
155
|
+
_SCITAGS_NEXT_REFRESH = min(_SCITAGS_NEXT_REFRESH, now + datetime.timedelta(minutes=5))
|
|
156
|
+
else:
|
|
157
|
+
_SCITAGS_EXP_ID = exp_id
|
|
158
|
+
_SCITAGS_ACTIVITY_IDS = activity_ids
|
|
159
|
+
|
|
160
|
+
return _SCITAGS_EXP_ID, _SCITAGS_ACTIVITY_IDS
|
|
161
|
+
|
|
107
162
|
|
|
108
163
|
def _pick_cert_file(vo: "Optional[str]") -> "Optional[str]":
|
|
109
164
|
cert = None
|
|
@@ -791,6 +846,8 @@ class FTS3Transfertool(Transfertool):
|
|
|
791
846
|
self.cert = None
|
|
792
847
|
self.verify = True # True is the default setting of a requests.* method
|
|
793
848
|
|
|
849
|
+
self.scitags_exp_id, self.scitags_activity_ids = _scitags_ids(logger=logger)
|
|
850
|
+
|
|
794
851
|
@classmethod
|
|
795
852
|
def _pick_fts_servers(cls, source_rse: "RseData", dest_rse: "RseData"):
|
|
796
853
|
"""
|
|
@@ -882,6 +939,10 @@ class FTS3Transfertool(Transfertool):
|
|
|
882
939
|
'selection_strategy': self.source_strategy if self.source_strategy else _configured_source_strategy(transfer.rws.activity, logger=self.logger),
|
|
883
940
|
'activity': rws.activity
|
|
884
941
|
}
|
|
942
|
+
if isinstance(self.scitags_exp_id, int):
|
|
943
|
+
activity_id = self.scitags_activity_ids.get(rws.activity)
|
|
944
|
+
if isinstance(activity_id, int):
|
|
945
|
+
t_file['metadata']['scitags_id'] = self.scitags_exp_id << 6 | activity_id
|
|
885
946
|
return t_file
|
|
886
947
|
|
|
887
948
|
def submit(self, transfers, job_params, timeout=None):
|
|
@@ -4,8 +4,8 @@ This file is automatically generated; Do not edit it. :)
|
|
|
4
4
|
'''
|
|
5
5
|
VERSION_INFO = {
|
|
6
6
|
'final': True,
|
|
7
|
-
'version': '32.
|
|
7
|
+
'version': '32.4.0',
|
|
8
8
|
'branch_nick': 'release-32-LTS',
|
|
9
|
-
'revision_id': '
|
|
10
|
-
'revno':
|
|
9
|
+
'revision_id': 'b32edac1a7e6c5f13575c92112afaa9e4b7e31b8',
|
|
10
|
+
'revno': 12629
|
|
11
11
|
}
|
|
@@ -24,7 +24,7 @@ from rucio.api.did import add_did, add_dids, list_content, list_content_history,
|
|
|
24
24
|
resurrect, get_users_following_did, remove_did_from_followed, add_did_to_followed, delete_metadata, \
|
|
25
25
|
set_metadata_bulk, set_dids_metadata_bulk
|
|
26
26
|
from rucio.api.rule import list_replication_rules, list_associated_replication_rules_for_file
|
|
27
|
-
from rucio.common.exception import ScopeNotFound, DataIdentifierNotFound, DataIdentifierAlreadyExists, \
|
|
27
|
+
from rucio.common.exception import ScopeNotFound, DatabaseException, DataIdentifierNotFound, DataIdentifierAlreadyExists, \
|
|
28
28
|
DuplicateContent, AccessDenied, KeyNotFound, Duplicate, InvalidValueForKey, UnsupportedStatus, \
|
|
29
29
|
UnsupportedOperation, RSENotFound, RuleNotFound, InvalidMetadata, InvalidPath, FileAlreadyExists, InvalidObject, FileConsistencyMismatch
|
|
30
30
|
from rucio.common.utils import render_json, APIEncoder
|
|
@@ -655,6 +655,15 @@ class DIDs(ErrorHandlingMethodView):
|
|
|
655
655
|
return generate_http_error_flask(409, error)
|
|
656
656
|
except AccessDenied as error:
|
|
657
657
|
return generate_http_error_flask(401, error)
|
|
658
|
+
except DatabaseException as error:
|
|
659
|
+
if 'DELETED_DIDS_PK violated' in str(error):
|
|
660
|
+
return generate_http_error_flask(
|
|
661
|
+
status_code=406,
|
|
662
|
+
exc=error.__class__.__name__,
|
|
663
|
+
exc_msg=str('A deleted DID {} with scope {} is reused'.format(name, scope))
|
|
664
|
+
)
|
|
665
|
+
else:
|
|
666
|
+
return generate_http_error_flask(406, error)
|
|
658
667
|
|
|
659
668
|
return 'Created', 201
|
|
660
669
|
|
|
@@ -43,15 +43,12 @@ class RSEs(ErrorHandlingMethodView):
|
|
|
43
43
|
description: Lists all RSEs.
|
|
44
44
|
tags:
|
|
45
45
|
- Rucio Storage Elements
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
expression:
|
|
53
|
-
description: An RSE expression.
|
|
54
|
-
type: string
|
|
46
|
+
parameters:
|
|
47
|
+
- name: expression
|
|
48
|
+
in: query
|
|
49
|
+
description: RSE expression to select RSEs.
|
|
50
|
+
schema:
|
|
51
|
+
type: string
|
|
55
52
|
responses:
|
|
56
53
|
200:
|
|
57
54
|
description: OK
|
|
@@ -36,7 +36,6 @@ from rucio.api.subscription import add_subscription, list_subscriptions, list_su
|
|
|
36
36
|
from rucio.common.config import config_get_bool
|
|
37
37
|
from rucio.common.types import InternalScope
|
|
38
38
|
from rucio.common.utils import api_update_return_dict, generate_uuid
|
|
39
|
-
from rucio.core.rse import get_rse_id
|
|
40
39
|
from rucio.core.vo import add_vo, vo_exists
|
|
41
40
|
from rucio.daemons.abacus import rse as abacus_rse
|
|
42
41
|
from rucio.daemons.judge import cleaner
|
|
@@ -93,34 +92,31 @@ class TestApiExternalRepresentation:
|
|
|
93
92
|
@classmethod
|
|
94
93
|
def setUpClass(cls):
|
|
95
94
|
# Get test RSEs
|
|
96
|
-
cls.rse_name = 'MOCK'
|
|
97
|
-
cls.rse_id = get_rse_id(rse=cls.rse_name, vo=cls.vo)
|
|
98
|
-
cls.rse2_name = 'MOCK2'
|
|
99
|
-
cls.rse2_id = get_rse_id(rse=cls.rse2_name, vo=cls.vo)
|
|
100
|
-
|
|
101
95
|
cls.rse3_name = rse_name_generator()
|
|
102
96
|
cls.rse3_id = api_rse.add_rse(cls.rse3_name, 'root', vo=cls.vo2 if cls.vo2 else cls.vo)
|
|
103
97
|
cls.rse4_name = rse_name_generator()
|
|
104
98
|
cls.rse4_id = api_rse.add_rse(cls.rse4_name, 'root', vo=cls.vo2 if cls.vo2 else cls.vo)
|
|
105
99
|
api_rse.add_distance(cls.rse3_name, cls.rse4_name, issuer='root', distance=3, vo=cls.vo2 or cls.vo)
|
|
106
100
|
|
|
107
|
-
def test_api_update_return_dict(self, account, account_name, scope_name, scope):
|
|
101
|
+
def test_api_update_return_dict(self, rse_factory, account, account_name, scope_name, scope):
|
|
108
102
|
""" API: Test the conversion of dictionaries to external representation """
|
|
103
|
+
rse1, rse1_id = rse_factory.make_rse()
|
|
104
|
+
rse2, rse2_id = rse_factory.make_rse()
|
|
109
105
|
test_dict = {'account': account,
|
|
110
106
|
'scope': scope,
|
|
111
|
-
'rse_expression': '
|
|
112
|
-
'rse_id':
|
|
113
|
-
'src_rse_id':
|
|
114
|
-
'source_rse_id':
|
|
115
|
-
'dest_rse_id':
|
|
116
|
-
'destination_rse_id':
|
|
107
|
+
'rse_expression': f'{rse1}|{rse2}',
|
|
108
|
+
'rse_id': rse1_id,
|
|
109
|
+
'src_rse_id': rse1_id,
|
|
110
|
+
'source_rse_id': rse1_id,
|
|
111
|
+
'dest_rse_id': rse1_id,
|
|
112
|
+
'destination_rse_id': rse1_id}
|
|
117
113
|
value = api_update_return_dict(test_dict)
|
|
118
|
-
expected = {'account': account_name, 'scope': scope_name, 'rse_expression': '
|
|
119
|
-
'rse_id':
|
|
120
|
-
'src_rse_id':
|
|
121
|
-
'source_rse_id':
|
|
122
|
-
'dest_rse_id':
|
|
123
|
-
'destination_rse_id':
|
|
114
|
+
expected = {'account': account_name, 'scope': scope_name, 'rse_expression': f'{rse1}|{rse2}',
|
|
115
|
+
'rse_id': rse1_id, 'rse': rse1,
|
|
116
|
+
'src_rse_id': rse1_id, 'src_rse': rse1,
|
|
117
|
+
'source_rse_id': rse1_id, 'source_rse': rse1,
|
|
118
|
+
'dest_rse_id': rse1_id, 'dest_rse': rse1,
|
|
119
|
+
'destination_rse_id': rse1_id, 'destination_rse': rse1}
|
|
124
120
|
assert value == expected
|
|
125
121
|
|
|
126
122
|
def test_api_account(self, vo, vo2, account, account_name):
|
|
@@ -134,20 +130,22 @@ class TestApiExternalRepresentation:
|
|
|
134
130
|
assert account.internal not in out
|
|
135
131
|
assert '@' not in ' '.join(out)
|
|
136
132
|
|
|
137
|
-
def test_api_account_limit(self, vo, vo2, account_name):
|
|
133
|
+
def test_api_account_limit(self, rse_factory, vo, vo2, account_name):
|
|
138
134
|
""" ACCOUNT_LIMIT (API): Test external representation of account limits """
|
|
139
135
|
# Add mock account limits
|
|
140
|
-
|
|
141
|
-
|
|
136
|
+
rse1, rse1_id = rse_factory.make_rse()
|
|
137
|
+
rse2, rse2_id = rse_factory.make_rse()
|
|
138
|
+
rse_expr = f'{rse1}|{rse2}'
|
|
139
|
+
api_acc_lim.set_local_account_limit(account_name, rse1, 10000, issuer='root', vo=vo)
|
|
142
140
|
api_acc_lim.set_global_account_limit(account_name, rse_expr, 20000, issuer='root', vo=vo)
|
|
143
141
|
|
|
144
142
|
out = api_acc_lim.get_local_account_limits(account_name, vo=vo)
|
|
145
|
-
assert
|
|
146
|
-
assert
|
|
143
|
+
assert rse1 in out
|
|
144
|
+
assert rse1_id not in out
|
|
147
145
|
|
|
148
|
-
out = api_acc_lim.get_local_account_limit(account_name,
|
|
149
|
-
assert
|
|
150
|
-
assert
|
|
146
|
+
out = api_acc_lim.get_local_account_limit(account_name, rse1, vo=vo)
|
|
147
|
+
assert rse1 in out
|
|
148
|
+
assert rse1_id not in out
|
|
151
149
|
|
|
152
150
|
out = api_acc_lim.get_global_account_limits(account_name, vo=vo)
|
|
153
151
|
assert rse_expr in out
|
|
@@ -159,15 +157,15 @@ class TestApiExternalRepresentation:
|
|
|
159
157
|
if vo2:
|
|
160
158
|
assert 'vo={}&({})'.format(vo, rse_expr) not in out
|
|
161
159
|
|
|
162
|
-
out = api_acc_lim.get_local_account_usage(account_name,
|
|
160
|
+
out = api_acc_lim.get_local_account_usage(account_name, rse1, issuer='root', vo=vo)
|
|
163
161
|
out = list(out)
|
|
164
162
|
assert 0 != len(out)
|
|
165
|
-
assert
|
|
163
|
+
assert rse1_id in [usage['rse_id'] for usage in out if 'rse_id' in usage]
|
|
166
164
|
for usage in out:
|
|
167
165
|
if 'rse_id' in usage:
|
|
168
166
|
assert 'rse' in usage
|
|
169
|
-
if usage['rse_id'] ==
|
|
170
|
-
assert
|
|
167
|
+
if usage['rse_id'] == rse1_id:
|
|
168
|
+
assert rse1 == usage["rse"]
|
|
171
169
|
|
|
172
170
|
out = api_acc_lim.get_global_account_usage(account_name, rse_expr, issuer='root', vo=vo)
|
|
173
171
|
out = list(out)
|
|
@@ -205,9 +203,11 @@ class TestApiExternalRepresentation:
|
|
|
205
203
|
for user in out:
|
|
206
204
|
assert user['user'] == account_name
|
|
207
205
|
|
|
208
|
-
def test_api_exporter(self, vo, vo2):
|
|
206
|
+
def test_api_exporter(self, vo, rse_factory, vo2):
|
|
209
207
|
""" EXPORTER (API): Test external representation of exported data """
|
|
210
208
|
|
|
209
|
+
rse1, rse1_id = rse_factory.make_rse()
|
|
210
|
+
rse2, rse2_id = rse_factory.make_rse()
|
|
211
211
|
out = export_data('root', vo=vo2 if vo2 else vo)
|
|
212
212
|
rses = out['rses']
|
|
213
213
|
assert self.rse3_name in rses
|
|
@@ -221,15 +221,15 @@ class TestApiExternalRepresentation:
|
|
|
221
221
|
|
|
222
222
|
# check for interference from other VOs
|
|
223
223
|
if vo2:
|
|
224
|
-
assert
|
|
225
|
-
assert
|
|
226
|
-
assert
|
|
227
|
-
assert
|
|
224
|
+
assert rse1 not in rses
|
|
225
|
+
assert rse1_id not in rses
|
|
226
|
+
assert rse2 not in rses
|
|
227
|
+
assert rse2_id not in rses
|
|
228
228
|
|
|
229
|
-
assert
|
|
230
|
-
assert
|
|
231
|
-
assert
|
|
232
|
-
assert
|
|
229
|
+
assert rse1 not in distances
|
|
230
|
+
assert rse1_id not in distances
|
|
231
|
+
assert rse2 not in distances
|
|
232
|
+
assert rse2_id not in distances
|
|
233
233
|
|
|
234
234
|
def test_api_identity(self, vo, vo2, account, account_name):
|
|
235
235
|
""" IDENTITY (API): Test external representation of identity accounts """
|
|
@@ -243,20 +243,26 @@ class TestApiExternalRepresentation:
|
|
|
243
243
|
if vo2:
|
|
244
244
|
assert account.internal not in out
|
|
245
245
|
|
|
246
|
-
def test_api_replica(self, vo, vo2, account_name, scope_name, scope):
|
|
246
|
+
def test_api_replica(self, vo, rse_factory, vo2, account_name, scope_name, scope):
|
|
247
247
|
""" REPLICA (API): Test external representation of replicas """
|
|
248
248
|
|
|
249
249
|
did = did_name_generator('file')
|
|
250
250
|
did_parent = did_name_generator('dataset')
|
|
251
|
-
|
|
252
|
-
|
|
251
|
+
rse2, rse2_id = rse_factory.make_rse(scheme='srm', protocol_impl='rucio.rse.protocols.gfal.Default', deterministic=False)
|
|
252
|
+
protocols = api_rse.get_rse_protocols(rse2, issuer='root', vo=vo)
|
|
253
|
+
pfn = 'srm://%s:%s/srm/managerv2?SFN=%s%s/%s' % (protocols['protocols'][0]['hostname'],
|
|
254
|
+
protocols['protocols'][0]['port'],
|
|
255
|
+
protocols['protocols'][0]['prefix'],
|
|
256
|
+
scope_name,
|
|
257
|
+
generate_uuid())
|
|
258
|
+
add_replicas(rse2, files=[{'scope': scope_name, 'name': did, 'bytes': 100, 'pfn': pfn}], issuer='root', vo=vo)
|
|
253
259
|
|
|
254
260
|
add_did(scope_name, did_parent, 'dataset', issuer='root', account=account_name, vo=vo)
|
|
255
261
|
attachment = {'scope': scope_name, 'name': did_parent,
|
|
256
262
|
'dids': [{'scope': scope_name, 'name': did}]}
|
|
257
263
|
attach_dids_to_dids([attachment], issuer='root', vo=vo)
|
|
258
264
|
|
|
259
|
-
out = get_did_from_pfns([pfn],
|
|
265
|
+
out = get_did_from_pfns([pfn], rse2, vo=vo)
|
|
260
266
|
out = list(out)
|
|
261
267
|
assert 0 != len(out)
|
|
262
268
|
did_found = False
|
|
@@ -281,15 +287,17 @@ class TestApiExternalRepresentation:
|
|
|
281
287
|
assert scope.internal not in parent
|
|
282
288
|
assert parents_found
|
|
283
289
|
|
|
284
|
-
def test_api_request(self, vo, account_name, scope_name):
|
|
290
|
+
def test_api_request(self, vo, rse_factory, account_name, scope_name):
|
|
285
291
|
""" REQUEST (API): Test external representation of requests """
|
|
286
292
|
|
|
293
|
+
rse1, rse1_id = rse_factory.make_rse()
|
|
294
|
+
rse2, rse2_id = rse_factory.make_rse()
|
|
287
295
|
did = did_name_generator('dataset')
|
|
288
|
-
add_did(scope_name, did, 'dataset', issuer='root', account=account_name, rse=
|
|
296
|
+
add_did(scope_name, did, 'dataset', issuer='root', account=account_name, rse=rse1, vo=vo)
|
|
289
297
|
|
|
290
298
|
requests = [{
|
|
291
|
-
'dest_rse_id':
|
|
292
|
-
'source_rse_id':
|
|
299
|
+
'dest_rse_id': rse2_id,
|
|
300
|
+
'source_rse_id': rse1_id,
|
|
293
301
|
'request_type': constants.RequestType.TRANSFER,
|
|
294
302
|
'request_id': generate_uuid(),
|
|
295
303
|
'name': did,
|
|
@@ -312,16 +320,16 @@ class TestApiExternalRepresentation:
|
|
|
312
320
|
for r in reqs:
|
|
313
321
|
assert r['scope'] == scope_name
|
|
314
322
|
assert r['account'] == account_name
|
|
315
|
-
assert r['source_rse'] ==
|
|
316
|
-
assert r['dest_rse'] ==
|
|
323
|
+
assert r['source_rse'] == rse1
|
|
324
|
+
assert r['dest_rse'] == rse2
|
|
317
325
|
|
|
318
|
-
out = get_request_by_did(scope_name, did,
|
|
326
|
+
out = get_request_by_did(scope_name, did, rse2, issuer='root', vo=vo)
|
|
319
327
|
assert out['scope'] == scope_name
|
|
320
328
|
assert out['account'] == account_name
|
|
321
|
-
assert out['dest_rse'] ==
|
|
322
|
-
assert out['source_rse'] ==
|
|
329
|
+
assert out['dest_rse'] == rse2
|
|
330
|
+
assert out['source_rse'] == rse1
|
|
323
331
|
|
|
324
|
-
out = list_requests([
|
|
332
|
+
out = list_requests([rse1], [rse2], [constants.RequestState.QUEUED], issuer='root', vo=vo)
|
|
325
333
|
out = list(out)
|
|
326
334
|
assert 0 != len(out)
|
|
327
335
|
assert scope_name in [req['scope'] for req in out]
|
|
@@ -329,16 +337,18 @@ class TestApiExternalRepresentation:
|
|
|
329
337
|
if req['scope'] == scope_name:
|
|
330
338
|
assert req['scope'] == scope_name
|
|
331
339
|
assert req['account'] == account_name
|
|
332
|
-
assert req['dest_rse'] ==
|
|
333
|
-
assert req['source_rse'] ==
|
|
340
|
+
assert req['dest_rse'] == rse2
|
|
341
|
+
assert req['source_rse'] == rse1
|
|
334
342
|
|
|
335
343
|
@pytest.mark.noparallel(reason='runs the reaper on a pre-defined rse, might interfere with other tests')
|
|
336
|
-
def test_api_rse(self, vo, vo2, account, account_name, scope_name):
|
|
344
|
+
def test_api_rse(self, vo, rse_factory, vo2, account, account_name, scope_name):
|
|
337
345
|
""" RSE (API): Test external representation of RSEs """
|
|
338
346
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
347
|
+
rse1, rse1_id = rse_factory.make_rse()
|
|
348
|
+
rse2, rse2_id = rse_factory.make_rse()
|
|
349
|
+
out = api_rse.get_rse(rse1, vo=vo)
|
|
350
|
+
assert out['rse'] == rse1
|
|
351
|
+
assert out['id'] == rse1_id
|
|
342
352
|
|
|
343
353
|
out = api_rse.list_rses(vo=vo2 if vo2 else vo)
|
|
344
354
|
out = list(out)
|
|
@@ -354,18 +364,18 @@ class TestApiExternalRepresentation:
|
|
|
354
364
|
assert rse['rse'] == self.rse4_name
|
|
355
365
|
|
|
356
366
|
key = "KEY_" + generate_uuid()
|
|
357
|
-
api_rse.add_rse_attribute(
|
|
367
|
+
api_rse.add_rse_attribute(rse1, key, 1, issuer='root', vo=vo)
|
|
358
368
|
out = api_rse.get_rses_with_attribute(key)
|
|
359
369
|
out = list(out)
|
|
360
370
|
assert 0 != len(out)
|
|
361
371
|
for rse in out:
|
|
362
|
-
assert rse['rse'] ==
|
|
372
|
+
assert rse['rse'] == rse1
|
|
363
373
|
|
|
364
|
-
out = api_rse.get_rse_protocols(
|
|
365
|
-
assert out['rse'] ==
|
|
374
|
+
out = api_rse.get_rse_protocols(rse1, issuer='root', vo=vo)
|
|
375
|
+
assert out['rse'] == rse1
|
|
366
376
|
|
|
367
377
|
# add some account and RSE counters
|
|
368
|
-
rse_mock, rse_mock_id =
|
|
378
|
+
rse_mock, rse_mock_id = rse_factory.make_mock_rse()
|
|
369
379
|
account_counter.del_counter(rse_id=rse_mock_id, account=account)
|
|
370
380
|
account_counter.add_counter(rse_id=rse_mock_id, account=account)
|
|
371
381
|
account_counter.increase(rse_id=rse_mock_id, account=account, files=1, bytes_=10)
|
|
@@ -393,11 +403,11 @@ class TestApiExternalRepresentation:
|
|
|
393
403
|
reaper.run(once=True, include_rses=rse_mock, greedy=True)
|
|
394
404
|
abacus_rse.run(once=True)
|
|
395
405
|
|
|
396
|
-
out = api_rse.parse_rse_expression('
|
|
397
|
-
assert
|
|
398
|
-
assert
|
|
399
|
-
assert
|
|
400
|
-
assert
|
|
406
|
+
out = api_rse.parse_rse_expression(f'{rse1}|{rse2}', vo=vo)
|
|
407
|
+
assert rse1 in out
|
|
408
|
+
assert rse2 in out
|
|
409
|
+
assert rse1_id not in out
|
|
410
|
+
assert rse2_id not in out
|
|
401
411
|
|
|
402
412
|
def test_api_scope(self, vo, vo2, account_name, scope_name, scope):
|
|
403
413
|
""" SCOPE (API): Test external representation of scopes """
|
|
@@ -15,10 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
from datetime import datetime, timedelta
|
|
17
17
|
|
|
18
|
-
from http.server import SimpleHTTPRequestHandler
|
|
19
|
-
from http.server import HTTPServer
|
|
20
18
|
from os import rename
|
|
21
|
-
from threading import Thread
|
|
22
19
|
|
|
23
20
|
import pytest
|
|
24
21
|
|
|
@@ -27,6 +24,7 @@ from rucio.client.client import Client
|
|
|
27
24
|
from rucio.common.config import config_get, config_set
|
|
28
25
|
from rucio.common.exception import CannotAuthenticate, ClientProtocolNotSupported, RucioException
|
|
29
26
|
from rucio.common.utils import execute
|
|
27
|
+
from tests.mocks.mock_http_server import MockServer
|
|
30
28
|
|
|
31
29
|
|
|
32
30
|
@pytest.fixture
|
|
@@ -37,43 +35,6 @@ def client_token_path_override(file_config_mock, function_scope_prefix, tmp_path
|
|
|
37
35
|
config_set('client', 'auth_token_file_path', str(tmp_path / f'{function_scope_prefix}token'))
|
|
38
36
|
|
|
39
37
|
|
|
40
|
-
class MockServer:
|
|
41
|
-
"""
|
|
42
|
-
Start A simple http server in a separate thread to serve as MOCK for testing the client
|
|
43
|
-
"""
|
|
44
|
-
|
|
45
|
-
class Handler(SimpleHTTPRequestHandler):
|
|
46
|
-
def send_code_and_message(self, code, headers, message):
|
|
47
|
-
"""
|
|
48
|
-
Helper which wraps the quite-low-level BaseHTTPRequestHandler primitives and is used to send reponses.
|
|
49
|
-
"""
|
|
50
|
-
self.send_response(code)
|
|
51
|
-
self.send_header("Content-type", "text/plain")
|
|
52
|
-
for name, content in headers.items():
|
|
53
|
-
self.send_header(name, content)
|
|
54
|
-
self.end_headers()
|
|
55
|
-
self.wfile.write(message.encode())
|
|
56
|
-
|
|
57
|
-
def __init__(self, request_handler_cls):
|
|
58
|
-
self.server = HTTPServer(('localhost', 0), request_handler_cls)
|
|
59
|
-
self.thread = Thread(target=self.server.serve_forever)
|
|
60
|
-
self.thread.daemon = True
|
|
61
|
-
|
|
62
|
-
def __enter__(self):
|
|
63
|
-
self.thread.start()
|
|
64
|
-
return self
|
|
65
|
-
|
|
66
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
67
|
-
self.server.shutdown()
|
|
68
|
-
self.thread.join()
|
|
69
|
-
self.server.server_close()
|
|
70
|
-
|
|
71
|
-
@property
|
|
72
|
-
def base_url(self):
|
|
73
|
-
name, port = self.server.server_address
|
|
74
|
-
return 'http://{}:{}'.format(name, port)
|
|
75
|
-
|
|
76
|
-
|
|
77
38
|
@pytest.mark.usefixtures("client_token_path_override")
|
|
78
39
|
class TestBaseClient:
|
|
79
40
|
""" To test Clients"""
|
|
@@ -49,6 +49,7 @@ from rucio.db.sqla.session import read_session, transactional_session
|
|
|
49
49
|
from rucio.tests.common import skip_rse_tests_with_accounts
|
|
50
50
|
from rucio.transfertool.fts3 import FTS3Transfertool
|
|
51
51
|
from tests.ruciopytest import NoParallelGroups
|
|
52
|
+
from tests.mocks.mock_http_server import MockServer
|
|
52
53
|
|
|
53
54
|
MAX_POLL_WAIT_SECONDS = 60
|
|
54
55
|
TEST_FTS_HOST = 'https://fts:8446'
|
|
@@ -118,6 +119,24 @@ def __get_source(request_id, src_rse_id, scope, name, *, session=None):
|
|
|
118
119
|
.first()
|
|
119
120
|
|
|
120
121
|
|
|
122
|
+
@pytest.fixture
|
|
123
|
+
def scitags_mock(core_config_mock):
|
|
124
|
+
"""Run a mock http server which always returns the content of scitags.json from test/inputs"""
|
|
125
|
+
from tests.inputs import SCITAGS_JSON
|
|
126
|
+
from pathlib import Path
|
|
127
|
+
|
|
128
|
+
class _SendScitagsJson(MockServer.Handler):
|
|
129
|
+
def do_GET(self):
|
|
130
|
+
file_content = Path(SCITAGS_JSON).read_text()
|
|
131
|
+
self.send_code_and_message(200, {'Content-Type': 'application/json'}, file_content)
|
|
132
|
+
|
|
133
|
+
with MockServer(_SendScitagsJson) as mock_server:
|
|
134
|
+
core_config.set('packet-marking', 'enabled', True)
|
|
135
|
+
core_config.set('packet-marking', 'fetch_url', mock_server.base_url)
|
|
136
|
+
core_config.set('packet-marking', 'exp_name', 'atlas')
|
|
137
|
+
yield mock_server
|
|
138
|
+
|
|
139
|
+
|
|
121
140
|
@skip_rse_tests_with_accounts
|
|
122
141
|
@pytest.mark.dirty(reason="leaves files in XRD containers")
|
|
123
142
|
@pytest.mark.noparallel(groups=[NoParallelGroups.XRD, NoParallelGroups.SUBMITTER, NoParallelGroups.POLLER, NoParallelGroups.FINISHER])
|
|
@@ -528,7 +547,7 @@ def test_multihop_receiver_on_failure(vo, did_factory, replica_client, root_acco
|
|
|
528
547
|
@pytest.mark.parametrize("caches_mock", [{"caches_to_mock": [
|
|
529
548
|
'rucio.core.rse_expression_parser.REGION', # The list of multihop RSEs is retrieved by rse expression
|
|
530
549
|
]}], indirect=True)
|
|
531
|
-
def test_multihop_receiver_on_success(vo, did_factory, root_account, caches_mock, metrics_mock):
|
|
550
|
+
def test_multihop_receiver_on_success(vo, did_factory, root_account, caches_mock, metrics_mock, scitags_mock):
|
|
532
551
|
"""
|
|
533
552
|
Verify that the receiver correctly handles successful multihop jobs
|
|
534
553
|
"""
|
|
@@ -547,7 +566,7 @@ def test_multihop_receiver_on_success(vo, did_factory, root_account, caches_mock
|
|
|
547
566
|
|
|
548
567
|
did = did_factory.upload_test_file(src_rse)
|
|
549
568
|
rule_priority = 5
|
|
550
|
-
rule_core.add_rule(dids=[did], account=root_account, copies=1, rse_expression=dst_rse, grouping='ALL', weight=None, lifetime=3600, locked=False, subscription_id=None, priority=rule_priority)
|
|
569
|
+
rule_core.add_rule(dids=[did], account=root_account, copies=1, rse_expression=dst_rse, grouping='ALL', weight=None, lifetime=3600, locked=False, subscription_id=None, priority=rule_priority, activity='test')
|
|
551
570
|
submitter(once=True, rses=[{'id': rse_id} for rse_id in all_rses], group_bulk=2, partition_wait_time=0, transfertype='single', filter_transfertool=None)
|
|
552
571
|
|
|
553
572
|
request = __wait_for_state_transition(dst_rse_id=jump_rse_id, run_poller=False, **did)
|
|
@@ -556,7 +575,9 @@ def test_multihop_receiver_on_success(vo, did_factory, root_account, caches_mock
|
|
|
556
575
|
assert request['state'] == RequestState.DONE
|
|
557
576
|
|
|
558
577
|
fts_response = FTS3Transfertool(external_host=TEST_FTS_HOST).bulk_query({request['external_id']: {request['id']: request}})
|
|
559
|
-
|
|
578
|
+
fts_response = fts_response[request['external_id']][request['id']]
|
|
579
|
+
assert fts_response.job_response['priority'] == rule_priority
|
|
580
|
+
assert fts_response.file_response['file_metadata'].get('scitags_id') is not None
|
|
560
581
|
|
|
561
582
|
# Two hops; both handled by receiver
|
|
562
583
|
assert metrics_mock.get_sample_value('rucio_daemons_conveyor_receiver_update_request_state_total', labels={'updated': 'True'}) >= 2
|