rucio-clients 38.0.0rc2__tar.gz → 38.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rucio-clients might be problematic. Click here for more details.
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/AUTHORS.rst +1 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/PKG-INFO +1 -1
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/bin/rucio +4 -1
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/account.py +1 -1
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/bin_legacy/rucio.py +2 -64
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/did.py +1 -4
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/exception.py +5 -5
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/schema/__init__.py +19 -35
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/utils.py +1 -1
- rucio_clients-38.1.0/lib/rucio/vcsversion.py +11 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/pyproject.toml +8 -2
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_bin_rucio.py +17 -1
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_cli_client_structure.py +5 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_conveyor.py +2 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_hermes.py +17 -27
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_reaper.py +1 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_transfer_plugins.py +2 -2
- rucio_clients-38.0.0rc2/lib/rucio/vcsversion.py +0 -11
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/ChangeLog +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/LICENSE +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/MANIFEST.in +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/README.md +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/bin/rucio-admin +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/etc/rse-accounts.cfg.template +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/etc/rucio.cfg.template +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/__init__.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/alembicrevision.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/__init__.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/bin_legacy/__init__.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/bin_legacy/rucio_admin.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/command.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/config.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/download.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/lifetime_exception.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/opendata.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/replica.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/rse.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/rule.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/scope.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/subscription.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/upload.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/cli/utils.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/__init__.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/accountclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/baseclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/client.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/configclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/credentialclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/didclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/diracclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/downloadclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/exportclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/importclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/lockclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/metaconventionsclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/opendataclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/pingclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/replicaclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/requestclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/richclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/rseclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/ruleclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/scopeclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/subscriptionclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/touchclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/client/uploadclient.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/__init__.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/bittorrent.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/cache.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/checksum.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/client.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/config.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/constants.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/constraints.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/didtype.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/extra.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/logging.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/pcache.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/plugins.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/policy.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/schema/generic.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/stomp_utils.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/stopwatch.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/common/types.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/__init__.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/bittorrent.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/gfal.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/webdav.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/protocols/xrootd.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/rse/translation.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio/version.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/lib/rucio_clients.egg-info/SOURCES.txt +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/requirements/requirements.client.txt +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/setup.cfg +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/setup.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/setuputil.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_abacus_account.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_abacus_collection_replica.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_abacus_rse.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_account.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_account_limits.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_archive.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_auditor.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_auditor_hdfs.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_auditor_srmdumps.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_authentication.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_automatix.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_bad_replica.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_bb8.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_belleii.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_boolean.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_clients.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_config.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_conveyor_submitter.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_counter.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_credential.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_curl.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_daemons.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_dataset_replicas.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_db.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_did.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_did_meta_plugins.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_download.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_dumper.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_filter_engine.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_gateway_external_representation.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_heartbeat.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_identity.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_impl_upload_download.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_import_export.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_judge_cleaner.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_judge_evaluator.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_judge_injector.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_judge_repairer.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_lifetime.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_message.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_meta_conventions.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_meta_did.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_module_import.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_monitor.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_multi_vo.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_naming_convention.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_oauthmanager.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_oidc.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_opendata.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_permission.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_pfns.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_ping.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_policy_package.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_preparer.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_qos.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_quarantined_replica.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_redirect.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_replica.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_replica_recoverer.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_replica_sorting.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_request.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_root_proxy.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_expression_parser.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_lfn2path.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_protocol_posix.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_protocol_srm.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rse_selector.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rucio_server.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_rule.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_scope.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_subscription.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_throttler.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_tpc.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_trace.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_transfer.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_undertaker.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_upload.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tests/test_utils.py +0 -0
- {rucio_clients-38.0.0rc2 → rucio_clients-38.1.0}/tools/merge_rucio_configs.py +0 -0
|
@@ -69,6 +69,7 @@ Individual contributors to the source code
|
|
|
69
69
|
- Maximilian Linhoff, <maximilian.linhoff@tu-dortmund.de>, 2024
|
|
70
70
|
- Eric Banzuzi, <eric.banzuzi@gmail.com>, 2024
|
|
71
71
|
- Paul Millar, <paul.millar@desy.de>, 2025
|
|
72
|
+
- Vimalan S <vimalan.github@gmail.com>, 2025
|
|
72
73
|
|
|
73
74
|
Organisations employing contributors
|
|
74
75
|
------------------------------------
|
|
@@ -17,6 +17,7 @@ import argparse
|
|
|
17
17
|
import sys
|
|
18
18
|
from typing import TYPE_CHECKING, Optional
|
|
19
19
|
|
|
20
|
+
from rucio.cli.bin_legacy.rucio import get_parser
|
|
20
21
|
from rucio.cli.bin_legacy.rucio import main as main_legacy
|
|
21
22
|
from rucio.cli.command import main
|
|
22
23
|
from rucio.common.utils import setup_logger
|
|
@@ -119,9 +120,11 @@ if __name__ == "__main__":
|
|
|
119
120
|
main() # pylint: disable=E1120
|
|
120
121
|
|
|
121
122
|
else:
|
|
122
|
-
make_warning(logger)
|
|
123
123
|
try:
|
|
124
|
+
get_parser().parse_args()
|
|
125
|
+
make_warning(logger)
|
|
124
126
|
main_legacy()
|
|
127
|
+
|
|
125
128
|
# Make a custom warning - show the new help menu when invalid commands are called.
|
|
126
129
|
except argparse.ArgumentError:
|
|
127
130
|
logger.error("Invalid argument(s) - %s " % sys.argv[1:])
|
|
@@ -212,5 +212,5 @@ def identity_add(ctx, account_name, type_, id, email, password):
|
|
|
212
212
|
@click.pass_context
|
|
213
213
|
def identity_remove(ctx, account_name, type_, id):
|
|
214
214
|
"""Revoke a given ID's access from an account"""
|
|
215
|
-
args = Arguments({"no_pager": ctx.obj.no_pager, "account": account_name, "authtype": type_, "
|
|
215
|
+
args = Arguments({"no_pager": ctx.obj.no_pager, "account": account_name, "authtype": type_, "identity": id})
|
|
216
216
|
identity_delete(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
@@ -32,7 +32,6 @@ from rich.status import Status
|
|
|
32
32
|
from rich.text import Text
|
|
33
33
|
from rich.theme import Theme
|
|
34
34
|
from rich.traceback import install
|
|
35
|
-
from rich.tree import Tree
|
|
36
35
|
from tabulate import tabulate
|
|
37
36
|
|
|
38
37
|
# rucio module has the same name as this executable module, so this rule fails. pylint: disable=no-name-in-module
|
|
@@ -716,64 +715,7 @@ def list_parent_dids(args, client, logger, console, spinner):
|
|
|
716
715
|
spinner.update(status='Fetching parent DIDs')
|
|
717
716
|
spinner.start()
|
|
718
717
|
|
|
719
|
-
if args.
|
|
720
|
-
dict_datasets = {}
|
|
721
|
-
output = []
|
|
722
|
-
for res in client.get_did_from_pfns(args.pfns):
|
|
723
|
-
for key in res:
|
|
724
|
-
if key not in dict_datasets:
|
|
725
|
-
dict_datasets[key] = []
|
|
726
|
-
for rule in client.list_associated_rules_for_file(res[key]['scope'], res[key]['name']):
|
|
727
|
-
if f"{rule['scope']}:{rule['name']}" not in dict_datasets[key]:
|
|
728
|
-
dict_datasets[key].append(f"{rule['scope']}:{rule['name']}")
|
|
729
|
-
|
|
730
|
-
for i, pfn in enumerate(dict_datasets):
|
|
731
|
-
if cli_config == 'rich':
|
|
732
|
-
parent_tree = Tree('')
|
|
733
|
-
for parent in dict_datasets[pfn]:
|
|
734
|
-
parent_tree.add(parent)
|
|
735
|
-
table = generate_table([['PFN', pfn], ['Parents', parent_tree]], col_alignments=['left', 'left'], row_styles=['none'])
|
|
736
|
-
output.append(table)
|
|
737
|
-
else:
|
|
738
|
-
print('PFN: ', pfn)
|
|
739
|
-
print('Parents: ', ','.join(dict_datasets[pfn]))
|
|
740
|
-
|
|
741
|
-
if cli_config == 'rich':
|
|
742
|
-
spinner.stop()
|
|
743
|
-
print_output(*output, console=console, no_pager=args.no_pager)
|
|
744
|
-
elif args.guids:
|
|
745
|
-
output = []
|
|
746
|
-
guids = []
|
|
747
|
-
for input_ in args.guids:
|
|
748
|
-
try:
|
|
749
|
-
uuid.UUID(input_)
|
|
750
|
-
except ValueError:
|
|
751
|
-
print(f'Ignoring invalid GUID: {input_}')
|
|
752
|
-
continue
|
|
753
|
-
dict_datasets = {}
|
|
754
|
-
for guid in guids:
|
|
755
|
-
for did in client.get_dataset_by_guid(guid):
|
|
756
|
-
if guid not in dict_datasets:
|
|
757
|
-
dict_datasets[guid] = []
|
|
758
|
-
for rule in client.list_associated_rules_for_file(did['scope'], did['name']):
|
|
759
|
-
if f"{rule['scope']}:{rule['name']}" not in dict_datasets[guid]:
|
|
760
|
-
dict_datasets[guid].append(f"{rule['scope']}:{rule['name']}")
|
|
761
|
-
|
|
762
|
-
for i, guid in enumerate(dict_datasets):
|
|
763
|
-
if cli_config == 'rich':
|
|
764
|
-
parent_tree = Tree('')
|
|
765
|
-
for parent in dict_datasets[guid]:
|
|
766
|
-
parent_tree.add(parent)
|
|
767
|
-
table = generate_table([['GUID', guid], ['Parents', parent_tree]], col_alignments=['left', 'left'], row_styles=['none'])
|
|
768
|
-
output.append(table)
|
|
769
|
-
else:
|
|
770
|
-
print('GUID: ', guid)
|
|
771
|
-
print('Parents : ', ','.join(dict_datasets[guid]))
|
|
772
|
-
|
|
773
|
-
if cli_config == 'rich':
|
|
774
|
-
spinner.stop()
|
|
775
|
-
print_output(*output, console=console, no_pager=args.no_pager)
|
|
776
|
-
elif args.did:
|
|
718
|
+
if args.did:
|
|
777
719
|
table_data = []
|
|
778
720
|
scope, name = get_scope(args.did, client)
|
|
779
721
|
for dataset in client.list_parent_dids(scope=scope, name=name):
|
|
@@ -789,7 +731,7 @@ def list_parent_dids(args, client, logger, console, spinner):
|
|
|
789
731
|
else:
|
|
790
732
|
print(tabulate(table_data, tablefmt=tablefmt, headers=['SCOPE:NAME', '[DID TYPE]']))
|
|
791
733
|
else:
|
|
792
|
-
raise InputValidationError('
|
|
734
|
+
raise InputValidationError('A DID must be provided. Use -h to list the options.')
|
|
793
735
|
return SUCCESS
|
|
794
736
|
|
|
795
737
|
|
|
@@ -2403,8 +2345,6 @@ You can filter by key/value, e.g.::
|
|
|
2403
2345
|
''')
|
|
2404
2346
|
list_parent_parser.set_defaults(function=list_parent_dids)
|
|
2405
2347
|
list_parent_parser.add_argument(dest='did', action='store', nargs='?', default=None, help='Data identifier.')
|
|
2406
|
-
list_parent_parser.add_argument('--pfn', dest='pfns', action='store', nargs='+', help='List parent dids for these pfns.')
|
|
2407
|
-
list_parent_parser.add_argument('--guid', dest='guids', action='store', nargs='+', help='List parent dids for these guids.')
|
|
2408
2348
|
|
|
2409
2349
|
# argparse 2.7 does not allow aliases for commands, thus the list-parent-datasets is a copy&paste from list-parent-dids
|
|
2410
2350
|
list_parent_datasets_parser = subparsers.add_parser('list-parent-datasets', help='List parent DIDs for a given DID', description='List all parents Data IDentifier that contains the target Data IDentifier.',
|
|
@@ -2423,8 +2363,6 @@ You can filter by key/value, e.g.::
|
|
|
2423
2363
|
|
|
2424
2364
|
list_parent_datasets_parser.set_defaults(function=list_parent_dids)
|
|
2425
2365
|
list_parent_datasets_parser.add_argument(dest='did', action='store', nargs='?', default=None, help='Data identifier.')
|
|
2426
|
-
list_parent_datasets_parser.add_argument('--pfn', dest='pfns', action='store', nargs='+', help='List parent dids for these pfns.')
|
|
2427
|
-
list_parent_datasets_parser.add_argument('--guid', dest='guids', action='store', nargs='+', help='List parent dids for these guids.')
|
|
2428
2366
|
|
|
2429
2367
|
# The list-scopes command
|
|
2430
2368
|
scope_list_parser = subparsers.add_parser('list-scopes', help='List all available scopes.',
|
|
@@ -37,11 +37,8 @@ def did():
|
|
|
37
37
|
@click.option("--short", is_flag=True, default=False, help="Dump the list of DIDs")
|
|
38
38
|
@click.argument("did-pattern", nargs=-1)
|
|
39
39
|
@click.option("--parent", default=False, is_flag=True, help="List the parents of the DID - must use a full DID scope and name")
|
|
40
|
-
# TODO Implement or remove option - view https://github.com/rucio/rucio/issues/7230
|
|
41
|
-
@click.option("--pfn", hidden=True)
|
|
42
|
-
@click.option("--guid", hidden=True)
|
|
43
40
|
@click.pass_context
|
|
44
|
-
def list_(ctx, did_pattern, recursive, filter_, short, parent
|
|
41
|
+
def list_(ctx, did_pattern, recursive, filter_, short, parent):
|
|
45
42
|
"""
|
|
46
43
|
List the Data IDentifiers matching certain pattern.
|
|
47
44
|
Only the collections (i.e. dataset or container) are returned by default.
|
|
@@ -1215,7 +1215,7 @@ class OpenDataError(RucioException):
|
|
|
1215
1215
|
|
|
1216
1216
|
def __init__(self, *args):
|
|
1217
1217
|
super(OpenDataError, self).__init__(*args)
|
|
1218
|
-
self._message =
|
|
1218
|
+
self._message = "Error related to open data."
|
|
1219
1219
|
self.error_code = 115
|
|
1220
1220
|
|
|
1221
1221
|
|
|
@@ -1226,7 +1226,7 @@ class OpenDataDataIdentifierNotFound(OpenDataError):
|
|
|
1226
1226
|
|
|
1227
1227
|
def __init__(self, *args):
|
|
1228
1228
|
super(OpenDataDataIdentifierNotFound, self).__init__(*args)
|
|
1229
|
-
self._message =
|
|
1229
|
+
self._message = "Data identifier not found in the open data catalog."
|
|
1230
1230
|
self.error_code = 116
|
|
1231
1231
|
|
|
1232
1232
|
|
|
@@ -1237,7 +1237,7 @@ class OpenDataDataIdentifierAlreadyExists(OpenDataError):
|
|
|
1237
1237
|
|
|
1238
1238
|
def __init__(self, *args):
|
|
1239
1239
|
super(OpenDataDataIdentifierAlreadyExists, self).__init__(*args)
|
|
1240
|
-
self._message =
|
|
1240
|
+
self._message = "Data identifier already exists in the open data catalog."
|
|
1241
1241
|
self.error_code = 117
|
|
1242
1242
|
|
|
1243
1243
|
|
|
@@ -1248,7 +1248,7 @@ class OpenDataInvalidState(OpenDataError):
|
|
|
1248
1248
|
|
|
1249
1249
|
def __init__(self, *args):
|
|
1250
1250
|
super(OpenDataInvalidState, self).__init__(*args)
|
|
1251
|
-
self._message =
|
|
1251
|
+
self._message = "Open data entry is in an invalid state."
|
|
1252
1252
|
self.error_code = 118
|
|
1253
1253
|
|
|
1254
1254
|
|
|
@@ -1259,5 +1259,5 @@ class OpenDataInvalidStateUpdate(OpenDataError):
|
|
|
1259
1259
|
|
|
1260
1260
|
def __init__(self, *args):
|
|
1261
1261
|
super(OpenDataInvalidStateUpdate, self).__init__(*args)
|
|
1262
|
-
self._message =
|
|
1262
|
+
self._message = "Invalid state update attempted on open data entry."
|
|
1263
1263
|
self.error_code = 119
|
|
@@ -59,23 +59,15 @@ def _get_generic_schema_module():
|
|
|
59
59
|
if not _is_multivo():
|
|
60
60
|
GENERIC_FALLBACK = 'generic'
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
72
|
-
# fall back to old system for now
|
|
73
|
-
try:
|
|
74
|
-
policy = config.config_get('policy', 'schema', check_config_table=False)
|
|
75
|
-
except (NoOptionError, NoSectionError):
|
|
76
|
-
policy = GENERIC_FALLBACK
|
|
77
|
-
policy = 'rucio.common.schema.' + policy.lower()
|
|
78
|
-
else:
|
|
62
|
+
try:
|
|
63
|
+
if 'RUCIO_POLICY_PACKAGE' in environ:
|
|
64
|
+
policy = environ['RUCIO_POLICY_PACKAGE']
|
|
65
|
+
else:
|
|
66
|
+
policy = config.config_get('policy', 'package', check_config_table=False, raise_exception=True)
|
|
67
|
+
package_module = importlib.import_module(policy)
|
|
68
|
+
check_policy_module_version(package_module)
|
|
69
|
+
policy = policy + ".schema"
|
|
70
|
+
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
79
71
|
policy = 'rucio.common.schema.' + GENERIC_FALLBACK.lower()
|
|
80
72
|
|
|
81
73
|
try:
|
|
@@ -102,24 +94,16 @@ if not _is_multivo():
|
|
|
102
94
|
|
|
103
95
|
def load_schema_for_vo(vo: str) -> None:
|
|
104
96
|
generic_fallback = 'generic_multi_vo'
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
116
|
-
# fall back to old system for now
|
|
117
|
-
try:
|
|
118
|
-
policy = config.config_get('policy', 'schema', check_config_table=False)
|
|
119
|
-
except (NoOptionError, NoSectionError):
|
|
120
|
-
policy = generic_fallback
|
|
121
|
-
policy = 'rucio.common.schema.' + policy.lower()
|
|
122
|
-
else:
|
|
97
|
+
try:
|
|
98
|
+
env_name = 'RUCIO_POLICY_PACKAGE_' + vo.upper()
|
|
99
|
+
if env_name in environ:
|
|
100
|
+
policy = environ[env_name]
|
|
101
|
+
else:
|
|
102
|
+
policy = config.config_get('policy', 'package-' + vo, check_config_table=False, raise_exception=True)
|
|
103
|
+
package_module = importlib.import_module(policy)
|
|
104
|
+
check_policy_module_version(package_module)
|
|
105
|
+
policy = policy + ".schema"
|
|
106
|
+
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
123
107
|
policy = 'rucio.common.schema.' + generic_fallback.lower()
|
|
124
108
|
|
|
125
109
|
try:
|
|
@@ -399,7 +399,7 @@ class NonDeterministicPFNAlgorithms(PolicyPackageAlgorithms):
|
|
|
399
399
|
Initialises a non-deterministic PFN construction object
|
|
400
400
|
"""
|
|
401
401
|
super().__init__()
|
|
402
|
-
|
|
402
|
+
|
|
403
403
|
self.vo = vo
|
|
404
404
|
|
|
405
405
|
def construct_non_deterministic_pfn(self, dsn: str, scope: Optional[str], filename: str, naming_convention: str) -> str:
|
|
@@ -89,7 +89,7 @@ def test_whoami():
|
|
|
89
89
|
assert "ERROR" not in err
|
|
90
90
|
|
|
91
91
|
|
|
92
|
-
def test_identity(random_account):
|
|
92
|
+
def test_identity(random_account, rucio_client):
|
|
93
93
|
"""CLIENT(ADMIN): Add/list/delete identity"""
|
|
94
94
|
|
|
95
95
|
cmd = f'rucio-admin identity add --account {random_account} --type GSS --id jdoe@CERN.CH --email jdoe@CERN.CH'
|
|
@@ -109,6 +109,22 @@ def test_identity(random_account):
|
|
|
109
109
|
exitcode, out, _ = execute(cmd)
|
|
110
110
|
assert 'jdoe@CERN.CH' not in out
|
|
111
111
|
|
|
112
|
+
# testing OIDC IDs
|
|
113
|
+
|
|
114
|
+
id = "CN=Joe Doe,CN=707658,CN=jdoe,OU=Users,OU=Organic Units,DC=cern,DC=ch"
|
|
115
|
+
cmd = f'rucio account identity add {random_account} --type OIDC --id "{id}" --email jdoe@CERN.CH'
|
|
116
|
+
exitcode, out, _ = execute(cmd)
|
|
117
|
+
assert exitcode == 0
|
|
118
|
+
assert f'Added new identity to account: {id}-{random_account}\n' in out
|
|
119
|
+
|
|
120
|
+
cmd = f'rucio -v account identity remove {random_account} --type OIDC --id "{id}"'
|
|
121
|
+
exitcode, _, err = execute(cmd)
|
|
122
|
+
assert exitcode == 0
|
|
123
|
+
assert "ERROR" not in err
|
|
124
|
+
|
|
125
|
+
ids = [i['type'] for i in rucio_client.list_identities(account=random_account.external)]
|
|
126
|
+
assert 'OIDC' not in ids
|
|
127
|
+
|
|
112
128
|
|
|
113
129
|
def test_attributes(random_account):
|
|
114
130
|
"""CLIENT(ADMIN): Add/List/Delete attributes"""
|
|
@@ -43,6 +43,11 @@ def test_main_args():
|
|
|
43
43
|
assert "This method is being deprecated" in err
|
|
44
44
|
assert "root" in out
|
|
45
45
|
|
|
46
|
+
# Ensure non-exist commands don't throw the deprecation error
|
|
47
|
+
non_existent_cmd = "rucio lfkdl --slkfdj 1"
|
|
48
|
+
_, _, err = execute(non_existent_cmd)
|
|
49
|
+
assert "This method is being deprecated" not in err
|
|
50
|
+
|
|
46
51
|
|
|
47
52
|
def test_help_menus():
|
|
48
53
|
"""Verify help menus"""
|
|
@@ -1617,6 +1617,7 @@ def test_checksum_validation(rse_factory, did_factory, root_account):
|
|
|
1617
1617
|
|
|
1618
1618
|
@pytest.mark.skip(reason="Pending https://cern.service-now.com/service-portal?id=ticket&table=incident&n=INC4506150")
|
|
1619
1619
|
@skip_rse_tests_with_accounts
|
|
1620
|
+
@pytest.mark.needs_iam
|
|
1620
1621
|
@pytest.mark.noparallel(groups=[NoParallelGroups.XRD, NoParallelGroups.SUBMITTER, NoParallelGroups.RECEIVER])
|
|
1621
1622
|
@pytest.mark.parametrize("file_config_mock", [
|
|
1622
1623
|
{"overrides": [('oidc', 'admin_issuer', 'indigoiam')]},
|
|
@@ -1760,6 +1761,7 @@ def test_transfer_plugins(rse_factory, did_factory, root_account, file_config_mo
|
|
|
1760
1761
|
|
|
1761
1762
|
@skip_rse_tests_with_accounts
|
|
1762
1763
|
@pytest.mark.noparallel(groups=[NoParallelGroups.XRD, NoParallelGroups.SUBMITTER, NoParallelGroups.POLLER, NoParallelGroups.FINISHER])
|
|
1764
|
+
@pytest.mark.needs_iam
|
|
1763
1765
|
@pytest.mark.parametrize("file_config_mock", [{
|
|
1764
1766
|
"overrides": [('client', 'register_bittorrent_meta', 'true')]
|
|
1765
1767
|
}], indirect=True)
|
|
@@ -59,16 +59,8 @@ class MyListener:
|
|
|
59
59
|
{
|
|
60
60
|
"table_content": [
|
|
61
61
|
("hermes", "services_list", "influx,activemq,elastic,email"),
|
|
62
|
-
(
|
|
63
|
-
|
|
64
|
-
"elastic_endpoint",
|
|
65
|
-
"http://localhost:9200/ddm_events/doc/_bulk",
|
|
66
|
-
),
|
|
67
|
-
(
|
|
68
|
-
"hermes",
|
|
69
|
-
"influxdb_endpoint",
|
|
70
|
-
"http://localhost:8086/api/v2/write?org=rucio&bucket=rucio",
|
|
71
|
-
),
|
|
62
|
+
("hermes", "elastic_endpoint", "http://elasticsearch:9200/ddm_events/doc/_bulk"),
|
|
63
|
+
("hermes", "influxdb_endpoint", "http://influxdb:8086/api/v2/write?org=rucio&bucket=rucio"),
|
|
72
64
|
("hermes", "influxdb_token", "mytoken"),
|
|
73
65
|
("messaging-hermes", "destination", "/queue/events"),
|
|
74
66
|
("messaging-hermes", "brokers", "localhost"),
|
|
@@ -76,22 +68,16 @@ class MyListener:
|
|
|
76
68
|
("messaging-hermes", "username", "hermes"),
|
|
77
69
|
("messaging-hermes", "password", "supersecret"),
|
|
78
70
|
("messaging-hermes", "nonssl_port", 61613),
|
|
79
|
-
("messaging-hermes", "send_email",
|
|
71
|
+
("messaging-hermes", "send_email", True),
|
|
72
|
+
("messaging-hermes", "smtp_host", "testing.host"),
|
|
73
|
+
("messaging-hermes", "smtp_port", 1234),
|
|
80
74
|
]
|
|
81
75
|
},
|
|
82
76
|
{
|
|
83
77
|
"table_content": [
|
|
84
78
|
("hermes", "services_list", "influx,activemq,elastic,email"),
|
|
85
|
-
(
|
|
86
|
-
|
|
87
|
-
"elastic_endpoint",
|
|
88
|
-
"http://localhost:9200/ddm_events/doc/_bulk",
|
|
89
|
-
),
|
|
90
|
-
(
|
|
91
|
-
"hermes",
|
|
92
|
-
"influxdb_endpoint",
|
|
93
|
-
"http://localhost:8086/api/v2/write?org=rucio&bucket=rucio",
|
|
94
|
-
),
|
|
79
|
+
("hermes", "elastic_endpoint", "http://elasticsearch:9200/ddm_events/doc/_bulk"),
|
|
80
|
+
("hermes", "influxdb_endpoint", "http://influxdb:8086/api/v2/write?org=rucio&bucket=rucio"),
|
|
95
81
|
("hermes", "influxdb_token", "mytoken"),
|
|
96
82
|
("messaging-hermes", "destination", "/queue/events"),
|
|
97
83
|
("messaging-hermes", "brokers", "localhost"),
|
|
@@ -99,9 +85,9 @@ class MyListener:
|
|
|
99
85
|
("messaging-hermes", "username", "hermes"),
|
|
100
86
|
("messaging-hermes", "password", "supersecret"),
|
|
101
87
|
("messaging-hermes", "nonssl_port", 61613),
|
|
102
|
-
("messaging-hermes", "send_email",
|
|
103
|
-
("messaging-hermes", "
|
|
104
|
-
("messaging-hermes", "
|
|
88
|
+
("messaging-hermes", "send_email", True),
|
|
89
|
+
("messaging-hermes", "smtp_host", "testing.host"),
|
|
90
|
+
("messaging-hermes", "smtp_port", 1234),
|
|
105
91
|
]
|
|
106
92
|
}
|
|
107
93
|
],
|
|
@@ -205,7 +191,11 @@ def test_hermes(core_config_mock, caches_mock, monkeypatch):
|
|
|
205
191
|
smtp_mock = MagicMock()
|
|
206
192
|
m.setattr(hermes.smtplib, "SMTP", smtp_mock)
|
|
207
193
|
hermes.hermes(once=True)
|
|
208
|
-
|
|
194
|
+
smtp_host = config_get("messaging-hermes", "smtp_host", default='', raise_exception=False)
|
|
195
|
+
if not smtp_host:
|
|
196
|
+
smtp_mock.assert_called_with()
|
|
197
|
+
else:
|
|
198
|
+
smtp_mock.assert_called_with(host="testing.host", port=1234)
|
|
209
199
|
service_dict = {"influx": 0, "elastic": 0, "email": 0, "activemq": 0}
|
|
210
200
|
messages = retrieve_messages(50, old_mode=False)
|
|
211
201
|
for message in messages:
|
|
@@ -247,7 +237,7 @@ def test_hermes(core_config_mock, caches_mock, monkeypatch):
|
|
|
247
237
|
# Checking influxDB
|
|
248
238
|
assert service_dict["influx"] == 0
|
|
249
239
|
res = requests.get(
|
|
250
|
-
"http://
|
|
240
|
+
"http://influxdb:8086/query?db=rucio",
|
|
251
241
|
headers={"Authorization": "Token mytoken"},
|
|
252
242
|
params={"q": "SELECT * FROM deletion"},
|
|
253
243
|
)
|
|
@@ -273,7 +263,7 @@ def test_hermes(core_config_mock, caches_mock, monkeypatch):
|
|
|
273
263
|
data = ' { "query": { "match_all": {} } }'
|
|
274
264
|
headers = {"Content-Type": "application/json"}
|
|
275
265
|
response = requests.post(
|
|
276
|
-
"http://
|
|
266
|
+
"http://elasticsearch:9200/_search?size=1000", data=data, headers=headers
|
|
277
267
|
)
|
|
278
268
|
assert response.status_code == 200
|
|
279
269
|
res = response.json()
|
|
@@ -498,6 +498,7 @@ def test_reaper_without_rse_usage(vo, caches_mock):
|
|
|
498
498
|
|
|
499
499
|
@skip_rse_tests_with_accounts
|
|
500
500
|
@pytest.mark.dirty(reason="leaves files in XRD containers")
|
|
501
|
+
@pytest.mark.needs_iam
|
|
501
502
|
@pytest.mark.noparallel(groups=[NoParallelGroups.WEB])
|
|
502
503
|
@pytest.mark.parametrize("caches_mock", [{"caches_to_mock": [
|
|
503
504
|
'rucio.daemons.reaper.reaper.REGION'
|
|
@@ -157,7 +157,7 @@ def test_activity_missing(file_config_mock, did_factory, rse_factory, root_accou
|
|
|
157
157
|
|
|
158
158
|
|
|
159
159
|
class TestCollocationHints:
|
|
160
|
-
class
|
|
160
|
+
class MockCollocationPlugin(FTS3TapeMetadataPlugin):
|
|
161
161
|
def __init__(self) -> None:
|
|
162
162
|
self.register(
|
|
163
163
|
'test',
|
|
@@ -167,7 +167,7 @@ class TestCollocationHints:
|
|
|
167
167
|
def _test_collocation(self, hints: dict[str, str]) -> dict[str, dict]:
|
|
168
168
|
return {"collocation_hints": {"0": "", "1": "", "2": "", "3": ""}}
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
MockCollocationPlugin()
|
|
171
171
|
|
|
172
172
|
@pytest.mark.parametrize("file_config_mock", [
|
|
173
173
|
{
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|