rucio-clients 36.1.0__tar.gz → 36.2.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 (207) hide show
  1. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/PKG-INFO +1 -1
  2. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/bin/rucio +14 -5
  3. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/bin/rucio-admin +4 -1
  4. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/bin_legacy/rucio_admin.py +5 -4
  5. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/config.py +7 -16
  6. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/exception.py +15 -0
  7. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/translation.py +3 -2
  8. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/vcsversion.py +3 -3
  9. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio_clients.egg-info/SOURCES.txt +0 -3
  10. rucio_clients-36.2.0/tests/test_dumper.py +47 -0
  11. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_hermes.py +2 -2
  12. rucio_clients-36.1.0/tests/test_dumper.py +0 -237
  13. rucio_clients-36.1.0/tests/test_dumper_consistency.py +0 -407
  14. rucio_clients-36.1.0/tests/test_dumper_data_model.py +0 -334
  15. rucio_clients-36.1.0/tests/test_dumper_path_parsing.py +0 -47
  16. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/AUTHORS.rst +0 -0
  17. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/ChangeLog +0 -0
  18. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/LICENSE +0 -0
  19. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/MANIFEST.in +0 -0
  20. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/README.md +0 -0
  21. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/etc/rse-accounts.cfg.template +0 -0
  22. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/etc/rucio.cfg.atlas.client.template +0 -0
  23. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/etc/rucio.cfg.template +0 -0
  24. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/__init__.py +0 -0
  25. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/alembicrevision.py +0 -0
  26. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/__init__.py +0 -0
  27. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/accountclient.py +0 -0
  28. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/accountlimitclient.py +0 -0
  29. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/baseclient.py +0 -0
  30. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/client.py +0 -0
  31. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/__init__.py +0 -0
  32. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/account.py +0 -0
  33. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/bin_legacy/__init__.py +0 -0
  34. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/bin_legacy/rucio.py +0 -0
  35. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/command.py +0 -0
  36. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/command_base.py +0 -0
  37. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/config.py +0 -0
  38. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/did.py +0 -0
  39. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/download.py +0 -0
  40. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/lifetime_exception.py +0 -0
  41. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/replica.py +0 -0
  42. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/rse.py +0 -0
  43. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/rule.py +0 -0
  44. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/scope.py +0 -0
  45. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/subscription.py +0 -0
  46. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/upload.py +0 -0
  47. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/utils.py +0 -0
  48. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/configclient.py +0 -0
  49. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/credentialclient.py +0 -0
  50. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/didclient.py +0 -0
  51. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/diracclient.py +0 -0
  52. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/downloadclient.py +0 -0
  53. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/exportclient.py +0 -0
  54. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/fileclient.py +0 -0
  55. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/importclient.py +0 -0
  56. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/lifetimeclient.py +0 -0
  57. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/lockclient.py +0 -0
  58. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/metaconventionsclient.py +0 -0
  59. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/pingclient.py +0 -0
  60. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/replicaclient.py +0 -0
  61. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/requestclient.py +0 -0
  62. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/richclient.py +0 -0
  63. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/rseclient.py +0 -0
  64. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/ruleclient.py +0 -0
  65. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/scopeclient.py +0 -0
  66. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/subscriptionclient.py +0 -0
  67. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/touchclient.py +0 -0
  68. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/uploadclient.py +0 -0
  69. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/__init__.py +0 -0
  70. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/bittorrent.py +0 -0
  71. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/cache.py +0 -0
  72. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/checksum.py +0 -0
  73. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/client.py +0 -0
  74. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/constants.py +0 -0
  75. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/constraints.py +0 -0
  76. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/didtype.py +0 -0
  77. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/extra.py +0 -0
  78. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/logging.py +0 -0
  79. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/pcache.py +0 -0
  80. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/plugins.py +0 -0
  81. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/policy.py +0 -0
  82. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/schema/__init__.py +0 -0
  83. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/schema/generic.py +0 -0
  84. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
  85. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/stomp_utils.py +0 -0
  86. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/stopwatch.py +0 -0
  87. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/test_rucio_server.py +0 -0
  88. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/types.py +0 -0
  89. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/utils.py +0 -0
  90. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/__init__.py +0 -0
  91. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/__init__.py +0 -0
  92. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/bittorrent.py +0 -0
  93. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/cache.py +0 -0
  94. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/dummy.py +0 -0
  95. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/gfal.py +0 -0
  96. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/globus.py +0 -0
  97. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/gsiftp.py +0 -0
  98. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
  99. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/mock.py +0 -0
  100. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
  101. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/posix.py +0 -0
  102. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/protocol.py +0 -0
  103. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/rclone.py +0 -0
  104. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/rfio.py +0 -0
  105. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/srm.py +0 -0
  106. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/ssh.py +0 -0
  107. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/storm.py +0 -0
  108. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/webdav.py +0 -0
  109. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/xrootd.py +0 -0
  110. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/rsemanager.py +0 -0
  111. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/version.py +0 -0
  112. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/pylintrc +0 -0
  113. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/pyproject.toml +0 -0
  114. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/requirements/requirements.client.txt +0 -0
  115. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/setup.cfg +0 -0
  116. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/setup.py +0 -0
  117. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/setuputil.py +0 -0
  118. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_abacus_account.py +0 -0
  119. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_abacus_collection_replica.py +0 -0
  120. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_abacus_rse.py +0 -0
  121. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_account.py +0 -0
  122. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_account_limits.py +0 -0
  123. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_archive.py +0 -0
  124. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_auditor.py +0 -0
  125. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_auditor_hdfs.py +0 -0
  126. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_auditor_srmdumps.py +0 -0
  127. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_authentication.py +0 -0
  128. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_automatix.py +0 -0
  129. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_bad_replica.py +0 -0
  130. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_bb8.py +0 -0
  131. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_belleii.py +0 -0
  132. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_bin_rucio.py +0 -0
  133. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_boolean.py +0 -0
  134. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_cli_client_structure.py +0 -0
  135. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_clients.py +0 -0
  136. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_config.py +0 -0
  137. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_conveyor.py +0 -0
  138. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_conveyor_submitter.py +0 -0
  139. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_counter.py +0 -0
  140. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_credential.py +0 -0
  141. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_curl.py +0 -0
  142. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_daemons.py +0 -0
  143. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_dataset_replicas.py +0 -0
  144. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_db.py +0 -0
  145. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_did.py +0 -0
  146. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_did_meta_plugins.py +0 -0
  147. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_download.py +0 -0
  148. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_filter_engine.py +0 -0
  149. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_gateway_external_representation.py +0 -0
  150. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_heartbeat.py +0 -0
  151. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_identity.py +0 -0
  152. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_impl_upload_download.py +0 -0
  153. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_import_export.py +0 -0
  154. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_judge_cleaner.py +0 -0
  155. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_judge_evaluator.py +0 -0
  156. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_judge_injector.py +0 -0
  157. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_judge_repairer.py +0 -0
  158. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_lifetime.py +0 -0
  159. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_message.py +0 -0
  160. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_meta_conventions.py +0 -0
  161. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_meta_did.py +0 -0
  162. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_module_import.py +0 -0
  163. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_monitor.py +0 -0
  164. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_multi_vo.py +0 -0
  165. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_naming_convention.py +0 -0
  166. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_oauthmanager.py +0 -0
  167. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_oidc.py +0 -0
  168. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_permission.py +0 -0
  169. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_pfns.py +0 -0
  170. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_ping.py +0 -0
  171. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_policy_package.py +0 -0
  172. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_preparer.py +0 -0
  173. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_qos.py +0 -0
  174. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_quarantined_replica.py +0 -0
  175. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_reaper.py +0 -0
  176. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_redirect.py +0 -0
  177. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_replica.py +0 -0
  178. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_replica_recoverer.py +0 -0
  179. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_replica_sorting.py +0 -0
  180. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_request.py +0 -0
  181. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_root_proxy.py +0 -0
  182. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse.py +0 -0
  183. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_expression_parser.py +0 -0
  184. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_lfn2path.py +0 -0
  185. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_gfal2.py +0 -0
  186. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
  187. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_posix.py +0 -0
  188. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_rclone.py +0 -0
  189. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_rsync.py +0 -0
  190. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_srm.py +0 -0
  191. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_ssh.py +0 -0
  192. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_webdav.py +0 -0
  193. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_xrootd.py +0 -0
  194. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_selector.py +0 -0
  195. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rucio_server.py +0 -0
  196. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rule.py +0 -0
  197. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_scope.py +0 -0
  198. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_subscription.py +0 -0
  199. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_throttler.py +0 -0
  200. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_tpc.py +0 -0
  201. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_trace.py +0 -0
  202. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_transfer.py +0 -0
  203. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_transfer_plugins.py +0 -0
  204. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_undertaker.py +0 -0
  205. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_upload.py +0 -0
  206. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_utils.py +0 -0
  207. {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tools/merge_rucio_configs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rucio-clients
3
- Version: 36.1.0
3
+ Version: 36.2.0
4
4
  Summary: Rucio Client Lite Package
5
5
  Home-page: https://rucio.cern.ch/
6
6
  Author: Rucio
@@ -21,6 +21,16 @@ from rucio.client.commands.bin_legacy.rucio import main as main_legacy
21
21
  from rucio.client.commands.command import main
22
22
 
23
23
 
24
+ def _get_first_command(args: list[str]) -> Optional[str]:
25
+ return next(
26
+ (
27
+ arg for arg in args
28
+ if arg != 'rucio' and (arg[0] != "-" or arg in ("-h", "--help", "--version"))
29
+ ),
30
+ None
31
+ )
32
+
33
+
24
34
  def make_warning():
25
35
  base_warning = "\nWARNING: This method is being deprecated."
26
36
  new_command = map_legacy_command()
@@ -33,10 +43,7 @@ def make_warning():
33
43
 
34
44
 
35
45
  def map_legacy_command() -> Optional[list[str]]:
36
- try:
37
- command = [arg for arg in sys.argv if arg[0] != "-" or arg in ("-h", "--version")][1]
38
- except IndexError:
39
- command = None
46
+ command = _get_first_command(sys.argv[1:])
40
47
 
41
48
  new_command = None
42
49
  if command not in ("-h", "--version", None):
@@ -89,7 +96,9 @@ def map_legacy_command() -> Optional[list[str]]:
89
96
 
90
97
  if __name__ == "__main__":
91
98
  commands = ("-h", "--help", "--version", "account", "config", "did", "replica", "rse", "rule", "scope", "subscription", "ping", "whoami", "test-server", "lifetime-exception", "upload", "download")
92
- first_command = [arg for arg in sys.argv if arg[0] != "-" or arg in ("-h", "--help", "--version")][1]
99
+
100
+ first_command = _get_first_command(sys.argv[1:])
101
+
93
102
  is_legacy = '--legacy' in sys.argv
94
103
 
95
104
  if (first_command in commands) and not is_legacy:
@@ -20,7 +20,10 @@ from rucio.client.commands.bin_legacy.rucio_admin import main as main_legacy
20
20
  def make_warning():
21
21
  base_warning = "\nWARNING: This method is being deprecated."
22
22
  args = [arg for arg in sys.argv if arg[0] != "-" or arg in ("-h", "--help", "--version")]
23
- first_command = args[1]
23
+ try:
24
+ first_command = args[1]
25
+ except IndexError:
26
+ first_command = None
24
27
  try:
25
28
  second_command = args[2]
26
29
  except IndexError:
@@ -418,7 +418,6 @@ def info_rse(args, client, logger, console, spinner):
418
418
  if cli_config == 'rich':
419
419
  table = generate_table(table_data, row_styles=['none'], col_alignments=['left', 'left'])
420
420
  output.append(table)
421
- table_data = []
422
421
  else:
423
422
  print('Protocols:')
424
423
  print('==========')
@@ -430,6 +429,7 @@ def info_rse(args, client, logger, console, spinner):
430
429
  else:
431
430
  print(' ' + protocol['scheme'])
432
431
 
432
+ table_data = []
433
433
  for item in sorted(protocol):
434
434
  if cli_config == 'rich':
435
435
  if item == 'domains':
@@ -447,10 +447,11 @@ def info_rse(args, client, logger, console, spinner):
447
447
  else:
448
448
  print(' ' + item + ': ' + str(protocol[item]))
449
449
 
450
- if cli_config == 'rich':
451
- table = generate_table(table_data, col_alignments=['left', 'left'], row_styles=['none'])
452
- output.append(Padding.indent(table, 2))
450
+ if cli_config == 'rich':
451
+ table = generate_table(table_data, col_alignments=['left', 'left'], row_styles=['none'])
452
+ output.append(Padding.indent(table, 2))
453
453
 
454
+ if cli_config == 'rich':
454
455
  header = ['SOURCE', 'USED', 'FILES', 'FREE', 'TOTAL', 'UPDATED AT']
455
456
  key2id = {header[i].lower().replace(' ', '_'): i for i in range(len(header))}
456
457
  table_data = []
@@ -17,10 +17,11 @@
17
17
  import configparser
18
18
  import json
19
19
  import os
20
+ from functools import cache
20
21
  from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union, overload
21
22
 
22
23
  from rucio.common import exception
23
- from rucio.common.exception import ConfigNotFound, DatabaseException
24
+ from rucio.common.exception import ConfigLoadingError, ConfigNotFound, DatabaseException
24
25
 
25
26
  _T = TypeVar('_T')
26
27
  _U = TypeVar('_U')
@@ -656,7 +657,6 @@ def __config_get_table(
656
657
  :raises ConfigNotFound
657
658
  :raises DatabaseException
658
659
  """
659
- global __CONFIG
660
660
  try:
661
661
  from rucio.core.config import get as core_config_get
662
662
  return core_config_get(section, option, default=default, session=session, use_cache=use_cache,
@@ -665,7 +665,7 @@ def __config_get_table(
665
665
  if raise_exception and default is None:
666
666
  raise err
667
667
  if clean_cached:
668
- __CONFIG = None
668
+ clean_cached_config()
669
669
  return default
670
670
 
671
671
 
@@ -753,21 +753,15 @@ def get_rse_credentials(path_to_credentials_file: Optional[Union[str, os.PathLik
753
753
  return credentials
754
754
 
755
755
 
756
- __CONFIG = None
757
-
758
-
756
+ @cache
759
757
  def get_config() -> configparser.ConfigParser:
760
758
  """Factory function for the configuration class. Returns the ConfigParser instance."""
761
- global __CONFIG
762
- if __CONFIG is None:
763
- __CONFIG = Config()
764
- return __CONFIG.parser
759
+ return Config().parser
765
760
 
766
761
 
767
762
  def clean_cached_config() -> None:
768
763
  """Deletes the cached config singleton instance."""
769
- global __CONFIG
770
- __CONFIG = None
764
+ get_config.cache_clear()
771
765
 
772
766
 
773
767
  class Config:
@@ -790,7 +784,4 @@ class Config:
790
784
  '\n\t' + '\n\t'.join(configs))
791
785
 
792
786
  if not self.parser.read(self.configfile) == [self.configfile]:
793
- raise ConfigNotFound(
794
- 'Could not load Rucio configuration file. '
795
- 'Rucio tried loading the following configuration file:'
796
- '\n\t' + self.configfile)
787
+ raise ConfigLoadingError(self.configfile)
@@ -1167,3 +1167,18 @@ class ChecksumCalculationError(RucioException):
1167
1167
  self.filepath = filepath
1168
1168
  self._message = 'An error occurred while calculating the %s checksum of file %s.' % (self.algorithm_name, self.filepath)
1169
1169
  self.error_code = 111
1170
+
1171
+
1172
+ class ConfigLoadingError(RucioException):
1173
+ """
1174
+ An error occurred while loading the configuration.
1175
+ """
1176
+ def __init__(
1177
+ self,
1178
+ config_file: str,
1179
+ *args,
1180
+ **kwargs
1181
+ ):
1182
+ super(ConfigLoadingError, self).__init__(*args, **kwargs)
1183
+ self._message = 'Could not load Rucio configuration file. Rucio tried loading the following configuration file:\n\t %s' % (config_file)
1184
+ self.error_code = 112
@@ -18,6 +18,7 @@ from typing import TYPE_CHECKING, Any, Optional
18
18
 
19
19
  from rucio.common import config
20
20
  from rucio.common.constants import RseAttr
21
+ from rucio.common.exception import ConfigNotFound
21
22
  from rucio.common.plugins import PolicyPackageAlgorithms
22
23
 
23
24
  if TYPE_CHECKING:
@@ -38,7 +39,7 @@ class RSEDeterministicScopeTranslation(PolicyPackageAlgorithms):
38
39
 
39
40
  try:
40
41
  algorithm_name = config.config_get('policy', self._algorithm_type)
41
- except (NoOptionError, NoSectionError, RuntimeError):
42
+ except (ConfigNotFound, NoOptionError, NoSectionError, RuntimeError):
42
43
  logger.debug("PFN2LFN: no algorithm specified in the config.")
43
44
  if super()._supports(self._algorithm_type, vo):
44
45
  algorithm_name = vo
@@ -244,7 +245,7 @@ class RSEDeterministicTranslation(PolicyPackageAlgorithms):
244
245
  policy_module = None
245
246
  try:
246
247
  policy_module = config.config_get('policy', 'lfn2pfn_module')
247
- except (NoOptionError, NoSectionError):
248
+ except (ConfigNotFound, NoOptionError, NoSectionError):
248
249
  pass
249
250
  if policy_module:
250
251
  # TODO: The import of importlib is done like this due to a dependency issue with python 2.6 and incompatibility of the module with py3.x
@@ -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': '36.1.0',
7
+ 'version': '36.2.0',
8
8
  'branch_nick': 'release-36',
9
- 'revision_id': '7f12d78cdec7d780fc888118c5812d67dfbf20b7',
10
- 'revno': 13394
9
+ 'revision_id': 'e9fa6a872d7c83dbe41cd74932267cdc5289cfd3',
10
+ 'revno': 13451
11
11
  }
@@ -138,9 +138,6 @@ tests/test_did.py
138
138
  tests/test_did_meta_plugins.py
139
139
  tests/test_download.py
140
140
  tests/test_dumper.py
141
- tests/test_dumper_consistency.py
142
- tests/test_dumper_data_model.py
143
- tests/test_dumper_path_parsing.py
144
141
  tests/test_filter_engine.py
145
142
  tests/test_gateway_external_representation.py
146
143
  tests/test_heartbeat.py
@@ -0,0 +1,47 @@
1
+ # Copyright European Organization for Nuclear Research (CERN) since 2012
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from io import StringIO
16
+
17
+ from rucio.common import dumper
18
+ from rucio.tests.common import mock_open
19
+
20
+ from .mocks import gfal2
21
+
22
+
23
+ def test_gfal_download_to_file():
24
+ gfal_file = StringIO()
25
+ local_file = StringIO()
26
+ gfal_file.write('content')
27
+ gfal_file.seek(0)
28
+
29
+ with gfal2.mocked_gfal2(dumper, files={'srm://example.com/file': gfal_file}):
30
+ dumper.gfal_download_to_file('srm://example.com/file', local_file)
31
+
32
+ local_file.seek(0)
33
+ assert local_file.read() == 'content'
34
+
35
+
36
+ def test_gfal_download_creates_file_with_content():
37
+ gfal_file = StringIO()
38
+ local_file = StringIO()
39
+ gfal_file.write('content')
40
+ gfal_file.seek(0)
41
+
42
+ with gfal2.mocked_gfal2(dumper, files={'srm://example.com/file': gfal_file}):
43
+ with mock_open(dumper, local_file):
44
+ dumper.gfal_download('srm://example.com/file', 'filename')
45
+
46
+ local_file.seek(0)
47
+ assert local_file.read() == 'content'
@@ -24,7 +24,7 @@ import pytest
24
24
  import requests
25
25
  import stomp
26
26
 
27
- from rucio.common.config import config_get, config_get_int
27
+ from rucio.common.config import config_get, config_get_int, config_get_list
28
28
  from rucio.core.message import add_message, retrieve_messages, truncate_messages
29
29
  from rucio.daemons.hermes import hermes
30
30
  from rucio.tests.common import rse_name_generator, skip_missing_elasticsearch_influxdb_in_env
@@ -140,7 +140,7 @@ def test_hermes(core_config_mock, caches_mock):
140
140
  add_message(
141
141
  "email",
142
142
  {
143
- "to": config_get("messaging-hermes", "email_test").split(","),
143
+ "to": config_get_list("messaging-hermes", "email_test"),
144
144
  "subject": "Half-Life %i" % i,
145
145
  "body": """
146
146
  Good morning, and welcome to the Black Mesa Transit System.
@@ -1,237 +0,0 @@
1
- # Copyright European Organization for Nuclear Research (CERN) since 2012
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- import bz2
16
- import json
17
- import os
18
- import tempfile
19
- from datetime import datetime
20
- from io import StringIO
21
- from unittest import mock
22
-
23
- import pytest
24
- import requests
25
-
26
- from rucio.common import config, dumper
27
- from rucio.tests.common import make_temp_file, mock_open
28
-
29
- from .mocks import gfal2
30
-
31
- DATE_SECONDS = "2015-03-10 14:00:35"
32
- DATE_TENTHS = "2015-03-10T14:00:35.5"
33
- DATE_MILLISECONDS = "2015-03-10T14:00:35.5"
34
- RSEPROTOCOL = {
35
- "hostname": "example.com",
36
- "scheme": "root",
37
- "port": 1094,
38
- "prefix": "//atlasdatadisk/rucio/",
39
- "domains": {
40
- "wan": {
41
- "read": 1,
42
- }
43
- },
44
- }
45
-
46
-
47
- class MockResponse:
48
- def __init__(self, json_data, status_code):
49
- self.json_data = json_data
50
- self.status_code = status_code
51
- self.text = json.dumps(json_data)
52
-
53
- def json(self):
54
- return self.json_data
55
-
56
-
57
- def test_http_download_failed_exception_with_no_semantic_errors():
58
- with pytest.raises(dumper.HTTPDownloadFailed):
59
- raise dumper.HTTPDownloadFailed('some message', 500)
60
-
61
-
62
- def test_error_ends_the_program():
63
- with pytest.raises(SystemExit):
64
- dumper.error('message', 2)
65
-
66
-
67
- def test_cacert_config_returns_a_string():
68
- assert isinstance(dumper.cacert_config(config, '.'), str)
69
-
70
-
71
- @mock.patch('rucio.common.config.config_get')
72
- def test_cacert_config_returns_false_if_no_cert_configured(mock_get):
73
- mock_get.return_value = ''
74
- assert not dumper.cacert_config(config, '.')
75
-
76
-
77
- def test_smart_open_for_text_file():
78
- tmp = make_temp_file('/tmp', 'abcdef')
79
- assert hasattr(dumper.smart_open(tmp), 'read') # check if object is file - python2/3 compatibility
80
- os.unlink(tmp)
81
-
82
-
83
- def test_smart_open_for_bz2_file():
84
- fd, path = tempfile.mkstemp()
85
- comp = bz2.BZ2Compressor()
86
- with os.fdopen(fd, 'wb') as f:
87
- f.write(comp.compress(b'abcdef'))
88
- f.write(comp.flush())
89
- assert not isinstance(dumper.smart_open(path), bz2.BZ2File)
90
- os.unlink(path)
91
-
92
-
93
- def test_temp_file_with_final_name_creates_a_tmp_file_and_then_removes_it():
94
- final_name = tempfile.mktemp()
95
- with dumper.temp_file('/tmp', final_name) as (_, tmp_path):
96
- tmp_path = os.path.join('/tmp', tmp_path)
97
- assert os.path.exists(tmp_path)
98
- assert not os.path.exists(final_name)
99
-
100
- assert os.path.exists(final_name)
101
- assert not os.path.exists(tmp_path)
102
- os.unlink(final_name)
103
-
104
-
105
- def test_temp_file_with_final_name_creates_a_tmp_file_and_keeps_it():
106
- with dumper.temp_file('/tmp') as (_, tmp_path):
107
- tmp_path = os.path.join('/tmp', tmp_path)
108
- assert os.path.exists(tmp_path)
109
-
110
- assert os.path.exists(tmp_path)
111
- os.unlink(tmp_path)
112
-
113
-
114
- def test_temp_file_cleanup_on_exception():
115
- try:
116
- with dumper.temp_file('/tmp') as (_, tmp_path):
117
- tmp_path = os.path.join('/tmp', tmp_path)
118
- raise Exception
119
- except:
120
- pass
121
- finally:
122
- assert not os.path.exists(tmp_path)
123
-
124
-
125
- def test_temp_file_cleanup_on_exception_with_final_name():
126
- final_name = tempfile.mktemp()
127
- try:
128
- with dumper.temp_file('/tmp', final_name) as (_, tmp_path):
129
- tmp_path = os.path.join('/tmp', tmp_path)
130
- raise Exception
131
- except:
132
- pass
133
- finally:
134
- assert not os.path.exists(tmp_path)
135
- assert not os.path.exists(final_name)
136
-
137
-
138
- def test_to_date_format():
139
- assert isinstance(dumper.to_datetime(DATE_SECONDS), datetime)
140
- assert isinstance(dumper.to_datetime(DATE_TENTHS), datetime)
141
- assert isinstance(dumper.to_datetime(DATE_MILLISECONDS), datetime)
142
-
143
-
144
- @mock.patch('rucio.common.dumper.ddmendpoint_preferred_protocol')
145
- def test_ddmendpoint_url_builds_url_from_ddmendpoint_preferred_protocol(mock_get):
146
- mock_get.return_value = RSEPROTOCOL
147
- assert dumper.ddmendpoint_url('SOMEENDPOINT') == 'root://example.com:1094//atlasdatadisk/'
148
-
149
-
150
- @mock.patch('rucio.common.dumper.ddmendpoint_preferred_protocol')
151
- def test_ddmendpoint_url_fails_on_unexistent_entry(mock_get):
152
- mock_get.side_effect = StopIteration()
153
- with pytest.raises(StopIteration):
154
- dumper.ddmendpoint_url('SOMEENDPOINT')
155
-
156
-
157
- @mock.patch('requests.get')
158
- def test_http_download_to_file_without_session_uses_requests_get(mock_get):
159
- response = requests.Response()
160
- response.status_code = 200
161
- response.iter_content = lambda _: ['content']
162
- mock_get.return_value = response
163
- stringio = StringIO()
164
-
165
- dumper.http_download_to_file('http://example.com', stringio)
166
-
167
- stringio.seek(0)
168
- assert stringio.read() == 'content'
169
-
170
-
171
- def test_http_download_to_file_with_session():
172
- response = requests.Response()
173
- response.status_code = 200
174
- response.iter_content = lambda _: ['content']
175
-
176
- stringio = StringIO()
177
- session = requests.Session()
178
- session.get = lambda _: response
179
-
180
- dumper.http_download_to_file('http://example.com', stringio, session)
181
- stringio.seek(0)
182
- assert stringio.read() == 'content'
183
-
184
-
185
- def test_http_download_to_file_throws_exception_on_error():
186
- response = requests.Response()
187
- response.status_code = 404
188
- response.iter_content = lambda _: ['content']
189
-
190
- stringio = StringIO()
191
- session = requests.Session()
192
- session.get = lambda _: response
193
-
194
- with pytest.raises(dumper.HTTPDownloadFailed):
195
- dumper.http_download_to_file('http://example.com', stringio, session)
196
-
197
-
198
- @mock.patch('requests.get')
199
- def test_http_download_creates_file_with_content(mock_get):
200
- response = requests.Response()
201
- response.status_code = 200
202
- response.iter_content = lambda _: ['abc']
203
- stringio = StringIO()
204
- mock_get.return_value = response
205
-
206
- with mock_open(dumper, stringio):
207
- dumper.http_download('http://example.com', 'filename')
208
-
209
- stringio.seek(0)
210
- assert stringio.read() == 'abc'
211
-
212
-
213
- def test_gfal_download_to_file():
214
- gfal_file = StringIO()
215
- local_file = StringIO()
216
- gfal_file.write('content')
217
- gfal_file.seek(0)
218
-
219
- with gfal2.mocked_gfal2(dumper, files={'srm://example.com/file': gfal_file}):
220
- dumper.gfal_download_to_file('srm://example.com/file', local_file)
221
-
222
- local_file.seek(0)
223
- assert local_file.read() == 'content'
224
-
225
-
226
- def test_gfal_download_creates_file_with_content():
227
- gfal_file = StringIO()
228
- local_file = StringIO()
229
- gfal_file.write('content')
230
- gfal_file.seek(0)
231
-
232
- with gfal2.mocked_gfal2(dumper, files={'srm://example.com/file': gfal_file}):
233
- with mock_open(dumper, local_file):
234
- dumper.gfal_download('srm://example.com/file', 'filename')
235
-
236
- local_file.seek(0)
237
- assert local_file.read() == 'content'