rucio 32.6.0__tar.gz → 33.0.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.6.0 → rucio-33.0.0}/PKG-INFO +25 -25
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/alembicrevision.py +1 -1
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/request.py +25 -2
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/didclient.py +0 -13
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/did_meta_plugins/filter_engine.py +2 -2
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/oidc.py +113 -4
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/permission/atlas.py +13 -0
- rucio-33.0.0/lib/rucio/core/plugins.py +148 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/request.py +598 -20
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/rse.py +60 -7
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/rule.py +149 -90
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/rule_grouping.py +6 -6
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/topology.py +36 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/transfer.py +421 -170
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/conveyor/poller.py +40 -17
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/conveyor/receiver.py +20 -6
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/reaper/reaper.py +15 -22
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/storage/consistency/actions.py +1 -1
- rucio-33.0.0/lib/rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +56 -0
- rucio-33.0.0/lib/rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +56 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/models.py +21 -39
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/sautils.py +1 -1
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/gfal.py +1 -1
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/rclone.py +1 -1
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/srm.py +1 -1
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/ssh.py +1 -1
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/xrootd.py +1 -1
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/transfertool/fts3.py +32 -23
- rucio-33.0.0/lib/rucio/vcsversion.py +11 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/ping.py +2 -2
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/requests.py +153 -1
- rucio-33.0.0/lib/rucio/web/rest/ping.py +28 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio.egg-info/SOURCES.txt +4 -6
- {rucio-32.6.0 → rucio-33.0.0}/requirements.txt +26 -26
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_conveyor.py +16 -1
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_conveyor_submitter.py +9 -2
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_daemons.py +1 -2
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_oidc.py +31 -1
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_request.py +86 -1
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_transfer.py +33 -1
- rucio-32.6.0/bin/rucio-light-reaper +0 -53
- rucio-32.6.0/lib/rucio/api/temporary_did.py +0 -49
- rucio-32.6.0/lib/rucio/core/temporary_did.py +0 -188
- rucio-32.6.0/lib/rucio/daemons/reaper/light_reaper.py +0 -255
- rucio-32.6.0/lib/rucio/vcsversion.py +0 -11
- rucio-32.6.0/lib/rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -115
- rucio-32.6.0/tests/test_temporary_did.py +0 -74
- {rucio-32.6.0 → rucio-33.0.0}/AUTHORS.rst +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/ChangeLog +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/LICENSE +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/MANIFEST.in +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/README.rst +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-abacus-account +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-abacus-collection-replica +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-abacus-rse +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-admin +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-atropos +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-auditor +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-automatix +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-bb8 +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-c3po +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-cache-client +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-cache-consumer +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-conveyor-finisher +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-conveyor-poller +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-conveyor-preparer +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-conveyor-receiver +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-conveyor-stager +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-conveyor-submitter +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-conveyor-throttler +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-dark-reaper +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-dumper +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-follower +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-hermes +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-judge-cleaner +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-judge-evaluator +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-judge-injector +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-judge-repairer +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-kronos +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-minos +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-minos-temporary-expiration +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-necromancer +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-oauth-manager +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-reaper +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-replica-recoverer +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-storage-consistency-actions +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-transmogrifier +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/bin/rucio-undertaker +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/alembic.ini.template +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/alembic_offline.ini.template +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/globus-config.yml.template +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/ldap.cfg.template +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/rse-accounts.cfg.template +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/rucio.cfg.template +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/account.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/account_limit.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/authentication.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/config.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/credential.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/did.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/dirac.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/exporter.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/heartbeat.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/identity.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/importer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/lifetime_exception.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/lock.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/meta.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/permission.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/quarantined_replica.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/replica.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/rse.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/rule.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/scope.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/subscription.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/api/vo.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/accountclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/baseclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/client.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/configclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/credentialclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/diracclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/downloadclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/exportclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/fileclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/importclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/lockclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/metaclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/pingclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/replicaclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/requestclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/rseclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/ruleclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/scopeclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/subscriptionclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/touchclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/client/uploadclient.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/cache.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/config.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/constants.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/constraints.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/didtype.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/dumper/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/dumper/consistency.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/dumper/data_models.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/dumper/path_parsing.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/exception.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/extra.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/logging.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/pcache.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/policy.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/schema/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/schema/atlas.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/schema/belleii.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/schema/cms.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/schema/domatpc.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/schema/escape.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/schema/generic.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/schema/icecube.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/schema/lsst.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/stomp_utils.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/stopwatch.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/types.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/common/utils.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/account.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/account_counter.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/account_limit.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/authentication.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/config.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/credential.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/did.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/did_meta_plugins/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/did_meta_plugins/did_column_meta.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/did_meta_plugins/json_meta.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/did_meta_plugins/mongo_meta.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/did_meta_plugins/postgres_meta.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/dirac.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/distance.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/exporter.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/heartbeat.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/identity.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/importer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/lifetime_exception.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/lock.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/message.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/meta.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/monitor.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/naming_convention.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/nongrid_trace.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/permission/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/permission/belleii.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/permission/cms.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/permission/escape.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/permission/generic.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/quarantined_replica.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/replica.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/replica_sorter.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/rse_counter.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/rse_expression_parser.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/rse_selector.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/scope.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/subscription.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/trace.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/vo.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/core/volatile_replica.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/abacus/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/abacus/account.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/abacus/rse.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/atropos/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/atropos/atropos.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/auditor/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/auditor/hdfs.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/automatix/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/automatix/automatix.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/badreplicas/minos.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/bb8/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/bb8/bb8.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/bb8/common.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/algorithms/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/algorithms/simple.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/algorithms/t2_free_space.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/c3po.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/collectors/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/collectors/agis.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/collectors/free_space.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/collectors/jedi_did.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/collectors/mock_did.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/collectors/network_metrics.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/collectors/workload.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/utils/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/utils/dataset_cache.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/utils/expiring_dataset_cache.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/utils/expiring_list.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/utils/popularity.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/c3po/utils/timeseries.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/cache/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/cache/consumer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/common.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/conveyor/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/conveyor/common.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/conveyor/finisher.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/conveyor/preparer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/conveyor/stager.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/conveyor/submitter.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/conveyor/throttler.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/follower/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/follower/follower.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/hermes/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/hermes/hermes.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/judge/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/judge/cleaner.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/judge/evaluator.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/judge/injector.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/judge/repairer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/reaper/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/storage/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/tracer/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/tracer/kronos.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/undertaker/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/constants.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/session.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/types.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/db/sqla/util.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/gsiftp.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/protocols/webdav.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/tests/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/tests/common.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/tests/common_server.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/transfertool/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/transfertool/globus.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/transfertool/globus_library.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/transfertool/mock.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/transfertool/transfertool.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/version.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/accounts.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/archives.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/auth.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/common.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/config.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/credentials.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/dids.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/dirac.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/export.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/identities.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/import.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/locks.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/main.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/meta.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/metrics.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/redirect.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/replicas.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/rses.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/rules.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/scopes.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/traces.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/flaskapi/v1/vos.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/main.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/lib/rucio/web/rest/metrics.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/pylintrc +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/pyproject.toml +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/setup.cfg +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/setup.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/setuputil.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_abacus_account.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_abacus_collection_replica.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_abacus_rse.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_account.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_account_limits.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_api_external_representation.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_archive.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_auditor.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_auditor_hdfs.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_auditor_srmdumps.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_authentication.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_automatix.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_bad_replica.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_bb8.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_belleii.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_bin_rucio.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_boolean.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_clients.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_common_types.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_config.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_counter.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_credential.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_curl.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_dataset_replicas.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_db.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_did.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_did_meta_plugins.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_didtype.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_download.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_dumper.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_dumper_consistency.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_dumper_data_model.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_dumper_path_parsing.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_filter_engine.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_heartbeat.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_hermes.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_identity.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_impl_upload_download.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_import_export.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_judge_cleaner.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_judge_evaluator.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_judge_injector.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_judge_repairer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_lifetime.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_message.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_meta.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_meta_did.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_module_import.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_monitor.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_multi_vo.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_naming_convention.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_oauthmanager.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_permission.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_pfns.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_ping.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_preparer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_qos.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_quarantined_replica.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_reaper.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_redirect.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_replica.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_replica_recoverer.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_replica_sorting.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_root_proxy.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_expression_parser.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_lfn2path.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_protocol_posix.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_protocol_srm.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rse_selector.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rucio_server.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_rule.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_schema_cms.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_scope.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_subscription.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_throttler.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_tpc.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_trace.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_undertaker.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_upload.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tests/test_utils.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tools/bootstrap.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tools/merge_rucio_configs.py +0 -0
- {rucio-32.6.0 → rucio-33.0.0}/tools/reset_database.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: rucio
|
|
3
|
-
Version:
|
|
3
|
+
Version: 33.0.0
|
|
4
4
|
Summary: Rucio Package
|
|
5
5
|
Home-page: https://rucio.cern.ch/
|
|
6
6
|
Author: Rucio
|
|
@@ -21,32 +21,32 @@ Requires-Python: >=3.9, <4
|
|
|
21
21
|
License-File: LICENSE
|
|
22
22
|
License-File: AUTHORS.rst
|
|
23
23
|
Requires-Dist: requests<=2.31.0,>=2.25.1
|
|
24
|
-
Requires-Dist: urllib3~=1.26.
|
|
24
|
+
Requires-Dist: urllib3~=1.26.18
|
|
25
25
|
Requires-Dist: dogpile.cache~=1.2.2
|
|
26
26
|
Requires-Dist: tabulate~=0.9.0
|
|
27
|
-
Requires-Dist: jsonschema~=4.
|
|
28
|
-
Requires-Dist: paramiko~=3.
|
|
29
|
-
Requires-Dist: argcomplete~=3.1.
|
|
27
|
+
Requires-Dist: jsonschema~=4.20.0
|
|
28
|
+
Requires-Dist: paramiko~=3.3.1
|
|
29
|
+
Requires-Dist: argcomplete~=3.1.6
|
|
30
30
|
Requires-Dist: python-magic~=0.4.27
|
|
31
|
-
Requires-Dist: SQLAlchemy==2.0.
|
|
32
|
-
Requires-Dist: alembic~=1.
|
|
31
|
+
Requires-Dist: SQLAlchemy==2.0.23
|
|
32
|
+
Requires-Dist: alembic~=1.12.1
|
|
33
33
|
Requires-Dist: pymemcache==4.0.0
|
|
34
34
|
Requires-Dist: python-dateutil==2.8.2
|
|
35
35
|
Requires-Dist: stomp.py==8.1.0
|
|
36
36
|
Requires-Dist: statsd==4.0.1
|
|
37
37
|
Requires-Dist: geoip2==4.7.0
|
|
38
|
-
Requires-Dist: google-auth==2.
|
|
39
|
-
Requires-Dist: redis==
|
|
40
|
-
Requires-Dist: Flask==
|
|
38
|
+
Requires-Dist: google-auth==2.23.4
|
|
39
|
+
Requires-Dist: redis==5.0.1
|
|
40
|
+
Requires-Dist: Flask==3.0.0
|
|
41
41
|
Requires-Dist: oic==1.6.1
|
|
42
|
-
Requires-Dist: prometheus_client==0.
|
|
43
|
-
Requires-Dist: boto3==1.
|
|
42
|
+
Requires-Dist: prometheus_client==0.19.0
|
|
43
|
+
Requires-Dist: boto3==1.29.5
|
|
44
44
|
Provides-Extra: oracle
|
|
45
45
|
Requires-Dist: cx_oracle==8.3.0; extra == "oracle"
|
|
46
46
|
Provides-Extra: mongo
|
|
47
|
-
Requires-Dist: pymongo==4.
|
|
47
|
+
Requires-Dist: pymongo==4.6.0; extra == "mongo"
|
|
48
48
|
Provides-Extra: postgresql
|
|
49
|
-
Requires-Dist: psycopg2-binary==2.9.
|
|
49
|
+
Requires-Dist: psycopg2-binary==2.9.9; extra == "postgresql"
|
|
50
50
|
Provides-Extra: mysql
|
|
51
51
|
Requires-Dist: PyMySQL==1.1.0; extra == "mysql"
|
|
52
52
|
Provides-Extra: kerberos
|
|
@@ -55,19 +55,19 @@ Requires-Dist: pykerberos~=1.2.4; extra == "kerberos"
|
|
|
55
55
|
Requires-Dist: requests-kerberos>=0.14.0; extra == "kerberos"
|
|
56
56
|
Provides-Extra: globus
|
|
57
57
|
Requires-Dist: PyYAML==6.0.1; extra == "globus"
|
|
58
|
-
Requires-Dist: globus-sdk==3.
|
|
58
|
+
Requires-Dist: globus-sdk==3.32.0; extra == "globus"
|
|
59
59
|
Provides-Extra: saml
|
|
60
|
-
Requires-Dist: python3-saml==1.
|
|
60
|
+
Requires-Dist: python3-saml==1.16.0; extra == "saml"
|
|
61
61
|
Provides-Extra: dev
|
|
62
62
|
Requires-Dist: PyYAML==6.0.1; extra == "dev"
|
|
63
|
-
Requires-Dist: pytest==7.4.
|
|
64
|
-
Requires-Dist: pytest-xdist~=3.
|
|
65
|
-
Requires-Dist: pyflakes==3.0
|
|
66
|
-
Requires-Dist: flake8==6.
|
|
67
|
-
Requires-Dist: pycodestyle==2.
|
|
68
|
-
Requires-Dist: pylint==3.0.
|
|
69
|
-
Requires-Dist: virtualenv==20.24.
|
|
63
|
+
Requires-Dist: pytest==7.4.3; extra == "dev"
|
|
64
|
+
Requires-Dist: pytest-xdist~=3.5.0; extra == "dev"
|
|
65
|
+
Requires-Dist: pyflakes==3.1.0; extra == "dev"
|
|
66
|
+
Requires-Dist: flake8==6.1.0; extra == "dev"
|
|
67
|
+
Requires-Dist: pycodestyle==2.11.0; extra == "dev"
|
|
68
|
+
Requires-Dist: pylint==3.0.2; extra == "dev"
|
|
69
|
+
Requires-Dist: virtualenv==20.24.7; extra == "dev"
|
|
70
70
|
Requires-Dist: xmltodict==0.13.0; extra == "dev"
|
|
71
|
-
Requires-Dist: pytz==2023.3; extra == "dev"
|
|
71
|
+
Requires-Dist: pytz==2023.3.post1; extra == "dev"
|
|
72
72
|
Requires-Dist: pydoc-markdown~=4.8.2; extra == "dev"
|
|
73
|
-
Requires-Dist: sh~=2.0.
|
|
73
|
+
Requires-Dist: sh~=2.0.6; extra == "dev"
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
Interface for the requests abstraction layer
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
|
-
from typing import TYPE_CHECKING
|
|
20
|
+
from typing import TYPE_CHECKING, Optional
|
|
21
21
|
|
|
22
22
|
from rucio.api import permission
|
|
23
23
|
from rucio.common import exception
|
|
@@ -199,7 +199,6 @@ def list_requests(src_rses, dst_rses, states, issuer, vo='def', *, session: "Ses
|
|
|
199
199
|
def list_requests_history(src_rses, dst_rses, states, issuer, vo='def', offset=None, limit=None, *, session: "Session"):
|
|
200
200
|
"""
|
|
201
201
|
List all historical requests in a specific state from a source RSE to a destination RSE.
|
|
202
|
-
|
|
203
202
|
:param src_rses: source RSEs.
|
|
204
203
|
:param dst_rses: destination RSEs.
|
|
205
204
|
:param states: list of request states.
|
|
@@ -218,3 +217,27 @@ def list_requests_history(src_rses, dst_rses, states, issuer, vo='def', offset=N
|
|
|
218
217
|
for req in request.list_requests_history(src_rse_ids, dst_rse_ids, states, offset, limit, session=session):
|
|
219
218
|
req = req.to_dict()
|
|
220
219
|
yield api_update_return_dict(req, session=session)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
@read_session
|
|
223
|
+
def get_request_metrics(src_rse: Optional[str], dst_rse: Optional[str], activity: Optional[str], issuer, vo='def', *, session: "Session"):
|
|
224
|
+
"""
|
|
225
|
+
Get statistics of requests in a specific state grouped by source RSE, destination RSE, and activity.
|
|
226
|
+
|
|
227
|
+
:param src_rse: source RSE.
|
|
228
|
+
:param dst_rse: destination RSE.
|
|
229
|
+
:param activity: activity
|
|
230
|
+
:param issuer: Issuing account as a string.
|
|
231
|
+
:param session: The database session in use.
|
|
232
|
+
"""
|
|
233
|
+
src_rse_id = None
|
|
234
|
+
if src_rse:
|
|
235
|
+
src_rse_id = get_rse_id(rse=src_rse, vo=vo, session=session)
|
|
236
|
+
dst_rse_id = None
|
|
237
|
+
if dst_rse:
|
|
238
|
+
dst_rse_id = get_rse_id(rse=dst_rse, vo=vo, session=session)
|
|
239
|
+
kwargs = {'issuer': issuer}
|
|
240
|
+
if not permission.has_permission(issuer=issuer, vo=vo, action='get_request_metrics', kwargs=kwargs, session=session):
|
|
241
|
+
raise exception.AccessDenied(f'{issuer} cannot get request statistics')
|
|
242
|
+
|
|
243
|
+
return request.get_request_metrics(dest_rse_id=dst_rse_id, src_rse_id=src_rse_id, activity=activity, session=session)
|
|
@@ -661,19 +661,6 @@ class DIDClient(BaseClient):
|
|
|
661
661
|
exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
|
|
662
662
|
raise exc_cls(exc_msg)
|
|
663
663
|
|
|
664
|
-
def add_temporary_dids(self, dids):
|
|
665
|
-
"""
|
|
666
|
-
Bulk add temporary data identifiers.
|
|
667
|
-
|
|
668
|
-
:param dids: A list of dids.
|
|
669
|
-
"""
|
|
670
|
-
url = build_url(choice(self.list_hosts), path='tmp_dids')
|
|
671
|
-
r = self._send_request(url, type_='POST', data=dumps(dids))
|
|
672
|
-
if r.status_code == codes.created:
|
|
673
|
-
return True
|
|
674
|
-
exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
|
|
675
|
-
raise exc_cls(exc_msg)
|
|
676
|
-
|
|
677
664
|
def list_archive_content(self, scope, name):
|
|
678
665
|
"""
|
|
679
666
|
List archive contents.
|
|
@@ -368,7 +368,7 @@ class FilterEngine:
|
|
|
368
368
|
# Infer what type key should be cast to from typecasting the value in the expression.
|
|
369
369
|
try:
|
|
370
370
|
if isinstance(value, int): # this could be bool or int (as bool subclass of int)
|
|
371
|
-
if
|
|
371
|
+
if isinstance(value, bool):
|
|
372
372
|
if is_in_json_column:
|
|
373
373
|
expression = "({}->>'{}')::boolean {} {}".format(jsonb_column, key, POSTGRES_OP_MAP[oper], str(value).lower())
|
|
374
374
|
else:
|
|
@@ -473,7 +473,7 @@ class FilterEngine:
|
|
|
473
473
|
# Infer what type key should be cast to from typecasting the value in the expression.
|
|
474
474
|
try:
|
|
475
475
|
if isinstance(value, int): # this could be bool or int (as bool subclass of int)
|
|
476
|
-
if
|
|
476
|
+
if isinstance(value, bool):
|
|
477
477
|
expression = oper(json_column[key].as_boolean(), value)
|
|
478
478
|
else:
|
|
479
479
|
expression = oper(json_column[key].as_float(), value) # cast as float, not integer, to avoid potentially losing precision in key
|
|
@@ -13,15 +13,18 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
+
import hashlib
|
|
16
17
|
import json
|
|
17
18
|
import logging
|
|
18
19
|
import random
|
|
19
20
|
import subprocess
|
|
20
21
|
import traceback
|
|
21
22
|
from datetime import datetime, timedelta
|
|
22
|
-
from typing import Any, TYPE_CHECKING, Optional
|
|
23
|
-
from urllib.parse import urlparse, parse_qs
|
|
23
|
+
from typing import Any, Final, TYPE_CHECKING, Optional
|
|
24
|
+
from urllib.parse import urljoin, urlparse, parse_qs
|
|
24
25
|
|
|
26
|
+
import requests
|
|
27
|
+
from dogpile.cache.api import NoValue
|
|
25
28
|
from jwkest.jws import JWS
|
|
26
29
|
from jwkest.jwt import JWT
|
|
27
30
|
from math import floor
|
|
@@ -36,6 +39,7 @@ from sqlalchemy import delete, select, update
|
|
|
36
39
|
from sqlalchemy.sql.expression import true
|
|
37
40
|
|
|
38
41
|
from rucio.common import types
|
|
42
|
+
from rucio.common.cache import make_region_memcached
|
|
39
43
|
from rucio.common.config import config_get, config_get_int
|
|
40
44
|
from rucio.common.exception import (CannotAuthenticate, CannotAuthorize,
|
|
41
45
|
RucioException)
|
|
@@ -52,7 +56,12 @@ from rucio.db.sqla.session import read_session, transactional_session
|
|
|
52
56
|
if TYPE_CHECKING:
|
|
53
57
|
from sqlalchemy.orm import Session
|
|
54
58
|
|
|
59
|
+
# The WLCG Common JWT Profile dictates that the lifetime of access and ID tokens
|
|
60
|
+
# should range from five minutes to six hours.
|
|
61
|
+
TOKEN_MIN_LIFETIME: Final = int(timedelta(minutes=5).total_seconds())
|
|
62
|
+
TOKEN_MAX_LIFETIME: Final = int(timedelta(hours=6).total_seconds())
|
|
55
63
|
|
|
64
|
+
REGION: Final = make_region_memcached(expiration_time=TOKEN_MAX_LIFETIME)
|
|
56
65
|
METRICS = MetricManager(module=__name__)
|
|
57
66
|
|
|
58
67
|
# worokaround for a bug in pyoidc (as of Dec 2019)
|
|
@@ -75,6 +84,78 @@ LEEWAY_SECS = 120
|
|
|
75
84
|
# --> check 'profile' info (requested profile scope)
|
|
76
85
|
|
|
77
86
|
|
|
87
|
+
@METRICS.time_it
|
|
88
|
+
def _token_cache_get(
|
|
89
|
+
key: str,
|
|
90
|
+
min_lifetime: int = TOKEN_MIN_LIFETIME,
|
|
91
|
+
) -> Optional[str]:
|
|
92
|
+
"""Retrieve a token from the cache.
|
|
93
|
+
|
|
94
|
+
Return ``None`` if the cache backend did not return a value, the value is
|
|
95
|
+
not a valid JWT, or the token has a remaining lifetime less than
|
|
96
|
+
``min_lifetime`` seconds.
|
|
97
|
+
"""
|
|
98
|
+
value = REGION.get(key)
|
|
99
|
+
if isinstance(value, NoValue):
|
|
100
|
+
METRICS.counter('token_cache.miss').inc()
|
|
101
|
+
return None
|
|
102
|
+
|
|
103
|
+
try:
|
|
104
|
+
assert isinstance(value, str)
|
|
105
|
+
payload = JWT().unpack(value).payload()
|
|
106
|
+
except Exception:
|
|
107
|
+
METRICS.counter('token_cache.invalid').inc()
|
|
108
|
+
return None
|
|
109
|
+
|
|
110
|
+
now = datetime.utcnow().timestamp()
|
|
111
|
+
expiration = payload.get('exp', 0) # type: ignore
|
|
112
|
+
if now + min_lifetime > expiration:
|
|
113
|
+
METRICS.counter('token_cache.expired').inc()
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
METRICS.counter('token_cache.hit').inc()
|
|
117
|
+
return value
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _token_cache_set(key: str, value: str) -> None:
|
|
121
|
+
"""Store a token in the cache."""
|
|
122
|
+
REGION.set(key, value)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def request_token(audience: str, scope: str, use_cache: bool = True) -> Optional[str]:
|
|
126
|
+
"""Request a token from the provider.
|
|
127
|
+
|
|
128
|
+
Return ``None`` if the configuration was not loaded properly or the request
|
|
129
|
+
was unsuccessful.
|
|
130
|
+
"""
|
|
131
|
+
if not all([OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_PROVIDER_ENDPOINT]):
|
|
132
|
+
if OIDC_CONFIGURATION_RUN or not __load_oidc_configuration():
|
|
133
|
+
return None
|
|
134
|
+
|
|
135
|
+
key = hashlib.md5(f'audience={audience};scope={scope}'.encode()).hexdigest()
|
|
136
|
+
|
|
137
|
+
if use_cache and (token := _token_cache_get(key)):
|
|
138
|
+
return token
|
|
139
|
+
|
|
140
|
+
try:
|
|
141
|
+
response = requests.post(url=OIDC_PROVIDER_ENDPOINT,
|
|
142
|
+
auth=(OIDC_CLIENT_ID, OIDC_CLIENT_SECRET),
|
|
143
|
+
data={'grant_type': 'client_credentials',
|
|
144
|
+
'audience': audience,
|
|
145
|
+
'scope': scope})
|
|
146
|
+
response.raise_for_status()
|
|
147
|
+
payload = response.json()
|
|
148
|
+
token = payload['access_token']
|
|
149
|
+
except Exception:
|
|
150
|
+
logging.debug('Failed to procure a token', exc_info=True)
|
|
151
|
+
return None
|
|
152
|
+
|
|
153
|
+
if use_cache:
|
|
154
|
+
_token_cache_set(key, token)
|
|
155
|
+
|
|
156
|
+
return token
|
|
157
|
+
|
|
158
|
+
|
|
78
159
|
def __get_rucio_oidc_clients(keytimeout: int = 43200) -> tuple[dict, dict]:
|
|
79
160
|
"""
|
|
80
161
|
Creates a Rucio OIDC Client instances per Identity Provider (IdP)
|
|
@@ -125,6 +206,11 @@ def __get_rucio_oidc_clients(keytimeout: int = 43200) -> tuple[dict, dict]:
|
|
|
125
206
|
# global variables to represent the IdP clients
|
|
126
207
|
OIDC_CLIENTS = {}
|
|
127
208
|
OIDC_ADMIN_CLIENTS = {}
|
|
209
|
+
# New-style token support.
|
|
210
|
+
OIDC_CLIENT_ID = ''
|
|
211
|
+
OIDC_CLIENT_SECRET = ''
|
|
212
|
+
OIDC_PROVIDER_ENDPOINT = ''
|
|
213
|
+
OIDC_CONFIGURATION_RUN = False
|
|
128
214
|
|
|
129
215
|
|
|
130
216
|
def __initialize_oidc_clients() -> None:
|
|
@@ -143,8 +229,31 @@ def __initialize_oidc_clients() -> None:
|
|
|
143
229
|
pass
|
|
144
230
|
|
|
145
231
|
|
|
146
|
-
|
|
147
|
-
|
|
232
|
+
def __load_oidc_configuration() -> bool:
|
|
233
|
+
"""Load the configuration for the new-style token support."""
|
|
234
|
+
global OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_PROVIDER_ENDPOINT, OIDC_CONFIGURATION_RUN
|
|
235
|
+
|
|
236
|
+
OIDC_CONFIGURATION_RUN = True
|
|
237
|
+
|
|
238
|
+
if not IDPSECRETS:
|
|
239
|
+
logging.error('Configuration option "idpsecrets" in section "oidc" is not set')
|
|
240
|
+
return False
|
|
241
|
+
if not ADMIN_ISSUER_ID:
|
|
242
|
+
logging.error('Configuration option "admin_issuer" in section "oidc" is not set')
|
|
243
|
+
return False
|
|
244
|
+
|
|
245
|
+
try:
|
|
246
|
+
with open(IDPSECRETS) as f:
|
|
247
|
+
data = json.load(f)
|
|
248
|
+
OIDC_CLIENT_ID = data[ADMIN_ISSUER_ID]['client_id']
|
|
249
|
+
OIDC_CLIENT_SECRET = data[ADMIN_ISSUER_ID]['client_secret']
|
|
250
|
+
OIDC_PROVIDER_ENDPOINT = urljoin(data[ADMIN_ISSUER_ID]['issuer'], 'token')
|
|
251
|
+
except Exception:
|
|
252
|
+
logging.error('Failed to parse configuration file "%s"', IDPSECRETS,
|
|
253
|
+
exc_info=True)
|
|
254
|
+
return False
|
|
255
|
+
else:
|
|
256
|
+
return True
|
|
148
257
|
|
|
149
258
|
|
|
150
259
|
def __get_init_oidc_client(token_object: models.Token = None, token_type: str = None, **kwargs) -> dict[Any, Any]:
|
|
@@ -87,6 +87,7 @@ def has_permission(issuer, action, kwargs, *, session: "Optional[Session]" = Non
|
|
|
87
87
|
'set_rse_usage': perm_set_rse_usage,
|
|
88
88
|
'set_rse_limits': perm_set_rse_limits,
|
|
89
89
|
'get_request_by_did': perm_get_request_by_did,
|
|
90
|
+
'get_request_metrics': perm_get_request_metrics,
|
|
90
91
|
'cancel_request': perm_cancel_request,
|
|
91
92
|
'get_next': perm_get_next,
|
|
92
93
|
'set_local_account_limit': perm_set_local_account_limit,
|
|
@@ -940,6 +941,18 @@ def perm_get_request_by_did(issuer, kwargs, *, session: "Optional[Session]" = No
|
|
|
940
941
|
return True
|
|
941
942
|
|
|
942
943
|
|
|
944
|
+
def perm_get_request_metrics(issuer, kwargs, *, session: "Optional[Session]" = None):
|
|
945
|
+
"""
|
|
946
|
+
Checks if an account can get the request stats
|
|
947
|
+
|
|
948
|
+
:param issuer: Account identifier which issues the command.
|
|
949
|
+
:param kwargs: List of arguments for the action.
|
|
950
|
+
:param session: The DB session to use
|
|
951
|
+
:returns: True if account is allowed, otherwise False
|
|
952
|
+
"""
|
|
953
|
+
return _is_root(issuer) or has_account_attribute(account=issuer, key='admin', session=session)
|
|
954
|
+
|
|
955
|
+
|
|
943
956
|
def perm_cancel_request(issuer, kwargs, *, session: "Optional[Session]" = None):
|
|
944
957
|
"""
|
|
945
958
|
Checks if an account can cancel a request.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import importlib
|
|
17
|
+
import os
|
|
18
|
+
from configparser import NoOptionError, NoSectionError
|
|
19
|
+
from typing import Any, Callable, Dict, TypeVar, Type
|
|
20
|
+
|
|
21
|
+
from rucio.common import config
|
|
22
|
+
from rucio.common.exception import InvalidAlgorithmName
|
|
23
|
+
from rucio.common.utils import check_policy_package_version
|
|
24
|
+
from rucio.core.vo import list_vos
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
PolicyPackageAlgorithmsT = TypeVar('PolicyPackageAlgorithmsT', bound='PolicyPackageAlgorithms')
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class PolicyPackageAlgorithms():
|
|
31
|
+
"""
|
|
32
|
+
Base class for Rucio Policy Package Algorithms
|
|
33
|
+
|
|
34
|
+
ALGORITHMS is of type Dict[str, Dict[str. Callable[..., Any]]]
|
|
35
|
+
where the key is the algorithm type and the value is a dictionary of algorithm names and their callables
|
|
36
|
+
"""
|
|
37
|
+
_ALGORITHMS: Dict[str, Dict[str, Callable[..., Any]]] = {}
|
|
38
|
+
_loaded_policy_modules = False
|
|
39
|
+
|
|
40
|
+
def __init__(self) -> None:
|
|
41
|
+
if not self._loaded_policy_modules:
|
|
42
|
+
self._register_all_policy_package_algorithms()
|
|
43
|
+
self._loaded_policy_modules = True
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def _get_one_algorithm(cls: Type[PolicyPackageAlgorithmsT], algorithm_type: str, name: str) -> Callable[..., Any]:
|
|
47
|
+
"""
|
|
48
|
+
Get the algorithm from the dictionary of algorithms
|
|
49
|
+
"""
|
|
50
|
+
return cls._ALGORITHMS[algorithm_type][name]
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def _get_algorithms(cls: Type[PolicyPackageAlgorithmsT], algorithm_type: str) -> Dict[str, Callable[..., Any]]:
|
|
54
|
+
"""
|
|
55
|
+
Get the dictionary of algorithms for a given type
|
|
56
|
+
"""
|
|
57
|
+
return cls._ALGORITHMS[algorithm_type]
|
|
58
|
+
|
|
59
|
+
@classmethod
|
|
60
|
+
def _register(
|
|
61
|
+
cls: Type[PolicyPackageAlgorithmsT],
|
|
62
|
+
algorithm_type: str, algorithm_dict: Dict[str, Callable[..., Any]]) -> None:
|
|
63
|
+
"""
|
|
64
|
+
Provided a dictionary of callable function,
|
|
65
|
+
and the associated algorithm type,
|
|
66
|
+
register it as one of the valid algorithms.
|
|
67
|
+
"""
|
|
68
|
+
if algorithm_type in cls._ALGORITHMS:
|
|
69
|
+
cls._ALGORITHMS[algorithm_type].update(algorithm_dict)
|
|
70
|
+
else:
|
|
71
|
+
cls._ALGORITHMS[algorithm_type] = algorithm_dict
|
|
72
|
+
|
|
73
|
+
@classmethod
|
|
74
|
+
def _supports(cls: Type[PolicyPackageAlgorithmsT], algorithm_type: str, name: str) -> bool:
|
|
75
|
+
"""
|
|
76
|
+
Check if a algorithm is supported by the plugin
|
|
77
|
+
"""
|
|
78
|
+
return name in cls._ALGORITHMS.get(algorithm_type, {})
|
|
79
|
+
|
|
80
|
+
@classmethod
|
|
81
|
+
def _register_all_policy_package_algorithms(cls: Type[PolicyPackageAlgorithmsT]) -> None:
|
|
82
|
+
'''
|
|
83
|
+
Loads all the algorithms of a given type from the policy package(s) and registers them
|
|
84
|
+
:param algorithm_type: the type of algorithm to register (e.g. 'surl', 'lfn2pfn')
|
|
85
|
+
:param dictionary: the dictionary to register them in
|
|
86
|
+
:param vo: the name of the relevant VO (None for single VO)
|
|
87
|
+
'''
|
|
88
|
+
try:
|
|
89
|
+
multivo = config.config_get_bool('common', 'multi_vo')
|
|
90
|
+
except (NoOptionError, NoSectionError):
|
|
91
|
+
multivo = False
|
|
92
|
+
if not multivo:
|
|
93
|
+
# single policy package
|
|
94
|
+
cls._try_importing_policy()
|
|
95
|
+
else:
|
|
96
|
+
# determine whether on client or server
|
|
97
|
+
client = False
|
|
98
|
+
if 'RUCIO_CLIENT_MODE' not in os.environ:
|
|
99
|
+
if not config.config_has_section('database') and config.config_has_section('client'):
|
|
100
|
+
client = True
|
|
101
|
+
else:
|
|
102
|
+
if os.environ['RUCIO_CLIENT_MODE']:
|
|
103
|
+
client = True
|
|
104
|
+
|
|
105
|
+
# on client, only register algorithms for selected VO
|
|
106
|
+
if client:
|
|
107
|
+
if 'RUCIO_VO' in os.environ:
|
|
108
|
+
vo = os.environ['RUCIO_VO']
|
|
109
|
+
else:
|
|
110
|
+
try:
|
|
111
|
+
vo = str(config.config_get('client', 'vo'))
|
|
112
|
+
except (NoOptionError, NoSectionError):
|
|
113
|
+
vo = 'def'
|
|
114
|
+
cls._try_importing_policy(vo)
|
|
115
|
+
# on server, list all VOs and register their algorithms
|
|
116
|
+
else:
|
|
117
|
+
# policy package per VO
|
|
118
|
+
vos = list_vos()
|
|
119
|
+
for vo in vos:
|
|
120
|
+
cls._try_importing_policy(vo['vo'])
|
|
121
|
+
|
|
122
|
+
@classmethod
|
|
123
|
+
def _try_importing_policy(cls: Type[PolicyPackageAlgorithmsT], vo: str = "") -> None:
|
|
124
|
+
try:
|
|
125
|
+
env_name = 'RUCIO_POLICY_PACKAGE' + ('' if not vo else '_' + vo.upper())
|
|
126
|
+
package = getattr(os.environ, env_name, "")
|
|
127
|
+
if not package:
|
|
128
|
+
package = str(config.config_get('policy', 'package' + ('' if not vo else '-' + vo)))
|
|
129
|
+
|
|
130
|
+
check_policy_package_version(package)
|
|
131
|
+
module = importlib.import_module(package)
|
|
132
|
+
|
|
133
|
+
if hasattr(module, 'get_algorithms'):
|
|
134
|
+
all_algorithms = module.get_algorithms()
|
|
135
|
+
|
|
136
|
+
# check that the names are correctly prefixed for multi-VO
|
|
137
|
+
if vo:
|
|
138
|
+
for _, algorithms in all_algorithms.items():
|
|
139
|
+
for k in algorithms.keys():
|
|
140
|
+
if not k.lower().startswith(vo.lower()):
|
|
141
|
+
raise InvalidAlgorithmName(k, vo)
|
|
142
|
+
|
|
143
|
+
# Updates the dictionary with the algorithms from the policy package
|
|
144
|
+
for algorithm_type, algorithm_dict in all_algorithms.items():
|
|
145
|
+
cls._register(algorithm_type, algorithm_dict)
|
|
146
|
+
|
|
147
|
+
except (NoOptionError, NoSectionError, ImportError):
|
|
148
|
+
pass
|