rucio 38.2.0__tar.gz → 38.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rucio might be problematic. Click here for more details.
- {rucio-38.2.0 → rucio-38.4.0}/PKG-INFO +1 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/bin_legacy/rucio.py +26 -23
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/command.py +36 -26
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/config.py +22 -7
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/did.py +2 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/download.py +1 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/opendata.py +78 -10
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/utils.py +13 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/accountclient.py +20 -19
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/accountlimitclient.py +5 -4
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/baseclient.py +25 -25
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/configclient.py +29 -5
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/credentialclient.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/didclient.py +33 -32
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/diracclient.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/exportclient.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/importclient.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/lifetimeclient.py +3 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/lockclient.py +4 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/metaconventionsclient.py +5 -4
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/opendataclient.py +8 -7
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/pingclient.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/replicaclient.py +27 -26
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/requestclient.py +8 -8
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/richclient.py +6 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/rseclient.py +31 -28
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/ruleclient.py +13 -12
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/scopeclient.py +4 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/subscriptionclient.py +6 -5
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/constants.py +23 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/exception.py +30 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/plugins.py +33 -15
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/utils.py +3 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/config.py +8 -6
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/credential.py +19 -26
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/did.py +1 -1
- rucio-38.4.0/lib/rucio/core/did_meta_plugins/did_column_meta.py +488 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/opendata.py +150 -8
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/replica.py +3 -4
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/request.py +1 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/rule.py +6 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/rule_grouping.py +5 -5
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/account.py +8 -7
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/config.py +2 -37
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/opendata.py +2 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/request.py +2 -117
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/rule.py +2 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/webdav.py +5 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/translation.py +3 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/transfertool/fts3.py +0 -19
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/transfertool/fts3_plugins.py +3 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/vcsversion.py +3 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +4 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/accounts.py +26 -25
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/archives.py +2 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/auth.py +15 -14
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/common.py +4 -4
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/config.py +57 -17
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/credentials.py +3 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/dids.py +25 -24
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/dirac.py +3 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/export.py +4 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/identities.py +5 -4
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/import.py +3 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +3 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/locks.py +4 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/meta_conventions.py +4 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/metrics.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/opendata.py +7 -6
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/opendata_public.py +6 -5
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/ping.py +3 -2
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/redirect.py +4 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/replicas.py +31 -31
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/requests.py +7 -7
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/rses.py +23 -16
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/rules.py +9 -8
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/scopes.py +4 -3
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +9 -8
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/traces.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/vos.py +4 -3
- {rucio-38.2.0 → rucio-38.4.0}/pyproject.toml +1 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_account.py +15 -1
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_bin_rucio.py +8 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_cli_client_structure.py +81 -11
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_clients.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_config.py +20 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_did.py +7 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_gateway_external_representation.py +8 -11
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_judge_evaluator.py +2 -1
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_opendata.py +109 -11
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_policy_package.py +21 -0
- rucio-38.2.0/lib/rucio/core/did_meta_plugins/did_column_meta.py +0 -331
- {rucio-38.2.0 → rucio-38.4.0}/AUTHORS.rst +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/ChangeLog +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/LICENSE +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/MANIFEST.in +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/README.md +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-abacus-account +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-abacus-collection-replica +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-abacus-rse +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-admin +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-atropos +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-auditor +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-automatix +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-bb8 +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-cache-client +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-cache-consumer +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-conveyor-finisher +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-conveyor-poller +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-conveyor-preparer +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-conveyor-receiver +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-conveyor-stager +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-conveyor-submitter +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-conveyor-throttler +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-dark-reaper +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-dumper +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-follower +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-hermes +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-judge-cleaner +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-judge-evaluator +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-judge-injector +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-judge-repairer +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-kronos +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-minos +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-minos-temporary-expiration +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-necromancer +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-oauth-manager +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-reaper +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-replica-recoverer +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-rse-decommissioner +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-storage-consistency-actions +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-transmogrifier +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/bin/rucio-undertaker +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/alembic.ini.template +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/alembic_offline.ini.template +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/globus-config.yml.template +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/ldap.cfg.template +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/rse-accounts.cfg.template +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/rucio.cfg.template +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/alembicrevision.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/account.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/bin_legacy/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/bin_legacy/rucio_admin.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/lifetime_exception.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/replica.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/rse.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/rule.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/scope.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/subscription.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/cli/upload.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/client.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/downloadclient.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/touchclient.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/client/uploadclient.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/bittorrent.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/cache.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/checksum.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/client.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/config.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/constraints.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/didtype.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/dumper/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/dumper/consistency.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/dumper/data_models.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/dumper/path_parsing.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/extra.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/logging.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/pcache.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/policy.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/schema/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/schema/generic.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/stomp_utils.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/stopwatch.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/common/types.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/account.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/account_counter.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/account_limit.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/authentication.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/did_meta_plugins/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/did_meta_plugins/elasticsearch_meta.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/did_meta_plugins/filter_engine.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/did_meta_plugins/json_meta.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/did_meta_plugins/mongo_meta.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/did_meta_plugins/postgres_meta.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/dirac.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/distance.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/exporter.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/heartbeat.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/identity.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/importer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/lifetime_exception.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/lock.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/message.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/meta_conventions.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/monitor.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/naming_convention.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/nongrid_trace.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/oidc.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/permission/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/permission/generic.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/quarantined_replica.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/replica_sorter.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/rse.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/rse_counter.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/rse_expression_parser.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/rse_selector.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/scope.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/subscription.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/topology.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/trace.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/transfer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/vo.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/core/volatile_replica.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/abacus/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/abacus/account.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/abacus/rse.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/atropos/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/atropos/atropos.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/auditor/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/auditor/hdfs.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/automatix/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/automatix/automatix.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/badreplicas/minos.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/bb8/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/bb8/bb8.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/bb8/common.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/cache/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/cache/consumer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/common.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/conveyor/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/conveyor/common.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/conveyor/finisher.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/conveyor/poller.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/conveyor/preparer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/conveyor/receiver.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/conveyor/stager.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/conveyor/submitter.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/conveyor/throttler.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/follower/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/follower/follower.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/hermes/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/hermes/hermes.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/judge/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/judge/cleaner.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/judge/evaluator.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/judge/injector.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/judge/repairer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/reaper/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/reaper/reaper.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/rsedecommissioner/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/rsedecommissioner/config.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/rsedecommissioner/profiles/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/rsedecommissioner/profiles/atlas.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/rsedecommissioner/profiles/generic.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/rsedecommissioner/profiles/types.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/rsedecommissioner/rse_decommissioner.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/storage/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/storage/consistency/actions.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/tracer/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/tracer/kronos.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/undertaker/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/constants.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/30d5206e9cad_increase_oauthrequest_redirect_msg_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a62db546a1f1_opendata_initial_model.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/models.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/sautils.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/session.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/types.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/db/sqla/util.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/account_limit.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/authentication.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/credential.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/did.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/dirac.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/exporter.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/heartbeat.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/identity.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/importer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/lifetime_exception.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/lock.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/meta_conventions.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/permission.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/quarantined_replica.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/replica.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/rse.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/scope.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/subscription.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/trace.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/gateway/vo.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/bittorrent.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/gfal.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/protocols/xrootd.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/tests/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/tests/common.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/tests/common_server.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/transfertool/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/transfertool/bittorrent.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/transfertool/bittorrent_driver.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/transfertool/bittorrent_driver_qbittorrent.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/transfertool/globus.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/transfertool/globus_library.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/transfertool/mock.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/transfertool/transfertool.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/version.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/main.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/flaskapi/v1/types.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/main.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/metrics.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio/web/rest/ping.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/lib/rucio.egg-info/SOURCES.txt +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/requirements/requirements.server.txt +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/setup.cfg +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/setup.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/setuputil.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_abacus_account.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_abacus_collection_replica.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_abacus_rse.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_account_limits.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_archive.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_auditor.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_auditor_hdfs.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_auditor_srmdumps.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_authentication.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_automatix.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_bad_replica.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_bb8.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_belleii.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_boolean.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_conveyor.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_conveyor_submitter.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_counter.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_credential.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_curl.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_daemons.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_dataset_replicas.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_db.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_did_meta_plugins.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_download.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_dumper.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_filter_engine.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_heartbeat.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_hermes.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_identity.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_impl_upload_download.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_import_export.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_judge_cleaner.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_judge_injector.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_judge_repairer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_lifetime.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_message.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_meta_conventions.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_meta_did.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_module_import.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_monitor.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_multi_vo.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_naming_convention.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_oauthmanager.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_oidc.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_permission.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_pfns.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_ping.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_preparer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_qos.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_quarantined_replica.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_reaper.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_redirect.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_replica.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_replica_recoverer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_replica_sorting.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_request.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_root_proxy.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_expression_parser.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_lfn2path.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_protocol_posix.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_protocol_srm.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rse_selector.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rucio_server.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_rule.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_scope.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_subscription.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_throttler.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_tpc.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_trace.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_transfer.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_transfer_plugins.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_undertaker.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_upload.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tests/test_utils.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tools/bootstrap.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tools/merge_rucio_configs.py +0 -0
- {rucio-38.2.0 → rucio-38.4.0}/tools/reset_database.py +0 -0
|
@@ -449,7 +449,6 @@ def list_dids(args, client, logger, console, spinner):
|
|
|
449
449
|
"""
|
|
450
450
|
|
|
451
451
|
filters = {}
|
|
452
|
-
type_ = 'collection'
|
|
453
452
|
table_data = []
|
|
454
453
|
|
|
455
454
|
try:
|
|
@@ -482,19 +481,17 @@ def list_dids(args, client, logger, console, spinner):
|
|
|
482
481
|
else:
|
|
483
482
|
table_data.append([f"{did['scope']}:{did['name']}", did['did_type']])
|
|
484
483
|
|
|
485
|
-
if
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
else:
|
|
489
|
-
table = generate_table(table_data, headers=['SCOPE:NAME', '[DID TYPE]'], col_alignments=['left', 'left'])
|
|
490
|
-
spinner.stop()
|
|
491
|
-
print_output(table, console=console, no_pager=args.no_pager)
|
|
484
|
+
if args.short:
|
|
485
|
+
for did, _ in table_data:
|
|
486
|
+
print(did)
|
|
492
487
|
else:
|
|
493
|
-
if
|
|
494
|
-
|
|
495
|
-
|
|
488
|
+
if cli_config == 'rich':
|
|
489
|
+
table = generate_table(table_data, headers=['SCOPE:NAME', '[DID TYPE]'], col_alignments=['left', 'left'])
|
|
490
|
+
spinner.stop()
|
|
491
|
+
print_output(table, console=console, no_pager=args.no_pager)
|
|
496
492
|
else:
|
|
497
493
|
print(tabulate(table_data, tablefmt=tablefmt, headers=['SCOPE:NAME', '[DID TYPE]']))
|
|
494
|
+
|
|
498
495
|
return SUCCESS
|
|
499
496
|
|
|
500
497
|
|
|
@@ -657,19 +654,17 @@ def list_content(args, client, logger, console, spinner):
|
|
|
657
654
|
else:
|
|
658
655
|
table_data.append([f"{content['scope']}:{content['name']}", content['type'].upper()])
|
|
659
656
|
|
|
660
|
-
if
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
else:
|
|
664
|
-
table = generate_table(table_data, headers=['SCOPE:NAME', '[DID TYPE]'], col_alignments=['left', 'left'])
|
|
665
|
-
spinner.stop()
|
|
666
|
-
print_output(table, console=console, no_pager=args.no_pager)
|
|
657
|
+
if args.short:
|
|
658
|
+
for did, dummy in table_data:
|
|
659
|
+
print(did)
|
|
667
660
|
else:
|
|
668
|
-
if
|
|
669
|
-
|
|
670
|
-
|
|
661
|
+
if cli_config == 'rich':
|
|
662
|
+
table = generate_table(table_data, headers=['SCOPE:NAME', '[DID TYPE]'], col_alignments=['left', 'left'])
|
|
663
|
+
spinner.stop()
|
|
664
|
+
print_output(table, console=console, no_pager=args.no_pager)
|
|
671
665
|
else:
|
|
672
666
|
print(tabulate(table_data, tablefmt=tablefmt, headers=['SCOPE:NAME', '[DID TYPE]']))
|
|
667
|
+
|
|
673
668
|
return SUCCESS
|
|
674
669
|
|
|
675
670
|
|
|
@@ -1011,6 +1006,8 @@ def download(args, client, logger, console, spinner):
|
|
|
1011
1006
|
items = []
|
|
1012
1007
|
if args.dids:
|
|
1013
1008
|
for did in args.dids:
|
|
1009
|
+
if args.scope:
|
|
1010
|
+
did = f"{args.scope}:{did}"
|
|
1014
1011
|
item = {'did': did}
|
|
1015
1012
|
item.update(item_defaults)
|
|
1016
1013
|
items.append(item)
|
|
@@ -1043,9 +1040,15 @@ def download(args, client, logger, console, spinner):
|
|
|
1043
1040
|
item_defaults['did'] = did_str
|
|
1044
1041
|
if args.rses is None:
|
|
1045
1042
|
logger.warning("No RSE was given, selecting one.")
|
|
1043
|
+
if not args.scope:
|
|
1044
|
+
scope = did_str.split(':')[0]
|
|
1045
|
+
did = did_str.split(':')[-1]
|
|
1046
|
+
else:
|
|
1047
|
+
scope = args.scope
|
|
1048
|
+
did = did_str.split(':')[-1]
|
|
1046
1049
|
|
|
1047
1050
|
replicas = client.list_replicas(
|
|
1048
|
-
[{"scope":
|
|
1051
|
+
[{"scope": scope, "name": did}],
|
|
1049
1052
|
schemes=args.protocol,
|
|
1050
1053
|
ignore_availability=False,
|
|
1051
1054
|
client_location=detect_client_location(),
|
|
@@ -2473,7 +2476,7 @@ You can filter by key/value, e.g.::
|
|
|
2473
2476
|
selected_parser.add_argument('--trace_taskid', '--trace-taskid', new_option_string='--trace-taskid', dest='trace_taskid', action=StoreAndDeprecateWarningAction, default=os.environ.get('RUCIO_TRACE_TASKID', None), help=argparse.SUPPRESS)
|
|
2474
2477
|
selected_parser.add_argument('--trace_usrdn', '--trace-usrdn', new_option_string='--trace-usrdn', dest='trace_usrdn', action=StoreAndDeprecateWarningAction, default=os.environ.get('RUCIO_TRACE_USRDN', None), help=argparse.SUPPRESS)
|
|
2475
2478
|
selected_parser.add_argument('--filter', dest='filter', action='store', help='Filter files by key-value pairs like guid=2e2232aafac8324db452070304f8d745.')
|
|
2476
|
-
selected_parser.add_argument('--scope', dest='scope', action='store', help='Scope
|
|
2479
|
+
selected_parser.add_argument('--scope', dest='scope', action='store', help='Scope to use as a filter or to use with DID names.')
|
|
2477
2480
|
selected_parser.add_argument('--metalink', dest='metalink_file', action='store', help='Path to a metalink file.')
|
|
2478
2481
|
selected_parser.add_argument('--deactivate-file-download-exceptions', dest='deactivate_file_download_exceptions', action='store_true', help='Does not raise NoFilesDownloaded, NotAllFilesDownloaded or incorrect number of output queue files Exception.') # NOQA: E501
|
|
2479
2482
|
selected_parser.add_argument('--replica-selection', dest='sort', action='store', help='Select the best replica using a replica sorting algorithm provided by replica sorter (e.g., random, geoip).')
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
import importlib
|
|
15
15
|
import signal
|
|
16
|
+
import sys
|
|
16
17
|
import time
|
|
17
18
|
|
|
18
19
|
import click
|
|
@@ -61,6 +62,16 @@ class LazyGroup(click.Group):
|
|
|
61
62
|
raise ValueError(f"Lazy loading of {import_path} failed by returning " "a non-command object")
|
|
62
63
|
return cmd_object
|
|
63
64
|
|
|
65
|
+
@exception_handler
|
|
66
|
+
def _invoke_with_handler(self, ctx: click.Context):
|
|
67
|
+
return super().invoke(ctx)
|
|
68
|
+
|
|
69
|
+
def invoke(self, ctx: click.Context):
|
|
70
|
+
result = self._invoke_with_handler(ctx)
|
|
71
|
+
if result not in (None, 0):
|
|
72
|
+
sys.exit(1 if result != 2 else 2)
|
|
73
|
+
return result
|
|
74
|
+
|
|
64
75
|
|
|
65
76
|
@click.group(
|
|
66
77
|
cls=LazyGroup,
|
|
@@ -87,7 +98,7 @@ class LazyGroup(click.Group):
|
|
|
87
98
|
@click.option("--ca-certificate", help="CA certificate to verify peer against (SSL)")
|
|
88
99
|
@click.option("--certificate", help="Client certificate file")
|
|
89
100
|
@click.option("--client-key", help="Client key for x509 Authentication")
|
|
90
|
-
@click.option("--config", help="The Rucio configuration file to use")
|
|
101
|
+
@click.option("--config", help="The Rucio configuration file to use", envvar="RUCIO_CONFIG")
|
|
91
102
|
@click.option("-H", "--host", help="The Rucio API host")
|
|
92
103
|
# oidc auth
|
|
93
104
|
@click.option("--oidc-user", help="OIDC username")
|
|
@@ -146,33 +157,32 @@ class LazyGroup(click.Group):
|
|
|
146
157
|
@click.version_option(version.version_string(), message="%(prog)s %(version)s")
|
|
147
158
|
# Hidden options at the end
|
|
148
159
|
@click.option("--no-pager", is_flag=True, default=False, hidden=True)
|
|
149
|
-
@exception_handler
|
|
150
160
|
@click.pass_context
|
|
151
161
|
def main(
|
|
152
|
-
ctx,
|
|
153
|
-
config,
|
|
154
|
-
verbose,
|
|
155
|
-
host,
|
|
156
|
-
auth_host,
|
|
157
|
-
issuer,
|
|
158
|
-
auth_strategy,
|
|
159
|
-
timeout,
|
|
160
|
-
user_agent,
|
|
161
|
-
vo,
|
|
162
|
-
no_pager,
|
|
163
|
-
user,
|
|
164
|
-
password,
|
|
165
|
-
oidc_user,
|
|
166
|
-
oidc_password,
|
|
167
|
-
oidc_scope,
|
|
168
|
-
oidc_audience,
|
|
169
|
-
oidc_auto,
|
|
170
|
-
oidc_polling,
|
|
171
|
-
oidc_refresh_lifetime,
|
|
172
|
-
oidc_issuer,
|
|
173
|
-
certificate,
|
|
174
|
-
client_key,
|
|
175
|
-
ca_certificate,
|
|
162
|
+
ctx: click.Context,
|
|
163
|
+
config: str,
|
|
164
|
+
verbose: bool,
|
|
165
|
+
host: str,
|
|
166
|
+
auth_host: str,
|
|
167
|
+
issuer: str,
|
|
168
|
+
auth_strategy: str,
|
|
169
|
+
timeout: float,
|
|
170
|
+
user_agent: str,
|
|
171
|
+
vo: str,
|
|
172
|
+
no_pager: bool,
|
|
173
|
+
user: str,
|
|
174
|
+
password: str,
|
|
175
|
+
oidc_user: str,
|
|
176
|
+
oidc_password: str,
|
|
177
|
+
oidc_scope: str,
|
|
178
|
+
oidc_audience: str,
|
|
179
|
+
oidc_auto: str,
|
|
180
|
+
oidc_polling: str,
|
|
181
|
+
oidc_refresh_lifetime: str,
|
|
182
|
+
oidc_issuer: str,
|
|
183
|
+
certificate: str,
|
|
184
|
+
client_key: str,
|
|
185
|
+
ca_certificate: str,
|
|
176
186
|
):
|
|
177
187
|
ctx.ensure_object(Arguments)
|
|
178
188
|
ctx.obj.start_time = time.time()
|
|
@@ -27,18 +27,17 @@ def config():
|
|
|
27
27
|
@click.option("-s", "--section", help="Filter by sections")
|
|
28
28
|
@click.option("-k", "--key", help="Show key's value, section required.")
|
|
29
29
|
@click.pass_context
|
|
30
|
-
def list_(ctx, section, key):
|
|
30
|
+
def list_(ctx: click.Context, section: str, key: str):
|
|
31
31
|
"""List the sections or content of sections in the rucio.cfg"""
|
|
32
32
|
get_config(Arguments({"no_pager": ctx.obj.no_pager, "section": section, "key": key}), ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
# TODO Change to only add new fields and cannot modify an existing field
|
|
36
35
|
@config.command("add")
|
|
37
36
|
@click.option("-s", "--section", help="Section name", required=True)
|
|
38
37
|
@click.option('--key', help='Attribute key', required=True)
|
|
39
38
|
@click.option('--value', help='Attribute value', required=True)
|
|
40
39
|
@click.pass_context
|
|
41
|
-
def add_(ctx, section, key, value):
|
|
40
|
+
def add_(ctx: click.Context, section: str, key: str, value: str):
|
|
42
41
|
"""
|
|
43
42
|
Add a new key/value to a section.
|
|
44
43
|
|
|
@@ -46,6 +45,12 @@ def add_(ctx, section, key, value):
|
|
|
46
45
|
Example, Add a key to an existing section:
|
|
47
46
|
$ rucio config add --section my-section --key key --value value
|
|
48
47
|
"""
|
|
48
|
+
has_option = ctx.obj.client.get_config().get(section, {}).get(key) is not None
|
|
49
|
+
if has_option:
|
|
50
|
+
msg = f"Config already has field {section}: {key}, please use \n\
|
|
51
|
+
rucio config update --section {section} --key {key} --value {value}"
|
|
52
|
+
raise ValueError(msg)
|
|
53
|
+
|
|
49
54
|
args = Arguments({"no_pager": ctx.obj.no_pager, "section": section, "option": key, "value": value})
|
|
50
55
|
set_config_option(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
51
56
|
|
|
@@ -54,7 +59,7 @@ def add_(ctx, section, key, value):
|
|
|
54
59
|
@click.option("-s", "--section", help="Section", required=True)
|
|
55
60
|
@click.option("-k", "--key", help="Key in section", required=True)
|
|
56
61
|
@click.pass_context
|
|
57
|
-
def remove(ctx, section, key):
|
|
62
|
+
def remove(ctx: click.Context, section: str, key: str):
|
|
58
63
|
"""Remove the section.key from the config."""
|
|
59
64
|
args = Arguments({"no_pager": ctx.obj.no_pager, "section": section, "option": key})
|
|
60
65
|
delete_config_option(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
@@ -66,7 +71,17 @@ def show(ctx):
|
|
|
66
71
|
"""Show a single sections options"""
|
|
67
72
|
|
|
68
73
|
|
|
69
|
-
|
|
70
|
-
|
|
74
|
+
@config.command("update")
|
|
75
|
+
@click.option("-s", "--section", required=True)
|
|
76
|
+
@click.option("-k", "--key", help='Attribute key', required=True)
|
|
77
|
+
@click.option("-v", "--value", help='Attribute value', required=True)
|
|
78
|
+
@click.pass_context
|
|
79
|
+
def update(ctx: click.Context, section: str, key: str, value: str):
|
|
71
80
|
"""Modify an existing command"""
|
|
72
|
-
|
|
81
|
+
has_option = ctx.obj.client.get_config().get(section, {}).get(key) is not None
|
|
82
|
+
if has_option:
|
|
83
|
+
ctx.obj.client.set_config_option(section, key, value)
|
|
84
|
+
else:
|
|
85
|
+
msg = f"{section} {key} not present. Please use \n\
|
|
86
|
+
rucio config add --section {section} --key {key} --value {value}"
|
|
87
|
+
raise ValueError(msg)
|
|
@@ -34,8 +34,8 @@ def did():
|
|
|
34
34
|
are used: ";" represents the logical OR operator; "," represents the logical AND operator',
|
|
35
35
|
""",
|
|
36
36
|
) # TODO Shorten this help and make supplying this easier
|
|
37
|
-
@click.option("--short", is_flag=True, default=False, help="
|
|
38
|
-
@click.argument("did-pattern", nargs=-1)
|
|
37
|
+
@click.option("--short", is_flag=True, default=False, help="Just dump the list of DIDs.")
|
|
38
|
+
@click.argument("did-pattern", nargs=-1, required=True)
|
|
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
40
|
@click.pass_context
|
|
41
41
|
def list_(ctx, did_pattern, recursive, filter_, short, parent):
|
|
@@ -52,7 +52,7 @@ from rucio.common.config import config_get_float
|
|
|
52
52
|
@click.option("--trace-taskid", default=os.environ.get("RUCIO_TRACE_TASKID", None), hidden=True)
|
|
53
53
|
@click.option("--trace-usrdn", default=os.environ.get("RUCIO_TRACE_USRDN", None), hidden=True)
|
|
54
54
|
@click.option("--filter", help="Filter files by key-value pairs like guid=2e2232aafac8324db452070304f8d745.")
|
|
55
|
-
@click.option("--scope", help="Scope
|
|
55
|
+
@click.option("--scope", help="Scope to use as a filter or to use with DID names.")
|
|
56
56
|
@click.option("--metalink", help="Path to a metalink file.")
|
|
57
57
|
@click.option("--no-show-download-exceptions", default=False, is_flag=True, help="Does not raise NoFilesDownloaded, NotAllFilesDownloaded or incorrect number of output queue files Exception.") # NOQA: E501
|
|
58
58
|
@click.option("--replica-selection", help="Select the best replica using a replica sorting algorithm provided by replica sorter (e.g., random, geoip).")
|
|
@@ -16,8 +16,11 @@ import json
|
|
|
16
16
|
from typing import TYPE_CHECKING, Optional
|
|
17
17
|
|
|
18
18
|
import click
|
|
19
|
+
from rich.text import Text
|
|
20
|
+
from tabulate import tabulate
|
|
19
21
|
|
|
20
22
|
from rucio.cli.utils import JSONType
|
|
23
|
+
from rucio.client.richclient import CLITheme, generate_table, get_cli_config, print_output
|
|
21
24
|
from rucio.common.constants import OPENDATA_DID_STATE_LITERAL_LIST
|
|
22
25
|
from rucio.common.utils import extract_scope
|
|
23
26
|
|
|
@@ -26,6 +29,8 @@ if TYPE_CHECKING:
|
|
|
26
29
|
|
|
27
30
|
from rucio.common.constants import OPENDATA_DID_STATE_LITERAL
|
|
28
31
|
|
|
32
|
+
cli_config = get_cli_config()
|
|
33
|
+
|
|
29
34
|
|
|
30
35
|
def is_valid_json(s: str) -> bool:
|
|
31
36
|
try:
|
|
@@ -50,15 +55,42 @@ def opendata_did() -> None:
|
|
|
50
55
|
help="Filter on Opendata state")
|
|
51
56
|
@click.option("--public", required=False, is_flag=True, default=False,
|
|
52
57
|
help="Perform request against the public endpoint")
|
|
58
|
+
@click.option("--short", is_flag=True, default=False, help="Dump the list of Opendata DIDs")
|
|
53
59
|
@click.pass_context
|
|
54
|
-
def list_opendata_dids(ctx: "Context", state: Optional["OPENDATA_DID_STATE_LITERAL"], public: bool
|
|
60
|
+
def list_opendata_dids(ctx: "Context", state: Optional["OPENDATA_DID_STATE_LITERAL"], public: bool,
|
|
61
|
+
short: bool) -> None:
|
|
55
62
|
"""
|
|
56
63
|
List Opendata DIDs, optionally filtered by state and public/private access
|
|
57
64
|
"""
|
|
58
65
|
|
|
59
66
|
client = ctx.obj.client
|
|
60
|
-
|
|
61
|
-
|
|
67
|
+
spinner = ctx.obj.spinner
|
|
68
|
+
|
|
69
|
+
dids_list = client.list_opendata_dids(state=state, public=public)
|
|
70
|
+
|
|
71
|
+
table_data = []
|
|
72
|
+
|
|
73
|
+
if cli_config == 'rich':
|
|
74
|
+
spinner.update(status='Fetching Opendata DIDs')
|
|
75
|
+
spinner.start()
|
|
76
|
+
|
|
77
|
+
for did in dids_list["dids"]:
|
|
78
|
+
if cli_config == 'rich':
|
|
79
|
+
table_data.append([f"{did['scope']}:{did['name']}",
|
|
80
|
+
Text(did['state'], style=CLITheme.OPENDATA_DID_STATE.get(did['state'], 'default'))])
|
|
81
|
+
else:
|
|
82
|
+
table_data.append([f"{did['scope']}:{did['name']}", did['state']])
|
|
83
|
+
|
|
84
|
+
if short:
|
|
85
|
+
for did, _ in table_data:
|
|
86
|
+
print(did)
|
|
87
|
+
else:
|
|
88
|
+
if cli_config == 'rich':
|
|
89
|
+
table = generate_table(table_data, headers=['SCOPE:NAME', '[STATE]'], col_alignments=['left', 'left'])
|
|
90
|
+
spinner.stop()
|
|
91
|
+
print_output(table, console=ctx.obj.console, no_pager=ctx.obj.no_pager)
|
|
92
|
+
else:
|
|
93
|
+
print(tabulate(table_data, tablefmt="psql", headers=['SCOPE:NAME', '[STATE]']))
|
|
62
94
|
|
|
63
95
|
|
|
64
96
|
@opendata_did.command("add")
|
|
@@ -101,12 +133,31 @@ def get_opendata_did(ctx: "Context", did: str, files: bool, meta: bool, public:
|
|
|
101
133
|
"""
|
|
102
134
|
|
|
103
135
|
client = ctx.obj.client
|
|
136
|
+
spinner = ctx.obj.spinner
|
|
137
|
+
console = ctx.obj.console
|
|
138
|
+
|
|
104
139
|
scope, name = extract_scope(did)
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
140
|
+
info = client.get_opendata_did(scope=scope, name=name, public=public,
|
|
141
|
+
include_files=files, include_metadata=meta,
|
|
142
|
+
include_doi=True)
|
|
143
|
+
|
|
144
|
+
output = []
|
|
145
|
+
if cli_config == 'rich':
|
|
146
|
+
spinner.update(status='Fetching Opendata DID stats')
|
|
147
|
+
spinner.start()
|
|
148
|
+
keyword_styles = {**CLITheme.BOOLEAN, **CLITheme.OPENDATA_DID_STATE}
|
|
149
|
+
|
|
150
|
+
table_data = [(k, Text(str(v), style=keyword_styles.get(str(v), 'default'))) for (k, v) in
|
|
151
|
+
sorted(info.items())]
|
|
152
|
+
table = generate_table(table_data, row_styles=['none'], col_alignments=['left', 'left'])
|
|
153
|
+
output.append(table)
|
|
154
|
+
else:
|
|
155
|
+
table = [(k + ':', str(v)) for (k, v) in sorted(info.items())]
|
|
156
|
+
print(tabulate(table, tablefmt='plain', disable_numparse=True))
|
|
157
|
+
|
|
158
|
+
if cli_config == 'rich':
|
|
159
|
+
spinner.stop()
|
|
160
|
+
print_output(*output, console=console, no_pager=ctx.obj.no_pager)
|
|
110
161
|
|
|
111
162
|
|
|
112
163
|
@opendata_did.command("update")
|
|
@@ -124,9 +175,26 @@ def update_opendata_did(ctx: "Context", did: str, meta: Optional[str],
|
|
|
124
175
|
Update an existing Opendata DID in the Opendata catalog.
|
|
125
176
|
"""
|
|
126
177
|
|
|
127
|
-
client = ctx.obj.client
|
|
128
178
|
if not any([meta, state, doi]):
|
|
129
179
|
raise ValueError("At least one of --meta, --state, or --doi must be provided.")
|
|
130
180
|
|
|
181
|
+
client = ctx.obj.client
|
|
182
|
+
spinner = ctx.obj.spinner
|
|
183
|
+
console = ctx.obj.console
|
|
184
|
+
|
|
131
185
|
scope, name = extract_scope(did)
|
|
132
|
-
client.update_opendata_did(scope=scope, name=name, meta=meta, state=state, doi=doi)
|
|
186
|
+
info = client.update_opendata_did(scope=scope, name=name, meta=meta, state=state, doi=doi)
|
|
187
|
+
|
|
188
|
+
if cli_config == 'rich':
|
|
189
|
+
spinner.update(status='Fetching Opendata DID stats')
|
|
190
|
+
spinner.start()
|
|
191
|
+
keyword_styles = {**CLITheme.BOOLEAN, **CLITheme.OPENDATA_DID_STATE}
|
|
192
|
+
|
|
193
|
+
table_data = [(k, Text(str(v), style=keyword_styles.get(str(v), 'default'))) for (k, v) in
|
|
194
|
+
sorted(info.items())]
|
|
195
|
+
table = generate_table(table_data, row_styles=['none'], col_alignments=['left', 'left'])
|
|
196
|
+
spinner.stop()
|
|
197
|
+
print_output(table, console=console, no_pager=ctx.obj.no_pager)
|
|
198
|
+
else:
|
|
199
|
+
table = [(k + ':', str(v)) for (k, v) in sorted(info.items())]
|
|
200
|
+
print(tabulate(table, tablefmt='plain', disable_numparse=True))
|
|
@@ -57,7 +57,19 @@ def exception_handler(function):
|
|
|
57
57
|
def new_funct(*args, **kwargs):
|
|
58
58
|
try:
|
|
59
59
|
return function(*args, **kwargs)
|
|
60
|
-
except
|
|
60
|
+
except click.exceptions.Exit as error:
|
|
61
|
+
# Exit is evoked every time click ends a program without running anything
|
|
62
|
+
# This error is raised when the help menu is called
|
|
63
|
+
logger.debug("Exited click context")
|
|
64
|
+
if ("-h" not in sys.argv) or ("--help" not in sys.argv):
|
|
65
|
+
return error.exit_code
|
|
66
|
+
return SUCCESS
|
|
67
|
+
except click.MissingParameter as error:
|
|
68
|
+
error.show()
|
|
69
|
+
msg = f"{error}. Please check the command help (-h/--help)."
|
|
70
|
+
logger.error(msg)
|
|
71
|
+
return 2 # Always return an error 2 for an incorrect specification
|
|
72
|
+
except (InputValidationError, click.exceptions.UsageError) as error:
|
|
61
73
|
logger.error(error)
|
|
62
74
|
logger.debug("This means that one you provided an invalid combination of parameters, or incorrect types. Please check the command help (-h/--help).")
|
|
63
75
|
return FAILURE
|
|
@@ -19,6 +19,7 @@ from urllib.parse import quote_plus
|
|
|
19
19
|
from requests.status_codes import codes
|
|
20
20
|
|
|
21
21
|
from rucio.client.baseclient import BaseClient, choice
|
|
22
|
+
from rucio.common.constants import HTTPMethod
|
|
22
23
|
from rucio.common.utils import build_url
|
|
23
24
|
|
|
24
25
|
if TYPE_CHECKING:
|
|
@@ -59,7 +60,7 @@ class AccountClient(BaseClient):
|
|
|
59
60
|
path = '/'.join([self.ACCOUNTS_BASEURL, account])
|
|
60
61
|
url = build_url(choice(self.list_hosts), path=path)
|
|
61
62
|
|
|
62
|
-
res = self._send_request(url,
|
|
63
|
+
res = self._send_request(url, method=HTTPMethod.POST, data=data)
|
|
63
64
|
if res.status_code == codes.created:
|
|
64
65
|
return True
|
|
65
66
|
exc_cls, exc_msg = self._get_exception(headers=res.headers, status_code=res.status_code, data=res.content)
|
|
@@ -88,7 +89,7 @@ class AccountClient(BaseClient):
|
|
|
88
89
|
path = '/'.join([self.ACCOUNTS_BASEURL, account])
|
|
89
90
|
url = build_url(choice(self.list_hosts), path=path)
|
|
90
91
|
|
|
91
|
-
res = self._send_request(url,
|
|
92
|
+
res = self._send_request(url, method=HTTPMethod.DELETE)
|
|
92
93
|
|
|
93
94
|
if res.status_code == codes.ok:
|
|
94
95
|
return True
|
|
@@ -118,7 +119,7 @@ class AccountClient(BaseClient):
|
|
|
118
119
|
path = '/'.join([self.ACCOUNTS_BASEURL, account])
|
|
119
120
|
url = build_url(choice(self.list_hosts), path=path)
|
|
120
121
|
|
|
121
|
-
res = self._send_request(url)
|
|
122
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
122
123
|
if res.status_code == codes.ok:
|
|
123
124
|
acc = self._load_json_data(res)
|
|
124
125
|
return next(acc)
|
|
@@ -152,7 +153,7 @@ class AccountClient(BaseClient):
|
|
|
152
153
|
path = '/'.join([self.ACCOUNTS_BASEURL, account])
|
|
153
154
|
url = build_url(choice(self.list_hosts), path=path)
|
|
154
155
|
|
|
155
|
-
res = self._send_request(url,
|
|
156
|
+
res = self._send_request(url, method=HTTPMethod.PUT, data=data)
|
|
156
157
|
|
|
157
158
|
if res.status_code == codes.ok:
|
|
158
159
|
return True
|
|
@@ -199,7 +200,7 @@ class AccountClient(BaseClient):
|
|
|
199
200
|
for key in filters:
|
|
200
201
|
params[key] = filters[key]
|
|
201
202
|
|
|
202
|
-
res = self._send_request(url, params=params)
|
|
203
|
+
res = self._send_request(url, method=HTTPMethod.GET, params=params)
|
|
203
204
|
|
|
204
205
|
if res.status_code == codes.ok:
|
|
205
206
|
accounts = self._load_json_data(res)
|
|
@@ -263,7 +264,7 @@ class AccountClient(BaseClient):
|
|
|
263
264
|
|
|
264
265
|
url = build_url(choice(self.list_hosts), path=path)
|
|
265
266
|
|
|
266
|
-
res = self._send_request(url,
|
|
267
|
+
res = self._send_request(url, method=HTTPMethod.POST, data=data)
|
|
267
268
|
|
|
268
269
|
if res.status_code == codes.created:
|
|
269
270
|
return True
|
|
@@ -300,7 +301,7 @@ class AccountClient(BaseClient):
|
|
|
300
301
|
|
|
301
302
|
url = build_url(choice(self.list_hosts), path=path)
|
|
302
303
|
|
|
303
|
-
res = self._send_request(url,
|
|
304
|
+
res = self._send_request(url, method=HTTPMethod.DELETE, data=data)
|
|
304
305
|
|
|
305
306
|
if res.status_code == codes.ok:
|
|
306
307
|
return True
|
|
@@ -319,7 +320,7 @@ class AccountClient(BaseClient):
|
|
|
319
320
|
"""
|
|
320
321
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'identities'])
|
|
321
322
|
url = build_url(choice(self.list_hosts), path=path)
|
|
322
|
-
res = self._send_request(url)
|
|
323
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
323
324
|
if res.status_code == codes.ok:
|
|
324
325
|
identities = self._load_json_data(res)
|
|
325
326
|
return identities
|
|
@@ -340,7 +341,7 @@ class AccountClient(BaseClient):
|
|
|
340
341
|
|
|
341
342
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'rules'])
|
|
342
343
|
url = build_url(choice(self.list_hosts), path=path)
|
|
343
|
-
res = self._send_request(url,
|
|
344
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
344
345
|
if res.status_code == codes.ok:
|
|
345
346
|
return self._load_json_data(res)
|
|
346
347
|
else:
|
|
@@ -385,7 +386,7 @@ class AccountClient(BaseClient):
|
|
|
385
386
|
|
|
386
387
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'limits', 'global', quote_plus(rse_expression)])
|
|
387
388
|
url = build_url(choice(self.list_hosts), path=path)
|
|
388
|
-
res = self._send_request(url,
|
|
389
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
389
390
|
if res.status_code == codes.ok:
|
|
390
391
|
return next(self._load_json_data(res))
|
|
391
392
|
exc_cls, exc_msg = self._get_exception(headers=res.headers, status_code=res.status_code, data=res.content)
|
|
@@ -403,7 +404,7 @@ class AccountClient(BaseClient):
|
|
|
403
404
|
|
|
404
405
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'limits', 'global'])
|
|
405
406
|
url = build_url(choice(self.list_hosts), path=path)
|
|
406
|
-
res = self._send_request(url,
|
|
407
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
407
408
|
if res.status_code == codes.ok:
|
|
408
409
|
return next(self._load_json_data(res))
|
|
409
410
|
exc_cls, exc_msg = self._get_exception(headers=res.headers, status_code=res.status_code, data=res.content)
|
|
@@ -421,7 +422,7 @@ class AccountClient(BaseClient):
|
|
|
421
422
|
|
|
422
423
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'limits', 'local'])
|
|
423
424
|
url = build_url(choice(self.list_hosts), path=path)
|
|
424
|
-
res = self._send_request(url,
|
|
425
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
425
426
|
if res.status_code == codes.ok:
|
|
426
427
|
return next(self._load_json_data(res))
|
|
427
428
|
exc_cls, exc_msg = self._get_exception(headers=res.headers, status_code=res.status_code, data=res.content)
|
|
@@ -441,7 +442,7 @@ class AccountClient(BaseClient):
|
|
|
441
442
|
|
|
442
443
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'limits', 'local', rse])
|
|
443
444
|
url = build_url(choice(self.list_hosts), path=path)
|
|
444
|
-
res = self._send_request(url,
|
|
445
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
445
446
|
if res.status_code == codes.ok:
|
|
446
447
|
return next(self._load_json_data(res))
|
|
447
448
|
exc_cls, exc_msg = self._get_exception(headers=res.headers, status_code=res.status_code, data=res.content)
|
|
@@ -463,7 +464,7 @@ class AccountClient(BaseClient):
|
|
|
463
464
|
else:
|
|
464
465
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'usage', 'local'])
|
|
465
466
|
url = build_url(choice(self.list_hosts), path=path)
|
|
466
|
-
res = self._send_request(url,
|
|
467
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
467
468
|
if res.status_code == codes.ok:
|
|
468
469
|
return self._load_json_data(res)
|
|
469
470
|
else:
|
|
@@ -486,7 +487,7 @@ class AccountClient(BaseClient):
|
|
|
486
487
|
else:
|
|
487
488
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'usage', 'global'])
|
|
488
489
|
url = build_url(choice(self.list_hosts), path=path)
|
|
489
|
-
res = self._send_request(url,
|
|
490
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
490
491
|
if res.status_code == codes.ok:
|
|
491
492
|
return self._load_json_data(res)
|
|
492
493
|
else:
|
|
@@ -506,7 +507,7 @@ class AccountClient(BaseClient):
|
|
|
506
507
|
"""
|
|
507
508
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'usage/history', rse])
|
|
508
509
|
url = build_url(choice(self.list_hosts), path=path)
|
|
509
|
-
res = self._send_request(url,
|
|
510
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
510
511
|
if res.status_code == codes.ok:
|
|
511
512
|
return next(self._load_json_data(res))
|
|
512
513
|
else:
|
|
@@ -524,7 +525,7 @@ class AccountClient(BaseClient):
|
|
|
524
525
|
"""
|
|
525
526
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'attr/'])
|
|
526
527
|
url = build_url(choice(self.list_hosts), path=path)
|
|
527
|
-
res = self._send_request(url,
|
|
528
|
+
res = self._send_request(url, method=HTTPMethod.GET)
|
|
528
529
|
if res.status_code == codes.ok:
|
|
529
530
|
return self._load_json_data(res)
|
|
530
531
|
else:
|
|
@@ -548,7 +549,7 @@ class AccountClient(BaseClient):
|
|
|
548
549
|
data = dumps({'key': key, 'value': value})
|
|
549
550
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'attr', key])
|
|
550
551
|
url = build_url(choice(self.list_hosts), path=path)
|
|
551
|
-
res = self._send_request(url,
|
|
552
|
+
res = self._send_request(url, method=HTTPMethod.POST, data=data)
|
|
552
553
|
if res.status_code == codes.created:
|
|
553
554
|
return True
|
|
554
555
|
else:
|
|
@@ -569,7 +570,7 @@ class AccountClient(BaseClient):
|
|
|
569
570
|
|
|
570
571
|
path = '/'.join([self.ACCOUNTS_BASEURL, account, 'attr', key])
|
|
571
572
|
url = build_url(choice(self.list_hosts), path=path)
|
|
572
|
-
res = self._send_request(url,
|
|
573
|
+
res = self._send_request(url, method=HTTPMethod.DELETE, data=None)
|
|
573
574
|
if res.status_code == codes.ok:
|
|
574
575
|
return True
|
|
575
576
|
else:
|
|
@@ -19,6 +19,7 @@ from urllib.parse import quote_plus
|
|
|
19
19
|
from requests.status_codes import codes
|
|
20
20
|
|
|
21
21
|
from rucio.client.baseclient import BaseClient, choice
|
|
22
|
+
from rucio.common.constants import HTTPMethod
|
|
22
23
|
from rucio.common.utils import build_url
|
|
23
24
|
|
|
24
25
|
|
|
@@ -123,7 +124,7 @@ class AccountLimitClient(BaseClient):
|
|
|
123
124
|
path = '/'.join([self.ACCOUNTLIMIT_BASEURL, 'local', account, rse])
|
|
124
125
|
url = build_url(choice(self.list_hosts), path=path)
|
|
125
126
|
|
|
126
|
-
r = self._send_request(url,
|
|
127
|
+
r = self._send_request(url, method=HTTPMethod.POST, data=data)
|
|
127
128
|
|
|
128
129
|
if r.status_code == codes.created:
|
|
129
130
|
return True
|
|
@@ -160,7 +161,7 @@ class AccountLimitClient(BaseClient):
|
|
|
160
161
|
path = '/'.join([self.ACCOUNTLIMIT_BASEURL, 'local', account, rse])
|
|
161
162
|
url = build_url(choice(self.list_hosts), path=path)
|
|
162
163
|
|
|
163
|
-
r = self._send_request(url,
|
|
164
|
+
r = self._send_request(url, method=HTTPMethod.DELETE)
|
|
164
165
|
|
|
165
166
|
if r.status_code == codes.ok:
|
|
166
167
|
return True
|
|
@@ -196,7 +197,7 @@ class AccountLimitClient(BaseClient):
|
|
|
196
197
|
path = '/'.join([self.ACCOUNTLIMIT_BASEURL, 'global', account, quote_plus(rse_expression)])
|
|
197
198
|
url = build_url(choice(self.list_hosts), path=path)
|
|
198
199
|
|
|
199
|
-
r = self._send_request(url,
|
|
200
|
+
r = self._send_request(url, method=HTTPMethod.POST, data=data)
|
|
200
201
|
|
|
201
202
|
if r.status_code == codes.created:
|
|
202
203
|
return True
|
|
@@ -233,7 +234,7 @@ class AccountLimitClient(BaseClient):
|
|
|
233
234
|
path = '/'.join([self.ACCOUNTLIMIT_BASEURL, 'global', account, quote_plus(rse_expression)])
|
|
234
235
|
url = build_url(choice(self.list_hosts), path=path)
|
|
235
236
|
|
|
236
|
-
r = self._send_request(url,
|
|
237
|
+
r = self._send_request(url, method=HTTPMethod.DELETE)
|
|
237
238
|
|
|
238
239
|
if r.status_code == codes.ok:
|
|
239
240
|
return True
|