diracx 0.0.4__tar.gz → 0.0.5__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.
Files changed (446) hide show
  1. diracx-0.0.5/.github/workflows/update_chart_version.py +338 -0
  2. {diracx-0.0.4 → diracx-0.0.5}/.pre-commit-config.yaml +1 -1
  3. {diracx-0.0.4 → diracx-0.0.5}/CHANGELOG.md +18 -0
  4. {diracx-0.0.4 → diracx-0.0.5}/PKG-INFO +1 -1
  5. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/auth/db.py +4 -0
  6. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/utils/base.py +6 -0
  7. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/authorize_code_flow.py +6 -0
  8. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/device_flow.py +6 -0
  9. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/management.py +5 -1
  10. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/configuration.py +6 -1
  11. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/factory.py +15 -5
  12. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/health/probes.py +6 -0
  13. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/utils/users.py +4 -0
  14. diracx-0.0.4/.github/workflows/update_chart_version.py +0 -158
  15. {diracx-0.0.4 → diracx-0.0.5}/.coveragerc +0 -0
  16. {diracx-0.0.4 → diracx-0.0.5}/.gitattributes +0 -0
  17. {diracx-0.0.4 → diracx-0.0.5}/.github/dependabot.yml +0 -0
  18. {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/deployment.yml +0 -0
  19. {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/generate_pixi_tasks_doc.py +0 -0
  20. {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/integration.yml +0 -0
  21. {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/main.yml +0 -0
  22. {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/release-please.yml +0 -0
  23. {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/update_security_txt_expiry.yml +0 -0
  24. {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/vulnerabilities.yml +0 -0
  25. {diracx-0.0.4 → diracx-0.0.5}/.gitignore +0 -0
  26. {diracx-0.0.4 → diracx-0.0.5}/.readthedocs.yaml +0 -0
  27. {diracx-0.0.4 → diracx-0.0.5}/LICENSE +0 -0
  28. {diracx-0.0.4 → diracx-0.0.5}/MANIFEST.in +0 -0
  29. {diracx-0.0.4 → diracx-0.0.5}/README.md +0 -0
  30. {diracx-0.0.4 → diracx-0.0.5}/codecov.yml +0 -0
  31. {diracx-0.0.4 → diracx-0.0.5}/containers/client/Dockerfile +0 -0
  32. {diracx-0.0.4 → diracx-0.0.5}/containers/services/Dockerfile +0 -0
  33. {diracx-0.0.4 → diracx-0.0.5}/diracx-api/README.md +0 -0
  34. {diracx-0.0.4 → diracx-0.0.5}/diracx-api/pyproject.toml +0 -0
  35. {diracx-0.0.4 → diracx-0.0.5}/diracx-api/src/diracx/api/__init__.py +0 -0
  36. {diracx-0.0.4 → diracx-0.0.5}/diracx-api/src/diracx/api/jobs.py +0 -0
  37. {diracx-0.0.4 → diracx-0.0.5}/diracx-api/src/diracx/api/py.typed +0 -0
  38. {diracx-0.0.4 → diracx-0.0.5}/diracx-api/src/diracx/api/utils.py +0 -0
  39. {diracx-0.0.4 → diracx-0.0.5}/diracx-api/tests/test_jobs.py +0 -0
  40. {diracx-0.0.4 → diracx-0.0.5}/diracx-api/tests/test_utils.py +0 -0
  41. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/README.md +0 -0
  42. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/pyproject.toml +0 -0
  43. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/__init__.py +0 -0
  44. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/__main__.py +0 -0
  45. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/auth.py +0 -0
  46. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/config.py +0 -0
  47. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/internal/__init__.py +0 -0
  48. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/internal/config.py +0 -0
  49. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/internal/legacy.py +0 -0
  50. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/jobs.py +0 -0
  51. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/py.typed +0 -0
  52. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/utils.py +0 -0
  53. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/cs_sync/integration_test.cfg +0 -0
  54. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/cs_sync/integration_test.yaml +0 -0
  55. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/cs_sync/integration_test_buggy.cfg +0 -0
  56. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/cs_sync/integration_test_secret.cfg +0 -0
  57. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/cs_sync/test_cssync.py +0 -0
  58. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/test_legacy.py +0 -0
  59. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/test_internal.py +0 -0
  60. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/test_jobs.py +0 -0
  61. {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/test_login.py +0 -0
  62. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/README.md +0 -0
  63. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/pyproject.toml +0 -0
  64. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/_diracx_client_importer.pth +0 -0
  65. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/_client_importer.py +0 -0
  66. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/__init__.py +0 -0
  67. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/__init__.py +0 -0
  68. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_client.py +0 -0
  69. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_configuration.py +0 -0
  70. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_patch.py +0 -0
  71. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_serialization.py +0 -0
  72. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_utils/__init__.py +0 -0
  73. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_utils/serialization.py +0 -0
  74. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_utils/utils.py +0 -0
  75. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_vendor.py +0 -0
  76. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/__init__.py +0 -0
  77. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/_client.py +0 -0
  78. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/_configuration.py +0 -0
  79. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/_patch.py +0 -0
  80. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/_vendor.py +0 -0
  81. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/operations/__init__.py +0 -0
  82. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/operations/_operations.py +0 -0
  83. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/operations/_patch.py +0 -0
  84. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/models/__init__.py +0 -0
  85. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/models/_enums.py +0 -0
  86. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/models/_models.py +0 -0
  87. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/models/_patch.py +0 -0
  88. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/operations/__init__.py +0 -0
  89. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/operations/_operations.py +0 -0
  90. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/operations/_patch.py +0 -0
  91. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/py.typed +0 -0
  92. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/aio.py +0 -0
  93. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/models.py +0 -0
  94. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/auth/aio.py +0 -0
  95. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/auth/common.py +0 -0
  96. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/auth/sync.py +0 -0
  97. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/client/aio.py +0 -0
  98. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/client/common.py +0 -0
  99. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/client/sync.py +0 -0
  100. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/jobs/aio.py +0 -0
  101. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/jobs/common.py +0 -0
  102. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/jobs/sync.py +0 -0
  103. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/utils.py +0 -0
  104. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/py.typed +0 -0
  105. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/sync.py +0 -0
  106. {diracx-0.0.4 → diracx-0.0.5}/diracx-client/tests/test_auth.py +0 -0
  107. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/README.md +0 -0
  108. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/pyproject.toml +0 -0
  109. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/__init__.py +0 -0
  110. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/config/__init__.py +0 -0
  111. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/config/schema.py +0 -0
  112. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/config/sources.py +0 -0
  113. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/exceptions.py +0 -0
  114. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/extensions.py +0 -0
  115. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/models.py +0 -0
  116. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/preferences.py +0 -0
  117. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/properties.py +0 -0
  118. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/py.typed +0 -0
  119. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/resources.py +0 -0
  120. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/s3.py +0 -0
  121. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/settings.py +0 -0
  122. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/utils.py +0 -0
  123. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_config_source.py +0 -0
  124. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_entry_points.py +0 -0
  125. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_extensions.py +0 -0
  126. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_resources.py +0 -0
  127. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_s3.py +0 -0
  128. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_schema_legacy_adaptor.py +0 -0
  129. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_secrets.py +0 -0
  130. {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_utils.py +0 -0
  131. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/README.md +0 -0
  132. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/pyproject.toml +0 -0
  133. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/__init__.py +0 -0
  134. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/__main__.py +0 -0
  135. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/exceptions.py +0 -0
  136. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/os/__init__.py +0 -0
  137. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/os/job_parameters.py +0 -0
  138. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/os/utils.py +0 -0
  139. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/py.typed +0 -0
  140. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/__init__.py +0 -0
  141. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/auth/__init__.py +0 -0
  142. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/auth/schema.py +0 -0
  143. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/dummy/__init__.py +0 -0
  144. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/dummy/db.py +0 -0
  145. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/dummy/schema.py +0 -0
  146. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job/__init__.py +0 -0
  147. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job/db.py +0 -0
  148. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job/schema.py +0 -0
  149. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job_logging/__init__.py +0 -0
  150. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job_logging/db.py +0 -0
  151. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job_logging/schema.py +0 -0
  152. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/pilot_agents/__init__.py +0 -0
  153. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/pilot_agents/db.py +0 -0
  154. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/pilot_agents/schema.py +0 -0
  155. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/sandbox_metadata/__init__.py +0 -0
  156. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/sandbox_metadata/db.py +0 -0
  157. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/sandbox_metadata/schema.py +0 -0
  158. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/task_queue/__init__.py +0 -0
  159. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/task_queue/db.py +0 -0
  160. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/task_queue/schema.py +0 -0
  161. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/utils/__init__.py +0 -0
  162. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/utils/functions.py +0 -0
  163. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/utils/types.py +0 -0
  164. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/auth/test_authorization_flow.py +0 -0
  165. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/auth/test_device_flow.py +0 -0
  166. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/auth/test_refresh_token.py +0 -0
  167. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/jobs/test_job_db.py +0 -0
  168. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/jobs/test_job_logging_db.py +0 -0
  169. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/jobs/test_sandbox_metadata.py +0 -0
  170. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/opensearch/test_connection.py +0 -0
  171. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/opensearch/test_index_template.py +0 -0
  172. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/opensearch/test_search.py +0 -0
  173. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/pilot_agents/__init__.py +0 -0
  174. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/pilot_agents/test_pilot_agents_db.py +0 -0
  175. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/test_dummy_db.py +0 -0
  176. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/test_freeze_time.py +0 -0
  177. {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/utils/test_uuid.py +0 -0
  178. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/README.md +0 -0
  179. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/pyproject.toml +0 -0
  180. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/__init__.py +0 -0
  181. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/__main__.py +0 -0
  182. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/__init__.py +0 -0
  183. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/authorize_code_flow.py +0 -0
  184. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/device_flow.py +0 -0
  185. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/management.py +0 -0
  186. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/token.py +0 -0
  187. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/utils.py +0 -0
  188. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/well_known.py +0 -0
  189. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/__init__.py +0 -0
  190. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/query.py +0 -0
  191. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/sandboxes.py +0 -0
  192. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/status.py +0 -0
  193. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/submission.py +0 -0
  194. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/utils.py +0 -0
  195. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/py.typed +0 -0
  196. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/task_queues/__init__.py +0 -0
  197. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/task_queues/priority.py +0 -0
  198. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/tests/jobs/test_sandboxes.py +0 -0
  199. {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/tests/jobs/test_status.py +0 -0
  200. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/README.md +0 -0
  201. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/pyproject.toml +0 -0
  202. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/__init__.py +0 -0
  203. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/access_policies.py +0 -0
  204. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/__init__.py +0 -0
  205. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/token.py +0 -0
  206. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/utils.py +0 -0
  207. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/well_known.py +0 -0
  208. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/dependencies.py +0 -0
  209. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/fastapi_classes.py +0 -0
  210. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/health/__init__.py +0 -0
  211. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/__init__.py +0 -0
  212. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/access_policies.py +0 -0
  213. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/legacy.py +0 -0
  214. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/query.py +0 -0
  215. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/sandboxes.py +0 -0
  216. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/status.py +0 -0
  217. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/submission.py +0 -0
  218. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/otel.py +0 -0
  219. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/py.typed +0 -0
  220. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/utils/__init__.py +0 -0
  221. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/auth/test_legacy_exchange.py +0 -0
  222. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/auth/test_standard.py +0 -0
  223. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
  224. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/health/test_probes.py +0 -0
  225. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/jobs/conftest.py +0 -0
  226. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/jobs/test_query.py +0 -0
  227. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/jobs/test_sandboxes.py +0 -0
  228. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/jobs/test_status.py +0 -0
  229. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/jobs/test_wms_access_policy.py +0 -0
  230. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/test_config_manager.py +0 -0
  231. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/test_generic.py +0 -0
  232. {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/test_policy.py +0 -0
  233. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/README.md +0 -0
  234. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/pyproject.toml +0 -0
  235. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/__init__.py +0 -0
  236. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/__main__.py +0 -0
  237. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/client_generation.py +0 -0
  238. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/client_generation_pytest.py +0 -0
  239. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/dummy_osdb.py +0 -0
  240. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/entrypoints.py +0 -0
  241. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/mock_osdb.py +0 -0
  242. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/osdb.py +0 -0
  243. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/routers.py +0 -0
  244. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/scripts/collect_demo_coverage.sh +0 -0
  245. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/time.py +0 -0
  246. {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/utils.py +0 -0
  247. {diracx-0.0.4 → diracx-0.0.5}/docs/SECURITY.md +0 -0
  248. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/auth-with-diracx.md +0 -0
  249. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/auth-with-external.md +0 -0
  250. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/configuration.md +0 -0
  251. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/opentelemetry.md +0 -0
  252. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/sandbox-store.md +0 -0
  253. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/user-management.md +0 -0
  254. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/connect.md +0 -0
  255. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/convert-cs.md +0 -0
  256. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/embracing.md +0 -0
  257. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/index.md +0 -0
  258. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/minimal-requirements.md +0 -0
  259. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/register-a-vo.md +0 -0
  260. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/register-the-admin-vo.md +0 -0
  261. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/index.md +0 -0
  262. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/reference/env-variables.md +0 -0
  263. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/reference/security_model.md +0 -0
  264. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/reference/settings-and-preferences.md +0 -0
  265. {diracx-0.0.4 → diracx-0.0.5}/docs/admin/tutorials/authentication.md +0 -0
  266. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/css/extra.css +0 -0
  267. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/css/fontawesome-all.min.css +0 -0
  268. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/css/images/arrow.svg +0 -0
  269. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/css/images/overlay.png +0 -0
  270. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/css/main.css +0 -0
  271. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/home.html +0 -0
  272. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/images/diracx-logo-square.svg +0 -0
  273. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/images/logo.svg +0 -0
  274. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/styles/extra.css +0 -0
  275. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/webfonts/fa-brands-400.woff2 +0 -0
  276. {diracx-0.0.4 → diracx-0.0.5}/docs/assets/webfonts/fa-solid-900.woff +0 -0
  277. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/api.md +0 -0
  278. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/cli.md +0 -0
  279. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/client.md +0 -0
  280. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/db.md +0 -0
  281. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/index.md +0 -0
  282. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/routes.md +0 -0
  283. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/designing-functionality.md +0 -0
  284. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/extensions.md +0 -0
  285. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/index.md +0 -0
  286. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/testing.md +0 -0
  287. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-cli-command.md +0 -0
  288. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-db.md +0 -0
  289. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-route.md +0 -0
  290. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-setting.md +0 -0
  291. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-task.md +0 -0
  292. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-test.md +0 -0
  293. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-functionality/index.md +0 -0
  294. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/client-customization.md +0 -0
  295. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/client-extension.md +0 -0
  296. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/client-generation.md +0 -0
  297. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/contribute.md +0 -0
  298. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/develop-legacy-dirac.md +0 -0
  299. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/extend-diracx/index.md +0 -0
  300. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/use-the-demo/index.md +0 -0
  301. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/use-the-demo/swagger.md +0 -0
  302. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/use-the-demo/web.md +0 -0
  303. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/index.md +0 -0
  304. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/application-state.md +0 -0
  305. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/client-metapathfinder.md +0 -0
  306. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/coding-conventions.md +0 -0
  307. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/configuration.md +0 -0
  308. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/db-transaction-model.md +0 -0
  309. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/dependency-injection.md +0 -0
  310. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/entrypoints.md +0 -0
  311. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/env-variables.md +0 -0
  312. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/pixi-tasks.md +0 -0
  313. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/security-policies.md +0 -0
  314. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/security-properties.md +0 -0
  315. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/test-recipes.md +0 -0
  316. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/writing-tests.md +0 -0
  317. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/advanced-tutorial.md +0 -0
  318. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/develop-web.md +0 -0
  319. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/getting-started.md +0 -0
  320. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/larger-developments.md +0 -0
  321. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/making-changes.md +0 -0
  322. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/play-with-auth.md +0 -0
  323. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/run-locally.md +0 -0
  324. {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/write-docs.md +0 -0
  325. {diracx-0.0.4 → diracx-0.0.5}/docs/index.md +0 -0
  326. {diracx-0.0.4 → diracx-0.0.5}/docs/overrides/main.html +0 -0
  327. {diracx-0.0.4 → diracx-0.0.5}/docs/roadmap.md +0 -0
  328. {diracx-0.0.4 → diracx-0.0.5}/docs/user/index.md +0 -0
  329. {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/client-configuration.md +0 -0
  330. {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/known-installations.md +0 -0
  331. {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/programmatic-usage/command-line-interface.md +0 -0
  332. {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/programmatic-usage/https-interface.md +0 -0
  333. {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/programmatic-usage/index.md +0 -0
  334. {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/programmatic-usage/python-interface.md +0 -0
  335. {diracx-0.0.4 → diracx-0.0.5}/docs/user/tutorials/getting-started.md +0 -0
  336. {diracx-0.0.4 → diracx-0.0.5}/extensions/containers/client/Dockerfile +0 -0
  337. {diracx-0.0.4 → diracx-0.0.5}/extensions/containers/services/Dockerfile +0 -0
  338. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/.github/workflows/main.yml +0 -0
  339. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/README.md +0 -0
  340. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-api/README.md +0 -0
  341. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-api/pyproject.toml +0 -0
  342. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-api/src/gubbins/api/__init__.py +0 -0
  343. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-api/src/gubbins/api/py.typed +0 -0
  344. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-api/tests/test_gubbins_api.py +0 -0
  345. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/README.md +0 -0
  346. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/pyproject.toml +0 -0
  347. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/src/gubbins/cli/__init__.py +0 -0
  348. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/src/gubbins/cli/config.py +0 -0
  349. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/src/gubbins/cli/lollygag.py +0 -0
  350. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/src/gubbins/cli/py.typed +0 -0
  351. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/tests/test_gubbins_cli.py +0 -0
  352. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/README.md +0 -0
  353. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/pyproject.toml +0 -0
  354. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/__init__.py +0 -0
  355. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/__init__.py +0 -0
  356. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_client.py +0 -0
  357. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_configuration.py +0 -0
  358. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_patch.py +0 -0
  359. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_serialization.py +0 -0
  360. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/__init__.py +0 -0
  361. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/serialization.py +0 -0
  362. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/utils.py +0 -0
  363. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_vendor.py +0 -0
  364. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/__init__.py +0 -0
  365. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_client.py +0 -0
  366. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_configuration.py +0 -0
  367. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_patch.py +0 -0
  368. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_vendor.py +0 -0
  369. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/__init__.py +0 -0
  370. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_operations.py +0 -0
  371. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_patch.py +0 -0
  372. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/__init__.py +0 -0
  373. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_enums.py +0 -0
  374. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_models.py +0 -0
  375. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/__init__.py +0 -0
  376. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_operations.py +0 -0
  377. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_patch.py +0 -0
  378. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/py.typed +0 -0
  379. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/aio.py +0 -0
  380. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/models.py +0 -0
  381. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/py.typed +0 -0
  382. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/sync.py +0 -0
  383. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/tests/test_gubbins_client.py +0 -0
  384. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/README.md +0 -0
  385. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/pyproject.toml +0 -0
  386. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/__init__.py +0 -0
  387. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/config/__init__.py +0 -0
  388. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/config/schema.py +0 -0
  389. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/models.py +0 -0
  390. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/properties.py +0 -0
  391. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/py.typed +0 -0
  392. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/tests/test_config.py +0 -0
  393. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/tests/test_properties.py +0 -0
  394. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/README.md +0 -0
  395. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/pyproject.toml +0 -0
  396. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/__init__.py +0 -0
  397. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/py.typed +0 -0
  398. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/__init__.py +0 -0
  399. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/__init__.py +0 -0
  400. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/db.py +0 -0
  401. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/schema.py +0 -0
  402. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/__init__.py +0 -0
  403. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/db.py +0 -0
  404. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/schema.py +0 -0
  405. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/tests/test_gubbins_job_db.py +0 -0
  406. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/tests/test_lollygag_db.py +0 -0
  407. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/README.md +0 -0
  408. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/pyproject.toml +0 -0
  409. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/__init__.py +0 -0
  410. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/__init__.py +0 -0
  411. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/well_known.py +0 -0
  412. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/__init__.py +0 -0
  413. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/lollygag.py +0 -0
  414. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/py.typed +0 -0
  415. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/tests/test_gubbins_logic.py +0 -0
  416. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/README.md +0 -0
  417. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/pyproject.toml +0 -0
  418. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/__init__.py +0 -0
  419. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/dependencies.py +0 -0
  420. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/__init__.py +0 -0
  421. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/access_policy.py +0 -0
  422. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/lollygag.py +0 -0
  423. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/py.typed +0 -0
  424. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/well_known.py +0 -0
  425. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
  426. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/tests/test_gubbins_job_manager.py +0 -0
  427. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/tests/test_lollybag.py +0 -0
  428. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/tests/test_wellknown.py +0 -0
  429. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-testing/README.md +0 -0
  430. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-testing/pyproject.toml +0 -0
  431. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-testing/src/gubbins/testing/__init__.py +0 -0
  432. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/pixi.toml +0 -0
  433. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/pyproject.toml +0 -0
  434. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/release.notes +0 -0
  435. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins-charts/.gitignore +0 -0
  436. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins-charts/Chart.yaml +0 -0
  437. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins-charts/README.md +0 -0
  438. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins-charts/values.yaml +0 -0
  439. {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins_values.yaml +0 -0
  440. {diracx-0.0.4 → diracx-0.0.5}/mkdocs.yml +0 -0
  441. {diracx-0.0.4 → diracx-0.0.5}/pixi.toml +0 -0
  442. {diracx-0.0.4 → diracx-0.0.5}/pyproject.toml +0 -0
  443. {diracx-0.0.4 → diracx-0.0.5}/run_local.sh +0 -0
  444. {diracx-0.0.4 → diracx-0.0.5}/tests/__init__.py +0 -0
  445. {diracx-0.0.4 → diracx-0.0.5}/tests/make_token_local.py +0 -0
  446. {diracx-0.0.4 → diracx-0.0.5}/tests/test_generic.py +0 -0
@@ -0,0 +1,338 @@
1
+ #!/usr/bin/env python3
2
+ """Script to update chart versions based on DiracX releases."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import re
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ import requests
12
+ import yaml
13
+
14
+
15
+ def parse_version(version_str: str) -> tuple[int, int, int, str | None]:
16
+ """Parse a semantic version string into components.
17
+
18
+ Args:
19
+ version_str: Version string like "1.0.0-alpha.1"
20
+
21
+ Returns:
22
+ Tuple of (major, minor, patch, pre_release_suffix)
23
+
24
+ """
25
+ # Remove leading 'v' if present
26
+ version_str = version_str.lstrip("v")
27
+
28
+ # Pattern for semver with optional pre-release
29
+ pattern = r"^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$"
30
+ match = re.match(pattern, version_str)
31
+
32
+ if not match:
33
+ raise ValueError(f"Invalid version format: {version_str}")
34
+
35
+ major, minor, patch, pre_release = match.groups()
36
+ return int(major), int(minor), int(patch), pre_release
37
+
38
+
39
+ def bump_version(current_version: str) -> str:
40
+ """Bump a version automatically - alpha if present, else patch.
41
+
42
+ Args:
43
+ current_version: Current version string
44
+
45
+ Returns:
46
+ New version string
47
+
48
+ """
49
+ major, minor, patch, pre_release = parse_version(current_version)
50
+
51
+ if pre_release and pre_release.startswith("alpha."):
52
+ # Increment alpha number
53
+ alpha_match = re.match(r"alpha\.(\d+)", pre_release)
54
+ if alpha_match:
55
+ alpha_num = int(alpha_match.group(1)) + 1
56
+ return f"{major}.{minor}.{patch}-alpha.{alpha_num}"
57
+ else:
58
+ # Invalid alpha format, start with alpha.1
59
+ return f"{major}.{minor}.{patch}-alpha.1"
60
+ else:
61
+ # No alpha suffix, bump patch version
62
+ return f"{major}.{minor}.{patch + 1}"
63
+
64
+
65
+ def update_chart_yaml(
66
+ chart_path: Path,
67
+ app_version: str,
68
+ new_chart_version: str,
69
+ dependency_name: str | None = None,
70
+ dependency_version: str | None = None,
71
+ ) -> None:
72
+ """Update Chart.yaml with new versions.
73
+
74
+ Args:
75
+ chart_path: Path to Chart.yaml
76
+ app_version: New application version
77
+ new_chart_version: New chart version
78
+ dependency_name: Optional name of dependency to update
79
+ dependency_version: Optional version for the dependency
80
+
81
+ """
82
+ content = chart_path.read_text()
83
+
84
+ # Update appVersion
85
+ content = re.sub(
86
+ r"^appVersion:\s*.*$",
87
+ f"appVersion: {app_version}",
88
+ content,
89
+ flags=re.MULTILINE,
90
+ )
91
+
92
+ # Update version
93
+ content = re.sub(
94
+ r"^version:\s*.*$",
95
+ f'version: "{new_chart_version}"',
96
+ content,
97
+ flags=re.MULTILINE,
98
+ )
99
+
100
+ # Update dependency version if specified
101
+ if dependency_name and dependency_version:
102
+ # Use YAML to properly update the dependency
103
+ chart_data = yaml.safe_load(content)
104
+ if "dependencies" in chart_data:
105
+ for dep in chart_data["dependencies"]:
106
+ if dep.get("name") == dependency_name:
107
+ dep["version"] = dependency_version
108
+ break
109
+ # Use regex for dependency update to preserve formatting
110
+ # Match the dependency block and update the version
111
+ name_pat = re.escape(dependency_name)
112
+ dep_pattern = (
113
+ rf'(- name:\s*{name_pat}\s*\n(?:.*\n)*?\s*version:\s*)("[^"]*"|[^\n]*)'
114
+ )
115
+ content = re.sub(dep_pattern, rf'\g<1>"{dependency_version}"', content)
116
+
117
+ chart_path.write_text(content)
118
+
119
+
120
+ def update_values_yaml(
121
+ values_path: Path, app_version: str, image_tag_path: str
122
+ ) -> None:
123
+ """Update values.yaml with new image tag.
124
+
125
+ Args:
126
+ values_path: Path to values.yaml
127
+ app_version: New application version to set as image tag
128
+ image_tag_path: Dot-separated path to the image tag field (e.g., "global.images.tag")
129
+
130
+ """
131
+ content = values_path.read_text()
132
+ data = yaml.safe_load(content)
133
+
134
+ # Navigate to the parent of the tag field and update it
135
+ path_parts = image_tag_path.split(".")
136
+ current = data
137
+ for part in path_parts[:-1]:
138
+ if part not in current:
139
+ print(f"Warning: Path '{part}' not found in values.yaml")
140
+ return
141
+ current = current[part]
142
+
143
+ tag_key = path_parts[-1]
144
+ if tag_key not in current:
145
+ print(f"Warning: Key '{tag_key}' not found at path in values.yaml")
146
+ return
147
+
148
+ old_value = current[tag_key]
149
+ current[tag_key] = app_version
150
+
151
+ # Use regex to preserve formatting - find and replace the specific value
152
+ # Build a regex pattern that matches the nested structure
153
+ # This is more reliable than re-serializing the entire YAML
154
+ def build_yaml_path_pattern(parts: list[str], value: str) -> tuple[str, str]:
155
+ """Build a regex pattern to find and replace a nested YAML value."""
156
+ # For simple cases, we use a pattern that finds the key and its value
157
+ # at the appropriate nesting level
158
+ key = parts[-1]
159
+ # Match the key followed by its value, being careful about indentation
160
+ pattern = rf"({re.escape(key)}:\s*)({re.escape(str(value))})"
161
+ replacement = rf"\g<1>{app_version}"
162
+ return pattern, replacement
163
+
164
+ pattern, replacement = build_yaml_path_pattern(path_parts, str(old_value))
165
+ new_content = re.sub(pattern, replacement, content, count=1)
166
+
167
+ if new_content == content:
168
+ # Fallback: if regex didn't match, dump the modified YAML
169
+ print("Warning: Using YAML dump fallback for values.yaml update")
170
+ new_content = yaml.dump(data, default_flow_style=False, sort_keys=False)
171
+
172
+ values_path.write_text(new_content)
173
+
174
+
175
+ def lookup_dependency_chart_version(
176
+ index_url: str, dependency_name: str, app_version: str
177
+ ) -> str | None:
178
+ """Look up the chart version for a dependency given its app version.
179
+
180
+ Args:
181
+ index_url: URL to the Helm chart index.yaml
182
+ dependency_name: Name of the dependency chart
183
+ app_version: Application version to match
184
+
185
+ Returns:
186
+ The chart version that matches the app version, or None if not found
187
+
188
+ """
189
+ print(f"Fetching chart index from {index_url}...")
190
+ response = requests.get(index_url, timeout=30)
191
+ response.raise_for_status()
192
+
193
+ index_data = yaml.safe_load(response.text)
194
+
195
+ if "entries" not in index_data:
196
+ print("Error: No entries found in chart index")
197
+ return None
198
+
199
+ if dependency_name not in index_data["entries"]:
200
+ print(f"Error: Dependency '{dependency_name}' not found in chart index")
201
+ return None
202
+
203
+ # Normalize the app version for comparison (remove 'v' prefix if present)
204
+ normalized_app_version = app_version.lstrip("v")
205
+
206
+ # Find the chart version with matching appVersion
207
+ for entry in index_data["entries"][dependency_name]:
208
+ entry_app_version = str(entry.get("appVersion", "")).lstrip("v")
209
+ if entry_app_version == normalized_app_version:
210
+ chart_version = entry.get("version")
211
+ print(
212
+ f"Found {dependency_name} chart version {chart_version} "
213
+ f"for app version {app_version}"
214
+ )
215
+ return chart_version
216
+
217
+ print(
218
+ f"Warning: No chart found for {dependency_name} with app version {app_version}"
219
+ )
220
+ return None
221
+
222
+
223
+ def main() -> None:
224
+ """Main function."""
225
+ parser = argparse.ArgumentParser(
226
+ description="Update chart versions for DiracX release"
227
+ )
228
+ parser.add_argument(
229
+ "--charts-dir", type=Path, default=".", help="Path to charts directory"
230
+ )
231
+ parser.add_argument(
232
+ "--chart-subdir",
233
+ type=str,
234
+ default="diracx",
235
+ help="Subdirectory containing chart files (use '.' for root)",
236
+ )
237
+ parser.add_argument(
238
+ "--app-version",
239
+ required=True,
240
+ help="Application version (e.g., v0.0.1a49)",
241
+ )
242
+ parser.add_argument(
243
+ "--image-tag-path",
244
+ type=str,
245
+ default="global.images.tag",
246
+ help="Dot-separated YAML path to image tag in values.yaml",
247
+ )
248
+ parser.add_argument(
249
+ "--update-dependency",
250
+ type=str,
251
+ help="Name of dependency to update in Chart.yaml",
252
+ )
253
+ parser.add_argument(
254
+ "--dependency-app-version",
255
+ type=str,
256
+ help="App version to match for the dependency",
257
+ )
258
+ parser.add_argument(
259
+ "--dependency-chart-index",
260
+ type=str,
261
+ default="https://charts.diracgrid.org/index.yaml",
262
+ help="URL to the dependency's chart index.yaml",
263
+ )
264
+
265
+ args = parser.parse_args()
266
+
267
+ # Determine chart subdirectory
268
+ if args.chart_subdir == ".":
269
+ chart_subdir = args.charts_dir
270
+ else:
271
+ chart_subdir = args.charts_dir / args.chart_subdir
272
+
273
+ # Define paths
274
+ chart_yaml = chart_subdir / "Chart.yaml"
275
+ values_yaml = chart_subdir / "values.yaml"
276
+
277
+ if not chart_yaml.exists():
278
+ print(f"Error: Chart.yaml not found at {chart_yaml}")
279
+ sys.exit(1)
280
+
281
+ if not values_yaml.exists():
282
+ print(f"Error: values.yaml not found at {values_yaml}")
283
+ sys.exit(1)
284
+
285
+ # Get current chart version using YAML parser to handle comments correctly
286
+ chart_content = chart_yaml.read_text()
287
+ chart_data = yaml.safe_load(chart_content)
288
+ version_match = chart_data.get("version")
289
+
290
+ if not version_match:
291
+ print("Error: Could not find version in Chart.yaml")
292
+ sys.exit(1)
293
+
294
+ current_chart_version = str(version_match)
295
+ print(f"Current chart version: {current_chart_version}")
296
+
297
+ # Calculate new chart version (alpha if present, else patch)
298
+ new_chart_version = bump_version(current_chart_version)
299
+ print(f"New chart version: {new_chart_version}")
300
+
301
+ # Look up dependency chart version if needed
302
+ dependency_version = None
303
+ if args.update_dependency:
304
+ if not args.dependency_app_version:
305
+ parser.error("--update-dependency requires --dependency-app-version")
306
+ dependency_version = lookup_dependency_chart_version(
307
+ args.dependency_chart_index,
308
+ args.update_dependency,
309
+ args.dependency_app_version,
310
+ )
311
+ if not dependency_version:
312
+ print(
313
+ f"Error: Could not find chart version for {args.update_dependency} "
314
+ f"with app version {args.dependency_app_version}"
315
+ )
316
+ sys.exit(1)
317
+
318
+ # Update files
319
+ print("Updating Chart.yaml...")
320
+ update_chart_yaml(
321
+ chart_yaml,
322
+ args.app_version,
323
+ new_chart_version,
324
+ args.update_dependency,
325
+ dependency_version,
326
+ )
327
+
328
+ print("Updating values.yaml...")
329
+ update_values_yaml(values_yaml, args.app_version, args.image_tag_path)
330
+
331
+ print(f"Successfully updated charts for app version {args.app_version}")
332
+ print(f"Chart version: {current_chart_version} -> {new_chart_version}")
333
+ if dependency_version:
334
+ print(f"Dependency {args.update_dependency} version: {dependency_version}")
335
+
336
+
337
+ if __name__ == "__main__":
338
+ main()
@@ -30,7 +30,7 @@ repos:
30
30
  - id: check-added-large-files
31
31
 
32
32
  - repo: https://github.com/astral-sh/ruff-pre-commit
33
- rev: 'v0.14.11'
33
+ rev: 'v0.14.13'
34
34
  hooks:
35
35
  - id: ruff
36
36
  args: ["--fix", "--show-fixes"]
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.5](https://github.com/DIRACGrid/diracx/compare/v0.0.4...v0.0.5) (2026-01-20)
4
+
5
+
6
+ ### Features
7
+
8
+ * add logging for error conditions and edge cases ([#734](https://github.com/DIRACGrid/diracx/issues/734)) ([2c8b5c6](https://github.com/DIRACGrid/diracx/commit/2c8b5c682f17270e341deaf23cd4a7b4b7c4dd0a))
9
+ * extend update_chart_version.py for downstream charts ([#731](https://github.com/DIRACGrid/diracx/issues/731)) ([b1a293b](https://github.com/DIRACGrid/diracx/commit/b1a293b01ad062d162afdfb5377a76c95eb09913))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * use YAML parser for chart version to handle comments ([9516971](https://github.com/DIRACGrid/diracx/commit/95169716206bb476f450fff8fd228ada649fef5b))
15
+
16
+
17
+ ### Miscellaneous Chores
18
+
19
+ * release 0.0.5 ([c0f166b](https://github.com/DIRACGrid/diracx/commit/c0f166bf29e1ed0ac2b5aa89ebb39ac60cfe23d3))
20
+
3
21
  ## [0.0.4](https://github.com/DIRACGrid/diracx/compare/v0.0.3...v0.0.4) (2026-01-19)
4
22
 
5
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diracx
3
- Version: 0.0.4
3
+ Version: 0.0.5
4
4
  Summary: Client installation for users of DiracX installations
5
5
  License: GPL-3.0-only
6
6
  License-File: LICENSE
@@ -178,6 +178,10 @@ class AuthDB(BaseSQLDB):
178
178
  await self.conn.execute(stmt)
179
179
 
180
180
  except IntegrityError:
181
+ logger.warning(
182
+ "Device flow code collision detected, retrying (user_code=%s)",
183
+ user_code,
184
+ )
181
185
  continue
182
186
 
183
187
  return user_code, device_code
@@ -211,6 +211,12 @@ class BaseSQLDB(metaclass=ABCMeta):
211
211
  try:
212
212
  self._conn.set(await self.engine.connect().__aenter__())
213
213
  except Exception as e:
214
+ logger.warning(
215
+ "Database connection failed for %s: %s",
216
+ self.__class__.__name__,
217
+ e,
218
+ exc_info=True,
219
+ )
214
220
  raise SQLDBUnavailableError(
215
221
  f"Cannot connect to {self.__class__.__name__}"
216
222
  ) from e
@@ -5,6 +5,7 @@ See docs/admin/explanations/authentication.md
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
+ import logging
8
9
  from typing import Literal
9
10
 
10
11
  from fastapi import (
@@ -30,6 +31,8 @@ from ..dependencies import (
30
31
  )
31
32
  from ..fastapi_classes import DiracxRouter
32
33
 
34
+ logger = logging.getLogger(__name__)
35
+
33
36
  router = DiracxRouter(require_auth=False)
34
37
 
35
38
 
@@ -115,15 +118,18 @@ async def complete_authorization_flow(
115
118
  settings=settings,
116
119
  )
117
120
  except AuthorizationError as e:
121
+ logger.warning("Authorization flow failed with invalid state: %s", e)
118
122
  raise HTTPException(
119
123
  status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid state"
120
124
  ) from e
121
125
  except IAMServerError as e:
126
+ logger.warning("IAM server error during authorization flow: %s", e)
122
127
  raise HTTPException(
123
128
  status_code=status.HTTP_502_BAD_GATEWAY,
124
129
  detail="Failed to contact IAM server",
125
130
  ) from e
126
131
  except IAMClientError as e:
132
+ logger.warning("IAM client error during authorization flow: %s", e)
127
133
  raise HTTPException(
128
134
  status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid code"
129
135
  ) from e
@@ -5,6 +5,8 @@ See docs/admin/explanations/authentication.md
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
+ import logging
9
+
8
10
  from fastapi import (
9
11
  HTTPException,
10
12
  Request,
@@ -32,6 +34,8 @@ from ..dependencies import (
32
34
  )
33
35
  from ..fastapi_classes import DiracxRouter
34
36
 
37
+ logger = logging.getLogger(__name__)
38
+
35
39
  router = DiracxRouter(require_auth=False)
36
40
 
37
41
 
@@ -136,11 +140,13 @@ async def finish_device_flow(
136
140
  settings,
137
141
  )
138
142
  except IAMServerError as e:
143
+ logger.warning("IAM server error during device flow completion: %s", e)
139
144
  raise HTTPException(
140
145
  status_code=status.HTTP_502_BAD_GATEWAY,
141
146
  detail=e.args[0],
142
147
  ) from e
143
148
  except IAMClientError as e:
149
+ logger.warning("IAM client error during device flow completion: %s", e)
144
150
  raise HTTPException(
145
151
  status_code=status.HTTP_401_UNAUTHORIZED,
146
152
  detail=e.args[0],
@@ -82,7 +82,11 @@ async def revoke_refresh_token_by_refresh_token(
82
82
  auth_db, None, token, token_type_hint, client_id, settings
83
83
  )
84
84
  except (DecodeError, KeyError):
85
- logger.warning("Someone tried to revoke its token but failed.")
85
+ logger.warning(
86
+ "Token revocation failed: invalid token format (client_id=%s)",
87
+ client_id,
88
+ exc_info=True,
89
+ )
86
90
  except ValueError as e:
87
91
  raise HTTPException(
88
92
  status_code=status.HTTP_400_BAD_REQUEST,
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import logging
3
4
  from datetime import datetime, timezone
4
5
  from typing import Annotated
5
6
 
@@ -14,6 +15,8 @@ from .access_policies import open_access
14
15
  from .dependencies import Config
15
16
  from .fastapi_classes import DiracxRouter
16
17
 
18
+ logger = logging.getLogger(__name__)
19
+
17
20
  LAST_MODIFIED_FORMAT = "%a, %d %b %Y %H:%M:%S GMT"
18
21
 
19
22
  router = DiracxRouter()
@@ -52,7 +55,9 @@ async def serve_config(
52
55
  if_modified_since, LAST_MODIFIED_FORMAT
53
56
  ).astimezone(timezone.utc)
54
57
  except ValueError:
55
- pass
58
+ logger.debug(
59
+ "Failed to parse If-Modified-Since header: %s", if_modified_since
60
+ )
56
61
  else:
57
62
  if not_before > config._modified:
58
63
  raise HTTPException(
@@ -76,7 +76,7 @@ def configure_logger():
76
76
  uvicorn_access_logger.handlers[0].setFormatter(AccessFormatter(new_format))
77
77
  # There may not be any handler defined, like in the CI
78
78
  except IndexError:
79
- pass
79
+ logger.debug("No handlers found for uvicorn.access logger (expected in CI)")
80
80
 
81
81
  uvicorn_logger = logging.getLogger("uvicorn")
82
82
  try:
@@ -85,7 +85,7 @@ def configure_logger():
85
85
  uvicorn_logger.handlers[0].setFormatter(DefaultFormatter(new_format))
86
86
  # There may not be any handler defined, like in the CI
87
87
  except IndexError:
88
- pass
88
+ logger.debug("No handlers found for uvicorn logger (expected in CI)")
89
89
 
90
90
 
91
91
  # Rules:
@@ -404,6 +404,12 @@ def http_response_handler(request: Request, exc: DiracHttpResponseError) -> Resp
404
404
 
405
405
 
406
406
  def route_unavailable_error_hander(request: Request, exc: DBUnavailableError):
407
+ logger.warning(
408
+ "503 Service Unavailable: %s (path=%s)",
409
+ exc,
410
+ request.url.path,
411
+ exc_info=True,
412
+ )
407
413
  return JSONResponse(
408
414
  status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
409
415
  headers={"Retry-After": "10"},
@@ -510,9 +516,13 @@ class ClientMinVersionCheckMiddleware(BaseHTTPMiddleware):
510
516
  status_code=exc.status_code,
511
517
  content={"detail": exc.detail},
512
518
  )
513
- # If the version is not given
514
- except Exception: # noqa: S110
515
- pass
519
+ # If the version is not given or cannot be parsed
520
+ except Exception:
521
+ logger.debug(
522
+ "Failed to check client version header: %s",
523
+ client_version,
524
+ exc_info=True,
525
+ )
516
526
 
517
527
  response = await call_next(request)
518
528
  return response
@@ -4,12 +4,16 @@ from __future__ import annotations
4
4
 
5
5
  __all__ = ["router"]
6
6
 
7
+ import logging
8
+
7
9
  from fastapi import HTTPException
8
10
  from starlette.responses import JSONResponse
9
11
 
10
12
  from ..dependencies import AuthDB, Config
11
13
  from ..fastapi_classes import DiracxRouter
12
14
 
15
+ logger = logging.getLogger(__name__)
16
+
13
17
  router = DiracxRouter(require_auth=False)
14
18
 
15
19
 
@@ -35,6 +39,7 @@ async def ready(config: Config, auth_db: AuthDB):
35
39
  try:
36
40
  await auth_db.ping()
37
41
  except Exception as e:
42
+ logger.warning("Ready probe failed: AuthDB ping failed", exc_info=True)
38
43
  raise HTTPException(status_code=503, detail="AuthDB ping failed") from e
39
44
  return JSONResponse(content={"status": "ready"})
40
45
 
@@ -50,5 +55,6 @@ async def startup(config: Config, auth_db: AuthDB):
50
55
  try:
51
56
  await auth_db.ping()
52
57
  except Exception as e:
58
+ logger.warning("Startup probe failed: AuthDB ping failed", exc_info=True)
53
59
  raise HTTPException(status_code=503, detail="AuthDB ping failed") from e
54
60
  return JSONResponse(content={"status": "startup complete"})
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import logging
3
4
  import re
4
5
  import uuid as std_uuid
5
6
  from typing import Annotated, Any
@@ -17,6 +18,8 @@ from diracx.core.properties import SecurityProperty
17
18
  from diracx.logic.auth.utils import read_token
18
19
  from diracx.routers.dependencies import AuthSettings
19
20
 
21
+ logger = logging.getLogger(__name__)
22
+
20
23
  # auto_error=False is used to avoid raising the wrong exception when the token is missing
21
24
  # The error is handled in the verify_dirac_access_token function
22
25
  # More info:
@@ -99,6 +102,7 @@ async def verify_dirac_access_token(
99
102
  ),
100
103
  )
101
104
  except JoseError as e:
105
+ logger.warning("Token validation failed: %s", e)
102
106
  raise HTTPException(
103
107
  status_code=status.HTTP_401_UNAUTHORIZED,
104
108
  detail="Invalid JWT",