rucio-clients 33.2.1__tar.gz → 33.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-clients might be problematic. Click here for more details.
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/PKG-INFO +1 -1
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/diracclient.py +3 -2
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/subscriptionclient.py +4 -3
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/xrootd.py +17 -10
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/vcsversion.py +3 -3
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_belleii.py +33 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_conveyor.py +50 -4
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_import_export.py +0 -7
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_reaper.py +20 -1
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_tpc.py +1 -1
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_transfer.py +10 -10
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/AUTHORS.rst +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/ChangeLog +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/LICENSE +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/MANIFEST.in +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/README.rst +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/bin/rucio +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/bin/rucio-admin +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/etc/rse-accounts.cfg.template +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/etc/rucio.cfg.template +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/__init__.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/alembicrevision.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/__init__.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/accountclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/baseclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/client.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/configclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/credentialclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/didclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/downloadclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/exportclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/fileclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/importclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/lockclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/metaclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/pingclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/replicaclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/requestclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/rseclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/ruleclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/scopeclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/touchclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/uploadclient.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/__init__.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/cache.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/config.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/constants.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/constraints.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/didtype.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/exception.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/extra.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/logging.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/pcache.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/policy.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/__init__.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/atlas.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/belleii.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/cms.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/domatpc.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/escape.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/generic.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/icecube.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/lsst.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/stomp_utils.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/stopwatch.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/types.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/utils.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/__init__.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/gfal.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/gsiftp.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/webdav.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/version.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio_clients.egg-info/SOURCES.txt +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/pylintrc +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/pyproject.toml +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/requirements.txt +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/setup.cfg +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/setup.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/setuputil.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_abacus_account.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_abacus_collection_replica.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_abacus_rse.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_account.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_account_limits.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_api_external_representation.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_archive.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_auditor.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_auditor_hdfs.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_auditor_srmdumps.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_authentication.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_automatix.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_bad_replica.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_bb8.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_bin_rucio.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_boolean.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_clients.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_common_types.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_config.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_conveyor_submitter.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_counter.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_credential.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_curl.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_daemons.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_dataset_replicas.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_db.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_did.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_did_meta_plugins.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_didtype.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_download.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_dumper.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_dumper_consistency.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_dumper_data_model.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_dumper_path_parsing.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_filter_engine.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_heartbeat.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_hermes.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_identity.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_impl_upload_download.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_judge_cleaner.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_judge_evaluator.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_judge_injector.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_judge_repairer.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_lifetime.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_message.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_meta.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_meta_did.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_module_import.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_monitor.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_multi_vo.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_naming_convention.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_oauthmanager.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_oidc.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_permission.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_pfns.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_ping.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_preparer.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_qos.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_quarantined_replica.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_redirect.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_replica.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_replica_recoverer.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_replica_sorting.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_request.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_root_proxy.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_expression_parser.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_lfn2path.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_posix.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_srm.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_selector.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rucio_server.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rule.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_schema_cms.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_scope.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_subscription.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_throttler.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_trace.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_undertaker.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_upload.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_utils.py +0 -0
- {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tools/merge_rucio_configs.py +0 -0
|
@@ -28,7 +28,7 @@ class DiracClient(BaseClient):
|
|
|
28
28
|
|
|
29
29
|
DIRAC_BASEURL = 'dirac'
|
|
30
30
|
|
|
31
|
-
def add_files(self, lfns, ignore_availability=False):
|
|
31
|
+
def add_files(self, lfns, ignore_availability=False, parents_metadata=None):
|
|
32
32
|
"""
|
|
33
33
|
Bulk add files :
|
|
34
34
|
- Create the file and replica.
|
|
@@ -37,10 +37,11 @@ class DiracClient(BaseClient):
|
|
|
37
37
|
|
|
38
38
|
:param lfns: List of lfn (dictionary {'lfn': <lfn>, 'rse': <rse>, 'bytes': <bytes>, 'adler32': <adler32>, 'guid': <guid>, 'pfn': <pfn>}
|
|
39
39
|
:param ignore_availability: A boolean to ignore blocked sites.
|
|
40
|
+
:param parents_metadata: Metadata for selected hierarchy DIDs. (dictionary {'lpn': {key : value}}). Default=None
|
|
40
41
|
"""
|
|
41
42
|
path = '/'.join([self.DIRAC_BASEURL, 'addfiles'])
|
|
42
43
|
url = build_url(choice(self.list_hosts), path=path)
|
|
43
|
-
r = self._send_request(url, type_='POST', data=dumps({'lfns': lfns, 'ignore_availability': ignore_availability}))
|
|
44
|
+
r = self._send_request(url, type_='POST', data=dumps({'lfns': lfns, 'ignore_availability': ignore_availability, 'parents_metadata': parents_metadata}))
|
|
44
45
|
if r.status_code == codes.created:
|
|
45
46
|
return True
|
|
46
47
|
else:
|
|
@@ -95,9 +95,10 @@ class SubscriptionClient(BaseClient):
|
|
|
95
95
|
result = self._send_request(url, type_='GET')
|
|
96
96
|
if result.status_code == codes.ok: # pylint: disable=no-member
|
|
97
97
|
return self._load_json_data(result)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
if result.status_code == codes.not_found:
|
|
99
|
+
return []
|
|
100
|
+
exc_cls, exc_msg = self._get_exception(headers=result.headers, status_code=result.status_code, data=result.content)
|
|
101
|
+
raise exc_cls(exc_msg)
|
|
101
102
|
|
|
102
103
|
def update_subscription(self, name, account=None, filter_=None, replication_rules=None, comments=None, lifetime=None, retroactive=None, dry_run=None, priority=None):
|
|
103
104
|
"""
|
|
@@ -24,6 +24,13 @@ from rucio.rse.protocols import protocol
|
|
|
24
24
|
class Default(protocol.RSEProtocol):
|
|
25
25
|
""" Implementing access to RSEs using the XRootD protocol using GSI authentication."""
|
|
26
26
|
|
|
27
|
+
@property
|
|
28
|
+
def _auth_env(self):
|
|
29
|
+
if self.auth_token:
|
|
30
|
+
return f"XrdSecPROTOCOL=ztn BEARER_TOKEN='{self.auth_token}'"
|
|
31
|
+
else:
|
|
32
|
+
return 'XrdSecPROTOCOL=gsi'
|
|
33
|
+
|
|
27
34
|
def __init__(self, protocol_attr, rse_settings, logger=logging.log):
|
|
28
35
|
""" Initializes the object with information about the referred RSE.
|
|
29
36
|
|
|
@@ -66,7 +73,7 @@ class Default(protocol.RSEProtocol):
|
|
|
66
73
|
self.logger(logging.DEBUG, 'xrootd.exists: pfn: {}'.format(pfn))
|
|
67
74
|
try:
|
|
68
75
|
path = self.pfn2path(pfn)
|
|
69
|
-
cmd = '
|
|
76
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} stat {path}'
|
|
70
77
|
self.logger(logging.DEBUG, 'xrootd.exists: cmd: {}'.format(cmd))
|
|
71
78
|
status, out, err = execute(cmd)
|
|
72
79
|
if status != 0:
|
|
@@ -86,7 +93,7 @@ class Default(protocol.RSEProtocol):
|
|
|
86
93
|
|
|
87
94
|
:returns: a dict with two keys, filesize and an element of GLOBALLY_SUPPORTED_CHECKSUMS.
|
|
88
95
|
"""
|
|
89
|
-
self.logger(logging.DEBUG, 'xrootd.stat: path: {}'
|
|
96
|
+
self.logger(logging.DEBUG, f'xrootd.stat: path: {path}')
|
|
90
97
|
ret = {}
|
|
91
98
|
chsum = None
|
|
92
99
|
if path.startswith('root:'):
|
|
@@ -94,7 +101,7 @@ class Default(protocol.RSEProtocol):
|
|
|
94
101
|
|
|
95
102
|
try:
|
|
96
103
|
# xrdfs stat for getting filesize
|
|
97
|
-
cmd = '
|
|
104
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} stat {path}'
|
|
98
105
|
self.logger(logging.DEBUG, 'xrootd.stat: filesize cmd: {}'.format(cmd))
|
|
99
106
|
status_stat, out, err = execute(cmd)
|
|
100
107
|
if status_stat == 0:
|
|
@@ -106,7 +113,7 @@ class Default(protocol.RSEProtocol):
|
|
|
106
113
|
break
|
|
107
114
|
|
|
108
115
|
# xrdfs query checksum for getting checksum
|
|
109
|
-
cmd = '
|
|
116
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} query checksum {path}'
|
|
110
117
|
self.logger(logging.DEBUG, 'xrootd.stat: checksum cmd: {}'.format(cmd))
|
|
111
118
|
status_query, out, err = execute(cmd)
|
|
112
119
|
if status_query == 0:
|
|
@@ -183,7 +190,7 @@ class Default(protocol.RSEProtocol):
|
|
|
183
190
|
try:
|
|
184
191
|
# The query stats call is not implemented on some xroot doors.
|
|
185
192
|
# Workaround: fail, if server does not reply within 10 seconds for static config query
|
|
186
|
-
cmd = '
|
|
193
|
+
cmd = f'{self._auth_env} XRD_REQUESTTIMEOUT=10 xrdfs {self.hostname}:{self.port} query config {self.hostname}:{self.port}'
|
|
187
194
|
self.logger(logging.DEBUG, 'xrootd.connect: cmd: {}'.format(cmd))
|
|
188
195
|
status, out, err = execute(cmd)
|
|
189
196
|
if status != 0:
|
|
@@ -206,7 +213,7 @@ class Default(protocol.RSEProtocol):
|
|
|
206
213
|
"""
|
|
207
214
|
self.logger(logging.DEBUG, 'xrootd.get: pfn: {}'.format(pfn))
|
|
208
215
|
try:
|
|
209
|
-
cmd = '
|
|
216
|
+
cmd = f'{self._auth_env} xrdcp -f {pfn} {dest}'
|
|
210
217
|
self.logger(logging.DEBUG, 'xrootd.get: cmd: {}'.format(cmd))
|
|
211
218
|
status, out, err = execute(cmd)
|
|
212
219
|
if status == 54:
|
|
@@ -237,7 +244,7 @@ class Default(protocol.RSEProtocol):
|
|
|
237
244
|
if not os.path.exists(source_url):
|
|
238
245
|
raise exception.SourceNotFound()
|
|
239
246
|
try:
|
|
240
|
-
cmd = '
|
|
247
|
+
cmd = f'{self._auth_env} xrdcp -f {source_url} {path}'
|
|
241
248
|
self.logger(logging.DEBUG, 'xrootd.put: cmd: {}'.format(cmd))
|
|
242
249
|
status, out, err = execute(cmd)
|
|
243
250
|
if status != 0:
|
|
@@ -259,7 +266,7 @@ class Default(protocol.RSEProtocol):
|
|
|
259
266
|
raise exception.SourceNotFound()
|
|
260
267
|
try:
|
|
261
268
|
path = self.pfn2path(pfn)
|
|
262
|
-
cmd = '
|
|
269
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} rm {path}'
|
|
263
270
|
self.logger(logging.DEBUG, 'xrootd.delete: cmd: {}'.format(cmd))
|
|
264
271
|
status, out, err = execute(cmd)
|
|
265
272
|
if status != 0:
|
|
@@ -283,10 +290,10 @@ class Default(protocol.RSEProtocol):
|
|
|
283
290
|
path = self.pfn2path(pfn)
|
|
284
291
|
new_path = self.pfn2path(new_pfn)
|
|
285
292
|
new_dir = new_path[:new_path.rindex('/') + 1]
|
|
286
|
-
cmd = '
|
|
293
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} mkdir -p {new_dir}'
|
|
287
294
|
self.logger(logging.DEBUG, 'xrootd.stat: mkdir cmd: {}'.format(cmd))
|
|
288
295
|
status, out, err = execute(cmd)
|
|
289
|
-
cmd = '
|
|
296
|
+
cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} mv {path} {new_path}'
|
|
290
297
|
self.logger(logging.DEBUG, 'xrootd.stat: rename cmd: {}'.format(cmd))
|
|
291
298
|
status, out, err = execute(cmd)
|
|
292
299
|
if status != 0:
|
|
@@ -4,8 +4,8 @@ This file is automatically generated; Do not edit it. :)
|
|
|
4
4
|
'''
|
|
5
5
|
VERSION_INFO = {
|
|
6
6
|
'final': True,
|
|
7
|
-
'version': '33.
|
|
7
|
+
'version': '33.4.0',
|
|
8
8
|
'branch_nick': 'release-33',
|
|
9
|
-
'revision_id': '
|
|
10
|
-
'revno':
|
|
9
|
+
'revision_id': '501f39cf4ba83caccda9a683e1f4c6008ed1b685',
|
|
10
|
+
'revno': 12708
|
|
11
11
|
}
|
|
@@ -85,6 +85,39 @@ def test_dirac_addfile(rse_factory, did_factory, root_account, did_client, dirac
|
|
|
85
85
|
assert rules[0]['rse_expression'] == 'ANY=true'
|
|
86
86
|
assert (rules[0]['expires_at'] - datetime.utcnow()).days == 30
|
|
87
87
|
|
|
88
|
+
@skip_non_belleii
|
|
89
|
+
def test_dirac_addfile_with_parents_meta(rse_factory, did_factory, root_account, did_client, dirac_client, rse_client, replica_client):
|
|
90
|
+
""" DIRAC (CLIENT): Test the functionality of the addfile method """
|
|
91
|
+
rse1, rse1_id = rse_factory.make_srm_rse(deterministic=True)
|
|
92
|
+
rse_client.add_rse_attribute(rse=rse1, key='ANY', value='True')
|
|
93
|
+
config_set('dirac', 'lifetime', '{"user.*": 2592400}')
|
|
94
|
+
lfn_name = did_name_generator('file')
|
|
95
|
+
lfn_meta = {'events': 10, 'key1':'value1'}
|
|
96
|
+
# Create replicas on rse1 using addfile in mock scope (not lifetime)
|
|
97
|
+
lfns = [{'lfn': lfn_name, 'rse': rse1, 'bytes': 1, 'adler32': '0cc737eb', 'guid': generate_uuid(), 'meta': lfn_meta}]
|
|
98
|
+
files = [{'scope': extract_scope(lfn['lfn'], [])[0], 'name': lfn['lfn']} for lfn in lfns]
|
|
99
|
+
reps = [{'scope': extract_scope(lfn['lfn'], [])[0], 'name': lfn['lfn'], 'rse': rse1} for lfn in lfns]
|
|
100
|
+
dataset = "/".join(lfns[0]['lfn'].split('/')[:-1])
|
|
101
|
+
container = "/".join(lfns[0]['lfn'].split('/')[:-2])
|
|
102
|
+
dataset_meta = {'project': 'data13_hip', 'run_number': 300000, 'mykey': 'myvalue'}
|
|
103
|
+
container_meta = {'containerkey': 'containervalue'}
|
|
104
|
+
parents_metadata = {dataset: dataset_meta, container: container_meta}
|
|
105
|
+
dirac_client.add_files(lfns=lfns, ignore_availability=False, parents_metadata=parents_metadata)
|
|
106
|
+
replicas = [rep for rep in replica_client.list_replicas(dids=files)]
|
|
107
|
+
for replica in replicas:
|
|
108
|
+
assert {'scope': replica['scope'], 'name': replica['name'], 'rse': list(replica['rses'].keys())[0]} in reps
|
|
109
|
+
|
|
110
|
+
# check if metadata if properly created for file and parents
|
|
111
|
+
for lfn in lfns:
|
|
112
|
+
scope, name = extract_scope(lfn['lfn'], [])
|
|
113
|
+
metadata = did_client.get_metadata(scope, name, plugin='ALL')
|
|
114
|
+
assert all(item in metadata.items() for item in lfn_meta.items())
|
|
115
|
+
dsn_scope, dsn_name = extract_scope(dataset, [])
|
|
116
|
+
metadata = did_client.get_metadata(dsn_scope, dsn_name, plugin='ALL')
|
|
117
|
+
assert all(item in metadata.items() for item in dataset_meta.items())
|
|
118
|
+
con_scope, con_name = extract_scope(container, [])
|
|
119
|
+
metadata = did_client.get_metadata(con_scope , con_name, plugin='ALL')
|
|
120
|
+
assert all(item in metadata.items() for item in container_meta.items())
|
|
88
121
|
|
|
89
122
|
@skip_non_belleii
|
|
90
123
|
def test_belle2_schema(rse_factory, did_factory, root_account, did_client):
|
|
@@ -52,7 +52,7 @@ from rucio.transfertool.fts3 import FTS3Transfertool
|
|
|
52
52
|
from tests.ruciopytest import NoParallelGroups
|
|
53
53
|
from tests.mocks.mock_http_server import MockServer
|
|
54
54
|
|
|
55
|
-
MAX_POLL_WAIT_SECONDS =
|
|
55
|
+
MAX_POLL_WAIT_SECONDS = 100
|
|
56
56
|
TEST_FTS_HOST = 'https://fts:8446'
|
|
57
57
|
|
|
58
58
|
|
|
@@ -823,7 +823,6 @@ def test_non_deterministic_dst(did_factory, did_client, root_account, vo, caches
|
|
|
823
823
|
|
|
824
824
|
|
|
825
825
|
@skip_rse_tests_with_accounts
|
|
826
|
-
@pytest.mark.dirty(reason="Submits a transfer to FTS which cannot be ever executed in this test env.")
|
|
827
826
|
@pytest.mark.noparallel(groups=[NoParallelGroups.STAGER, NoParallelGroups.POLLER, NoParallelGroups.FINISHER])
|
|
828
827
|
def test_stager(rse_factory, did_factory, root_account, replica_client):
|
|
829
828
|
"""
|
|
@@ -861,8 +860,8 @@ def test_stager(rse_factory, did_factory, root_account, replica_client):
|
|
|
861
860
|
'requested_at': datetime.utcnow()}])
|
|
862
861
|
stager(once=True, rses=[{'id': rse_id} for rse_id in all_rses])
|
|
863
862
|
|
|
864
|
-
|
|
865
|
-
assert
|
|
863
|
+
replica = __wait_for_replica_transfer(dst_rse_id=dst_rse_id, max_wait_seconds=2 * MAX_POLL_WAIT_SECONDS, **did)
|
|
864
|
+
assert replica['state'] == ReplicaState.AVAILABLE
|
|
866
865
|
|
|
867
866
|
|
|
868
867
|
@pytest.mark.noparallel(groups=[NoParallelGroups.SUBMITTER, NoParallelGroups.FINISHER])
|
|
@@ -1579,6 +1578,53 @@ def test_checksum_validation(rse_factory, did_factory, root_account):
|
|
|
1579
1578
|
assert request['state'] == RequestState.FAILED
|
|
1580
1579
|
|
|
1581
1580
|
|
|
1581
|
+
@skip_rse_tests_with_accounts
|
|
1582
|
+
@pytest.mark.noparallel(groups=[NoParallelGroups.XRD, NoParallelGroups.SUBMITTER, NoParallelGroups.RECEIVER])
|
|
1583
|
+
@pytest.mark.parametrize("file_config_mock", [
|
|
1584
|
+
{"overrides": [('oidc', 'admin_issuer', 'indigoiam')]},
|
|
1585
|
+
], indirect=True)
|
|
1586
|
+
def test_transfer_with_tokens(vo, did_factory, root_account, caches_mock, file_config_mock):
|
|
1587
|
+
src_rse = 'WEB1'
|
|
1588
|
+
src_rse_id = rse_core.get_rse_id(rse=src_rse, vo=vo)
|
|
1589
|
+
dst_rse = 'XRD5'
|
|
1590
|
+
dst_rse_id = rse_core.get_rse_id(rse=dst_rse, vo=vo)
|
|
1591
|
+
all_rses = [src_rse_id, dst_rse_id]
|
|
1592
|
+
|
|
1593
|
+
did = did_factory.upload_test_file(src_rse)
|
|
1594
|
+
|
|
1595
|
+
rule_core.add_rule(dids=[did], account=root_account, copies=1, rse_expression=dst_rse, grouping='ALL', weight=None, lifetime=None, locked=False, subscription_id=None)
|
|
1596
|
+
|
|
1597
|
+
received_messages = {}
|
|
1598
|
+
|
|
1599
|
+
class ReceiverWrapper(Receiver):
|
|
1600
|
+
"""
|
|
1601
|
+
Wrap receiver to record the last handled message for each given request_id
|
|
1602
|
+
"""
|
|
1603
|
+
def _perform_request_update(self, msg, *, session=None, logger=logging.log):
|
|
1604
|
+
ret = super()._perform_request_update(msg, session=session, logger=logger)
|
|
1605
|
+
received_messages[msg['file_metadata']['request_id']] = msg
|
|
1606
|
+
return ret
|
|
1607
|
+
|
|
1608
|
+
with patch('rucio.daemons.conveyor.receiver.Receiver', ReceiverWrapper):
|
|
1609
|
+
receiver_thread = threading.Thread(target=receiver, kwargs={'id_': 0, 'all_vos': True, 'total_threads': 1})
|
|
1610
|
+
receiver_thread.start()
|
|
1611
|
+
try:
|
|
1612
|
+
submitter(once=True, rses=[{'id': rse_id} for rse_id in all_rses], group_bulk=2, partition_wait_time=0, transfertype='single', filter_transfertool=None)
|
|
1613
|
+
# Wait for the reception of the FTS Completion message for the submitted request
|
|
1614
|
+
request = request_core.get_request_by_did(rse_id=dst_rse_id, **did)
|
|
1615
|
+
for i in range(MAX_POLL_WAIT_SECONDS):
|
|
1616
|
+
if request['id'] in received_messages:
|
|
1617
|
+
break
|
|
1618
|
+
if i == MAX_POLL_WAIT_SECONDS - 1:
|
|
1619
|
+
assert False # Waited too long; fail the test
|
|
1620
|
+
time.sleep(1)
|
|
1621
|
+
assert received_messages[request['id']]['job_metadata']['auth_method'] == 'oauth2'
|
|
1622
|
+
finally:
|
|
1623
|
+
receiver_graceful_stop.set()
|
|
1624
|
+
receiver_thread.join(timeout=5)
|
|
1625
|
+
receiver_graceful_stop.clear()
|
|
1626
|
+
|
|
1627
|
+
|
|
1582
1628
|
@pytest.mark.noparallel(groups=[NoParallelGroups.PREPARER])
|
|
1583
1629
|
@pytest.mark.parametrize("file_config_mock", [{
|
|
1584
1630
|
"overrides": [('conveyor', 'use_preparer', 'true')]
|
|
@@ -81,13 +81,6 @@ def reset_rses():
|
|
|
81
81
|
db_session.commit()
|
|
82
82
|
|
|
83
83
|
|
|
84
|
-
def test_active():
|
|
85
|
-
db_session = session.get_session()
|
|
86
|
-
if db_session.bind.dialect.name == 'sqlite':
|
|
87
|
-
return False
|
|
88
|
-
return True
|
|
89
|
-
|
|
90
|
-
|
|
91
84
|
@pytest.fixture
|
|
92
85
|
def importer_example_data(vo):
|
|
93
86
|
if not config_has_section('importer'):
|
|
@@ -36,7 +36,8 @@ from rucio.daemons.reaper.dark_reaper import reaper as dark_reaper
|
|
|
36
36
|
from rucio.daemons.reaper.reaper import run as run_reaper
|
|
37
37
|
from rucio.db.sqla.models import ConstituentAssociationHistory
|
|
38
38
|
from rucio.db.sqla.session import read_session
|
|
39
|
-
from rucio.tests.common import rse_name_generator
|
|
39
|
+
from rucio.tests.common import rse_name_generator, skip_rse_tests_with_accounts
|
|
40
|
+
from tests.ruciopytest import NoParallelGroups
|
|
40
41
|
|
|
41
42
|
__mock_protocol = {'scheme': 'MOCK',
|
|
42
43
|
'hostname': 'localhost',
|
|
@@ -481,3 +482,21 @@ def test_reaper_without_rse_usage(vo, caches_mock):
|
|
|
481
482
|
cache_region.invalidate()
|
|
482
483
|
reaper(once=True, rses=[], include_rses=rse_name, exclude_rses=None, chunk_size=1000, scheme='MOCK')
|
|
483
484
|
assert len(list(replica_core.list_replicas(dids, rse_expression=rse_name))) == nb_files - nb_epoch_tombstone
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
@skip_rse_tests_with_accounts
|
|
488
|
+
@pytest.mark.dirty(reason="leaves files in XRD containers")
|
|
489
|
+
@pytest.mark.noparallel(groups=[NoParallelGroups.WEB])
|
|
490
|
+
@pytest.mark.parametrize("caches_mock", [{"caches_to_mock": [
|
|
491
|
+
'rucio.daemons.reaper.reaper.REGION'
|
|
492
|
+
]}], indirect=True)
|
|
493
|
+
@pytest.mark.parametrize("file_config_mock", [
|
|
494
|
+
{"overrides": [('oidc', 'admin_issuer', 'indigoiam')]},
|
|
495
|
+
], indirect=True)
|
|
496
|
+
def test_deletion_with_tokens(vo, did_factory, root_account, caches_mock, file_config_mock):
|
|
497
|
+
rse_name = 'WEB1'
|
|
498
|
+
did = did_factory.upload_test_file(rse_name)
|
|
499
|
+
for rule in list(rule_core.list_associated_rules_for_file(**did)):
|
|
500
|
+
rule_core.delete_rule(rule['id'])
|
|
501
|
+
|
|
502
|
+
reaper(once=True, rses=[], include_rses=rse_name, exclude_rses=None, chunk_size=1000, greedy=True, scheme='davs')
|
|
@@ -88,7 +88,7 @@ def test_tpc(containerized_rses, root_account, test_scope, did_factory, rse_clie
|
|
|
88
88
|
paths, *_ = build_transfer_paths(topology=topology, protocol_factory=ProtocolFactory(), requests_with_sources=requests)
|
|
89
89
|
[[_, [transfer_path]]] = paths.items()
|
|
90
90
|
assert transfer_path[0].rws.rule_id == rule_id[0]
|
|
91
|
-
src_url = transfer_path[0].
|
|
91
|
+
src_url = transfer_path[0].source_url(transfer_path[0].sources[0])
|
|
92
92
|
dest_url = transfer_path[0].dest_url
|
|
93
93
|
check_url(src_url, rse1_hostname, test_file_expected_pfn)
|
|
94
94
|
check_url(dest_url, rse2_hostname, test_file_expected_pfn)
|
|
@@ -181,16 +181,16 @@ def test_disk_vs_tape_priority(rse_factory, root_account, mock_scope, file_confi
|
|
|
181
181
|
# On equal priority and distance, disk should be preferred over tape. Both disk sources will be returned
|
|
182
182
|
[[_, [transfer]]] = pick_and_prepare_submission_path(topology=topology, protocol_factory=ProtocolFactory(),
|
|
183
183
|
requests_with_sources=requests).items()
|
|
184
|
-
assert len(transfer[0].
|
|
185
|
-
assert transfer[0].
|
|
184
|
+
assert len(transfer[0].sources) == 2
|
|
185
|
+
assert transfer[0].sources[0].rse.name in (disk1_rse_name, disk2_rse_name)
|
|
186
186
|
|
|
187
187
|
# Change the rating of the disk RSEs. Disk still preferred, because it must fail twice before tape is tried
|
|
188
188
|
disk1_source.ranking = -1
|
|
189
189
|
disk2_source.ranking = -1
|
|
190
190
|
[[_, [transfer]]] = pick_and_prepare_submission_path(topology=topology, protocol_factory=ProtocolFactory(),
|
|
191
191
|
requests_with_sources=requests).items()
|
|
192
|
-
assert len(transfer[0].
|
|
193
|
-
assert transfer[0].
|
|
192
|
+
assert len(transfer[0].sources) == 2
|
|
193
|
+
assert transfer[0].sources[0].rse.name in (disk1_rse_name, disk2_rse_name)
|
|
194
194
|
|
|
195
195
|
# Change the rating of the disk RSEs again. Tape RSEs must now be preferred.
|
|
196
196
|
# Multiple tape sources are not allowed. Only one tape RSE source must be returned.
|
|
@@ -200,21 +200,21 @@ def test_disk_vs_tape_priority(rse_factory, root_account, mock_scope, file_confi
|
|
|
200
200
|
requests_with_sources=requests).items()
|
|
201
201
|
assert len(transfers) == 1
|
|
202
202
|
transfer = transfers[0]
|
|
203
|
-
assert len(transfer[0].
|
|
204
|
-
assert transfer[0].
|
|
203
|
+
assert len(transfer[0].sources) == 1
|
|
204
|
+
assert transfer[0].sources[0].rse.name in (tape1_rse_name, tape2_rse_name)
|
|
205
205
|
|
|
206
206
|
# On equal source ranking, but different distance; the smaller distance is preferred
|
|
207
207
|
[[_, [transfer]]] = pick_and_prepare_submission_path(topology=topology, protocol_factory=ProtocolFactory(),
|
|
208
208
|
requests_with_sources=requests).items()
|
|
209
|
-
assert len(transfer[0].
|
|
210
|
-
assert transfer[0].
|
|
209
|
+
assert len(transfer[0].sources) == 1
|
|
210
|
+
assert transfer[0].sources[0].rse.name == tape2_rse_name
|
|
211
211
|
|
|
212
212
|
# On different source ranking, the bigger ranking is preferred
|
|
213
213
|
tape2_source.ranking = -1
|
|
214
214
|
[[_, [transfer]]] = pick_and_prepare_submission_path(topology=topology, protocol_factory=ProtocolFactory(),
|
|
215
215
|
requests_with_sources=requests).items()
|
|
216
|
-
assert len(transfer[0].
|
|
217
|
-
assert transfer[0].
|
|
216
|
+
assert len(transfer[0].sources) == 1
|
|
217
|
+
assert transfer[0].sources[0].rse.name == tape1_rse_name
|
|
218
218
|
|
|
219
219
|
|
|
220
220
|
@pytest.mark.parametrize("file_config_mock", [
|
|
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
|
|
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
|
|
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
|
|
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
|