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.

Files changed (188) hide show
  1. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/PKG-INFO +1 -1
  2. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/diracclient.py +3 -2
  3. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/subscriptionclient.py +4 -3
  4. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/xrootd.py +17 -10
  5. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/vcsversion.py +3 -3
  6. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_belleii.py +33 -0
  7. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_conveyor.py +50 -4
  8. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_import_export.py +0 -7
  9. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_reaper.py +20 -1
  10. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_tpc.py +1 -1
  11. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_transfer.py +10 -10
  12. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/AUTHORS.rst +0 -0
  13. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/ChangeLog +0 -0
  14. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/LICENSE +0 -0
  15. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/MANIFEST.in +0 -0
  16. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/README.rst +0 -0
  17. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/bin/rucio +0 -0
  18. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/bin/rucio-admin +0 -0
  19. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/etc/rse-accounts.cfg.template +0 -0
  20. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/etc/rucio.cfg.atlas.client.template +0 -0
  21. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/etc/rucio.cfg.template +0 -0
  22. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/__init__.py +0 -0
  23. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/alembicrevision.py +0 -0
  24. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/__init__.py +0 -0
  25. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/accountclient.py +0 -0
  26. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/accountlimitclient.py +0 -0
  27. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/baseclient.py +0 -0
  28. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/client.py +0 -0
  29. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/configclient.py +0 -0
  30. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/credentialclient.py +0 -0
  31. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/didclient.py +0 -0
  32. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/downloadclient.py +0 -0
  33. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/exportclient.py +0 -0
  34. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/fileclient.py +0 -0
  35. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/importclient.py +0 -0
  36. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/lifetimeclient.py +0 -0
  37. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/lockclient.py +0 -0
  38. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/metaclient.py +0 -0
  39. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/pingclient.py +0 -0
  40. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/replicaclient.py +0 -0
  41. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/requestclient.py +0 -0
  42. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/rseclient.py +0 -0
  43. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/ruleclient.py +0 -0
  44. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/scopeclient.py +0 -0
  45. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/touchclient.py +0 -0
  46. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/client/uploadclient.py +0 -0
  47. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/__init__.py +0 -0
  48. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/cache.py +0 -0
  49. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/config.py +0 -0
  50. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/constants.py +0 -0
  51. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/constraints.py +0 -0
  52. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/didtype.py +0 -0
  53. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/exception.py +0 -0
  54. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/extra.py +0 -0
  55. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/logging.py +0 -0
  56. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/pcache.py +0 -0
  57. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/policy.py +0 -0
  58. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/__init__.py +0 -0
  59. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/atlas.py +0 -0
  60. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/belleii.py +0 -0
  61. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/cms.py +0 -0
  62. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/domatpc.py +0 -0
  63. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/escape.py +0 -0
  64. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/generic.py +0 -0
  65. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
  66. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/icecube.py +0 -0
  67. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/schema/lsst.py +0 -0
  68. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/stomp_utils.py +0 -0
  69. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/stopwatch.py +0 -0
  70. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/test_rucio_server.py +0 -0
  71. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/types.py +0 -0
  72. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/common/utils.py +0 -0
  73. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/__init__.py +0 -0
  74. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/__init__.py +0 -0
  75. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/cache.py +0 -0
  76. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/dummy.py +0 -0
  77. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/gfal.py +0 -0
  78. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/globus.py +0 -0
  79. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/gsiftp.py +0 -0
  80. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
  81. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/mock.py +0 -0
  82. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
  83. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/posix.py +0 -0
  84. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/protocol.py +0 -0
  85. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/rclone.py +0 -0
  86. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/rfio.py +0 -0
  87. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/srm.py +0 -0
  88. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/ssh.py +0 -0
  89. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/storm.py +0 -0
  90. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/protocols/webdav.py +0 -0
  91. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/rse/rsemanager.py +0 -0
  92. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio/version.py +0 -0
  93. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/lib/rucio_clients.egg-info/SOURCES.txt +0 -0
  94. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/pylintrc +0 -0
  95. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/pyproject.toml +0 -0
  96. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/requirements.txt +0 -0
  97. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/setup.cfg +0 -0
  98. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/setup.py +0 -0
  99. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/setuputil.py +0 -0
  100. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_abacus_account.py +0 -0
  101. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_abacus_collection_replica.py +0 -0
  102. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_abacus_rse.py +0 -0
  103. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_account.py +0 -0
  104. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_account_limits.py +0 -0
  105. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_api_external_representation.py +0 -0
  106. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_archive.py +0 -0
  107. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_auditor.py +0 -0
  108. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_auditor_hdfs.py +0 -0
  109. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_auditor_srmdumps.py +0 -0
  110. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_authentication.py +0 -0
  111. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_automatix.py +0 -0
  112. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_bad_replica.py +0 -0
  113. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_bb8.py +0 -0
  114. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_bin_rucio.py +0 -0
  115. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_boolean.py +0 -0
  116. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_clients.py +0 -0
  117. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_common_types.py +0 -0
  118. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_config.py +0 -0
  119. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_conveyor_submitter.py +0 -0
  120. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_counter.py +0 -0
  121. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_credential.py +0 -0
  122. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_curl.py +0 -0
  123. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_daemons.py +0 -0
  124. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_dataset_replicas.py +0 -0
  125. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_db.py +0 -0
  126. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_did.py +0 -0
  127. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_did_meta_plugins.py +0 -0
  128. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_didtype.py +0 -0
  129. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_download.py +0 -0
  130. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_dumper.py +0 -0
  131. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_dumper_consistency.py +0 -0
  132. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_dumper_data_model.py +0 -0
  133. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_dumper_path_parsing.py +0 -0
  134. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_filter_engine.py +0 -0
  135. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_heartbeat.py +0 -0
  136. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_hermes.py +0 -0
  137. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_identity.py +0 -0
  138. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_impl_upload_download.py +0 -0
  139. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_judge_cleaner.py +0 -0
  140. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_judge_evaluator.py +0 -0
  141. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_judge_injector.py +0 -0
  142. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_judge_repairer.py +0 -0
  143. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_lifetime.py +0 -0
  144. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_message.py +0 -0
  145. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_meta.py +0 -0
  146. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_meta_did.py +0 -0
  147. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_module_import.py +0 -0
  148. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_monitor.py +0 -0
  149. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_multi_vo.py +0 -0
  150. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_naming_convention.py +0 -0
  151. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_oauthmanager.py +0 -0
  152. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_oidc.py +0 -0
  153. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_permission.py +0 -0
  154. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_pfns.py +0 -0
  155. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_ping.py +0 -0
  156. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_preparer.py +0 -0
  157. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_qos.py +0 -0
  158. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_quarantined_replica.py +0 -0
  159. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_redirect.py +0 -0
  160. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_replica.py +0 -0
  161. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_replica_recoverer.py +0 -0
  162. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_replica_sorting.py +0 -0
  163. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_request.py +0 -0
  164. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_root_proxy.py +0 -0
  165. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse.py +0 -0
  166. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_expression_parser.py +0 -0
  167. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_lfn2path.py +0 -0
  168. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_gfal2.py +0 -0
  169. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
  170. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_posix.py +0 -0
  171. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_rclone.py +0 -0
  172. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_rsync.py +0 -0
  173. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_srm.py +0 -0
  174. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_ssh.py +0 -0
  175. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_webdav.py +0 -0
  176. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_protocol_xrootd.py +0 -0
  177. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rse_selector.py +0 -0
  178. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rucio_server.py +0 -0
  179. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_rule.py +0 -0
  180. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_schema_cms.py +0 -0
  181. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_scope.py +0 -0
  182. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_subscription.py +0 -0
  183. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_throttler.py +0 -0
  184. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_trace.py +0 -0
  185. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_undertaker.py +0 -0
  186. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_upload.py +0 -0
  187. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tests/test_utils.py +0 -0
  188. {rucio-clients-33.2.1 → rucio-clients-33.4.0}/tools/merge_rucio_configs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rucio-clients
