rucio 38.0.0rc2__tar.gz → 38.1.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-38.0.0rc2 → rucio-38.1.0}/AUTHORS.rst +1 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/PKG-INFO +1 -1
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio +4 -1
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/account.py +1 -1
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/bin_legacy/rucio.py +2 -64
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/did.py +1 -4
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/exception.py +5 -5
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/schema/__init__.py +19 -35
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/utils.py +1 -1
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/lock.py +7 -6
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/permission/__init__.py +20 -32
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/common.py +1 -1
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/conveyor/finisher.py +2 -2
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/conveyor/poller.py +2 -2
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/conveyor/preparer.py +1 -1
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/conveyor/submitter.py +2 -2
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/conveyor/throttler.py +1 -1
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/models.py +2 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/session.py +8 -1
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/tests/common.py +64 -12
- rucio-38.1.0/lib/rucio/vcsversion.py +11 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/auth.py +11 -2
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/main.py +1 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/pyproject.toml +8 -2
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_bin_rucio.py +17 -1
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_cli_client_structure.py +5 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_conveyor.py +2 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_hermes.py +17 -27
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_reaper.py +1 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_transfer_plugins.py +2 -2
- rucio-38.0.0rc2/lib/rucio/vcsversion.py +0 -11
- {rucio-38.0.0rc2 → rucio-38.1.0}/ChangeLog +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/LICENSE +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/MANIFEST.in +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/README.md +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-abacus-account +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-abacus-collection-replica +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-abacus-rse +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-admin +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-atropos +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-auditor +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-automatix +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-bb8 +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-cache-client +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-cache-consumer +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-conveyor-finisher +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-conveyor-poller +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-conveyor-preparer +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-conveyor-receiver +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-conveyor-stager +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-conveyor-submitter +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-conveyor-throttler +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-dark-reaper +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-dumper +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-follower +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-hermes +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-judge-cleaner +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-judge-evaluator +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-judge-injector +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-judge-repairer +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-kronos +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-minos +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-minos-temporary-expiration +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-necromancer +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-oauth-manager +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-reaper +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-replica-recoverer +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-rse-decommissioner +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-storage-consistency-actions +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-transmogrifier +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/bin/rucio-undertaker +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/alembic.ini.template +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/alembic_offline.ini.template +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/globus-config.yml.template +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/ldap.cfg.template +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/rse-accounts.cfg.template +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/rucio.cfg.template +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/alembicrevision.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/bin_legacy/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/bin_legacy/rucio_admin.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/command.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/config.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/download.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/lifetime_exception.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/opendata.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/rse.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/rule.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/scope.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/subscription.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/upload.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/cli/utils.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/accountclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/baseclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/client.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/configclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/credentialclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/didclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/diracclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/downloadclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/exportclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/importclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/lockclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/metaconventionsclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/opendataclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/pingclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/replicaclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/requestclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/richclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/rseclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/ruleclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/scopeclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/subscriptionclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/touchclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/client/uploadclient.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/bittorrent.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/cache.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/checksum.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/client.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/config.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/constants.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/constraints.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/didtype.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/dumper/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/dumper/consistency.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/dumper/data_models.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/dumper/path_parsing.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/extra.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/logging.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/pcache.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/plugins.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/policy.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/schema/generic.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/stomp_utils.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/stopwatch.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/common/types.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/account.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/account_counter.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/account_limit.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/authentication.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/config.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/credential.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/did.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/did_meta_plugins/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/did_meta_plugins/did_column_meta.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/did_meta_plugins/elasticsearch_meta.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/did_meta_plugins/filter_engine.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/did_meta_plugins/json_meta.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/did_meta_plugins/mongo_meta.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/did_meta_plugins/postgres_meta.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/dirac.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/distance.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/exporter.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/heartbeat.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/identity.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/importer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/lifetime_exception.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/message.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/meta_conventions.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/monitor.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/naming_convention.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/nongrid_trace.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/oidc.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/opendata.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/permission/generic.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/quarantined_replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/replica_sorter.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/request.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/rse.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/rse_counter.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/rse_expression_parser.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/rse_selector.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/rule.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/rule_grouping.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/scope.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/subscription.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/topology.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/trace.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/transfer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/vo.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/core/volatile_replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/abacus/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/abacus/account.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/abacus/rse.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/atropos/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/atropos/atropos.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/auditor/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/auditor/hdfs.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/automatix/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/automatix/automatix.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/badreplicas/minos.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/bb8/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/bb8/bb8.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/bb8/common.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/cache/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/cache/consumer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/conveyor/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/conveyor/common.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/conveyor/receiver.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/conveyor/stager.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/follower/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/follower/follower.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/hermes/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/hermes/hermes.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/judge/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/judge/cleaner.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/judge/evaluator.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/judge/injector.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/judge/repairer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/reaper/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/reaper/reaper.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/rsedecommissioner/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/rsedecommissioner/config.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/rsedecommissioner/profiles/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/rsedecommissioner/profiles/atlas.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/rsedecommissioner/profiles/generic.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/rsedecommissioner/profiles/types.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/rsedecommissioner/rse_decommissioner.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/storage/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/storage/consistency/actions.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/tracer/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/tracer/kronos.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/undertaker/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/constants.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/30d5206e9cad_increase_oauthrequest_redirect_msg_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/a62db546a1f1_opendata_initial_model.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/sautils.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/types.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/db/sqla/util.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/account.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/account_limit.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/authentication.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/config.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/credential.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/did.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/dirac.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/exporter.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/heartbeat.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/identity.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/importer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/lifetime_exception.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/lock.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/meta_conventions.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/opendata.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/permission.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/quarantined_replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/request.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/rse.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/rule.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/scope.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/subscription.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/trace.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/gateway/vo.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/bittorrent.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/gfal.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/webdav.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/protocols/xrootd.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/rse/translation.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/tests/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/tests/common_server.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/transfertool/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/transfertool/bittorrent.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/transfertool/bittorrent_driver.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/transfertool/bittorrent_driver_qbittorrent.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/transfertool/fts3.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/transfertool/fts3_plugins.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/transfertool/globus.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/transfertool/globus_library.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/transfertool/mock.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/transfertool/transfertool.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/version.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/accounts.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/archives.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/common.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/config.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/credentials.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/dids.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/dirac.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/export.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/identities.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/import.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/locks.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/meta_conventions.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/metrics.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/opendata.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/opendata_public.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/ping.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/redirect.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/replicas.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/requests.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/rses.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/rules.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/scopes.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/traces.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/types.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/flaskapi/v1/vos.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/main.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/metrics.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio/web/rest/ping.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/lib/rucio.egg-info/SOURCES.txt +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/requirements/requirements.server.txt +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/setup.cfg +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/setup.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/setuputil.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_abacus_account.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_abacus_collection_replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_abacus_rse.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_account.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_account_limits.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_archive.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_auditor.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_auditor_hdfs.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_auditor_srmdumps.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_authentication.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_automatix.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_bad_replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_bb8.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_belleii.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_boolean.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_clients.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_config.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_conveyor_submitter.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_counter.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_credential.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_curl.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_daemons.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_dataset_replicas.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_db.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_did.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_did_meta_plugins.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_download.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_dumper.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_filter_engine.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_gateway_external_representation.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_heartbeat.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_identity.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_impl_upload_download.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_import_export.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_judge_cleaner.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_judge_evaluator.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_judge_injector.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_judge_repairer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_lifetime.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_message.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_meta_conventions.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_meta_did.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_module_import.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_monitor.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_multi_vo.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_naming_convention.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_oauthmanager.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_oidc.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_opendata.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_permission.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_pfns.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_ping.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_policy_package.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_preparer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_qos.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_quarantined_replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_redirect.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_replica.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_replica_recoverer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_replica_sorting.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_request.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_root_proxy.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_expression_parser.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_lfn2path.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_protocol_posix.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_protocol_srm.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rse_selector.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rucio_server.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_rule.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_scope.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_subscription.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_throttler.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_tpc.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_trace.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_transfer.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_undertaker.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_upload.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tests/test_utils.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tools/bootstrap.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tools/merge_rucio_configs.py +0 -0
- {rucio-38.0.0rc2 → rucio-38.1.0}/tools/reset_database.py +0 -0
|
@@ -69,6 +69,7 @@ Individual contributors to the source code
|
|
|
69
69
|
- Maximilian Linhoff, <maximilian.linhoff@tu-dortmund.de>, 2024
|
|
70
70
|
- Eric Banzuzi, <eric.banzuzi@gmail.com>, 2024
|
|
71
71
|
- Paul Millar, <paul.millar@desy.de>, 2025
|
|
72
|
+
- Vimalan S <vimalan.github@gmail.com>, 2025
|
|
72
73
|
|
|
73
74
|
Organisations employing contributors
|
|
74
75
|
------------------------------------
|
|
@@ -17,6 +17,7 @@ import argparse
|
|
|
17
17
|
import sys
|
|
18
18
|
from typing import TYPE_CHECKING, Optional
|
|
19
19
|
|
|
20
|
+
from rucio.cli.bin_legacy.rucio import get_parser
|
|
20
21
|
from rucio.cli.bin_legacy.rucio import main as main_legacy
|
|
21
22
|
from rucio.cli.command import main
|
|
22
23
|
from rucio.common.utils import setup_logger
|
|
@@ -119,9 +120,11 @@ if __name__ == "__main__":
|
|
|
119
120
|
main() # pylint: disable=E1120
|
|
120
121
|
|
|
121
122
|
else:
|
|
122
|
-
make_warning(logger)
|
|
123
123
|
try:
|
|
124
|
+
get_parser().parse_args()
|
|
125
|
+
make_warning(logger)
|
|
124
126
|
main_legacy()
|
|
127
|
+
|
|
125
128
|
# Make a custom warning - show the new help menu when invalid commands are called.
|
|
126
129
|
except argparse.ArgumentError:
|
|
127
130
|
logger.error("Invalid argument(s) - %s " % sys.argv[1:])
|
|
@@ -212,5 +212,5 @@ def identity_add(ctx, account_name, type_, id, email, password):
|
|
|
212
212
|
@click.pass_context
|
|
213
213
|
def identity_remove(ctx, account_name, type_, id):
|
|
214
214
|
"""Revoke a given ID's access from an account"""
|
|
215
|
-
args = Arguments({"no_pager": ctx.obj.no_pager, "account": account_name, "authtype": type_, "
|
|
215
|
+
args = Arguments({"no_pager": ctx.obj.no_pager, "account": account_name, "authtype": type_, "identity": id})
|
|
216
216
|
identity_delete(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
@@ -32,7 +32,6 @@ from rich.status import Status
|
|
|
32
32
|
from rich.text import Text
|
|
33
33
|
from rich.theme import Theme
|
|
34
34
|
from rich.traceback import install
|
|
35
|
-
from rich.tree import Tree
|
|
36
35
|
from tabulate import tabulate
|
|
37
36
|
|
|
38
37
|
# rucio module has the same name as this executable module, so this rule fails. pylint: disable=no-name-in-module
|
|
@@ -716,64 +715,7 @@ def list_parent_dids(args, client, logger, console, spinner):
|
|
|
716
715
|
spinner.update(status='Fetching parent DIDs')
|
|
717
716
|
spinner.start()
|
|
718
717
|
|
|
719
|
-
if args.
|
|
720
|
-
dict_datasets = {}
|
|
721
|
-
output = []
|
|
722
|
-
for res in client.get_did_from_pfns(args.pfns):
|
|
723
|
-
for key in res:
|
|
724
|
-
if key not in dict_datasets:
|
|
725
|
-
dict_datasets[key] = []
|
|
726
|
-
for rule in client.list_associated_rules_for_file(res[key]['scope'], res[key]['name']):
|
|
727
|
-
if f"{rule['scope']}:{rule['name']}" not in dict_datasets[key]:
|
|
728
|
-
dict_datasets[key].append(f"{rule['scope']}:{rule['name']}")
|
|
729
|
-
|
|
730
|
-
for i, pfn in enumerate(dict_datasets):
|
|
731
|
-
if cli_config == 'rich':
|
|
732
|
-
parent_tree = Tree('')
|
|
733
|
-
for parent in dict_datasets[pfn]:
|
|
734
|
-
parent_tree.add(parent)
|
|
735
|
-
table = generate_table([['PFN', pfn], ['Parents', parent_tree]], col_alignments=['left', 'left'], row_styles=['none'])
|
|
736
|
-
output.append(table)
|
|
737
|
-
else:
|
|
738
|
-
print('PFN: ', pfn)
|
|
739
|
-
print('Parents: ', ','.join(dict_datasets[pfn]))
|
|
740
|
-
|
|
741
|
-
if cli_config == 'rich':
|
|
742
|
-
spinner.stop()
|
|
743
|
-
print_output(*output, console=console, no_pager=args.no_pager)
|
|
744
|
-
elif args.guids:
|
|
745
|
-
output = []
|
|
746
|
-
guids = []
|
|
747
|
-
for input_ in args.guids:
|
|
748
|
-
try:
|
|
749
|
-
uuid.UUID(input_)
|
|
750
|
-
except ValueError:
|
|
751
|
-
print(f'Ignoring invalid GUID: {input_}')
|
|
752
|
-
continue
|
|
753
|
-
dict_datasets = {}
|
|
754
|
-
for guid in guids:
|
|
755
|
-
for did in client.get_dataset_by_guid(guid):
|
|
756
|
-
if guid not in dict_datasets:
|
|
757
|
-
dict_datasets[guid] = []
|
|
758
|
-
for rule in client.list_associated_rules_for_file(did['scope'], did['name']):
|
|
759
|
-
if f"{rule['scope']}:{rule['name']}" not in dict_datasets[guid]:
|
|
760
|
-
dict_datasets[guid].append(f"{rule['scope']}:{rule['name']}")
|
|
761
|
-
|
|
762
|
-
for i, guid in enumerate(dict_datasets):
|
|
763
|
-
if cli_config == 'rich':
|
|
764
|
-
parent_tree = Tree('')
|
|
765
|
-
for parent in dict_datasets[guid]:
|
|
766
|
-
parent_tree.add(parent)
|
|
767
|
-
table = generate_table([['GUID', guid], ['Parents', parent_tree]], col_alignments=['left', 'left'], row_styles=['none'])
|
|
768
|
-
output.append(table)
|
|
769
|
-
else:
|
|
770
|
-
print('GUID: ', guid)
|
|
771
|
-
print('Parents : ', ','.join(dict_datasets[guid]))
|
|
772
|
-
|
|
773
|
-
if cli_config == 'rich':
|
|
774
|
-
spinner.stop()
|
|
775
|
-
print_output(*output, console=console, no_pager=args.no_pager)
|
|
776
|
-
elif args.did:
|
|
718
|
+
if args.did:
|
|
777
719
|
table_data = []
|
|
778
720
|
scope, name = get_scope(args.did, client)
|
|
779
721
|
for dataset in client.list_parent_dids(scope=scope, name=name):
|
|
@@ -789,7 +731,7 @@ def list_parent_dids(args, client, logger, console, spinner):
|
|
|
789
731
|
else:
|
|
790
732
|
print(tabulate(table_data, tablefmt=tablefmt, headers=['SCOPE:NAME', '[DID TYPE]']))
|
|
791
733
|
else:
|
|
792
|
-
raise InputValidationError('
|
|
734
|
+
raise InputValidationError('A DID must be provided. Use -h to list the options.')
|
|
793
735
|
return SUCCESS
|
|
794
736
|
|
|
795
737
|
|
|
@@ -2403,8 +2345,6 @@ You can filter by key/value, e.g.::
|
|
|
2403
2345
|
''')
|
|
2404
2346
|
list_parent_parser.set_defaults(function=list_parent_dids)
|
|
2405
2347
|
list_parent_parser.add_argument(dest='did', action='store', nargs='?', default=None, help='Data identifier.')
|
|
2406
|
-
list_parent_parser.add_argument('--pfn', dest='pfns', action='store', nargs='+', help='List parent dids for these pfns.')
|
|
2407
|
-
list_parent_parser.add_argument('--guid', dest='guids', action='store', nargs='+', help='List parent dids for these guids.')
|
|
2408
2348
|
|
|
2409
2349
|
# argparse 2.7 does not allow aliases for commands, thus the list-parent-datasets is a copy&paste from list-parent-dids
|
|
2410
2350
|
list_parent_datasets_parser = subparsers.add_parser('list-parent-datasets', help='List parent DIDs for a given DID', description='List all parents Data IDentifier that contains the target Data IDentifier.',
|
|
@@ -2423,8 +2363,6 @@ You can filter by key/value, e.g.::
|
|
|
2423
2363
|
|
|
2424
2364
|
list_parent_datasets_parser.set_defaults(function=list_parent_dids)
|
|
2425
2365
|
list_parent_datasets_parser.add_argument(dest='did', action='store', nargs='?', default=None, help='Data identifier.')
|
|
2426
|
-
list_parent_datasets_parser.add_argument('--pfn', dest='pfns', action='store', nargs='+', help='List parent dids for these pfns.')
|
|
2427
|
-
list_parent_datasets_parser.add_argument('--guid', dest='guids', action='store', nargs='+', help='List parent dids for these guids.')
|
|
2428
2366
|
|
|
2429
2367
|
# The list-scopes command
|
|
2430
2368
|
scope_list_parser = subparsers.add_parser('list-scopes', help='List all available scopes.',
|
|
@@ -37,11 +37,8 @@ def did():
|
|
|
37
37
|
@click.option("--short", is_flag=True, default=False, help="Dump the list of DIDs")
|
|
38
38
|
@click.argument("did-pattern", nargs=-1)
|
|
39
39
|
@click.option("--parent", default=False, is_flag=True, help="List the parents of the DID - must use a full DID scope and name")
|
|
40
|
-
# TODO Implement or remove option - view https://github.com/rucio/rucio/issues/7230
|
|
41
|
-
@click.option("--pfn", hidden=True)
|
|
42
|
-
@click.option("--guid", hidden=True)
|
|
43
40
|
@click.pass_context
|
|
44
|
-
def list_(ctx, did_pattern, recursive, filter_, short, parent
|
|
41
|
+
def list_(ctx, did_pattern, recursive, filter_, short, parent):
|
|
45
42
|
"""
|
|
46
43
|
List the Data IDentifiers matching certain pattern.
|
|
47
44
|
Only the collections (i.e. dataset or container) are returned by default.
|
|
@@ -1215,7 +1215,7 @@ class OpenDataError(RucioException):
|
|
|
1215
1215
|
|
|
1216
1216
|
def __init__(self, *args):
|
|
1217
1217
|
super(OpenDataError, self).__init__(*args)
|
|
1218
|
-
self._message =
|
|
1218
|
+
self._message = "Error related to open data."
|
|
1219
1219
|
self.error_code = 115
|
|
1220
1220
|
|
|
1221
1221
|
|
|
@@ -1226,7 +1226,7 @@ class OpenDataDataIdentifierNotFound(OpenDataError):
|
|
|
1226
1226
|
|
|
1227
1227
|
def __init__(self, *args):
|
|
1228
1228
|
super(OpenDataDataIdentifierNotFound, self).__init__(*args)
|
|
1229
|
-
self._message =
|
|
1229
|
+
self._message = "Data identifier not found in the open data catalog."
|
|
1230
1230
|
self.error_code = 116
|
|
1231
1231
|
|
|
1232
1232
|
|
|
@@ -1237,7 +1237,7 @@ class OpenDataDataIdentifierAlreadyExists(OpenDataError):
|
|
|
1237
1237
|
|
|
1238
1238
|
def __init__(self, *args):
|
|
1239
1239
|
super(OpenDataDataIdentifierAlreadyExists, self).__init__(*args)
|
|
1240
|
-
self._message =
|
|
1240
|
+
self._message = "Data identifier already exists in the open data catalog."
|
|
1241
1241
|
self.error_code = 117
|
|
1242
1242
|
|
|
1243
1243
|
|
|
@@ -1248,7 +1248,7 @@ class OpenDataInvalidState(OpenDataError):
|
|
|
1248
1248
|
|
|
1249
1249
|
def __init__(self, *args):
|
|
1250
1250
|
super(OpenDataInvalidState, self).__init__(*args)
|
|
1251
|
-
self._message =
|
|
1251
|
+
self._message = "Open data entry is in an invalid state."
|
|
1252
1252
|
self.error_code = 118
|
|
1253
1253
|
|
|
1254
1254
|
|
|
@@ -1259,5 +1259,5 @@ class OpenDataInvalidStateUpdate(OpenDataError):
|
|
|
1259
1259
|
|
|
1260
1260
|
def __init__(self, *args):
|
|
1261
1261
|
super(OpenDataInvalidStateUpdate, self).__init__(*args)
|
|
1262
|
-
self._message =
|
|
1262
|
+
self._message = "Invalid state update attempted on open data entry."
|
|
1263
1263
|
self.error_code = 119
|
|
@@ -59,23 +59,15 @@ def _get_generic_schema_module():
|
|
|
59
59
|
if not _is_multivo():
|
|
60
60
|
GENERIC_FALLBACK = 'generic'
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
72
|
-
# fall back to old system for now
|
|
73
|
-
try:
|
|
74
|
-
policy = config.config_get('policy', 'schema', check_config_table=False)
|
|
75
|
-
except (NoOptionError, NoSectionError):
|
|
76
|
-
policy = GENERIC_FALLBACK
|
|
77
|
-
policy = 'rucio.common.schema.' + policy.lower()
|
|
78
|
-
else:
|
|
62
|
+
try:
|
|
63
|
+
if 'RUCIO_POLICY_PACKAGE' in environ:
|
|
64
|
+
policy = environ['RUCIO_POLICY_PACKAGE']
|
|
65
|
+
else:
|
|
66
|
+
policy = config.config_get('policy', 'package', check_config_table=False, raise_exception=True)
|
|
67
|
+
package_module = importlib.import_module(policy)
|
|
68
|
+
check_policy_module_version(package_module)
|
|
69
|
+
policy = policy + ".schema"
|
|
70
|
+
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
79
71
|
policy = 'rucio.common.schema.' + GENERIC_FALLBACK.lower()
|
|
80
72
|
|
|
81
73
|
try:
|
|
@@ -102,24 +94,16 @@ if not _is_multivo():
|
|
|
102
94
|
|
|
103
95
|
def load_schema_for_vo(vo: str) -> None:
|
|
104
96
|
generic_fallback = 'generic_multi_vo'
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
116
|
-
# fall back to old system for now
|
|
117
|
-
try:
|
|
118
|
-
policy = config.config_get('policy', 'schema', check_config_table=False)
|
|
119
|
-
except (NoOptionError, NoSectionError):
|
|
120
|
-
policy = generic_fallback
|
|
121
|
-
policy = 'rucio.common.schema.' + policy.lower()
|
|
122
|
-
else:
|
|
97
|
+
try:
|
|
98
|
+
env_name = 'RUCIO_POLICY_PACKAGE_' + vo.upper()
|
|
99
|
+
if env_name in environ:
|
|
100
|
+
policy = environ[env_name]
|
|
101
|
+
else:
|
|
102
|
+
policy = config.config_get('policy', 'package-' + vo, check_config_table=False, raise_exception=True)
|
|
103
|
+
package_module = importlib.import_module(policy)
|
|
104
|
+
check_policy_module_version(package_module)
|
|
105
|
+
policy = policy + ".schema"
|
|
106
|
+
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
123
107
|
policy = 'rucio.common.schema.' + generic_fallback.lower()
|
|
124
108
|
|
|
125
109
|
try:
|
|
@@ -399,7 +399,7 @@ class NonDeterministicPFNAlgorithms(PolicyPackageAlgorithms):
|
|
|
399
399
|
Initialises a non-deterministic PFN construction object
|
|
400
400
|
"""
|
|
401
401
|
super().__init__()
|
|
402
|
-
|
|
402
|
+
|
|
403
403
|
self.vo = vo
|
|
404
404
|
|
|
405
405
|
def construct_non_deterministic_pfn(self, dsn: str, scope: Optional[str], filename: str, naming_convention: str) -> str:
|
|
@@ -542,7 +542,7 @@ def touch_dataset_locks(dataset_locks: "Iterable[dict[str, Any]]", *, session: "
|
|
|
542
542
|
for dataset_lock in dataset_locks:
|
|
543
543
|
eol_at = define_eol(dataset_lock['scope'], dataset_lock['name'], rses=[{'id': dataset_lock['rse_id']}], session=session)
|
|
544
544
|
try:
|
|
545
|
-
|
|
545
|
+
update_dslock_stmt = update(
|
|
546
546
|
models.DatasetLock
|
|
547
547
|
).where(
|
|
548
548
|
and_(models.DatasetLock.scope == dataset_lock['scope'],
|
|
@@ -553,24 +553,25 @@ def touch_dataset_locks(dataset_locks: "Iterable[dict[str, Any]]", *, session: "
|
|
|
553
553
|
}).execution_options(
|
|
554
554
|
synchronize_session=False
|
|
555
555
|
)
|
|
556
|
-
|
|
556
|
+
session.execute(update_dslock_stmt)
|
|
557
|
+
|
|
558
|
+
update_rule_subq = select(
|
|
557
559
|
models.DatasetLock.rule_id
|
|
558
560
|
).where(
|
|
559
561
|
and_(models.DatasetLock.scope == dataset_lock['scope'],
|
|
560
562
|
models.DatasetLock.name == dataset_lock['name'],
|
|
561
563
|
models.DatasetLock.rse_id == dataset_lock['rse_id'])
|
|
562
564
|
)
|
|
563
|
-
|
|
564
|
-
stmt = update(
|
|
565
|
+
update_rule_stmt = update(
|
|
565
566
|
models.ReplicationRule
|
|
566
567
|
).where(
|
|
567
|
-
models.ReplicationRule.id.in_(
|
|
568
|
+
models.ReplicationRule.id.in_(update_rule_subq)
|
|
568
569
|
).values({
|
|
569
570
|
models.ReplicationRule.eol_at: eol_at
|
|
570
571
|
}).execution_options(
|
|
571
572
|
synchronize_session=False
|
|
572
573
|
)
|
|
573
|
-
session.execute(
|
|
574
|
+
session.execute(update_rule_stmt)
|
|
574
575
|
except DatabaseError:
|
|
575
576
|
return False
|
|
576
577
|
|
|
@@ -49,20 +49,16 @@ if not multivo:
|
|
|
49
49
|
if fallback_policy == 'def':
|
|
50
50
|
fallback_policy = generic_fallback
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
# fall back to old system for now
|
|
63
|
-
policy = 'rucio.core.permission.' + fallback_policy.lower()
|
|
64
|
-
else:
|
|
65
|
-
policy = 'rucio.core.permission.' + generic_fallback.lower()
|
|
52
|
+
try:
|
|
53
|
+
if 'RUCIO_POLICY_PACKAGE' in environ:
|
|
54
|
+
policy = environ['RUCIO_POLICY_PACKAGE']
|
|
55
|
+
else:
|
|
56
|
+
policy = config.config_get('policy', 'package', check_config_table=False, raise_exception=True)
|
|
57
|
+
package_module = importlib.import_module(policy)
|
|
58
|
+
check_policy_module_version(package_module)
|
|
59
|
+
policy = policy + ".permission"
|
|
60
|
+
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
61
|
+
policy = 'rucio.core.permission.' + fallback_policy.lower()
|
|
66
62
|
|
|
67
63
|
try:
|
|
68
64
|
module = importlib.import_module(policy)
|
|
@@ -86,24 +82,16 @@ if not multivo:
|
|
|
86
82
|
|
|
87
83
|
def load_permission_for_vo(vo: str) -> None:
|
|
88
84
|
generic_fallback = 'generic_multi_vo'
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
100
|
-
# fall back to old system for now
|
|
101
|
-
try:
|
|
102
|
-
policy = config.config_get('policy', 'permission')
|
|
103
|
-
except (NoOptionError, NoSectionError):
|
|
104
|
-
policy = generic_fallback
|
|
105
|
-
policy = 'rucio.core.permission.' + policy.lower()
|
|
106
|
-
else:
|
|
85
|
+
try:
|
|
86
|
+
env_name = 'RUCIO_POLICY_PACKAGE_' + vo.upper()
|
|
87
|
+
if env_name in environ:
|
|
88
|
+
policy = environ[env_name]
|
|
89
|
+
else:
|
|
90
|
+
policy = config.config_get('policy', 'package-' + vo, raise_exception=True)
|
|
91
|
+
package_module = importlib.import_module(policy)
|
|
92
|
+
check_policy_module_version(package_module)
|
|
93
|
+
policy = policy + ".permission"
|
|
94
|
+
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
107
95
|
policy = 'rucio.core.permission.' + generic_fallback.lower()
|
|
108
96
|
|
|
109
97
|
try:
|
|
@@ -118,7 +118,7 @@ def _activity_looper(
|
|
|
118
118
|
sleep_time: int,
|
|
119
119
|
activities: Optional['Sequence[str]'],
|
|
120
120
|
heartbeat_handler: HeartbeatHandler,
|
|
121
|
-
) -> 'Generator[tuple[str, float], tuple[float, bool], None]':
|
|
121
|
+
) -> 'Generator[tuple[Optional[str], float], tuple[float, bool], None]':
|
|
122
122
|
"""
|
|
123
123
|
Generator which loops (either once, or indefinitely) over all activities while ensuring that `sleep_time`
|
|
124
124
|
passes between handling twice the same activity.
|
|
@@ -66,7 +66,7 @@ def _fetch_requests(
|
|
|
66
66
|
set_last_processed_by: bool,
|
|
67
67
|
cached_topology: Optional[ExpiringObjectCache],
|
|
68
68
|
heartbeat_handler: "HeartbeatHandler",
|
|
69
|
-
activity: str,
|
|
69
|
+
activity: Optional[str],
|
|
70
70
|
) -> tuple[bool, tuple[list[dict[str, Any]], Topology]]:
|
|
71
71
|
worker_number, total_workers, logger = heartbeat_handler.live()
|
|
72
72
|
|
|
@@ -184,7 +184,7 @@ def finisher(
|
|
|
184
184
|
)
|
|
185
185
|
def _db_producer(
|
|
186
186
|
*,
|
|
187
|
-
activity: str,
|
|
187
|
+
activity: Optional[str],
|
|
188
188
|
heartbeat_handler: "HeartbeatHandler"
|
|
189
189
|
) -> tuple[bool, tuple[list[dict[str, Any]], Topology]]:
|
|
190
190
|
return _fetch_requests(
|
|
@@ -66,7 +66,7 @@ def _fetch_requests(
|
|
|
66
66
|
transfertool: Optional[str],
|
|
67
67
|
filter_transfertool: Optional[str],
|
|
68
68
|
cached_topology: Optional[ExpiringObjectCache],
|
|
69
|
-
activity: str,
|
|
69
|
+
activity: Optional[str],
|
|
70
70
|
set_last_processed_by: bool,
|
|
71
71
|
heartbeat_handler: "HeartbeatHandler"
|
|
72
72
|
) -> tuple[bool, list[dict[str, Any]]]:
|
|
@@ -196,7 +196,7 @@ def poller(
|
|
|
196
196
|
)
|
|
197
197
|
def _db_producer(
|
|
198
198
|
*,
|
|
199
|
-
activity: str,
|
|
199
|
+
activity: Optional[str],
|
|
200
200
|
heartbeat_handler: "HeartbeatHandler"
|
|
201
201
|
) -> tuple[bool, list[dict[str, Any]]]:
|
|
202
202
|
return _fetch_requests(
|
|
@@ -100,7 +100,7 @@ def preparer(
|
|
|
100
100
|
sleep_time=sleep_time)
|
|
101
101
|
def _db_producer(
|
|
102
102
|
*,
|
|
103
|
-
activity: str,
|
|
103
|
+
activity: Optional[str],
|
|
104
104
|
heartbeat_handler: "HeartbeatHandler"
|
|
105
105
|
) -> tuple[bool, tuple[Topology, dict[str, RequestWithSources]]]:
|
|
106
106
|
return _fetch_requests(
|
|
@@ -55,7 +55,7 @@ TRANSFER_TYPE = config_get('conveyor', 'transfertype', False, 'single')
|
|
|
55
55
|
def _fetch_requests(
|
|
56
56
|
partition_hash_var: Optional[str],
|
|
57
57
|
bulk: int,
|
|
58
|
-
activity: str,
|
|
58
|
+
activity: Optional[str],
|
|
59
59
|
rse_ids: Optional[list[str]],
|
|
60
60
|
request_type: list[RequestType],
|
|
61
61
|
ignore_availability: bool,
|
|
@@ -285,7 +285,7 @@ def submitter(
|
|
|
285
285
|
activities=activities)
|
|
286
286
|
def _db_producer(
|
|
287
287
|
*,
|
|
288
|
-
activity: str,
|
|
288
|
+
activity: Optional[str],
|
|
289
289
|
heartbeat_handler: "HeartbeatHandler"
|
|
290
290
|
) -> tuple[bool, tuple[Topology, dict[str, RequestWithSources]]]:
|
|
291
291
|
return _fetch_requests(
|
|
@@ -102,7 +102,7 @@ def throttler(
|
|
|
102
102
|
sleep_time=sleep_time)
|
|
103
103
|
def _db_producer(
|
|
104
104
|
*,
|
|
105
|
-
activity: str,
|
|
105
|
+
activity: Optional[str],
|
|
106
106
|
heartbeat_handler: "HeartbeatHandler"
|
|
107
107
|
) -> tuple[bool, Optional["ReleaseGroupsDict"]]:
|
|
108
108
|
worker_number, total_workers, logger = heartbeat_handler.live()
|
|
@@ -517,6 +517,7 @@ class OpenDataDOI(BASE, ModelBase):
|
|
|
517
517
|
Index('OPENDATA_DOI_CREATED_AT_IDX', 'created_at'),
|
|
518
518
|
)
|
|
519
519
|
|
|
520
|
+
|
|
520
521
|
class OpenDataMeta(BASE, ModelBase):
|
|
521
522
|
"""Mapping between OpenData DIDs and DOIs"""
|
|
522
523
|
__tablename__ = 'dids_opendata_meta'
|
|
@@ -535,6 +536,7 @@ class OpenDataMeta(BASE, ModelBase):
|
|
|
535
536
|
),
|
|
536
537
|
)
|
|
537
538
|
|
|
539
|
+
|
|
538
540
|
class VirtualPlacements(BASE, ModelBase):
|
|
539
541
|
"""Represents virtual placements"""
|
|
540
542
|
__tablename__ = 'virtual_placements'
|
|
@@ -38,6 +38,8 @@ from rucio.db.sqla.constants import DatabaseOperationType
|
|
|
38
38
|
|
|
39
39
|
EXTRA_MODULES = import_extras(['MySQLdb', 'pymysql'])
|
|
40
40
|
|
|
41
|
+
LOG = logging.getLogger(__name__)
|
|
42
|
+
|
|
41
43
|
if TYPE_CHECKING:
|
|
42
44
|
from collections.abc import Callable, Iterator
|
|
43
45
|
from typing import Optional, ParamSpec, TypeVar
|
|
@@ -71,7 +73,6 @@ DEFAULT_SCHEMA_NAME = config_get(DATABASE_SECTION, 'schema',
|
|
|
71
73
|
_METADATA = MetaData(schema=DEFAULT_SCHEMA_NAME)
|
|
72
74
|
_MAKER, _ENGINE, _LOCK = None, None, Lock()
|
|
73
75
|
|
|
74
|
-
|
|
75
76
|
SQLA_CONFIG_POOLCLASS_MAPPING = {
|
|
76
77
|
'queuepool': QueuePool,
|
|
77
78
|
'singletonthreadpool': SingletonThreadPool,
|
|
@@ -218,6 +219,12 @@ def get_engine() -> 'Engine':
|
|
|
218
219
|
if 'mysql' in sql_connection:
|
|
219
220
|
conv = mysql_convert_decimal_to_float(pymysql=sql_connection.startswith('mysql+pymysql'))
|
|
220
221
|
params['connect_args'] = {'conv': conv}
|
|
222
|
+
elif 'oracle' in sql_connection:
|
|
223
|
+
try:
|
|
224
|
+
import oracledb # pylint: disable=import-error
|
|
225
|
+
oracledb.init_oracle_client()
|
|
226
|
+
except Exception as err:
|
|
227
|
+
LOG.warning('Could not start Oracle thick mode; falling back to thin: %s', err)
|
|
221
228
|
for param, param_type in config_params:
|
|
222
229
|
try:
|
|
223
230
|
params[param] = param_type(config_get(DATABASE_SECTION, param, check_config_table=False))
|
|
@@ -50,23 +50,75 @@ skip_outside_gh_actions = pytest.mark.skipif(os.getenv("GITHUB_ACTIONS") != "tru
|
|
|
50
50
|
reason="Skipping tests outside GitHub Actions")
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
def is_influxdb_available(
|
|
54
|
-
|
|
53
|
+
def is_influxdb_available(
|
|
54
|
+
url: str = "http://influxdb:8086",
|
|
55
|
+
timeout: float = 2.0
|
|
56
|
+
) -> bool:
|
|
57
|
+
"""
|
|
58
|
+
Return True when InfluxDB is up and ready for queries, otherwise False.
|
|
59
|
+
|
|
60
|
+
Strategy:
|
|
61
|
+
1. Try /health → 200 + JSON["status"] == "pass"
|
|
62
|
+
2. Fallback to /ping → 204
|
|
63
|
+
"""
|
|
64
|
+
print(f"Checking InfluxDB availability at {url}")
|
|
65
|
+
try:
|
|
66
|
+
r = requests.get(f"{url}/health", timeout=timeout)
|
|
67
|
+
print(f"InfluxDB /health responded with {r.status_code} and body: {r.text}", r.status_code, r.text)
|
|
68
|
+
if r.status_code == 200 and r.json().get("status") == "pass":
|
|
69
|
+
return True
|
|
70
|
+
print(f"InfluxDB is not running healthy at {url}.")
|
|
71
|
+
return False
|
|
72
|
+
except requests.RequestException as e:
|
|
73
|
+
# /health failed or is not available (pre‑1.8)
|
|
74
|
+
print(f"Failed to query InfluxDB /health at {url}: {e}")
|
|
75
|
+
|
|
55
76
|
try:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
77
|
+
print(f"Falling back to /ping for InfluxDB at {url}")
|
|
78
|
+
r = requests.get(f"{url}/ping", timeout=timeout)
|
|
79
|
+
print(f"InfluxDB /ping responded with {r.status_code}")
|
|
80
|
+
return r.status_code == 204
|
|
81
|
+
except requests.RequestException as e:
|
|
82
|
+
print(f"InfluxDB is not reachable at {url}: {e}")
|
|
60
83
|
return False
|
|
61
84
|
|
|
62
85
|
|
|
63
|
-
def is_elasticsearch_available(
|
|
64
|
-
|
|
86
|
+
def is_elasticsearch_available(
|
|
87
|
+
url: str = "http://elasticsearch:9200",
|
|
88
|
+
timeout: float = 2.0,
|
|
89
|
+
min_status: str = 'green',
|
|
90
|
+
) -> bool:
|
|
91
|
+
"""
|
|
92
|
+
Return True when the Elasticsearch node is reachable **and**
|
|
93
|
+
cluster health is at least `min_status` ('red'<'yellow'<'green').
|
|
94
|
+
|
|
95
|
+
1. GET /_cluster/health → 200 + JSON["status"] meets threshold
|
|
96
|
+
2. Fallback: HEAD / → 200 (port open but health unknown)
|
|
97
|
+
"""
|
|
98
|
+
_status_level = {"red": 1, "yellow": 2, "green": 3}
|
|
99
|
+
|
|
100
|
+
print(f"Checking Elasticsearch availability at {url}")
|
|
101
|
+
try:
|
|
102
|
+
r = requests.get(f"{url}/_cluster/health", timeout=timeout)
|
|
103
|
+
print(f"Elasticsearch /_cluster/health responded with {r.status_code} and body: {r.text}")
|
|
104
|
+
if r.status_code == 200:
|
|
105
|
+
status = r.json().get("status")
|
|
106
|
+
if status and _status_level[status] >= _status_level[min_status]:
|
|
107
|
+
return True
|
|
108
|
+
print(f"Elasticsearch health is {status!r}, below threshold {min_status!r}.")
|
|
109
|
+
return False
|
|
110
|
+
except requests.RequestException as e:
|
|
111
|
+
# Either not reachable or /_cluster/health not yet available
|
|
112
|
+
print(f"Failed to query Elasticsearch /_cluster/health at {url}: {e}")
|
|
113
|
+
|
|
114
|
+
# Very old nodes or boot‑strapping clusters: fall back to a simple HEAD /
|
|
65
115
|
try:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
116
|
+
print(f"Falling back to HEAD request for Elasticsearch at {url}")
|
|
117
|
+
r = requests.head(url, timeout=timeout)
|
|
118
|
+
print(f"Elasticsearch HEAD / responded with {r.status_code}")
|
|
119
|
+
return r.status_code == 200
|
|
120
|
+
except requests.RequestException as e:
|
|
121
|
+
print(f"Elasticsearch is not reachable at {url}: {e}")
|
|
70
122
|
return False
|
|
71
123
|
|
|
72
124
|
|