rucio 37.2.0__tar.gz → 37.3.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-37.2.0 → rucio-37.3.0}/PKG-INFO +1 -1
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/plugins.py +1 -1
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/did.py +2 -3
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/replica.py +1 -1
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/util.py +1 -1
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/authentication.py +58 -88
- rucio-37.3.0/lib/rucio/gateway/config.py +215 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/did.py +245 -329
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/dirac.py +33 -34
- rucio-37.3.0/lib/rucio/gateway/exporter.py +57 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/importer.py +12 -14
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/lifetime_exception.py +16 -24
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/lock.py +27 -40
- rucio-37.3.0/lib/rucio/gateway/replica.py +535 -0
- rucio-37.3.0/lib/rucio/gateway/rse.py +605 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/rule.py +115 -146
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/scope.py +18 -25
- rucio-37.3.0/lib/rucio/gateway/trace.py +48 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/vcsversion.py +3 -3
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/accounts.py +2 -2
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/auth.py +15 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/common.py +3 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/config.py +7 -7
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/dids.py +55 -55
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/dirac.py +2 -2
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/export.py +1 -1
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/import.py +1 -1
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +5 -5
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/locks.py +4 -4
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/main.py +17 -10
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/replicas.py +29 -28
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/rses.py +37 -37
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/rules.py +15 -15
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/scopes.py +3 -3
- rucio-37.3.0/lib/rucio/web/rest/flaskapi/v1/traces.py +135 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio.egg-info/SOURCES.txt +1 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_trace.py +29 -0
- rucio-37.2.0/lib/rucio/gateway/config.py +0 -227
- rucio-37.2.0/lib/rucio/gateway/exporter.py +0 -60
- rucio-37.2.0/lib/rucio/gateway/replica.py +0 -538
- rucio-37.2.0/lib/rucio/gateway/rse.py +0 -632
- rucio-37.2.0/lib/rucio/web/rest/flaskapi/v1/traces.py +0 -137
- {rucio-37.2.0 → rucio-37.3.0}/AUTHORS.rst +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/ChangeLog +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/LICENSE +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/MANIFEST.in +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/README.md +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-abacus-account +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-abacus-collection-replica +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-abacus-rse +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-admin +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-atropos +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-auditor +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-automatix +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-bb8 +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-cache-client +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-cache-consumer +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-conveyor-finisher +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-conveyor-poller +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-conveyor-preparer +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-conveyor-receiver +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-conveyor-stager +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-conveyor-submitter +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-conveyor-throttler +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-dark-reaper +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-dumper +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-follower +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-hermes +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-judge-cleaner +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-judge-evaluator +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-judge-injector +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-judge-repairer +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-kronos +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-minos +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-minos-temporary-expiration +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-necromancer +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-oauth-manager +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-reaper +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-replica-recoverer +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-rse-decommissioner +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-storage-consistency-actions +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-transmogrifier +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/bin/rucio-undertaker +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/alembic.ini.template +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/alembic_offline.ini.template +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/globus-config.yml.template +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/ldap.cfg.template +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/rse-accounts.cfg.template +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/rucio.cfg.template +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/alembicrevision.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/account.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/bin_legacy/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/bin_legacy/rucio.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/bin_legacy/rucio_admin.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/command.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/config.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/did.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/download.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/lifetime_exception.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/replica.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/rse.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/rule.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/scope.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/subscription.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/upload.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/cli/utils.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/accountclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/baseclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/client.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/configclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/credentialclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/didclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/diracclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/downloadclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/exportclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/fileclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/importclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/lockclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/metaconventionsclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/pingclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/replicaclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/requestclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/richclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/rseclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/ruleclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/scopeclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/subscriptionclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/touchclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/client/uploadclient.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/bittorrent.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/cache.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/checksum.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/client.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/config.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/constants.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/constraints.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/didtype.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/dumper/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/dumper/consistency.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/dumper/data_models.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/dumper/path_parsing.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/exception.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/extra.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/logging.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/pcache.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/policy.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/schema/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/schema/generic.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/stomp_utils.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/stopwatch.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/types.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/common/utils.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/account.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/account_counter.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/account_limit.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/authentication.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/config.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/credential.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/did_meta_plugins/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/did_meta_plugins/did_column_meta.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/did_meta_plugins/elasticsearch_meta.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/did_meta_plugins/filter_engine.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/did_meta_plugins/json_meta.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/did_meta_plugins/mongo_meta.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/did_meta_plugins/postgres_meta.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/dirac.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/distance.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/exporter.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/heartbeat.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/identity.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/importer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/lifetime_exception.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/lock.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/message.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/meta_conventions.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/monitor.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/naming_convention.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/nongrid_trace.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/oidc.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/permission/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/permission/generic.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/quarantined_replica.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/replica_sorter.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/request.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/rse.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/rse_counter.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/rse_expression_parser.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/rse_selector.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/rule.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/rule_grouping.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/scope.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/subscription.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/topology.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/trace.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/transfer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/vo.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/core/volatile_replica.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/abacus/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/abacus/account.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/abacus/rse.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/atropos/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/atropos/atropos.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/auditor/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/auditor/hdfs.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/automatix/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/automatix/automatix.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/badreplicas/minos.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/bb8/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/bb8/bb8.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/bb8/common.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/cache/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/cache/consumer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/common.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/conveyor/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/conveyor/common.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/conveyor/finisher.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/conveyor/poller.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/conveyor/preparer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/conveyor/receiver.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/conveyor/stager.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/conveyor/submitter.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/conveyor/throttler.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/follower/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/follower/follower.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/hermes/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/hermes/hermes.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/judge/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/judge/cleaner.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/judge/evaluator.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/judge/injector.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/judge/repairer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/reaper/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/reaper/reaper.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/rsedecommissioner/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/rsedecommissioner/config.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/rsedecommissioner/profiles/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/rsedecommissioner/profiles/atlas.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/rsedecommissioner/profiles/generic.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/rsedecommissioner/profiles/types.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/rsedecommissioner/rse_decommissioner.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/storage/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/storage/consistency/actions.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/tracer/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/tracer/kronos.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/undertaker/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/constants.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/30d5206e9cad_increase_oauthrequest_redirect_msg_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/models.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/sautils.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/session.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/db/sqla/types.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/account.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/account_limit.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/credential.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/heartbeat.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/identity.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/meta_conventions.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/permission.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/quarantined_replica.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/request.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/subscription.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/gateway/vo.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/bittorrent.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/gfal.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/webdav.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/protocols/xrootd.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/rse/translation.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/tests/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/tests/common.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/tests/common_server.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/transfertool/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/transfertool/bittorrent.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/transfertool/bittorrent_driver.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/transfertool/bittorrent_driver_qbittorrent.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/transfertool/fts3.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/transfertool/fts3_plugins.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/transfertool/globus.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/transfertool/globus_library.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/transfertool/mock.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/transfertool/transfertool.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/version.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/archives.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/credentials.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/identities.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/meta_conventions.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/metrics.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/ping.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/redirect.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/requests.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/types.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/flaskapi/v1/vos.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/main.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/metrics.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/lib/rucio/web/rest/ping.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/pyproject.toml +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/requirements/requirements.server.txt +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/setup.cfg +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/setup.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/setuputil.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_abacus_account.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_abacus_collection_replica.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_abacus_rse.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_account.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_account_limits.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_archive.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_auditor.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_auditor_hdfs.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_auditor_srmdumps.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_authentication.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_automatix.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_bad_replica.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_bb8.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_belleii.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_bin_rucio.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_boolean.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_cli_client_structure.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_clients.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_config.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_conveyor.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_conveyor_submitter.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_counter.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_credential.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_curl.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_daemons.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_dataset_replicas.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_db.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_did.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_did_meta_plugins.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_download.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_dumper.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_filter_engine.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_gateway_external_representation.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_heartbeat.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_hermes.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_identity.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_impl_upload_download.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_import_export.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_judge_cleaner.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_judge_evaluator.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_judge_injector.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_judge_repairer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_lifetime.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_message.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_meta_conventions.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_meta_did.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_module_import.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_monitor.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_multi_vo.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_naming_convention.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_oauthmanager.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_oidc.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_permission.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_pfns.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_ping.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_policy_package.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_preparer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_qos.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_quarantined_replica.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_reaper.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_redirect.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_replica.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_replica_recoverer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_replica_sorting.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_request.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_root_proxy.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_expression_parser.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_lfn2path.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_protocol_posix.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_protocol_srm.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rse_selector.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rucio_server.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_rule.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_scope.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_subscription.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_throttler.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_tpc.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_transfer.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_transfer_plugins.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_undertaker.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_upload.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tests/test_utils.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tools/bootstrap.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tools/merge_rucio_configs.py +0 -0
- {rucio-37.2.0 → rucio-37.3.0}/tools/reset_database.py +0 -0
|
@@ -156,7 +156,7 @@ class PolicyPackageAlgorithms:
|
|
|
156
156
|
# import from utils here to avoid circular import
|
|
157
157
|
|
|
158
158
|
env_name = 'RUCIO_POLICY_PACKAGE' + ('' if not vo else '_' + vo.upper())
|
|
159
|
-
package =
|
|
159
|
+
package = os.getenv(env_name, "")
|
|
160
160
|
if not package:
|
|
161
161
|
package = str(config.config_get('policy', 'package' + ('' if not vo else '-' + vo)))
|
|
162
162
|
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
import logging
|
|
16
16
|
import random
|
|
17
17
|
from datetime import datetime, timedelta
|
|
18
|
-
from enum import Enum
|
|
19
18
|
from hashlib import md5
|
|
20
19
|
from re import match
|
|
21
20
|
from typing import TYPE_CHECKING, Any, Literal, Optional, Union
|
|
@@ -1349,7 +1348,7 @@ def list_new_dids(
|
|
|
1349
1348
|
select_stmt = select_stmt.where(
|
|
1350
1349
|
models.DataIdentifier.did_type == DIDType[did_type]
|
|
1351
1350
|
)
|
|
1352
|
-
elif isinstance(did_type,
|
|
1351
|
+
elif isinstance(did_type, DIDType):
|
|
1353
1352
|
select_stmt = select_stmt.where(
|
|
1354
1353
|
models.DataIdentifier.did_type == did_type
|
|
1355
1354
|
)
|
|
@@ -2297,7 +2296,7 @@ def set_status(
|
|
|
2297
2296
|
@read_session
|
|
2298
2297
|
def list_dids(
|
|
2299
2298
|
scope: "InternalScope",
|
|
2300
|
-
filters: "
|
|
2299
|
+
filters: "Iterable[dict[Any, Any]]",
|
|
2301
2300
|
did_type: Literal['all', 'collection', 'dataset', 'container', 'file'] = 'collection',
|
|
2302
2301
|
ignore_case: bool = False,
|
|
2303
2302
|
limit: Optional[int] = None,
|
|
@@ -243,7 +243,7 @@ def __exist_replicas(
|
|
|
243
243
|
|
|
244
244
|
@read_session
|
|
245
245
|
def list_bad_replicas_status(
|
|
246
|
-
state: BadFilesStatus = BadFilesStatus.BAD,
|
|
246
|
+
state: Optional[BadFilesStatus] = BadFilesStatus.BAD,
|
|
247
247
|
rse_id: Optional[str] = None,
|
|
248
248
|
younger_than: Optional[datetime] = None,
|
|
249
249
|
older_than: Optional[datetime] = None,
|
|
@@ -337,7 +337,7 @@ def list_oracle_global_temp_tables(session: "Session") -> list[str]:
|
|
|
337
337
|
global_temp_tables = [
|
|
338
338
|
str(t[0]).upper()
|
|
339
339
|
for t in session.execute(
|
|
340
|
-
text(
|
|
340
|
+
text("SELECT /*+ OPT_PARAM('OPTIMIZER_FEATURES_ENABLE', '11.2.0.4') */ UPPER(table_name) "
|
|
341
341
|
'FROM all_tables '
|
|
342
342
|
'WHERE OWNER = :owner AND IOT_NAME IS NULL AND DURATION IS NOT NULL'),
|
|
343
343
|
dict(owner=models.BASE.metadata.schema.upper())
|
|
@@ -12,27 +12,21 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from typing import
|
|
15
|
+
from typing import Any, Optional
|
|
16
16
|
|
|
17
17
|
from rucio.common import exception
|
|
18
18
|
from rucio.common.types import InternalAccount, TokenDict
|
|
19
19
|
from rucio.common.utils import gateway_update_return_dict
|
|
20
20
|
from rucio.core import authentication, identity, oidc
|
|
21
|
-
from rucio.db.sqla.constants import IdentityType
|
|
22
|
-
from rucio.db.sqla.session import
|
|
21
|
+
from rucio.db.sqla.constants import DatabaseOperationType, IdentityType
|
|
22
|
+
from rucio.db.sqla.session import db_session
|
|
23
23
|
from rucio.gateway import permission
|
|
24
24
|
|
|
25
|
-
if TYPE_CHECKING:
|
|
26
|
-
from sqlalchemy.orm import Session
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
@transactional_session
|
|
30
26
|
def refresh_cli_auth_token(
|
|
31
27
|
token_string: str,
|
|
32
28
|
account: str,
|
|
33
29
|
vo: str = 'def',
|
|
34
|
-
*,
|
|
35
|
-
session: "Session"
|
|
36
30
|
) -> Optional[tuple[str, int]]:
|
|
37
31
|
"""
|
|
38
32
|
Checks if there is active refresh token and if so returns
|
|
@@ -40,20 +34,18 @@ def refresh_cli_auth_token(
|
|
|
40
34
|
refresh and returns new access token.
|
|
41
35
|
:param token_string: token string
|
|
42
36
|
:param account: Rucio account for which token refresh should be considered
|
|
43
|
-
:param session: The database session in use.
|
|
44
37
|
|
|
45
38
|
:return: tuple of (access token, expiration epoch), None otherswise
|
|
46
39
|
"""
|
|
47
40
|
internal_account = InternalAccount(account, vo=vo)
|
|
48
|
-
|
|
41
|
+
|
|
42
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
43
|
+
return oidc.refresh_cli_auth_token(token_string, internal_account, session=session)
|
|
49
44
|
|
|
50
45
|
|
|
51
|
-
@transactional_session
|
|
52
46
|
def redirect_auth_oidc(
|
|
53
47
|
authn_code: str,
|
|
54
48
|
fetchtoken: bool = False,
|
|
55
|
-
*,
|
|
56
|
-
session: "Session"
|
|
57
49
|
) -> Optional[str]:
|
|
58
50
|
"""
|
|
59
51
|
Finds the Authentication URL in the Rucio DB oauth_requests table
|
|
@@ -63,21 +55,18 @@ def redirect_auth_oidc(
|
|
|
63
55
|
authorization securely to IdP via Rucio Auth server through a browser.
|
|
64
56
|
:param fetchtoken: If True, valid token temporarily saved in the oauth_requests table
|
|
65
57
|
will be returned. If False, redirection URL is returned.
|
|
66
|
-
:param session: The database session in use.
|
|
67
58
|
|
|
68
59
|
:returns: result of the query (authorization URL or a
|
|
69
60
|
token if a user asks with the correct code) or None.
|
|
70
61
|
Exception thrown in case of an unexpected crash.
|
|
71
62
|
"""
|
|
72
|
-
|
|
63
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
64
|
+
return authentication.redirect_auth_oidc(authn_code, fetchtoken, session=session)
|
|
73
65
|
|
|
74
66
|
|
|
75
|
-
@transactional_session
|
|
76
67
|
def get_auth_oidc(
|
|
77
68
|
account: str,
|
|
78
69
|
vo: str = 'def',
|
|
79
|
-
*,
|
|
80
|
-
session: "Session",
|
|
81
70
|
**kwargs
|
|
82
71
|
) -> str:
|
|
83
72
|
"""
|
|
@@ -107,7 +96,6 @@ def get_auth_oidc(
|
|
|
107
96
|
:param refresh_lifetime: specifies how long the OAuth daemon should
|
|
108
97
|
be refreshing this token. Default is 96 hours.
|
|
109
98
|
:param ip: IP address of the client as a string.
|
|
110
|
-
:param session: The database session in use.
|
|
111
99
|
|
|
112
100
|
:returns: User & Rucio OIDC Client specific Authorization or Redirection URL as a string
|
|
113
101
|
OR a redirection url to be used in user's browser for authentication.
|
|
@@ -115,16 +103,14 @@ def get_auth_oidc(
|
|
|
115
103
|
# no permission layer for the moment !
|
|
116
104
|
|
|
117
105
|
internal_account = InternalAccount(account, vo=vo)
|
|
118
|
-
|
|
106
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
107
|
+
return oidc.get_auth_oidc(internal_account, session=session, **kwargs)
|
|
119
108
|
|
|
120
109
|
|
|
121
|
-
@transactional_session
|
|
122
110
|
def get_token_oidc(
|
|
123
111
|
auth_query_string: str,
|
|
124
112
|
ip: Optional[str] = None,
|
|
125
|
-
|
|
126
|
-
session: "Session"
|
|
127
|
-
) -> Optional[dict[str, Optional[Union[str, bool]]]]:
|
|
113
|
+
) -> Optional[dict[str, Any]]:
|
|
128
114
|
"""
|
|
129
115
|
After Rucio User got redirected to Rucio /auth/oidc_token (or /auth/oidc_code)
|
|
130
116
|
REST endpoints with authz code and session state encoded within the URL.
|
|
@@ -132,17 +118,16 @@ def get_token_oidc(
|
|
|
132
118
|
|
|
133
119
|
:param auth_query_string: IdP redirection URL query string (AuthZ code & user session state).
|
|
134
120
|
:param ip: IP address of the client as a string.
|
|
135
|
-
:param session: The database session in use.
|
|
136
121
|
|
|
137
122
|
:returns: One of the following tuples: ("fetchcode", <code>); ("token", <token>);
|
|
138
123
|
("polling", True); The result depends on the authentication strategy being used
|
|
139
124
|
(no auto, auto, polling).
|
|
140
125
|
"""
|
|
141
126
|
# no permission layer for the moment !
|
|
142
|
-
|
|
127
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
128
|
+
return oidc.get_token_oidc(auth_query_string, ip, session=session)
|
|
143
129
|
|
|
144
130
|
|
|
145
|
-
@transactional_session
|
|
146
131
|
def get_auth_token_user_pass(
|
|
147
132
|
account: str,
|
|
148
133
|
username: str,
|
|
@@ -150,8 +135,6 @@ def get_auth_token_user_pass(
|
|
|
150
135
|
appid: str,
|
|
151
136
|
ip: Optional[str] = None,
|
|
152
137
|
vo: str = 'def',
|
|
153
|
-
*,
|
|
154
|
-
session: "Session"
|
|
155
138
|
) -> Optional[TokenDict]:
|
|
156
139
|
"""
|
|
157
140
|
Authenticate a Rucio account temporarily via username and password.
|
|
@@ -164,30 +147,27 @@ def get_auth_token_user_pass(
|
|
|
164
147
|
:param appid: The application identifier as a string.
|
|
165
148
|
:param ip: IP address of the client as a string.
|
|
166
149
|
:param vo: The VO to act on.
|
|
167
|
-
:param session: The database session in use.
|
|
168
150
|
|
|
169
151
|
:returns: A dict with token and expires_at entries.
|
|
170
152
|
"""
|
|
171
153
|
|
|
172
154
|
kwargs = {'account': account, 'username': username, 'password': password}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
155
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
156
|
+
auth_result = permission.has_permission(issuer=account, vo=vo, action='get_auth_token_user_pass', kwargs=kwargs, session=session)
|
|
157
|
+
if not auth_result.allowed:
|
|
158
|
+
raise exception.AccessDenied('User with identity %s can not log to account %s. %s' % (username, account, auth_result.message))
|
|
176
159
|
|
|
177
|
-
|
|
160
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
178
161
|
|
|
179
|
-
|
|
162
|
+
return authentication.get_auth_token_user_pass(internal_account, username, password, appid, ip, session=session)
|
|
180
163
|
|
|
181
164
|
|
|
182
|
-
@transactional_session
|
|
183
165
|
def get_auth_token_gss(
|
|
184
166
|
account: str,
|
|
185
167
|
gsscred: str,
|
|
186
168
|
appid: str,
|
|
187
169
|
ip: Optional[str] = None,
|
|
188
170
|
vo: str = 'def',
|
|
189
|
-
*,
|
|
190
|
-
session: "Session"
|
|
191
171
|
) -> Optional[TokenDict]:
|
|
192
172
|
"""
|
|
193
173
|
Authenticate a Rucio account temporarily via a GSS token.
|
|
@@ -199,30 +179,27 @@ def get_auth_token_gss(
|
|
|
199
179
|
:param appid: The application identifier as a string.
|
|
200
180
|
:param ip: IP address of the client as a string.
|
|
201
181
|
:param vo: The VO to act on.
|
|
202
|
-
:param session: The database session in use.
|
|
203
182
|
|
|
204
183
|
:returns: A dict with token and expires_at entries.
|
|
205
184
|
"""
|
|
206
185
|
|
|
207
186
|
kwargs = {'account': account, 'gsscred': gsscred}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
187
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
188
|
+
auth_result = permission.has_permission(issuer=account, vo=vo, action='get_auth_token_gss', kwargs=kwargs, session=session)
|
|
189
|
+
if not auth_result.allowed:
|
|
190
|
+
raise exception.AccessDenied('User with identity %s can not log to account %s. %s' % (gsscred, account, auth_result.message))
|
|
211
191
|
|
|
212
|
-
|
|
192
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
213
193
|
|
|
214
|
-
|
|
194
|
+
return authentication.get_auth_token_gss(internal_account, gsscred, appid, ip, session=session)
|
|
215
195
|
|
|
216
196
|
|
|
217
|
-
@transactional_session
|
|
218
197
|
def get_auth_token_x509(
|
|
219
198
|
account: Optional[str],
|
|
220
199
|
dn: str,
|
|
221
200
|
appid: str,
|
|
222
201
|
ip: Optional[str] = None,
|
|
223
202
|
vo: str = 'def',
|
|
224
|
-
*,
|
|
225
|
-
session: "Session"
|
|
226
203
|
) -> Optional[TokenDict]:
|
|
227
204
|
"""
|
|
228
205
|
Authenticate a Rucio account temporarily via an x509 certificate.
|
|
@@ -234,7 +211,6 @@ def get_auth_token_x509(
|
|
|
234
211
|
:param appid: The application identifier as a string.
|
|
235
212
|
:param ip: IP address of the client as a string.
|
|
236
213
|
:param vo: The VO to act on.
|
|
237
|
-
:param session: The database session in use.
|
|
238
214
|
|
|
239
215
|
:returns: A dict with token and expires_at entries.
|
|
240
216
|
"""
|
|
@@ -243,24 +219,23 @@ def get_auth_token_x509(
|
|
|
243
219
|
account = identity.get_default_account(dn, IdentityType.X509).external
|
|
244
220
|
|
|
245
221
|
kwargs = {'account': account, 'dn': dn}
|
|
246
|
-
auth_result = permission.has_permission(issuer=account, vo=vo, action='get_auth_token_x509', kwargs=kwargs, session=session)
|
|
247
|
-
if not auth_result.allowed:
|
|
248
|
-
raise exception.AccessDenied('User with identity %s can not log to account %s. %s' % (dn, account, auth_result.message))
|
|
249
222
|
|
|
250
|
-
|
|
223
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
224
|
+
auth_result = permission.has_permission(issuer=account, vo=vo, action='get_auth_token_x509', kwargs=kwargs, session=session)
|
|
225
|
+
if not auth_result.allowed:
|
|
226
|
+
raise exception.AccessDenied('User with identity %s can not log to account %s. %s' % (dn, account, auth_result.message))
|
|
227
|
+
|
|
228
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
251
229
|
|
|
252
|
-
|
|
230
|
+
return authentication.get_auth_token_x509(internal_account, dn, appid, ip, session=session)
|
|
253
231
|
|
|
254
232
|
|
|
255
|
-
@transactional_session
|
|
256
233
|
def get_auth_token_ssh(
|
|
257
234
|
account: str,
|
|
258
235
|
signature: str,
|
|
259
236
|
appid: str,
|
|
260
237
|
ip: Optional[str] = None,
|
|
261
238
|
vo: str = 'def',
|
|
262
|
-
*,
|
|
263
|
-
session: "Session"
|
|
264
239
|
) -> Optional[TokenDict]:
|
|
265
240
|
"""
|
|
266
241
|
Authenticate a Rucio account temporarily via SSH key exchange.
|
|
@@ -272,29 +247,27 @@ def get_auth_token_ssh(
|
|
|
272
247
|
:param appid: The application identifier as a string.
|
|
273
248
|
:param ip: IP address of the client as a string.
|
|
274
249
|
:param vo: The VO to act on.
|
|
275
|
-
:param session: The database session in use.
|
|
276
250
|
|
|
277
251
|
:returns: A dict with token and expires_at entries.
|
|
278
252
|
"""
|
|
279
253
|
|
|
280
254
|
kwargs = {'account': account, 'signature': signature}
|
|
281
|
-
auth_result = permission.has_permission(issuer=account, vo=vo, action='get_auth_token_ssh', kwargs=kwargs, session=session)
|
|
282
|
-
if not auth_result.allowed:
|
|
283
|
-
raise exception.AccessDenied('User with provided signature can not log to account %s. %s' % (account, auth_result.message))
|
|
284
255
|
|
|
285
|
-
|
|
256
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
257
|
+
auth_result = permission.has_permission(issuer=account, vo=vo, action='get_auth_token_ssh', kwargs=kwargs, session=session)
|
|
258
|
+
if not auth_result.allowed:
|
|
259
|
+
raise exception.AccessDenied('User with provided signature can not log to account %s. %s' % (account, auth_result.message))
|
|
260
|
+
|
|
261
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
286
262
|
|
|
287
|
-
|
|
263
|
+
return authentication.get_auth_token_ssh(internal_account, signature, appid, ip, session=session)
|
|
288
264
|
|
|
289
265
|
|
|
290
|
-
@transactional_session
|
|
291
266
|
def get_ssh_challenge_token(
|
|
292
267
|
account: str,
|
|
293
268
|
appid: str,
|
|
294
269
|
ip: Optional[str] = None,
|
|
295
270
|
vo: str = 'def',
|
|
296
|
-
*,
|
|
297
|
-
session: "Session"
|
|
298
271
|
) -> Optional[TokenDict]:
|
|
299
272
|
"""
|
|
300
273
|
Get a challenge token for subsequent SSH public key authentication.
|
|
@@ -305,30 +278,28 @@ def get_ssh_challenge_token(
|
|
|
305
278
|
:param appid: The application identifier as a string.
|
|
306
279
|
:param ip: IP address of the client as a string.
|
|
307
280
|
:param vo: The VO to act on.
|
|
308
|
-
:param session: The database session in use.
|
|
309
281
|
|
|
310
282
|
:returns: A dict with token and expires_at entries.
|
|
311
283
|
"""
|
|
312
284
|
|
|
313
285
|
kwargs = {'account': account}
|
|
314
|
-
auth_result = permission.has_permission(issuer=account, vo=vo, action='get_auth_token_ssh', kwargs=kwargs, session=session)
|
|
315
|
-
if not auth_result.allowed:
|
|
316
|
-
raise exception.AccessDenied('User can not get challenge token for account %s. %s' % (account, auth_result.message))
|
|
317
286
|
|
|
318
|
-
|
|
287
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
288
|
+
auth_result = permission.has_permission(issuer=account, vo=vo, action='get_auth_token_ssh', kwargs=kwargs, session=session)
|
|
289
|
+
if not auth_result.allowed:
|
|
290
|
+
raise exception.AccessDenied('User can not get challenge token for account %s. %s' % (account, auth_result.message))
|
|
291
|
+
|
|
292
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
319
293
|
|
|
320
|
-
|
|
294
|
+
return authentication.get_ssh_challenge_token(internal_account, appid, ip, session=session)
|
|
321
295
|
|
|
322
296
|
|
|
323
|
-
@transactional_session
|
|
324
297
|
def get_auth_token_saml(
|
|
325
298
|
account: str,
|
|
326
299
|
saml_nameid: str,
|
|
327
300
|
appid: str,
|
|
328
301
|
ip: Optional[str] = None,
|
|
329
302
|
vo: str = 'def',
|
|
330
|
-
*,
|
|
331
|
-
session: "Session"
|
|
332
303
|
) -> Optional[TokenDict]:
|
|
333
304
|
"""
|
|
334
305
|
Authenticate a Rucio account temporarily via SSO.
|
|
@@ -339,26 +310,24 @@ def get_auth_token_saml(
|
|
|
339
310
|
:param saml_nameid: NameId returned in SAML response as a string.
|
|
340
311
|
:param appid: The application identifier as a string.
|
|
341
312
|
:param ip: IP address of the client as a string.
|
|
342
|
-
:param session: The database session in use.
|
|
343
313
|
|
|
344
314
|
:returns: A dict with token and expires_at entries.
|
|
345
315
|
"""
|
|
346
316
|
|
|
347
317
|
kwargs = {'account': account, 'saml_nameid': saml_nameid}
|
|
348
|
-
auth_result = permission.has_permission(issuer=account, vo=vo, action='get_auth_token_saml', kwargs=kwargs, session=session)
|
|
349
|
-
if not auth_result.allowed:
|
|
350
|
-
raise exception.AccessDenied('User with identity %s can not log to account %s. %s' % (saml_nameid, account, auth_result.message))
|
|
351
318
|
|
|
352
|
-
|
|
319
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
320
|
+
auth_result = permission.has_permission(issuer=account, vo=vo, action='get_auth_token_saml', kwargs=kwargs, session=session)
|
|
321
|
+
if not auth_result.allowed:
|
|
322
|
+
raise exception.AccessDenied('User with identity %s can not log to account %s. %s' % (saml_nameid, account, auth_result.message))
|
|
323
|
+
|
|
324
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
353
325
|
|
|
354
|
-
|
|
326
|
+
return authentication.get_auth_token_saml(internal_account, saml_nameid, appid, ip, session=session)
|
|
355
327
|
|
|
356
328
|
|
|
357
|
-
@transactional_session
|
|
358
329
|
def validate_auth_token(
|
|
359
330
|
token: str,
|
|
360
|
-
*,
|
|
361
|
-
session: "Session"
|
|
362
331
|
) -> dict[str, Any]:
|
|
363
332
|
"""
|
|
364
333
|
Validate an authentication token.
|
|
@@ -374,8 +343,9 @@ def validate_auth_token(
|
|
|
374
343
|
vo: <vo> }
|
|
375
344
|
"""
|
|
376
345
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
346
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
347
|
+
auth = authentication.validate_auth_token(token, session=session)
|
|
348
|
+
vo = auth['account'].vo
|
|
349
|
+
auth = gateway_update_return_dict(auth, session=session)
|
|
350
|
+
auth['vo'] = vo
|
|
381
351
|
return auth
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from rucio.common import exception
|
|
18
|
+
from rucio.common.config import convert_to_any_type
|
|
19
|
+
from rucio.core import config
|
|
20
|
+
from rucio.db.sqla.constants import DatabaseOperationType
|
|
21
|
+
from rucio.db.sqla.session import db_session
|
|
22
|
+
from rucio.gateway import permission
|
|
23
|
+
|
|
24
|
+
"""
|
|
25
|
+
ConfigParser compatible interface.
|
|
26
|
+
|
|
27
|
+
- File handling methods unnecessary.
|
|
28
|
+
- Convenience methods getint/getfloat/getboolean are superseded by auto-coercing get.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def sections(issuer: str, vo: str = 'def') -> list[str]:
|
|
33
|
+
"""
|
|
34
|
+
Return a list of the sections available.
|
|
35
|
+
|
|
36
|
+
:param issuer: The issuer account.
|
|
37
|
+
:param vo: The VO to act on.
|
|
38
|
+
:returns: ['section_name', ...]
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
kwargs = {'issuer': issuer}
|
|
42
|
+
with db_session(DatabaseOperationType.READ) as session:
|
|
43
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='config_sections', kwargs=kwargs, session=session)
|
|
44
|
+
if not auth_result.allowed:
|
|
45
|
+
raise exception.AccessDenied('%s cannot retrieve sections. %s' % (issuer, auth_result.message))
|
|
46
|
+
return config.sections(session=session)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def add_section(section: str, issuer: str, vo: str = 'def') -> None:
|
|
50
|
+
"""
|
|
51
|
+
Add a section to the configuration.
|
|
52
|
+
|
|
53
|
+
:param section: The name of the section.
|
|
54
|
+
:param issuer: The issuer account.
|
|
55
|
+
:param vo: The VO to act on.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
kwargs = {'issuer': issuer, 'section': section}
|
|
59
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
60
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='config_add_section', kwargs=kwargs, session=session)
|
|
61
|
+
if not auth_result.allowed:
|
|
62
|
+
raise exception.AccessDenied('%s cannot add section %s. %s' % (issuer, section, auth_result.message))
|
|
63
|
+
return config.add_section(section, session=session)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def has_section(section: str, issuer: str, vo: str = 'def') -> bool:
|
|
67
|
+
"""
|
|
68
|
+
Indicates whether the named section is present in the configuration.
|
|
69
|
+
|
|
70
|
+
:param section: The name of the section.
|
|
71
|
+
:param issuer: The issuer account.
|
|
72
|
+
:param vo: The VO to act on.
|
|
73
|
+
:returns: True/False
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
kwargs = {'issuer': issuer, 'section': section}
|
|
77
|
+
with db_session(DatabaseOperationType.READ) as session:
|
|
78
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='config_has_section', kwargs=kwargs, session=session)
|
|
79
|
+
if not auth_result.allowed:
|
|
80
|
+
raise exception.AccessDenied('%s cannot check existence of section %s. %s' % (issuer, section, auth_result.message))
|
|
81
|
+
return config.has_section(section, session=session)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def options(section: str, issuer: str, vo: str = 'def') -> list[str]:
|
|
85
|
+
"""
|
|
86
|
+
Returns a list of options available in the specified section.
|
|
87
|
+
|
|
88
|
+
:param section: The name of the section.
|
|
89
|
+
:param issuer: The issuer account.
|
|
90
|
+
:param vo: The VO to act on.
|
|
91
|
+
:returns: ['option', ...]
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
kwargs = {'issuer': issuer, 'section': section}
|
|
95
|
+
with db_session(DatabaseOperationType.READ) as session:
|
|
96
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='config_options', kwargs=kwargs, session=session)
|
|
97
|
+
if auth_result.allowed:
|
|
98
|
+
raise exception.AccessDenied('%s cannot retrieve options from section %s. %s' % (issuer, section, auth_result.message))
|
|
99
|
+
return config.options(section, session=session)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def has_option(section: str, option: str, issuer: str, vo: str = 'def') -> bool:
|
|
103
|
+
"""
|
|
104
|
+
Check if the given section exists and contains the given option.
|
|
105
|
+
|
|
106
|
+
:param section: The name of the section.
|
|
107
|
+
:param option: The name of the option.
|
|
108
|
+
:param issuer: The issuer account.
|
|
109
|
+
:param vo: The VO to act on.
|
|
110
|
+
:returns: True/False
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
kwargs = {'issuer': issuer, 'section': section, 'option': option}
|
|
114
|
+
with db_session(DatabaseOperationType.READ) as session:
|
|
115
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='config_has_option', kwargs=kwargs, session=session)
|
|
116
|
+
if not auth_result.allowed:
|
|
117
|
+
raise exception.AccessDenied('%s cannot check existence of option %s from section %s. %s' % (issuer, option, section, auth_result.message))
|
|
118
|
+
return config.has_option(section, option, session=session)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def get(section: str, option: str, issuer: str, vo: str = 'def') -> Any:
|
|
122
|
+
"""
|
|
123
|
+
Get an option value for the named section. Value can be auto-coerced to int, float, and bool; string otherwise.
|
|
124
|
+
|
|
125
|
+
Caveat emptor: Strings, regardless the case, matching 'on'/off', 'true'/'false', 'yes'/'no' are converted to bool.
|
|
126
|
+
0/1 are converted to int, and not to bool.
|
|
127
|
+
|
|
128
|
+
:param section: The name of the section.
|
|
129
|
+
:param option: The name of the option.
|
|
130
|
+
:param issuer: The issuer account.
|
|
131
|
+
:param vo: The VO to act on.
|
|
132
|
+
:returns: The auto-coerced value.
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
kwargs = {'issuer': issuer, 'section': section, 'option': option}
|
|
136
|
+
with db_session(DatabaseOperationType.READ) as session:
|
|
137
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='config_get', kwargs=kwargs, session=session)
|
|
138
|
+
if not auth_result.allowed:
|
|
139
|
+
raise exception.AccessDenied('%s cannot retrieve option %s from section %s. %s' % (issuer, option, section, auth_result.message))
|
|
140
|
+
return config.get(section, option, session=session, convert_type_fnc=convert_to_any_type)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def items(section: str, issuer: str, vo: str = 'def') -> list[tuple[str, Any]]:
|
|
144
|
+
"""
|
|
145
|
+
Return a list of (option, value) pairs for each option in the given section. Values are auto-coerced as in get().
|
|
146
|
+
|
|
147
|
+
:param section: The name of the section.
|
|
148
|
+
:param value: The content of the value.
|
|
149
|
+
:param issuer: The issuer account.
|
|
150
|
+
:param vo: The VO to act on.
|
|
151
|
+
:returns: [('option', auto-coerced value), ...]
|
|
152
|
+
"""
|
|
153
|
+
|
|
154
|
+
kwargs = {'issuer': issuer, 'section': section}
|
|
155
|
+
with db_session(DatabaseOperationType.READ) as session:
|
|
156
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='config_items', kwargs=kwargs, session=session)
|
|
157
|
+
if not auth_result.allowed:
|
|
158
|
+
raise exception.AccessDenied('%s cannot retrieve options and values from section %s. %s' % (issuer, section, auth_result.message))
|
|
159
|
+
return config.items(section, session=session, convert_type_fnc=convert_to_any_type)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def set(section: str, option: str, value: Any, issuer: str, vo: str = 'def') -> None:
|
|
163
|
+
"""
|
|
164
|
+
Set the given option to the specified value.
|
|
165
|
+
|
|
166
|
+
:param section: The name of the section.
|
|
167
|
+
:param option: The name of the option.
|
|
168
|
+
:param value: The content of the value.
|
|
169
|
+
:param issuer: The issuer account.
|
|
170
|
+
:param vo: The VO to act on.
|
|
171
|
+
"""
|
|
172
|
+
|
|
173
|
+
kwargs = {'issuer': issuer, 'section': section, 'option': option, 'value': value}
|
|
174
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
175
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='config_set', kwargs=kwargs, session=session)
|
|
176
|
+
if not auth_result.allowed:
|
|
177
|
+
raise exception.AccessDenied('%s cannot set option %s to %s in section %s. %s' % (issuer, option, value, section, auth_result.message))
|
|
178
|
+
return config.set(section, option, value, session=session)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def remove_section(section: str, issuer: str, vo: str = 'def') -> bool:
|
|
182
|
+
"""
|
|
183
|
+
Remove the specified option from the specified section.
|
|
184
|
+
|
|
185
|
+
:param section: The name of the section.
|
|
186
|
+
:param issuer: The issuer account.
|
|
187
|
+
:param vo: The VO to act on.
|
|
188
|
+
:returns: True/False.
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
kwargs = {'issuer': issuer, 'section': section}
|
|
192
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
193
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='config_remove_section', kwargs=kwargs, session=session)
|
|
194
|
+
if not auth_result.allowed:
|
|
195
|
+
raise exception.AccessDenied('%s cannot remove section %s. %s' % (issuer, section, auth_result.message))
|
|
196
|
+
return config.remove_section(section, session=session)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def remove_option(section: str, option: str, issuer: str, vo: str = 'def') -> bool:
|
|
200
|
+
"""
|
|
201
|
+
Remove the specified section from the configuration.
|
|
202
|
+
|
|
203
|
+
:param section: The name of the section.
|
|
204
|
+
:param option: The name of the option.
|
|
205
|
+
:param issuer: The issuer account.
|
|
206
|
+
:param vo: The VO to act on.
|
|
207
|
+
:returns: True/False
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
kwargs = {'issuer': issuer, 'section': section, 'option': option}
|
|
211
|
+
with db_session(DatabaseOperationType.WRITE) as session:
|
|
212
|
+
auth_result = permission.has_permission(issuer=issuer, vo=vo, action='config_remove_option', kwargs=kwargs, session=session)
|
|
213
|
+
if not auth_result.allowed:
|
|
214
|
+
raise exception.AccessDenied('%s cannot remove option %s from section %s. %s' % (issuer, option, section, auth_result.message))
|
|
215
|
+
return config.remove_option(section, option, session=session)
|