3
- Version: 33.2.1
3
+ Version: 33.4.0
4
4
  Summary: Rucio Client Lite Package
5
5
  Home-page: https://rucio.cern.ch/
6
6
  Author: Rucio
@@ -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
- else:
99
- exc_cls, exc_msg = self._get_exception(headers=result.headers, status_code=result.status_code, data=result.content)
100
- raise exc_cls(exc_msg)
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 = 'XrdSecPROTOCOL=gsi xrdfs %s:%s stat %s' % (self.hostname, self.port, path)
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: {}'.format(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 = 'XrdSecPROTOCOL=gsi xrdfs %s:%s stat %s' % (self.hostname, self.port, path)
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 = 'XrdSecPROTOCOL=gsi xrdfs %s:%s query checksum %s' % (self.hostname, self.port, path)
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 = 'XrdSecPROTOCOL=gsi XRD_REQUESTTIMEOUT=10 xrdfs %s:%s query config %s:%s' % (self.hostname, self.port, self.hostname, self.port)
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 = 'XrdSecPROTOCOL=gsi xrdcp -f %s %s' % (pfn, dest)
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 = 'XrdSecPROTOCOL=gsi xrdcp -f %s %s' % (source_url, path)
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 = 'XrdSecPROTOCOL=gsi xrdfs %s:%s rm %s' % (self.hostname, self.port, path)
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 = 'XrdSecPROTOCOL=gsi xrdfs %s:%s mkdir -p %s' % (self.hostname, self.port, new_dir)
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 = 'XrdSecPROTOCOL=gsi xrdfs %s:%s mv %s %s' % (self.hostname, self.port, path, new_path)
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.2.1',
7
+ 'version': '33.4.0',
8
8
  'branch_nick': 'release-33',
9
- 'revision_id': '40778f689d8c42f91d2e54f30c09aa7fef393fd7',
10
- 'revno': 12685
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 = 60
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
- request = request_core.get_request_by_did(rse_id=dst_rse_id, **did)
865
- assert request['state'] == RequestState.SUBMITTED
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].legacy_sources[0][1]
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].legacy_sources) == 2
185
- assert transfer[0].legacy_sources[0][0] in (disk1_rse_name, disk2_rse_name)
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].legacy_sources) == 2
193
- assert transfer[0].legacy_sources[0][0] in (disk1_rse_name, disk2_rse_name)
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].legacy_sources) == 1
204
- assert transfer[0].legacy_sources[0][0] in (tape1_rse_name, tape2_rse_name)
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].legacy_sources) == 1
210
- assert transfer[0].legacy_sources[0][0] == tape2_rse_name
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].legacy_sources) == 1
217
- assert transfer[0].legacy_sources[0][0] == tape1_rse_name
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