rucio 38.4.0__tar.gz → 38.5.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.4.0 → rucio-38.5.0}/PKG-INFO +1 -1
- {rucio-38.4.0 → rucio-38.5.0}/etc/rucio.cfg.template +2 -3
- {rucio-38.4.0 → rucio-38.5.0}/etc/rucio_multi_vo.cfg.template +2 -3
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/bin_legacy/rucio.py +12 -7
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/bin_legacy/rucio_admin.py +9 -2
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/replica.py +6 -2
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/rule.py +0 -1
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/scope.py +9 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/utils.py +11 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/downloadclient.py +3 -1
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/scopeclient.py +40 -1
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/didtype.py +18 -11
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/did_meta_plugins/__init__.py +2 -1
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/did_meta_plugins/did_column_meta.py +2 -10
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +39 -25
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/did_meta_plugins/elasticsearch_meta.py +3 -11
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/did_meta_plugins/json_meta.py +2 -8
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/did_meta_plugins/mongo_meta.py +3 -12
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/did_meta_plugins/postgres_meta.py +7 -14
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/dirac.py +1 -1
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/rse.py +6 -2
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/scope.py +47 -7
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/automatix/automatix.py +2 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/models.py +22 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/did.py +1 -1
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/dirac.py +1 -1
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/scope.py +35 -3
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/vcsversion.py +3 -3
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/opendata.py +21 -21
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/opendata_public.py +8 -8
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/scopes.py +63 -11
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_bin_rucio.py +79 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_cli_client_structure.py +13 -4
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_conveyor.py +22 -15
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_did_meta_plugins.py +21 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_gateway_external_representation.py +1 -1
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_multi_vo.py +2 -2
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_policy_package.py +41 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse.py +14 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_scope.py +64 -2
- {rucio-38.4.0 → rucio-38.5.0}/AUTHORS.rst +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/ChangeLog +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/LICENSE +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/MANIFEST.in +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/README.md +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-abacus-account +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-abacus-collection-replica +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-abacus-rse +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-admin +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-atropos +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-auditor +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-automatix +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-bb8 +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-cache-client +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-cache-consumer +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-conveyor-finisher +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-conveyor-poller +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-conveyor-preparer +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-conveyor-receiver +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-conveyor-stager +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-conveyor-submitter +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-conveyor-throttler +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-dark-reaper +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-dumper +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-follower +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-hermes +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-judge-cleaner +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-judge-evaluator +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-judge-injector +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-judge-repairer +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-kronos +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-minos +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-minos-temporary-expiration +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-necromancer +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-oauth-manager +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-reaper +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-replica-recoverer +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-rse-decommissioner +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-storage-consistency-actions +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-transmogrifier +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/bin/rucio-undertaker +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/alembic.ini.template +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/alembic_offline.ini.template +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/globus-config.yml.template +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/ldap.cfg.template +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/rse-accounts.cfg.template +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/alembicrevision.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/account.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/bin_legacy/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/command.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/config.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/did.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/download.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/lifetime_exception.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/opendata.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/rse.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/subscription.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/cli/upload.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/accountclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/baseclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/client.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/configclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/credentialclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/didclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/diracclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/exportclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/importclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/lockclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/metaconventionsclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/opendataclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/pingclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/replicaclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/requestclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/richclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/rseclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/ruleclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/subscriptionclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/touchclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/client/uploadclient.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/bittorrent.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/cache.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/checksum.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/client.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/config.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/constants.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/constraints.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/dumper/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/dumper/consistency.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/dumper/data_models.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/dumper/path_parsing.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/exception.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/extra.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/logging.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/pcache.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/plugins.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/policy.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/schema/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/schema/generic.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/stomp_utils.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/stopwatch.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/types.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/common/utils.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/account.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/account_counter.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/account_limit.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/authentication.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/config.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/credential.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/did.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/did_meta_plugins/filter_engine.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/distance.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/exporter.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/heartbeat.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/identity.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/importer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/lifetime_exception.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/lock.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/message.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/meta_conventions.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/monitor.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/naming_convention.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/nongrid_trace.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/oidc.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/opendata.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/permission/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/permission/generic.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/quarantined_replica.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/replica.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/replica_sorter.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/request.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/rse_counter.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/rse_expression_parser.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/rse_selector.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/rule.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/rule_grouping.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/subscription.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/topology.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/trace.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/transfer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/vo.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/core/volatile_replica.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/abacus/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/abacus/account.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/abacus/rse.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/atropos/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/atropos/atropos.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/auditor/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/auditor/hdfs.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/automatix/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/badreplicas/minos.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/bb8/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/bb8/bb8.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/bb8/common.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/cache/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/cache/consumer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/common.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/conveyor/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/conveyor/common.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/conveyor/finisher.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/conveyor/poller.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/conveyor/preparer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/conveyor/receiver.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/conveyor/stager.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/conveyor/submitter.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/conveyor/throttler.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/follower/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/follower/follower.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/hermes/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/hermes/hermes.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/judge/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/judge/cleaner.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/judge/evaluator.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/judge/injector.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/judge/repairer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/reaper/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/reaper/reaper.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/rsedecommissioner/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/rsedecommissioner/config.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/rsedecommissioner/profiles/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/rsedecommissioner/profiles/atlas.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/rsedecommissioner/profiles/generic.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/rsedecommissioner/profiles/types.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/rsedecommissioner/rse_decommissioner.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/storage/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/storage/consistency/actions.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/tracer/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/tracer/kronos.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/undertaker/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/constants.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/30d5206e9cad_increase_oauthrequest_redirect_msg_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/a62db546a1f1_opendata_initial_model.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/sautils.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/session.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/types.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/db/sqla/util.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/account.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/account_limit.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/authentication.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/config.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/credential.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/exporter.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/heartbeat.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/identity.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/importer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/lifetime_exception.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/lock.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/meta_conventions.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/opendata.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/permission.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/quarantined_replica.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/replica.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/request.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/rse.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/rule.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/subscription.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/trace.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/gateway/vo.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/bittorrent.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/gfal.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/webdav.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/protocols/xrootd.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/rse/translation.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/tests/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/tests/common.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/tests/common_server.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/transfertool/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/transfertool/bittorrent.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/transfertool/bittorrent_driver.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/transfertool/bittorrent_driver_qbittorrent.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/transfertool/fts3.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/transfertool/fts3_plugins.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/transfertool/globus.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/transfertool/globus_library.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/transfertool/mock.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/transfertool/transfertool.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/version.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/accounts.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/archives.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/auth.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/common.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/config.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/credentials.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/dids.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/dirac.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/export.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/identities.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/import.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/locks.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/main.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/meta_conventions.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/metrics.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/ping.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/redirect.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/replicas.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/requests.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/rses.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/rules.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/traces.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/types.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/flaskapi/v1/vos.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/main.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/metrics.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio/web/rest/ping.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/lib/rucio.egg-info/SOURCES.txt +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/pyproject.toml +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/requirements/requirements.server.txt +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/setup.cfg +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/setup.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/setuputil.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_abacus_account.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_abacus_collection_replica.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_abacus_rse.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_account.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_account_limits.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_archive.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_auditor.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_auditor_hdfs.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_auditor_srmdumps.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_authentication.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_automatix.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_bad_replica.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_bb8.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_belleii.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_boolean.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_clients.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_config.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_conveyor_submitter.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_counter.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_credential.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_curl.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_daemons.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_dataset_replicas.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_db.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_did.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_download.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_dumper.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_filter_engine.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_heartbeat.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_hermes.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_identity.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_impl_upload_download.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_import_export.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_judge_cleaner.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_judge_evaluator.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_judge_injector.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_judge_repairer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_lifetime.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_message.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_meta_conventions.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_meta_did.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_module_import.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_monitor.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_naming_convention.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_oauthmanager.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_oidc.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_opendata.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_permission.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_pfns.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_ping.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_preparer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_qos.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_quarantined_replica.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_reaper.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_redirect.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_replica.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_replica_recoverer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_replica_sorting.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_request.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_root_proxy.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_expression_parser.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_lfn2path.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_protocol_posix.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_protocol_srm.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rse_selector.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rucio_server.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_rule.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_subscription.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_throttler.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_tpc.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_trace.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_transfer.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_transfer_plugins.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_undertaker.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_upload.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tests/test_utils.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tools/bootstrap.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tools/merge_rucio_configs.py +0 -0
- {rucio-38.4.0 → rucio-38.5.0}/tools/reset_database.py +0 -0
|
@@ -121,8 +121,8 @@ usercert = /opt/rucio/tools/x509up
|
|
|
121
121
|
|
|
122
122
|
[messaging-fts3]
|
|
123
123
|
port = 61123
|
|
124
|
-
ssl_key_file = /
|
|
125
|
-
ssl_cert_file = /
|
|
124
|
+
ssl_key_file = /etc/grid-security/hostkey.pem
|
|
125
|
+
ssl_cert_file = /etc/grid-security/hostcert.pem
|
|
126
126
|
destination = /topic/transfer.fts_monitoring_queue_state
|
|
127
127
|
brokers = dashb-test-mb.cern.ch
|
|
128
128
|
voname = atlas
|
|
@@ -199,7 +199,6 @@ account = cache_mb
|
|
|
199
199
|
cacert = /opt/rucio/etc/web/ca.crt
|
|
200
200
|
#cacert = /etc/pki/tls/certs/CERN-bundle.pem
|
|
201
201
|
usercert = /opt/rucio/etc/web/usercert.pem
|
|
202
|
-
#usercert = /home/mario/.ssh/usercert_with_key.pem
|
|
203
202
|
|
|
204
203
|
[nagios]
|
|
205
204
|
proxy = /opt/rucio/etc/ddmadmin.proxy.nagios
|
|
@@ -102,8 +102,8 @@ usercert = /opt/rucio/tools/x509up
|
|
|
102
102
|
|
|
103
103
|
[messaging-fts3]
|
|
104
104
|
port = 61123
|
|
105
|
-
ssl_key_file = /
|
|
106
|
-
ssl_cert_file = /
|
|
105
|
+
ssl_key_file = /etc/grid-security/hostkey.pem
|
|
106
|
+
ssl_cert_file = /etc/grid-security/hostcert.pem
|
|
107
107
|
destination = /topic/transfer.fts_monitoring_queue_state
|
|
108
108
|
brokers = dashb-test-mb.cern.ch
|
|
109
109
|
voname = atlas
|
|
@@ -179,7 +179,6 @@ account = cache_mb
|
|
|
179
179
|
cacert = /opt/rucio/etc/web/ca.crt
|
|
180
180
|
#cacert = /etc/pki/tls/certs/CERN-bundle.pem
|
|
181
181
|
usercert = /opt/rucio/etc/web/usercert.pem
|
|
182
|
-
#usercert = /home/mario/.ssh/usercert_with_key.pem
|
|
183
182
|
|
|
184
183
|
[nagios]
|
|
185
184
|
proxy = /opt/rucio/etc/ddmadmin.proxy.nagios
|
|
@@ -36,7 +36,7 @@ from tabulate import tabulate
|
|
|
36
36
|
|
|
37
37
|
# rucio module has the same name as this executable module, so this rule fails. pylint: disable=no-name-in-module
|
|
38
38
|
from rucio import version
|
|
39
|
-
from rucio.cli.utils import exception_handler, get_client, setup_gfal2_logger, signal_handler
|
|
39
|
+
from rucio.cli.utils import exception_handler, get_client, scope_exists, setup_gfal2_logger, signal_handler
|
|
40
40
|
from rucio.client.richclient import MAX_TRACEBACK_WIDTH, MIN_CONSOLE_WIDTH, CLITheme, generate_table, get_cli_config, get_pager, print_output, setup_rich_logger
|
|
41
41
|
from rucio.common.client import detect_client_location
|
|
42
42
|
from rucio.common.config import config_get, config_get_float
|
|
@@ -48,7 +48,6 @@ from rucio.common.exception import (
|
|
|
48
48
|
InvalidType,
|
|
49
49
|
RSENotFound,
|
|
50
50
|
RucioException,
|
|
51
|
-
ScopeNotFound,
|
|
52
51
|
UnsupportedOperation,
|
|
53
52
|
)
|
|
54
53
|
from rucio.common.extra import import_extras
|
|
@@ -459,8 +458,7 @@ def list_dids(args, client, logger, console, spinner):
|
|
|
459
458
|
scope = args.did[0]
|
|
460
459
|
name = '*'
|
|
461
460
|
|
|
462
|
-
|
|
463
|
-
raise ScopeNotFound
|
|
461
|
+
scope_exists(client, scope)
|
|
464
462
|
|
|
465
463
|
if args.recursive and '*' in name:
|
|
466
464
|
raise InputValidationError('Option recursive cannot be used with wildcards.')
|
|
@@ -522,12 +520,19 @@ def list_scopes(args, client, logger, console, spinner):
|
|
|
522
520
|
scopes = client.list_scopes()
|
|
523
521
|
if (cli_config == 'rich') and (not args.csv):
|
|
524
522
|
scopes = [[scope] for scope in sorted(scopes)]
|
|
525
|
-
table = generate_table(scopes, headers=['SCOPE'], col_alignments=['left'])
|
|
523
|
+
table = generate_table(scopes, headers=['SCOPE', 'ACCOUNT'], col_alignments=['left'])
|
|
526
524
|
spinner.stop()
|
|
527
525
|
print_output(table, console=console, no_pager=args.no_pager)
|
|
528
526
|
else:
|
|
529
|
-
|
|
530
|
-
|
|
527
|
+
if isinstance(scopes[0], str): # TODO: Backwards compatibility - remove in v40 issue #8125
|
|
528
|
+
for scope in scopes:
|
|
529
|
+
print(scope)
|
|
530
|
+
elif args.csv:
|
|
531
|
+
for scope in scopes:
|
|
532
|
+
print(scope['scope'])
|
|
533
|
+
else:
|
|
534
|
+
scopes = [[s['scope'], s['account']] for s in scopes]
|
|
535
|
+
print(tabulate(scopes, tablefmt=tablefmt, headers=['SCOPE', 'ACCOUNT'], disable_numparse=True))
|
|
531
536
|
return SUCCESS
|
|
532
537
|
|
|
533
538
|
|
|
@@ -780,8 +780,15 @@ def list_scopes(args, client, logger, console, spinner):
|
|
|
780
780
|
spinner.stop()
|
|
781
781
|
print_output(table, console=console, no_pager=args.no_pager)
|
|
782
782
|
else:
|
|
783
|
-
|
|
784
|
-
|
|
783
|
+
if isinstance(scopes[0], str): # TODO: Backwards compatibility - remove in v40 issue #8125
|
|
784
|
+
for scope in scopes:
|
|
785
|
+
print(scope)
|
|
786
|
+
elif args.csv:
|
|
787
|
+
for scope in scopes:
|
|
788
|
+
print(scope['scope'])
|
|
789
|
+
else:
|
|
790
|
+
scopes = [[s['scope'], s['account']] for s in scopes]
|
|
791
|
+
print(tabulate(scopes, tablefmt=tablefmt, headers=['SCOPE', 'ACCOUNT'], disable_numparse=True))
|
|
785
792
|
return SUCCESS
|
|
786
793
|
|
|
787
794
|
|
|
@@ -129,11 +129,15 @@ def update_bad(ctx, replicas, reason, as_file, collection, lfn, scope, rse):
|
|
|
129
129
|
"""Mark a replica bad"""
|
|
130
130
|
args = {"reason": reason, "allow_collection": collection, "scope": scope, "rse": rse}
|
|
131
131
|
if as_file:
|
|
132
|
-
|
|
132
|
+
if len(replicas) != 1:
|
|
133
|
+
raise ValueError("Exactly one positional argument expected in case as-file")
|
|
134
|
+
args["inputfile"] = replicas[0]
|
|
133
135
|
elif lfn:
|
|
134
136
|
if (scope is None) or (rse is None):
|
|
135
137
|
raise ValueError("Scope and RSE are required when using LFNs")
|
|
136
|
-
|
|
138
|
+
if len(replicas) != 1:
|
|
139
|
+
raise ValueError("Exactly one positional argument expected in case of LFN list")
|
|
140
|
+
args["lfns"] = replicas[0]
|
|
137
141
|
else:
|
|
138
142
|
args["listbadfiles"] = replicas
|
|
139
143
|
declare_bad_file_replicas(Arguments(args), ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
@@ -118,7 +118,6 @@ def move(ctx, rule_id, rses, activity, source_rses):
|
|
|
118
118
|
@click.option("--account", help="The account owning the rule")
|
|
119
119
|
@click.option("--stuck", is_flag=True, default=False, help="Set state to STUCK.")
|
|
120
120
|
@click.option('--suspend', is_flag=True, default=None, help='Set state to SUSPENDED.')
|
|
121
|
-
@click.option("--activity", help="Activity of the rule.")
|
|
122
121
|
@click.option("--cancel-requests", is_flag=True, default=False, help="Cancel requests when setting rules to stuck.")
|
|
123
122
|
@click.option("--priority", help="Priority of the requests of the rule.")
|
|
124
123
|
@click.option("--child-rule-id", help='Child rule id of the rule. Use "None" to remove an existing parent/child relationship.')
|
|
@@ -39,3 +39,12 @@ def add_(ctx, account, scope_name):
|
|
|
39
39
|
def list_(ctx: click.Context, account: str, csv: bool):
|
|
40
40
|
"""List existing scopes"""
|
|
41
41
|
list_scopes(Arguments({"no_pager": ctx.obj.no_pager, "account": account, "csv": csv}), ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@scope.command("update")
|
|
45
|
+
@click.argument('scope-name')
|
|
46
|
+
@click.option('-a', '--account', help="New account to associate with the scope", required=True)
|
|
47
|
+
@click.pass_context
|
|
48
|
+
def update(ctx: click.Context, scope_name: str, account: str):
|
|
49
|
+
"""Update the ownership of a [SCOPE-NAME]"""
|
|
50
|
+
ctx.obj.client.update_scope_ownership(account=account, scope=scope_name)
|
|
@@ -41,6 +41,7 @@ from rucio.common.exception import (
|
|
|
41
41
|
RSENotFound,
|
|
42
42
|
RucioException,
|
|
43
43
|
RuleNotFound,
|
|
44
|
+
ScopeNotFound,
|
|
44
45
|
UnsupportedOperation,
|
|
45
46
|
)
|
|
46
47
|
from rucio.common.utils import setup_logger
|
|
@@ -260,3 +261,13 @@ class JSONType(click.ParamType):
|
|
|
260
261
|
return json.loads(value)
|
|
261
262
|
except json.JSONDecodeError as e:
|
|
262
263
|
self.fail(f"Invalid JSON: {e}", param, ctx)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def scope_exists(client: 'Client', scope: str) -> None:
|
|
267
|
+
possible_scopes = client.list_scopes()
|
|
268
|
+
if isinstance(possible_scopes[0], str): # type: ignore #TODO Backwards Compat - Remove in v40, #8125
|
|
269
|
+
scopes = possible_scopes
|
|
270
|
+
else:
|
|
271
|
+
scopes = [s['scope'] for s in possible_scopes] # type: ignore
|
|
272
|
+
if scope not in scopes: # type: ignore - handled by the if isinstance
|
|
273
|
+
raise ScopeNotFound
|
|
@@ -1856,7 +1856,9 @@ class DownloadClient:
|
|
|
1856
1856
|
did_name = did[1]
|
|
1857
1857
|
elif len(did) == 1:
|
|
1858
1858
|
if self.extract_scope_convention == 'belleii':
|
|
1859
|
-
scopes =
|
|
1859
|
+
scopes = self.client.list_scopes()
|
|
1860
|
+
if not isinstance(scopes, list):
|
|
1861
|
+
scopes = [scope['scope'] for scope in scopes]
|
|
1860
1862
|
did_scope, did_name = extract_scope(did[0], scopes)
|
|
1861
1863
|
else:
|
|
1862
1864
|
did = did_str.split('.')
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
from json import loads
|
|
16
|
+
from typing import TYPE_CHECKING, Any, Literal, Union
|
|
16
17
|
from urllib.parse import quote_plus
|
|
17
18
|
|
|
18
19
|
from requests.status_codes import codes
|
|
@@ -21,6 +22,9 @@ from rucio.client.baseclient import BaseClient, choice
|
|
|
21
22
|
from rucio.common.constants import HTTPMethod
|
|
22
23
|
from rucio.common.utils import build_url
|
|
23
24
|
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from collections.abc import Iterator
|
|
27
|
+
|
|
24
28
|
|
|
25
29
|
class ScopeClient(BaseClient):
|
|
26
30
|
|
|
@@ -64,7 +68,7 @@ class ScopeClient(BaseClient):
|
|
|
64
68
|
exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
|
|
65
69
|
raise exc_cls(exc_msg)
|
|
66
70
|
|
|
67
|
-
def list_scopes(self) -> list[str]:
|
|
71
|
+
def list_scopes(self) -> "Union[list[str], Iterator[dict[Literal['scope', 'account'], Any]]]":
|
|
68
72
|
"""
|
|
69
73
|
Sends the request to list all scopes.
|
|
70
74
|
|
|
@@ -83,6 +87,41 @@ class ScopeClient(BaseClient):
|
|
|
83
87
|
exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
|
|
84
88
|
raise exc_cls(exc_msg)
|
|
85
89
|
|
|
90
|
+
def update_scope_ownership(self, account: str, scope: str) -> bool:
|
|
91
|
+
"""
|
|
92
|
+
Change the ownership of a scope
|
|
93
|
+
|
|
94
|
+
Parameters
|
|
95
|
+
----------
|
|
96
|
+
account :
|
|
97
|
+
New account to assign as scope owner
|
|
98
|
+
scope :
|
|
99
|
+
Scope to change ownership of
|
|
100
|
+
|
|
101
|
+
Returns
|
|
102
|
+
-------
|
|
103
|
+
bool
|
|
104
|
+
True if the operation was successful
|
|
105
|
+
|
|
106
|
+
Raises
|
|
107
|
+
------
|
|
108
|
+
AccountNotFound
|
|
109
|
+
If account doesn't exist.
|
|
110
|
+
ScopeNotFound
|
|
111
|
+
If scope doesn't exist.
|
|
112
|
+
CannotAuthenticate, AccessDenied
|
|
113
|
+
Insufficient permission/incorrect credentials to change ownership.
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
path = '/'.join(['scopes', account, scope])
|
|
117
|
+
url = build_url(choice(self.list_hosts), path=path)
|
|
118
|
+
r = self._send_request(url, method=HTTPMethod.PUT)
|
|
119
|
+
if r.status_code == codes.ok:
|
|
120
|
+
return True
|
|
121
|
+
else:
|
|
122
|
+
exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
|
|
123
|
+
raise exc_cls(exc_msg)
|
|
124
|
+
|
|
86
125
|
def list_scopes_for_account(self, account: str) -> list[str]:
|
|
87
126
|
"""
|
|
88
127
|
Sends the request to list all scopes for a rucio account.
|
|
@@ -15,10 +15,12 @@
|
|
|
15
15
|
"""
|
|
16
16
|
DID type to represent a DID and to simplify operations on it
|
|
17
17
|
"""
|
|
18
|
-
|
|
18
|
+
import logging
|
|
19
|
+
from configparser import NoSectionError
|
|
19
20
|
from typing import Any, Union
|
|
20
21
|
|
|
21
|
-
from rucio.common.exception import DIDError
|
|
22
|
+
from rucio.common.exception import ConfigNotFound, DIDError, InvalidAlgorithmName
|
|
23
|
+
from rucio.common.utils import extract_scope
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
class DID:
|
|
@@ -126,15 +128,20 @@ class DID:
|
|
|
126
128
|
Construct the DID from a string.
|
|
127
129
|
:param did: string containing the DID information
|
|
128
130
|
"""
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
131
|
+
try:
|
|
132
|
+
self.scope, self.name = extract_scope(did)
|
|
133
|
+
except (ImportError, InvalidAlgorithmName, ConfigNotFound, NoSectionError) as e: # Only use when the policy can not be found
|
|
134
|
+
logging.debug("Failure using extract_scope policy for '%s': %s - Using fallback." % (did, type(e).__name__))
|
|
135
|
+
did_parts = did.split(DID.SCOPE_SEPARATOR, 1)
|
|
136
|
+
if len(did_parts) == 1:
|
|
137
|
+
self.name = did
|
|
138
|
+
self._update_implicit_scope()
|
|
139
|
+
if not self.has_scope():
|
|
140
|
+
error = f"Could not parse scope from did string {did} - fallback policy expects only one '{DID.SCOPE_SEPARATOR}'"
|
|
141
|
+
raise DIDError(error)
|
|
142
|
+
else:
|
|
143
|
+
self.scope = did_parts[0]
|
|
144
|
+
self.name = did_parts[1]
|
|
138
145
|
|
|
139
146
|
def _did_from_dict(self, did: dict[str, str]) -> None:
|
|
140
147
|
"""
|
|
@@ -96,8 +96,9 @@ def get_metadata(scope, name, plugin="DID_COLUMN", *, session: "Session"):
|
|
|
96
96
|
return all_metadata
|
|
97
97
|
else:
|
|
98
98
|
for metadata_plugin in METADATA_PLUGIN_MODULES:
|
|
99
|
-
if metadata_plugin.
|
|
99
|
+
if metadata_plugin.is_named(plugin):
|
|
100
100
|
return metadata_plugin.get_metadata(scope, name, session=session)
|
|
101
|
+
|
|
101
102
|
raise exception.UnsupportedMetadataPlugin(f'Metadata plugin "{plugin}" is not enabled on the server.')
|
|
102
103
|
|
|
103
104
|
|
|
@@ -46,7 +46,8 @@ class DidColumnMeta(DidMetaPlugin):
|
|
|
46
46
|
def __init__(self) -> None:
|
|
47
47
|
"""Initialize the DID column metadata plugin."""
|
|
48
48
|
super(DidColumnMeta, self).__init__()
|
|
49
|
-
|
|
49
|
+
|
|
50
|
+
self._plugin_name = "DID_COLUMN"
|
|
50
51
|
|
|
51
52
|
@read_session
|
|
52
53
|
def get_metadata(
|
|
@@ -477,12 +478,3 @@ class DidColumnMeta(DidMetaPlugin):
|
|
|
477
478
|
hardcoded_keys = list(set(all_did_table_columns) - set(exclude_did_table_columns)) + additional_keys
|
|
478
479
|
|
|
479
480
|
return key in hardcoded_keys
|
|
480
|
-
|
|
481
|
-
def get_plugin_name(
|
|
482
|
-
self
|
|
483
|
-
) -> str:
|
|
484
|
-
"""
|
|
485
|
-
Return a unique identifier for this plugin.
|
|
486
|
-
:returns: The name of the plugin.
|
|
487
|
-
"""
|
|
488
|
-
return self.plugin_name
|
|
@@ -13,13 +13,11 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
from abc import ABCMeta, abstractmethod
|
|
16
|
-
from typing import TYPE_CHECKING
|
|
17
|
-
|
|
18
|
-
from rucio.db.sqla.session import transactional_session
|
|
16
|
+
from typing import TYPE_CHECKING
|
|
19
17
|
|
|
20
18
|
if TYPE_CHECKING:
|
|
21
19
|
from collections.abc import Iterator
|
|
22
|
-
from typing import Any,
|
|
20
|
+
from typing import Any, Literal
|
|
23
21
|
|
|
24
22
|
from sqlalchemy.orm import Session
|
|
25
23
|
|
|
@@ -35,7 +33,23 @@ class DidMetaPlugin(metaclass=ABCMeta):
|
|
|
35
33
|
"""
|
|
36
34
|
Initializes the plugin
|
|
37
35
|
"""
|
|
38
|
-
|
|
36
|
+
self._plugin_name = None
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def name(self) -> str:
|
|
40
|
+
"""
|
|
41
|
+
The getter method for the plugin's name.
|
|
42
|
+
|
|
43
|
+
:returns: The standardized (casefolded) name of this plugin.
|
|
44
|
+
:raises AttributeError: If '_plugin_name' is not defined in the subclass.
|
|
45
|
+
"""
|
|
46
|
+
if self._plugin_name:
|
|
47
|
+
return self._plugin_name.casefold()
|
|
48
|
+
raise AttributeError("Subclasses of DidMetaPlugin must define the '_plugin_name' attribute.")
|
|
49
|
+
|
|
50
|
+
def is_named(self, plugin_name: str) -> bool:
|
|
51
|
+
"""Return whether the plugin matches the provided name using case-insensitive comparison."""
|
|
52
|
+
return self.name == plugin_name.casefold()
|
|
39
53
|
|
|
40
54
|
@abstractmethod
|
|
41
55
|
def get_metadata(
|
|
@@ -43,12 +57,12 @@ class DidMetaPlugin(metaclass=ABCMeta):
|
|
|
43
57
|
scope: "InternalScope",
|
|
44
58
|
name: str,
|
|
45
59
|
*,
|
|
46
|
-
session: "
|
|
60
|
+
session: "Session | None" = None
|
|
47
61
|
) -> "Any":
|
|
48
62
|
"""
|
|
49
63
|
Get data identifier metadata
|
|
50
64
|
|
|
51
|
-
:param scope: The scope
|
|
65
|
+
:param scope: The scope of the DID.
|
|
52
66
|
:param name: The data identifier name.
|
|
53
67
|
:param session: The database session in use.
|
|
54
68
|
"""
|
|
@@ -63,22 +77,21 @@ class DidMetaPlugin(metaclass=ABCMeta):
|
|
|
63
77
|
value: str,
|
|
64
78
|
recursive: bool = False,
|
|
65
79
|
*,
|
|
66
|
-
session: "
|
|
80
|
+
session: "Session | None" = None
|
|
67
81
|
) -> None:
|
|
68
82
|
"""
|
|
69
83
|
Add metadata to data identifier.
|
|
70
84
|
|
|
71
|
-
:param scope: The scope
|
|
85
|
+
:param scope: The scope of the DID.
|
|
72
86
|
:param name: The data identifier name.
|
|
73
87
|
:param key: the key.
|
|
74
88
|
:param value: the value.
|
|
75
|
-
:param
|
|
76
|
-
:param recursive: Option to propagate the metadata change to content.
|
|
89
|
+
:param recursive: Instruction to propagate the metadata change recursively to content (False by default).
|
|
77
90
|
:param session: The database session in use.
|
|
78
91
|
"""
|
|
79
92
|
pass
|
|
80
93
|
|
|
81
|
-
@
|
|
94
|
+
@abstractmethod
|
|
82
95
|
def set_metadata_bulk(
|
|
83
96
|
self,
|
|
84
97
|
scope: "InternalScope",
|
|
@@ -86,16 +99,16 @@ class DidMetaPlugin(metaclass=ABCMeta):
|
|
|
86
99
|
meta: dict[str, "Any"],
|
|
87
100
|
recursive: bool = False,
|
|
88
101
|
*,
|
|
89
|
-
session: "
|
|
102
|
+
session: "Session | None" = None
|
|
90
103
|
) -> None:
|
|
91
104
|
"""
|
|
92
105
|
Add metadata to data identifier in bulk.
|
|
93
106
|
|
|
94
|
-
:param scope: The scope
|
|
107
|
+
:param scope: The scope of the DID.
|
|
95
108
|
:param name: The data identifier name.
|
|
96
109
|
:param meta: all key-values to set.
|
|
97
110
|
:type meta: dict
|
|
98
|
-
:param recursive:
|
|
111
|
+
:param recursive: Instruction to propagate the metadata change recursively to content (False by default).
|
|
99
112
|
:param session: The database session in use.
|
|
100
113
|
"""
|
|
101
114
|
for key, value in meta.items():
|
|
@@ -108,14 +121,14 @@ class DidMetaPlugin(metaclass=ABCMeta):
|
|
|
108
121
|
name: str,
|
|
109
122
|
key: str,
|
|
110
123
|
*,
|
|
111
|
-
session: "
|
|
124
|
+
session: "Session | None" = None
|
|
112
125
|
) -> None:
|
|
113
126
|
"""
|
|
114
127
|
Deletes the metadata stored for the given key.
|
|
115
128
|
|
|
116
129
|
:param scope: The scope of the DID.
|
|
117
130
|
:param name: The name of the DID.
|
|
118
|
-
:param key:
|
|
131
|
+
:param key: The key to be deleted.
|
|
119
132
|
:param session: The database session in use.
|
|
120
133
|
"""
|
|
121
134
|
pass
|
|
@@ -125,19 +138,19 @@ class DidMetaPlugin(metaclass=ABCMeta):
|
|
|
125
138
|
self,
|
|
126
139
|
scope: "InternalScope",
|
|
127
140
|
filters: dict[str, "Any"],
|
|
128
|
-
did_type: Literal['all', 'collection', 'dataset', 'container', 'file'] = 'collection',
|
|
141
|
+
did_type: "Literal['all', 'collection', 'dataset', 'container', 'file']" = 'collection',
|
|
129
142
|
ignore_case: bool = False,
|
|
130
|
-
limit: "
|
|
131
|
-
offset: "
|
|
143
|
+
limit: "int | None" = None,
|
|
144
|
+
offset: "int | None" = None,
|
|
132
145
|
long: bool = False,
|
|
133
146
|
recursive: bool = False,
|
|
134
147
|
*,
|
|
135
|
-
session: "
|
|
136
|
-
) -> "Iterator[
|
|
148
|
+
session: "Session | None" = None
|
|
149
|
+
) -> "Iterator[str | dict[str, Any]]":
|
|
137
150
|
"""
|
|
138
151
|
Search data identifiers
|
|
139
152
|
|
|
140
|
-
:param scope:
|
|
153
|
+
:param scope: The scope of the DID.
|
|
141
154
|
:param filters: dictionary of attributes by which the results should be filtered.
|
|
142
155
|
:param did_type: the type of the DID: all(container, dataset, file), collection(dataset or container), dataset, container, file.
|
|
143
156
|
:param ignore_case: ignore case distinctions.
|
|
@@ -154,12 +167,13 @@ class DidMetaPlugin(metaclass=ABCMeta):
|
|
|
154
167
|
self,
|
|
155
168
|
key: str,
|
|
156
169
|
*,
|
|
157
|
-
session: "
|
|
170
|
+
session: "Session | None" = None
|
|
158
171
|
) -> bool:
|
|
159
172
|
"""
|
|
160
173
|
Returns whether key is managed by this plugin or not.
|
|
174
|
+
|
|
161
175
|
:param key: Key of the metadata.
|
|
162
176
|
:param session: The database session in use.
|
|
163
|
-
:returns (Boolean)
|
|
177
|
+
:returns: (Boolean)
|
|
164
178
|
"""
|
|
165
179
|
pass
|
|
@@ -91,7 +91,7 @@ class ElasticDidMeta(DidMetaPlugin):
|
|
|
91
91
|
})
|
|
92
92
|
|
|
93
93
|
self.client = Elasticsearch(**self.es_config)
|
|
94
|
-
self.
|
|
94
|
+
self._plugin_name = "ELASTIC"
|
|
95
95
|
|
|
96
96
|
def drop_index(self) -> None:
|
|
97
97
|
self.client.indices.delete(index=self.index)
|
|
@@ -188,7 +188,7 @@ class ElasticDidMeta(DidMetaPlugin):
|
|
|
188
188
|
raise exception.RucioException(err)
|
|
189
189
|
|
|
190
190
|
if recursive:
|
|
191
|
-
raise exception.UnsupportedOperation(f"'{self.
|
|
191
|
+
raise exception.UnsupportedOperation(f"'{self.name}' metadata module does not currently support recursive inserts of metadata")
|
|
192
192
|
|
|
193
193
|
def delete_metadata(
|
|
194
194
|
self,
|
|
@@ -330,7 +330,7 @@ class ElasticDidMeta(DidMetaPlugin):
|
|
|
330
330
|
self.client.close_point_in_time(body={"id": pit_id})
|
|
331
331
|
|
|
332
332
|
if recursive:
|
|
333
|
-
raise exception.UnsupportedOperation(f"'{self.
|
|
333
|
+
raise exception.UnsupportedOperation(f"'{self.name}' metadata module does not currently support recursive searches")
|
|
334
334
|
|
|
335
335
|
def on_delete(
|
|
336
336
|
self,
|
|
@@ -397,11 +397,3 @@ class ElasticDidMeta(DidMetaPlugin):
|
|
|
397
397
|
session: "Optional[Session]" = None
|
|
398
398
|
) -> bool:
|
|
399
399
|
return True
|
|
400
|
-
|
|
401
|
-
def get_plugin_name(self) -> str:
|
|
402
|
-
"""
|
|
403
|
-
Returns a unique identifier for this plugin. This can be later used for filtering down results to this plugin only.
|
|
404
|
-
|
|
405
|
-
:returns: The name of the plugin
|
|
406
|
-
"""
|
|
407
|
-
return self.plugin_name
|
|
@@ -38,7 +38,8 @@ class JSONDidMeta(DidMetaPlugin):
|
|
|
38
38
|
|
|
39
39
|
def __init__(self):
|
|
40
40
|
super(JSONDidMeta, self).__init__()
|
|
41
|
-
|
|
41
|
+
|
|
42
|
+
self._plugin_name = "JSON"
|
|
42
43
|
|
|
43
44
|
@read_session
|
|
44
45
|
def get_metadata(self, scope, name, *, session: "Session"):
|
|
@@ -231,10 +232,3 @@ class JSONDidMeta(DidMetaPlugin):
|
|
|
231
232
|
@read_session
|
|
232
233
|
def manages_key(self, key, *, session: "Session"):
|
|
233
234
|
return json_implemented(session=session)
|
|
234
|
-
|
|
235
|
-
def get_plugin_name(self):
|
|
236
|
-
"""
|
|
237
|
-
Returns a unique identifier for this plugin. This can be later used for filtering down results to this plugin only.
|
|
238
|
-
:returns: The name of the plugin.
|
|
239
|
-
"""
|
|
240
|
-
return self.plugin_name
|
|
@@ -81,7 +81,7 @@ class MongoDidMeta(DidMetaPlugin):
|
|
|
81
81
|
self.db = self.client[con_params['mongo_db']]
|
|
82
82
|
self.col = self.db[con_params['mongo_collection']]
|
|
83
83
|
|
|
84
|
-
self.
|
|
84
|
+
self._plugin_name = "MONGO"
|
|
85
85
|
|
|
86
86
|
def drop_database(self):
|
|
87
87
|
self.client.drop_database(self.db.name)
|
|
@@ -188,9 +188,8 @@ class MongoDidMeta(DidMetaPlugin):
|
|
|
188
188
|
if recursive:
|
|
189
189
|
# TODO: possible, but requires retrieving the results of a concurrent sqla query to call list_content on for datasets and containers
|
|
190
190
|
raise exception.UnsupportedOperation(
|
|
191
|
-
"'{}' metadata module does not currently support recursive searches".format(
|
|
192
|
-
|
|
193
|
-
))
|
|
191
|
+
"'{}' metadata module does not currently support recursive searches".format(self.name)
|
|
192
|
+
)
|
|
194
193
|
|
|
195
194
|
if long:
|
|
196
195
|
query_result = self.col.find(mongo_query_str)
|
|
@@ -219,11 +218,3 @@ class MongoDidMeta(DidMetaPlugin):
|
|
|
219
218
|
|
|
220
219
|
def manages_key(self, key, *, session: "Optional[Session]" = None):
|
|
221
220
|
return True
|
|
222
|
-
|
|
223
|
-
def get_plugin_name(self):
|
|
224
|
-
"""
|
|
225
|
-
Returns a unique identifier for this plugin. This can be later used for filtering down results to this plugin only.
|
|
226
|
-
|
|
227
|
-
:returns: The name of the plugin
|
|
228
|
-
"""
|
|
229
|
-
return self.plugin_name
|
|
@@ -95,7 +95,7 @@ class ExternalPostgresJSONDidMeta(DidMetaPlugin):
|
|
|
95
95
|
else: # managed by Rucio, create a metadata table if it doesn't exist
|
|
96
96
|
self._try_create_metadata_table()
|
|
97
97
|
|
|
98
|
-
self.
|
|
98
|
+
self._plugin_name = "POSTGRES_JSON"
|
|
99
99
|
|
|
100
100
|
def _try_create_metadata_table(self):
|
|
101
101
|
"""
|
|
@@ -260,17 +260,19 @@ class ExternalPostgresJSONDidMeta(DidMetaPlugin):
|
|
|
260
260
|
|
|
261
261
|
def delete_metadata(self, scope, name, key, *, session: "Optional[Session]" = None):
|
|
262
262
|
"""
|
|
263
|
-
Delete a key from metadata.
|
|
263
|
+
Delete a key from metadata of DID.
|
|
264
264
|
|
|
265
265
|
:param scope: the scope of DID
|
|
266
266
|
:param name: the name of the DID
|
|
267
267
|
:param key: the key to be deleted
|
|
268
268
|
:param session: the database session in use
|
|
269
269
|
"""
|
|
270
|
-
statement = sql.SQL("UPDATE {} SET data = {}.data - {}").format(
|
|
270
|
+
statement = sql.SQL("UPDATE {} SET data = {}.data - {} WHERE scope = {} AND name = {}").format(
|
|
271
271
|
sql.Identifier(self.table),
|
|
272
272
|
sql.Identifier(self.table),
|
|
273
|
-
sql.Literal(key)
|
|
273
|
+
sql.Literal(key),
|
|
274
|
+
sql.Literal(scope.internal),
|
|
275
|
+
sql.Literal(name)
|
|
274
276
|
)
|
|
275
277
|
|
|
276
278
|
cur = self.client.cursor()
|
|
@@ -306,7 +308,7 @@ class ExternalPostgresJSONDidMeta(DidMetaPlugin):
|
|
|
306
308
|
# TODO: possible, but requires retrieving the results of a concurrent sqla query to call list_content
|
|
307
309
|
# on for datasets and containers
|
|
308
310
|
raise exception.UnsupportedOperation(
|
|
309
|
-
"'{}' metadata module does not currently support recursive searches".format(self.
|
|
311
|
+
"'{}' metadata module does not currently support recursive searches".format(self.name)
|
|
310
312
|
)
|
|
311
313
|
|
|
312
314
|
statement = sql.SQL("SELECT * FROM {} WHERE {} {}").format(
|
|
@@ -341,12 +343,3 @@ class ExternalPostgresJSONDidMeta(DidMetaPlugin):
|
|
|
341
343
|
|
|
342
344
|
def manages_key(self, key, *, session: "Optional[Session]" = None):
|
|
343
345
|
return True
|
|
344
|
-
|
|
345
|
-
def get_plugin_name(self):
|
|
346
|
-
"""
|
|
347
|
-
Returns a unique identifier for this plugin. This can be later used for filtering down results to this
|
|
348
|
-
plugin only.
|
|
349
|
-
|
|
350
|
-
:returns: The name of the plugin
|
|
351
|
-
"""
|
|
352
|
-
return self.plugin_name
|
|
@@ -99,7 +99,7 @@ def add_files(
|
|
|
99
99
|
# The list of scopes is necessary for the extract_scope
|
|
100
100
|
filter_ = {'scope': InternalScope(scope='*', vo=vo)}
|
|
101
101
|
scopes = list_scopes(filter_=filter_, session=session)
|
|
102
|
-
scopes = [scope.external for scope in scopes]
|
|
102
|
+
scopes = [scope['scope'].external for scope in scopes]
|
|
103
103
|
exist_lfn = []
|
|
104
104
|
try:
|
|
105
105
|
config_lifetime: str = config_get(section='dirac', option='lifetime', default='{}', session=session)
|