diracx 0.0.1a45__tar.gz → 0.0.1a47__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 (442) hide show
  1. {diracx-0.0.1a45 → diracx-0.0.1a47}/.github/workflows/integration.yml +10 -4
  2. {diracx-0.0.1a45 → diracx-0.0.1a47}/.github/workflows/main.yml +8 -8
  3. diracx-0.0.1a47/.github/workflows/update_security_txt_expiry.yml +88 -0
  4. {diracx-0.0.1a45 → diracx-0.0.1a47}/.github/workflows/vulnerabilities.yml +4 -4
  5. {diracx-0.0.1a45 → diracx-0.0.1a47}/.pre-commit-config.yaml +18 -11
  6. {diracx-0.0.1a45 → diracx-0.0.1a47}/PKG-INFO +2 -3
  7. {diracx-0.0.1a45 → diracx-0.0.1a47}/README.md +1 -2
  8. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-api/pyproject.toml +1 -0
  9. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-api/src/diracx/api/jobs.py +39 -8
  10. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/pyproject.toml +1 -1
  11. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/src/diracx/cli/auth.py +6 -2
  12. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/src/diracx/cli/internal/legacy.py +6 -7
  13. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/tests/legacy/cs_sync/integration_test.cfg +1 -0
  14. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/_client.py +10 -33
  15. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/_configuration.py +6 -18
  16. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/_utils/serialization.py +70 -224
  17. {diracx-0.0.1a45/extensions/gubbins/gubbins-client/src/gubbins → diracx-0.0.1a47/diracx-client/src/diracx}/client/_generated/_utils/utils.py +3 -9
  18. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/aio/_client.py +8 -29
  19. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/aio/_configuration.py +7 -21
  20. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/aio/_patch.py +1 -3
  21. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/aio/operations/_operations.py +437 -475
  22. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/models/__init__.py +17 -10
  23. {diracx-0.0.1a45/extensions/gubbins/gubbins-client/src/gubbins → diracx-0.0.1a47/diracx-client/src/diracx}/client/_generated/models/_enums.py +3 -0
  24. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/models/_models.py +425 -166
  25. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/operations/_operations.py +501 -631
  26. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/patches/jobs/common.py +1 -1
  27. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/tests/test_auth.py +9 -5
  28. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/pyproject.toml +1 -1
  29. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/config/sources.py +0 -1
  30. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/exceptions.py +0 -4
  31. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/models.py +55 -2
  32. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/s3.py +6 -1
  33. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/settings.py +14 -27
  34. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/utils.py +2 -2
  35. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/tests/test_config_source.py +0 -2
  36. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/tests/test_utils.py +6 -6
  37. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/__main__.py +0 -1
  38. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/os/job_parameters.py +9 -3
  39. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/dummy/db.py +3 -14
  40. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/job/db.py +15 -54
  41. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/job_logging/db.py +0 -1
  42. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/pilot_agents/db.py +0 -1
  43. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/sandbox_metadata/db.py +5 -1
  44. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/utils/__init__.py +2 -0
  45. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/utils/base.py +92 -3
  46. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/jobs/test_job_db.py +49 -0
  47. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/opensearch/test_index_template.py +4 -2
  48. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/pilot_agents/test_pilot_agents_db.py +0 -1
  49. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/test_dummy_db.py +1 -1
  50. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/__main__.py +4 -1
  51. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/auth/token.py +4 -4
  52. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/auth/utils.py +2 -3
  53. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/jobs/query.py +14 -8
  54. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/jobs/sandboxes.py +37 -14
  55. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/jobs/status.py +36 -23
  56. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/tests/logic/test_sandboxes.py +2 -2
  57. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/access_policies.py +0 -2
  58. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/auth/management.py +2 -1
  59. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/auth/token.py +6 -29
  60. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/auth/well_known.py +9 -0
  61. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/factory.py +4 -13
  62. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/fastapi_classes.py +0 -1
  63. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/jobs/access_policies.py +13 -3
  64. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/jobs/query.py +131 -11
  65. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/jobs/sandboxes.py +23 -4
  66. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/jobs/status.py +137 -36
  67. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/utils/users.py +1 -1
  68. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/auth/test_standard.py +84 -7
  69. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/jobs/test_query.py +37 -1
  70. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/jobs/test_sandboxes.py +2 -2
  71. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/jobs/test_status.py +200 -143
  72. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/jobs/test_wms_access_policy.py +0 -3
  73. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/test_policy.py +0 -1
  74. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/pyproject.toml +1 -1
  75. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/client_generation.py +4 -0
  76. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/utils.py +0 -5
  77. diracx-0.0.1a47/docs/SECURITY.md +3 -0
  78. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/admin/explanations/configuration.md +1 -1
  79. diracx-0.0.1a47/docs/admin/explanations/sandbox-store.md +5 -0
  80. diracx-0.0.1a47/docs/admin/how-to/install/convert-cs.md +139 -0
  81. diracx-0.0.1a47/docs/admin/how-to/install/register-a-vo.md +85 -0
  82. diracx-0.0.1a47/docs/admin/how-to/install/register-the-admin-vo.md +96 -0
  83. diracx-0.0.1a47/docs/admin/index.md +8 -0
  84. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/admin/reference/security_model.md +31 -31
  85. diracx-0.0.1a47/docs/assets/css/extra.css +11 -0
  86. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/home.html +17 -55
  87. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/explanations/components/cli.md +5 -5
  88. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/explanations/components/db.md +1 -0
  89. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/explanations/components/index.md +15 -14
  90. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/explanations/components/routes.md +3 -2
  91. diracx-0.0.1a45/extensions/README.md → diracx-0.0.1a47/docs/dev/explanations/extensions.md +61 -71
  92. diracx-0.0.1a47/docs/dev/how-to/add-a-cli-command.md +3 -0
  93. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/how-to/add-a-route.md +3 -2
  94. diracx-0.0.1a47/docs/dev/how-to/client-extension.md +3 -0
  95. diracx-0.0.1a47/docs/dev/how-to/contribute.md +54 -0
  96. diracx-0.0.1a47/docs/dev/how-to/develop-legacy-dirac.md +3 -0
  97. diracx-0.0.1a47/docs/dev/index.md +11 -0
  98. diracx-0.0.1a47/docs/dev/reference/dependency-injection.md +282 -0
  99. diracx-0.0.1a47/docs/dev/reference/pixi-tasks.md +3 -0
  100. diracx-0.0.1a47/docs/dev/tutorials/getting-started.md +308 -0
  101. diracx-0.0.1a47/docs/dev/tutorials/run-locally.md +109 -0
  102. diracx-0.0.1a47/docs/dev/tutorials/write-docs.md +80 -0
  103. diracx-0.0.1a47/docs/overrides/main.html +7 -0
  104. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/roadmap.md +3 -3
  105. diracx-0.0.1a47/docs/user/index.md +3 -0
  106. diracx-0.0.1a47/docs/user/reference/known-installations.md +39 -0
  107. diracx-0.0.1a47/docs/user/reference/programmatic-usage/command-line-interface.md +3 -0
  108. diracx-0.0.1a47/docs/user/reference/programmatic-usage/https-interface.md +1 -0
  109. diracx-0.0.1a47/docs/user/reference/programmatic-usage/index.md +8 -0
  110. diracx-0.0.1a47/docs/user/reference/programmatic-usage/python-interface.md +3 -0
  111. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_client.py +11 -37
  112. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_configuration.py +6 -18
  113. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/serialization.py +70 -224
  114. {diracx-0.0.1a45/diracx-client/src/diracx → diracx-0.0.1a47/extensions/gubbins/gubbins-client/src/gubbins}/client/_generated/_utils/utils.py +3 -9
  115. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_client.py +9 -33
  116. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_configuration.py +7 -21
  117. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_patch.py +1 -3
  118. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_operations.py +452 -514
  119. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/__init__.py +17 -10
  120. {diracx-0.0.1a45/diracx-client/src/diracx → diracx-0.0.1a47/extensions/gubbins/gubbins-client/src/gubbins}/client/_generated/models/_enums.py +3 -0
  121. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_models.py +425 -164
  122. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_operations.py +516 -670
  123. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_patch.py +1 -3
  124. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/tests/test_gubbins_client.py +3 -3
  125. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-core/tests/test_config.py +0 -1
  126. diracx-0.0.1a47/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/__init__.py +0 -0
  127. diracx-0.0.1a47/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/__init__.py +0 -0
  128. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/db.py +3 -14
  129. diracx-0.0.1a47/extensions/gubbins/gubbins-logic/README.md +0 -0
  130. diracx-0.0.1a47/extensions/gubbins/gubbins-logic/src/gubbins/logic/__init__.py +0 -0
  131. diracx-0.0.1a47/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/__init__.py +0 -0
  132. diracx-0.0.1a47/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/__init__.py +0 -0
  133. diracx-0.0.1a47/extensions/gubbins/gubbins-logic/src/gubbins/logic/py.typed +0 -0
  134. diracx-0.0.1a47/extensions/gubbins/gubbins-routers/README.md +0 -0
  135. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/access_policy.py +0 -2
  136. diracx-0.0.1a47/extensions/gubbins/gubbins-routers/src/gubbins/routers/py.typed +0 -0
  137. diracx-0.0.1a47/extensions/gubbins/gubbins-testing/README.md +0 -0
  138. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/pyproject.toml +3 -1
  139. {diracx-0.0.1a45 → diracx-0.0.1a47}/mkdocs.yml +71 -41
  140. {diracx-0.0.1a45 → diracx-0.0.1a47}/pixi.toml +0 -10
  141. {diracx-0.0.1a45 → diracx-0.0.1a47}/pyproject.toml +21 -2
  142. diracx-0.0.1a47/release.notes.new +31 -0
  143. diracx-0.0.1a47/tests/__init__.py +0 -0
  144. diracx-0.0.1a45/docs/SECURITY.md +0 -7
  145. diracx-0.0.1a45/docs/admin/how-to/convert-cs.md +0 -40
  146. diracx-0.0.1a45/docs/admin/how-to/register-a-vo.md +0 -83
  147. diracx-0.0.1a45/docs/admin/how-to/register-the-admin-vo.md +0 -96
  148. diracx-0.0.1a45/docs/assets/css/extra.css +0 -54
  149. diracx-0.0.1a45/docs/dev/explanations/extensions.md +0 -5
  150. diracx-0.0.1a45/docs/dev/reference/dependency-injection.md +0 -16
  151. diracx-0.0.1a45/docs/dev/tutorials/getting-started.md +0 -67
  152. diracx-0.0.1a45/docs/dev/tutorials/run-locally.md +0 -32
  153. diracx-0.0.1a45/docs/dev/tutorials/write-docs.md +0 -6
  154. diracx-0.0.1a45/docs/project/consortium.md +0 -24
  155. diracx-0.0.1a45/docs/project/index.md +0 -3
  156. diracx-0.0.1a45/release.notes.new +0 -55
  157. {diracx-0.0.1a45 → diracx-0.0.1a47}/.coveragerc +0 -0
  158. {diracx-0.0.1a45 → diracx-0.0.1a47}/.gitattributes +0 -0
  159. {diracx-0.0.1a45 → diracx-0.0.1a47}/.github/dependabot.yml +0 -0
  160. {diracx-0.0.1a45 → diracx-0.0.1a47}/.github/workflows/deployment.yml +0 -0
  161. {diracx-0.0.1a45 → diracx-0.0.1a47}/.github/workflows/make_release.py +0 -0
  162. {diracx-0.0.1a45 → diracx-0.0.1a47}/.gitignore +0 -0
  163. {diracx-0.0.1a45 → diracx-0.0.1a47}/.readthedocs.yaml +0 -0
  164. {diracx-0.0.1a45 → diracx-0.0.1a47}/LICENSE +0 -0
  165. {diracx-0.0.1a45 → diracx-0.0.1a47}/MANIFEST.in +0 -0
  166. {diracx-0.0.1a45 → diracx-0.0.1a47}/codecov.yml +0 -0
  167. {diracx-0.0.1a45 → diracx-0.0.1a47}/containers/client/Dockerfile +0 -0
  168. {diracx-0.0.1a45 → diracx-0.0.1a47}/containers/services/Dockerfile +0 -0
  169. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-api/README.md +0 -0
  170. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-api/src/diracx/api/__init__.py +0 -0
  171. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-api/src/diracx/api/py.typed +0 -0
  172. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-api/src/diracx/api/utils.py +0 -0
  173. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-api/tests/test_jobs.py +0 -0
  174. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-api/tests/test_utils.py +0 -0
  175. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/README.md +0 -0
  176. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/src/diracx/cli/__init__.py +0 -0
  177. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/src/diracx/cli/__main__.py +0 -0
  178. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/src/diracx/cli/config.py +0 -0
  179. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/src/diracx/cli/internal/__init__.py +0 -0
  180. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/src/diracx/cli/internal/config.py +0 -0
  181. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/src/diracx/cli/jobs.py +0 -0
  182. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/src/diracx/cli/py.typed +0 -0
  183. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/src/diracx/cli/utils.py +0 -0
  184. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/tests/legacy/cs_sync/integration_test.yaml +0 -0
  185. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/tests/legacy/cs_sync/integration_test_buggy.cfg +0 -0
  186. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/tests/legacy/cs_sync/integration_test_secret.cfg +0 -0
  187. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/tests/legacy/cs_sync/test_cssync.py +0 -0
  188. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/tests/legacy/test_legacy.py +0 -0
  189. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/tests/test_internal.py +0 -0
  190. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/tests/test_jobs.py +0 -0
  191. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-cli/tests/test_login.py +0 -0
  192. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/README.md +0 -0
  193. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/pyproject.toml +0 -0
  194. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/_diracx_client_importer.pth +0 -0
  195. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/_client_importer.py +0 -0
  196. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/__init__.py +0 -0
  197. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/__init__.py +0 -0
  198. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/_patch.py +0 -0
  199. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/_serialization.py +0 -0
  200. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/_utils/__init__.py +0 -0
  201. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/_vendor.py +0 -0
  202. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/aio/__init__.py +0 -0
  203. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/aio/_vendor.py +0 -0
  204. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/aio/operations/__init__.py +0 -0
  205. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/aio/operations/_patch.py +0 -0
  206. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/models/_patch.py +0 -0
  207. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/operations/__init__.py +0 -0
  208. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/operations/_patch.py +0 -0
  209. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/_generated/py.typed +0 -0
  210. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/aio.py +0 -0
  211. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/models.py +0 -0
  212. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/patches/auth/aio.py +0 -0
  213. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/patches/auth/common.py +0 -0
  214. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/patches/auth/sync.py +0 -0
  215. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/patches/client/aio.py +0 -0
  216. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/patches/client/common.py +0 -0
  217. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/patches/client/sync.py +0 -0
  218. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/patches/jobs/aio.py +0 -0
  219. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/patches/jobs/sync.py +0 -0
  220. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/patches/utils.py +0 -0
  221. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/py.typed +0 -0
  222. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-client/src/diracx/client/sync.py +0 -0
  223. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/README.md +0 -0
  224. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/__init__.py +0 -0
  225. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/config/__init__.py +0 -0
  226. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/config/schema.py +0 -0
  227. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/extensions.py +0 -0
  228. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/preferences.py +0 -0
  229. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/properties.py +0 -0
  230. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/src/diracx/core/py.typed +0 -0
  231. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/tests/test_extensions.py +0 -0
  232. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/tests/test_s3.py +0 -0
  233. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-core/tests/test_secrets.py +0 -0
  234. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/README.md +0 -0
  235. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/pyproject.toml +0 -0
  236. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/__init__.py +0 -0
  237. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/exceptions.py +0 -0
  238. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/os/__init__.py +0 -0
  239. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/os/utils.py +0 -0
  240. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/py.typed +0 -0
  241. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/__init__.py +0 -0
  242. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/auth/__init__.py +0 -0
  243. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/auth/db.py +0 -0
  244. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/auth/schema.py +0 -0
  245. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/dummy/__init__.py +0 -0
  246. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/dummy/schema.py +0 -0
  247. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/job/__init__.py +0 -0
  248. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/job/schema.py +0 -0
  249. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/job_logging/__init__.py +0 -0
  250. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/job_logging/schema.py +0 -0
  251. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/pilot_agents/__init__.py +0 -0
  252. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/pilot_agents/schema.py +0 -0
  253. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/sandbox_metadata/__init__.py +0 -0
  254. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/sandbox_metadata/schema.py +0 -0
  255. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/task_queue/__init__.py +0 -0
  256. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/task_queue/db.py +0 -0
  257. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/task_queue/schema.py +0 -0
  258. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/utils/functions.py +0 -0
  259. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/src/diracx/db/sql/utils/types.py +0 -0
  260. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/auth/test_authorization_flow.py +0 -0
  261. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/auth/test_device_flow.py +0 -0
  262. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/auth/test_refresh_token.py +0 -0
  263. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/jobs/test_job_logging_db.py +0 -0
  264. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/jobs/test_sandbox_metadata.py +0 -0
  265. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/opensearch/test_connection.py +0 -0
  266. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/opensearch/test_search.py +0 -0
  267. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/pilot_agents/__init__.py +0 -0
  268. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-db/tests/test_freeze_time.py +0 -0
  269. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/README.md +0 -0
  270. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/pyproject.toml +0 -0
  271. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/__init__.py +0 -0
  272. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/auth/__init__.py +0 -0
  273. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/auth/authorize_code_flow.py +0 -0
  274. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/auth/device_flow.py +0 -0
  275. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/auth/management.py +0 -0
  276. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/auth/well_known.py +0 -0
  277. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/jobs/__init__.py +0 -0
  278. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/jobs/submission.py +0 -0
  279. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/jobs/utils.py +0 -0
  280. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/py.typed +0 -0
  281. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/task_queues/__init__.py +0 -0
  282. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-logic/src/diracx/logic/task_queues/priority.py +0 -0
  283. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/README.md +0 -0
  284. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/pyproject.toml +0 -0
  285. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/__init__.py +0 -0
  286. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/auth/__init__.py +0 -0
  287. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/auth/authorize_code_flow.py +0 -0
  288. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/auth/device_flow.py +0 -0
  289. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/auth/utils.py +0 -0
  290. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/configuration.py +0 -0
  291. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/dependencies.py +0 -0
  292. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/health/__init__.py +0 -0
  293. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/health/probes.py +0 -0
  294. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/jobs/__init__.py +0 -0
  295. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/jobs/legacy.py +0 -0
  296. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/jobs/submission.py +0 -0
  297. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/otel.py +0 -0
  298. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/py.typed +0 -0
  299. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/src/diracx/routers/utils/__init__.py +0 -0
  300. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/auth/test_legacy_exchange.py +0 -0
  301. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
  302. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/health/test_probes.py +0 -0
  303. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/jobs/conftest.py +0 -0
  304. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/test_config_manager.py +0 -0
  305. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-routers/tests/test_generic.py +0 -0
  306. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/README.md +0 -0
  307. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/__init__.py +0 -0
  308. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/__main__.py +0 -0
  309. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/client_generation_pytest.py +0 -0
  310. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/dummy_osdb.py +0 -0
  311. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/entrypoints.py +0 -0
  312. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/mock_osdb.py +0 -0
  313. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/osdb.py +0 -0
  314. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/routers.py +0 -0
  315. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/scripts/collect_demo_coverage.sh +0 -0
  316. {diracx-0.0.1a45 → diracx-0.0.1a47}/diracx-testing/src/diracx/testing/time.py +0 -0
  317. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/admin/explanations/authentication.md +0 -0
  318. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/admin/explanations/opentelemetry.md +0 -0
  319. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/admin/explanations/user-management.md +0 -0
  320. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/admin/reference/settings-and-preferences.md +0 -0
  321. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/admin/tutorials/authentication.md +0 -0
  322. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/css/fontawesome-all.min.css +0 -0
  323. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/css/images/arrow.svg +0 -0
  324. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/css/images/overlay.png +0 -0
  325. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/css/main.css +0 -0
  326. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/images/diracx-logo-square.svg +0 -0
  327. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/images/logo.svg +0 -0
  328. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/images/pic02.jpg +0 -0
  329. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/styles/extra.css +0 -0
  330. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/webfonts/fa-brands-400.woff2 +0 -0
  331. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/assets/webfonts/fa-solid-900.woff +0 -0
  332. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/explanations/client.md +0 -0
  333. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/explanations/components/api.md +0 -0
  334. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/explanations/designing-functionality.md +0 -0
  335. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/explanations/index.md +0 -0
  336. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/explanations/testing.md +0 -0
  337. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/how-to/add-a-db.md +0 -0
  338. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/how-to/add-a-setting.md +0 -0
  339. /diracx-0.0.1a45/docs/dev/reference/client-metapathfinder.md → /diracx-0.0.1a47/docs/dev/how-to/add-a-task.md +0 -0
  340. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/how-to/add-a-test.md +0 -0
  341. /diracx-0.0.1a45/docs/dev/reference/db-transaction-model.md → /diracx-0.0.1a47/docs/dev/how-to/add-functionality/index.md +0 -0
  342. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/how-to/client-customization.md +0 -0
  343. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/how-to/client-generation.md +0 -0
  344. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/how-to/extend-diracx/index.md +0 -0
  345. /diracx-0.0.1a45/extensions/gubbins/gubbins-api/README.md → /diracx-0.0.1a47/docs/dev/how-to/use-the-demo/index.md +0 -0
  346. /diracx-0.0.1a45/extensions/gubbins/gubbins-api/src/gubbins/api/__init__.py → /diracx-0.0.1a47/docs/dev/how-to/use-the-demo/swagger.md +0 -0
  347. /diracx-0.0.1a45/extensions/gubbins/gubbins-api/src/gubbins/api/py.typed → /diracx-0.0.1a47/docs/dev/how-to/use-the-demo/web.md +0 -0
  348. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/reference/application-state.md +0 -0
  349. /diracx-0.0.1a45/extensions/gubbins/gubbins-cli/README.md → /diracx-0.0.1a47/docs/dev/reference/client-metapathfinder.md +0 -0
  350. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/reference/coding-conventions.md +0 -0
  351. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/reference/configuration.md +0 -0
  352. /diracx-0.0.1a45/extensions/gubbins/gubbins-cli/src/gubbins/cli/__init__.py → /diracx-0.0.1a47/docs/dev/reference/db-transaction-model.md +0 -0
  353. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/reference/entrypoints.md +0 -0
  354. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/reference/security-policies.md +0 -0
  355. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/reference/security-properties.md +0 -0
  356. /diracx-0.0.1a45/extensions/gubbins/gubbins-cli/src/gubbins/cli/py.typed → /diracx-0.0.1a47/docs/dev/reference/test-recipes.md +0 -0
  357. /diracx-0.0.1a45/extensions/gubbins/gubbins-client/README.md → /diracx-0.0.1a47/docs/dev/reference/writing-tests.md +0 -0
  358. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/tutorials/advanced-tutorial.md +0 -0
  359. /diracx-0.0.1a45/extensions/gubbins/gubbins-core/README.md → /diracx-0.0.1a47/docs/dev/tutorials/develop-web.md +0 -0
  360. /diracx-0.0.1a45/extensions/gubbins/gubbins-core/src/gubbins/core/py.typed → /diracx-0.0.1a47/docs/dev/tutorials/larger-developments.md +0 -0
  361. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/dev/tutorials/making-changes.md +0 -0
  362. /diracx-0.0.1a45/extensions/gubbins/gubbins-db/README.md → /diracx-0.0.1a47/docs/dev/tutorials/play-with-auth.md +0 -0
  363. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/index.md +0 -0
  364. {diracx-0.0.1a45 → diracx-0.0.1a47}/docs/user/reference/client-configuration.md +0 -0
  365. /diracx-0.0.1a45/extensions/gubbins/gubbins-db/src/gubbins/db/py.typed → /diracx-0.0.1a47/docs/user/tutorials/getting-started.md +0 -0
  366. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/containers/client/Dockerfile +0 -0
  367. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/containers/services/Dockerfile +0 -0
  368. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/.github/workflows/main.yml +0 -0
  369. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/README.md +0 -0
  370. {diracx-0.0.1a45/extensions/gubbins/gubbins-logic → diracx-0.0.1a47/extensions/gubbins/gubbins-api}/README.md +0 -0
  371. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-api/pyproject.toml +0 -0
  372. {diracx-0.0.1a45/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs → diracx-0.0.1a47/extensions/gubbins/gubbins-api/src/gubbins/api}/__init__.py +0 -0
  373. {diracx-0.0.1a45/extensions/gubbins/gubbins-logic/src/gubbins/logic → diracx-0.0.1a47/extensions/gubbins/gubbins-api/src/gubbins/api}/py.typed +0 -0
  374. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-api/tests/test_gubbins_api.py +0 -0
  375. {diracx-0.0.1a45/extensions/gubbins/gubbins-routers → diracx-0.0.1a47/extensions/gubbins/gubbins-cli}/README.md +0 -0
  376. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-cli/pyproject.toml +0 -0
  377. {diracx-0.0.1a45/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag → diracx-0.0.1a47/extensions/gubbins/gubbins-cli/src/gubbins/cli}/__init__.py +0 -0
  378. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-cli/src/gubbins/cli/config.py +0 -0
  379. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-cli/src/gubbins/cli/lollygag.py +0 -0
  380. {diracx-0.0.1a45/extensions/gubbins/gubbins-routers/src/gubbins/routers → diracx-0.0.1a47/extensions/gubbins/gubbins-cli/src/gubbins/cli}/py.typed +0 -0
  381. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-cli/tests/test_gubbins_cli.py +0 -0
  382. {diracx-0.0.1a45/extensions/gubbins/gubbins-testing → diracx-0.0.1a47/extensions/gubbins/gubbins-client}/README.md +0 -0
  383. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/pyproject.toml +0 -0
  384. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/__init__.py +0 -0
  385. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/__init__.py +0 -0
  386. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_patch.py +0 -0
  387. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_serialization.py +0 -0
  388. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/__init__.py +0 -0
  389. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_vendor.py +0 -0
  390. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/__init__.py +0 -0
  391. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_vendor.py +0 -0
  392. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/__init__.py +0 -0
  393. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_patch.py +0 -0
  394. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/__init__.py +0 -0
  395. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/py.typed +0 -0
  396. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/aio.py +0 -0
  397. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/models.py +0 -0
  398. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/py.typed +0 -0
  399. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-client/src/gubbins/client/sync.py +0 -0
  400. /diracx-0.0.1a45/extensions/gubbins/gubbins-logic/src/gubbins/logic/__init__.py → /diracx-0.0.1a47/extensions/gubbins/gubbins-core/README.md +0 -0
  401. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-core/pyproject.toml +0 -0
  402. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-core/src/gubbins/core/__init__.py +0 -0
  403. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-core/src/gubbins/core/config/__init__.py +0 -0
  404. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-core/src/gubbins/core/config/schema.py +0 -0
  405. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-core/src/gubbins/core/models.py +0 -0
  406. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-core/src/gubbins/core/properties.py +0 -0
  407. /diracx-0.0.1a45/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/__init__.py → /diracx-0.0.1a47/extensions/gubbins/gubbins-core/src/gubbins/core/py.typed +0 -0
  408. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-core/tests/test_properties.py +0 -0
  409. /diracx-0.0.1a45/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/__init__.py → /diracx-0.0.1a47/extensions/gubbins/gubbins-db/README.md +0 -0
  410. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-db/pyproject.toml +0 -0
  411. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-db/src/gubbins/db/__init__.py +0 -0
  412. /diracx-0.0.1a45/tests/__init__.py → /diracx-0.0.1a47/extensions/gubbins/gubbins-db/src/gubbins/db/py.typed +0 -0
  413. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/__init__.py +0 -0
  414. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/db.py +0 -0
  415. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/schema.py +0 -0
  416. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/schema.py +0 -0
  417. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-db/tests/test_gubbins_job_db.py +0 -0
  418. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-db/tests/test_lollygag_db.py +0 -0
  419. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-logic/pyproject.toml +0 -0
  420. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/well_known.py +0 -0
  421. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/lollygag.py +0 -0
  422. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-logic/tests/test_gubbins_logic.py +0 -0
  423. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/pyproject.toml +0 -0
  424. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/src/gubbins/routers/__init__.py +0 -0
  425. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/src/gubbins/routers/dependencies.py +0 -0
  426. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/__init__.py +0 -0
  427. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/lollygag.py +0 -0
  428. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/src/gubbins/routers/well_known.py +0 -0
  429. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
  430. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/tests/test_gubbins_job_manager.py +0 -0
  431. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/tests/test_lollybag.py +0 -0
  432. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-routers/tests/test_wellknown.py +0 -0
  433. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-testing/pyproject.toml +0 -0
  434. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/gubbins-testing/src/gubbins/testing/__init__.py +0 -0
  435. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/pixi.toml +0 -0
  436. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins/release.notes +0 -0
  437. {diracx-0.0.1a45 → diracx-0.0.1a47}/extensions/gubbins_values.yaml +0 -0
  438. {diracx-0.0.1a45 → diracx-0.0.1a47}/release.notes +0 -0
  439. {diracx-0.0.1a45 → diracx-0.0.1a47}/release.notes.old +0 -0
  440. {diracx-0.0.1a45 → diracx-0.0.1a47}/run_local.sh +0 -0
  441. {diracx-0.0.1a45 → diracx-0.0.1a47}/tests/make_token_local.py +0 -0
  442. {diracx-0.0.1a45 → diracx-0.0.1a47}/tests/test_generic.py +0 -0
@@ -58,11 +58,17 @@ jobs:
58
58
  run: |
59
59
  has_error=0
60
60
  # TODO: set has_error=1 when we are ready to really run the tests
61
- if [ -f server-tests-failed ]; then has_error=0; echo "Server tests failed"; fi
62
- if [ -f client-tests-failed ]; then has_error=0; echo "Client tests failed"; fi
63
- if [ -f pilot-tests-failed ]; then has_error=0; echo "Pilot tests failed"; fi
61
+ if [ -f server-tests-failed ]; then has_error=1; echo "Server tests failed"; fi
62
+ if [ -f client-tests-failed ]; then has_error=1; echo "Client tests failed"; fi
63
+ if [ -f pilot-tests-failed ]; then has_error=1; echo "Pilot tests failed"; fi
64
64
  if [ ${has_error} = 1 ]; then exit 1; fi
65
- - name: diracx logs
65
+ - name: diracx filtered requests logs
66
+ run: |
67
+ docker logs diracx 2>/dev/null | grep '/api/' \
68
+ | awk -F\" '{print $2, $3}' \
69
+ | awk '{print $1, $2, $4}' \
70
+ | sort | uniq -c | sort
71
+ - name: diracx error logs
66
72
  if: ${{ failure() }}
67
73
  run: |
68
74
  mkdir -p /tmp/service-logs
@@ -19,7 +19,7 @@ jobs:
19
19
  steps:
20
20
  - name: Checkout code
21
21
  uses: actions/checkout@v4
22
- - uses: prefix-dev/setup-pixi@v0.8.8
22
+ - uses: prefix-dev/setup-pixi@v0.8.12
23
23
  with:
24
24
  run-install: false
25
25
  post-cleanup: false
@@ -32,7 +32,7 @@ jobs:
32
32
  pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
33
33
  # Show any changes
34
34
  git diff
35
- - uses: prefix-dev/setup-pixi@v0.8.8
35
+ - uses: prefix-dev/setup-pixi@v0.8.12
36
36
  with:
37
37
  cache: false
38
38
  environments: shellcheck
@@ -63,7 +63,7 @@ jobs:
63
63
  steps:
64
64
  - name: Checkout code
65
65
  uses: actions/checkout@v4
66
- - uses: prefix-dev/setup-pixi@v0.8.8
66
+ - uses: prefix-dev/setup-pixi@v0.8.12
67
67
  with:
68
68
  run-install: false
69
69
  post-cleanup: false
@@ -76,7 +76,7 @@ jobs:
76
76
  pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
77
77
  # Show any changes
78
78
  git diff
79
- - uses: prefix-dev/setup-pixi@v0.8.8
79
+ - uses: prefix-dev/setup-pixi@v0.8.12
80
80
  with:
81
81
  cache: false
82
82
  environments: ${{ matrix.package }}
@@ -96,7 +96,7 @@ jobs:
96
96
  steps:
97
97
  - name: Checkout code
98
98
  uses: actions/checkout@v4
99
- - uses: prefix-dev/setup-pixi@v0.8.8
99
+ - uses: prefix-dev/setup-pixi@v0.8.12
100
100
  with:
101
101
  run-install: false
102
102
  post-cleanup: false
@@ -109,7 +109,7 @@ jobs:
109
109
  pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
110
110
  # Show any changes
111
111
  git diff
112
- - uses: prefix-dev/setup-pixi@v0.8.8
112
+ - uses: prefix-dev/setup-pixi@v0.8.12
113
113
  with:
114
114
  cache: false
115
115
  environments: ${{ matrix.extension == 'diracx' && 'default' || 'default-gubbins' }}
@@ -222,7 +222,7 @@ jobs:
222
222
  steps:
223
223
  - name: Checkout code
224
224
  uses: actions/checkout@v4
225
- - uses: prefix-dev/setup-pixi@v0.8.8
225
+ - uses: prefix-dev/setup-pixi@v0.8.12
226
226
  with:
227
227
  run-install: false
228
228
  post-cleanup: false
@@ -232,7 +232,7 @@ jobs:
232
232
  pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
233
233
  # Show any changes
234
234
  git diff
235
- - uses: prefix-dev/setup-pixi@v0.8.8
235
+ - uses: prefix-dev/setup-pixi@v0.8.12
236
236
  with:
237
237
  cache: false
238
238
  locked: false
@@ -0,0 +1,88 @@
1
+ name: Update Security.txt Expiry
2
+
3
+ on:
4
+ schedule:
5
+ # Runs once a year
6
+ - cron: '15 2 1 1 *' # January 1st at 02:15 UTC
7
+ workflow_dispatch: # Allows manual triggering for testing.
8
+
9
+ jobs:
10
+ update-expiry:
11
+ runs-on: ubuntu-latest
12
+ # Grant GITHUB_TOKEN permissions to create a pull request.
13
+ permissions:
14
+ contents: write
15
+ pull-requests: write
16
+
17
+ steps:
18
+ - name: Checkout repository
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Set up Python
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: '3.x'
25
+
26
+ - name: Update expiry date in well_known.py
27
+ id: update_script
28
+ run: |
29
+ import re
30
+ from datetime import datetime, timedelta, timezone
31
+ import os
32
+
33
+ file_path = "diracx-routers/src/diracx/routers/auth/well_known.py"
34
+ changes_made = False
35
+
36
+ with open(file_path, "r") as f:
37
+ content = f.read()
38
+
39
+ # Using a robust regex to find the line and capture the date
40
+ pattern = re.compile(r'''(^\s*Expires: )(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z)''', re.MULTILINE)
41
+ match = pattern.search(content)
42
+
43
+ if match:
44
+ old_date_str = match.group(2)
45
+ try:
46
+ expiry_date = datetime.strptime(old_date_str, "%Y-%m-%dT%H:%M:%S.%fZ").replace(tzinfo=timezone.utc)
47
+ now = datetime.now(timezone.utc)
48
+
49
+ # Update if the expiry is less than 45 days away
50
+ if (expiry_date - now) < timedelta(days=45):
51
+ # Set the new expiry to be 1 year from today
52
+ new_expiry_date = now + timedelta(days=365)
53
+ new_date_str = new_expiry_date.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"
54
+
55
+ new_content = pattern.sub(r'''\g<1>''' + new_date_str, content)
56
+
57
+ with open(file_path, "w") as f:
58
+ f.write(new_content)
59
+
60
+ print(f"INFO: Updated expiry date to {new_date_str}")
61
+ changes_made = True
62
+ else:
63
+ print(f"INFO: Expiry date {old_date_str} is not within the update window. No changes made.")
64
+ except (ValueError) as e:
65
+ print(f"ERROR: Could not parse date string {old_date_str}. Error: {e}")
66
+
67
+ else:
68
+ print(f"ERROR: Could not find the 'Expires:' line in the specified format in {file_path}")
69
+
70
+ # Set output for subsequent steps
71
+ with open(os.environ['GITHUB_OUTPUT'], 'a') as hf:
72
+ print(f'changes_made={str(changes_made).lower()}', file=hf)
73
+ shell: python
74
+
75
+ - name: Create Pull Request
76
+ if: steps.update_script.outputs.changes_made == 'true'
77
+ uses: peter-evans/create-pull-request@v7
78
+ with:
79
+ token: ${{ secrets.GITHUB_TOKEN }}
80
+ commit-message: "chore(security): Update security.txt expiry date"
81
+ title: "Automated Security.txt Expiry Update"
82
+ body: |
83
+ This is an automated PR to update the `Expires` field in the `security.txt` file.
84
+
85
+ The expiry date is automatically updated to one year from the current date to ensure it remains valid.
86
+ branch: "chore/update-security-txt-expiry"
87
+ base: "main"
88
+ delete-branch: true
@@ -22,7 +22,7 @@ jobs:
22
22
  tags: true
23
23
 
24
24
  - name: Run Trivy (client:dev)
25
- uses: aquasecurity/trivy-action@0.30.0
25
+ uses: aquasecurity/trivy-action@0.32.0
26
26
  with:
27
27
  image-ref: "ghcr.io/diracgrid/diracx/client:dev"
28
28
  format: "sarif"
@@ -35,7 +35,7 @@ jobs:
35
35
  category: "client-dev"
36
36
 
37
37
  - name: Run Trivy (services:dev)
38
- uses: aquasecurity/trivy-action@0.30.0
38
+ uses: aquasecurity/trivy-action@0.32.0
39
39
  with:
40
40
  image-ref: "ghcr.io/diracgrid/diracx/services:dev"
41
41
  format: "sarif"
@@ -61,7 +61,7 @@ jobs:
61
61
 
62
62
  - name: Run Trivy (client:release)
63
63
  if: ${{ steps.get-latest-tag.outputs.latest_tag != '' }}
64
- uses: aquasecurity/trivy-action@0.30.0
64
+ uses: aquasecurity/trivy-action@0.32.0
65
65
  with:
66
66
  image-ref: "ghcr.io/diracgrid/diracx/client:${{ steps.get-latest-tag.outputs.latest_tag }}"
67
67
  format: "sarif"
@@ -77,7 +77,7 @@ jobs:
77
77
 
78
78
  - name: Run Trivy (services:release)
79
79
  if: ${{ steps.get-latest-tag.outputs.latest_tag != '' }}
80
- uses: aquasecurity/trivy-action@0.30.0
80
+ uses: aquasecurity/trivy-action@0.32.0
81
81
  with:
82
82
  image-ref: "ghcr.io/diracgrid/diracx/services:${{ steps.get-latest-tag.outputs.latest_tag }}"
83
83
  format: "sarif"
@@ -1,9 +1,22 @@
1
1
  # See https://pre-commit.com for more information
2
2
  # See https://pre-commit.com/hooks.html for more hooks
3
+ default_install_hook_types:
4
+ - pre-commit
5
+ - commit-msg
6
+
3
7
  default_language_version:
4
8
  python: python3
5
9
 
10
+ default_stages: [pre-commit]
11
+
6
12
  repos:
13
+ - repo: https://github.com/compilerla/conventional-pre-commit
14
+ rev: v4.2.0
15
+ hooks:
16
+ - id: conventional-pre-commit
17
+ stages: [commit-msg]
18
+ args: ["--verbose"]
19
+
7
20
  - repo: https://github.com/pre-commit/pre-commit-hooks
8
21
  rev: v5.0.0
9
22
  hooks:
@@ -14,18 +27,14 @@ repos:
14
27
  - id: check-added-large-files
15
28
 
16
29
  - repo: https://github.com/astral-sh/ruff-pre-commit
17
- rev: 'v0.11.9'
30
+ rev: 'v0.12.7'
18
31
  hooks:
19
32
  - id: ruff
20
33
  args: ["--fix", "--show-fixes"]
21
-
22
- - repo: https://github.com/psf/black-pre-commit-mirror
23
- rev: 25.1.0
24
- hooks:
25
- - id: black
34
+ - id: ruff-format
26
35
 
27
36
  - repo: https://github.com/pre-commit/mirrors-mypy
28
- rev: v1.15.0
37
+ rev: v1.17.1
29
38
  hooks:
30
39
  - id: mypy
31
40
  additional_dependencies:
@@ -44,6 +53,7 @@ repos:
44
53
  - id: mdformat
45
54
  args: ["--number"]
46
55
  additional_dependencies:
56
+ - mdformat-mkdocs
47
57
  - mdformat-gfm
48
58
  - mdformat-black
49
59
 
@@ -51,7 +61,4 @@ repos:
51
61
  rev: v2.4.1
52
62
  hooks:
53
63
  - id: codespell
54
- args:
55
- - "--skip=diracx-client/src/diracx/client/_generated/*, diracx-[a-z]*/tests/*, diracx-testing/*, build/*, extensions/gubbins/gubbins-client/src/gubbins/client/_generated/*, extensions/gubbins/gubbins-*/tests/*"
56
- - "--ignore-words-list=CheckIn"
57
- - "-w"
64
+ args: ["-w"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diracx
3
- Version: 0.0.1a45
3
+ Version: 0.0.1a47
4
4
  Summary: Client installation for users of DiracX installations
5
5
  License: GPL-3.0-only
6
6
  License-File: LICENSE
@@ -20,8 +20,7 @@ Description-Content-Type: text/markdown
20
20
 
21
21
  ![DiracX tests](https://github.com/DIRACGrid/diracx/actions/workflows/main.yml/badge.svg?branch=main)
22
22
  ![Legacy tests](https://github.com/DIRACGrid/diracx/actions/workflows/integration.yml/badge.svg?branch=main)
23
- ![Diracx deployment](https://github.com/DIRACGrid/diracx/actions/workflows/deployment.yml/badge.svg?branch=main)
24
- ![Diracx: extensions](https://github.com/DIRACGrid/diracx/actions/workflows/extensions.yml/badge.svg?branch=main)
23
+ ![DiracX deployment](https://github.com/DIRACGrid/diracx/actions/workflows/deployment.yml/badge.svg?branch=main)
25
24
 
26
25
  # DiracX
27
26
 
@@ -1,7 +1,6 @@
1
1
  ![DiracX tests](https://github.com/DIRACGrid/diracx/actions/workflows/main.yml/badge.svg?branch=main)
2
2
  ![Legacy tests](https://github.com/DIRACGrid/diracx/actions/workflows/integration.yml/badge.svg?branch=main)
3
- ![Diracx deployment](https://github.com/DIRACGrid/diracx/actions/workflows/deployment.yml/badge.svg?branch=main)
4
- ![Diracx: extensions](https://github.com/DIRACGrid/diracx/actions/workflows/extensions.yml/badge.svg?branch=main)
3
+ ![DiracX deployment](https://github.com/DIRACGrid/diracx/actions/workflows/deployment.yml/badge.svg?branch=main)
5
4
 
6
5
  # DiracX
7
6
 
@@ -16,6 +16,7 @@ dependencies = [
16
16
  "diracx-client",
17
17
  "diracx-core",
18
18
  "httpx",
19
+ "zstandard",
19
20
  ]
20
21
  dynamic = ["version"]
21
22
 
@@ -7,10 +7,12 @@ import logging
7
7
  import os
8
8
  import tarfile
9
9
  import tempfile
10
+ from contextlib import contextmanager
10
11
  from pathlib import Path
11
- from typing import Literal
12
+ from typing import BinaryIO, Literal
12
13
 
13
14
  import httpx
15
+ import zstandard
14
16
 
15
17
  from diracx.client.aio import AsyncDiracClient
16
18
  from diracx.client.models import SandboxInfo
@@ -20,8 +22,29 @@ from .utils import with_client
20
22
  logger = logging.getLogger(__name__)
21
23
 
22
24
  SANDBOX_CHECKSUM_ALGORITHM = "sha256"
23
- SANDBOX_COMPRESSION: Literal["bz2"] = "bz2"
24
- SANDBOX_OPEN_MODE: Literal["w|bz2"] = "w|bz2"
25
+ SANDBOX_COMPRESSION: Literal["zst"] = "zst"
26
+
27
+
28
+ @contextmanager
29
+ def tarfile_open(fileobj: BinaryIO):
30
+ """Context manager to extend tarfile.open to support reading zstd compressed files.
31
+
32
+ This is only needed for Python <=3.13.
33
+ """
34
+ # Save current position and read magic bytes
35
+ current_pos = fileobj.tell()
36
+ magic = fileobj.read(4)
37
+ fileobj.seek(current_pos)
38
+
39
+ # Read magic bytes to determine compression format
40
+ if magic.startswith(b"\x28\xb5\x2f\xfd"): # zstd magic number
41
+ dctx = zstandard.ZstdDecompressor()
42
+ with dctx.stream_reader(fileobj) as decompressor:
43
+ with tarfile.open(fileobj=decompressor, mode="r|") as tf:
44
+ yield tf
45
+ else:
46
+ with tarfile.open(fileobj=fileobj, mode="r") as tf:
47
+ yield tf
25
48
 
26
49
 
27
50
  @with_client
@@ -33,10 +56,18 @@ async def create_sandbox(paths: list[Path], *, client: AsyncDiracClient) -> str:
33
56
  be used to submit jobs.
34
57
  """
35
58
  with tempfile.TemporaryFile(mode="w+b") as tar_fh:
36
- with tarfile.open(fileobj=tar_fh, mode=SANDBOX_OPEN_MODE) as tf:
37
- for path in paths:
38
- logger.debug("Adding %s to sandbox as %s", path.resolve(), path.name)
39
- tf.add(path.resolve(), path.name, recursive=True)
59
+ # Create zstd compressed tar with level 18 and long matching enabled
60
+ compression_params = zstandard.ZstdCompressionParameters.from_level(
61
+ 18, enable_ldm=1
62
+ )
63
+ cctx = zstandard.ZstdCompressor(compression_params=compression_params)
64
+ with cctx.stream_writer(tar_fh, closefd=False) as compressor:
65
+ with tarfile.open(fileobj=compressor, mode="w|") as tf:
66
+ for path in paths:
67
+ logger.debug(
68
+ "Adding %s to sandbox as %s", path.resolve(), path.name
69
+ )
70
+ tf.add(path.resolve(), path.name, recursive=True)
40
71
  tar_fh.seek(0)
41
72
 
42
73
  hasher = getattr(hashlib, SANDBOX_CHECKSUM_ALGORITHM)()
@@ -89,6 +120,6 @@ async def download_sandbox(pfn: str, destination: Path, *, client: AsyncDiracCli
89
120
  fh.seek(0)
90
121
  logger.debug("Sandbox downloaded for %s", pfn)
91
122
 
92
- with tarfile.open(fileobj=fh) as tf:
123
+ with tarfile_open(fh) as tf:
93
124
  tf.extractall(path=destination, filter="data")
94
125
  logger.debug("Extracted %s to %s", pfn, destination)
@@ -20,7 +20,7 @@ dependencies = [
20
20
  "gitpython",
21
21
  "pydantic>=2.10",
22
22
  "rich",
23
- "typer>=0.12.4",
23
+ "typer>=0.15.4",
24
24
  "pyyaml",
25
25
  ]
26
26
  dynamic = ["version"]
@@ -12,7 +12,9 @@ from typing import Annotated, Optional
12
12
  import typer
13
13
 
14
14
  from diracx.client.aio import AsyncDiracClient
15
- from diracx.client.models import DeviceFlowErrorResponse
15
+
16
+ # See https://github.com/DIRACGrid/diracx/issues/578
17
+ from diracx.client.models import DeviceFlowErrorResponse # type: ignore [attr-defined]
16
18
  from diracx.core.preferences import get_diracx_preferences
17
19
  from diracx.core.utils import read_credentials, write_credentials
18
20
 
@@ -88,7 +90,9 @@ async def login(
88
90
  )
89
91
  while expires > datetime.now(tz=timezone.utc):
90
92
  print(".", end="", flush=True)
91
- response = await api.auth.get_oidc_token(device_code=data.device_code, client_id=api.client_id) # type: ignore
93
+ response = await api.auth.get_oidc_token(
94
+ device_code=data.device_code, client_id=api.client_id
95
+ ) # type: ignore
92
96
  if isinstance(response, DeviceFlowErrorResponse):
93
97
  if response.error == "authorization_pending":
94
98
  # TODO: Setting more than 5 seconds results in an error
@@ -95,6 +95,7 @@ def _apply_fixes(raw):
95
95
  raw["DIRAC"].pop("Extensions", None)
96
96
  raw["DIRAC"].pop("Framework", None)
97
97
  raw["DIRAC"].pop("Security", None)
98
+ raw["DIRAC"].pop("PreferredURLPatterns", None)
98
99
 
99
100
  # This is VOMS specific and no longer required
100
101
  raw["DIRAC"].pop("ConnConf", None)
@@ -210,7 +211,6 @@ def generate_helm_values(
210
211
  },
211
212
  "rabbitmq": {"enabled": False},
212
213
  "mysql": {"enabled": False},
213
- "global": {"images": {"services": "FILL ME"}, "storageClassName": "FILL ME"},
214
214
  }
215
215
 
216
216
  cfg = diraccfg.CFG().loadFromBuffer(public_cfg.read_text())
@@ -264,8 +264,7 @@ def generate_helm_values(
264
264
 
265
265
  from diracx.core.extensions import select_from_extension
266
266
 
267
- for entry_point in select_from_extension(group="diracx.db.sql"):
268
-
267
+ for entry_point in select_from_extension(group="diracx.dbs.sql"):
269
268
  db_name = entry_point.name
270
269
  db_config = all_db_configs.get(db_name, {})
271
270
 
@@ -284,9 +283,9 @@ def generate_helm_values(
284
283
  if "Password" in db_config:
285
284
  sql_dbs["dbs"][db_name]["password"] = db_config.get("Password")
286
285
  if "Host" in db_config or "Port" in db_config:
287
- sql_dbs["dbs"][db_name][
288
- "host"
289
- ] = f"{db_config.get('Host', default_db_host)}:{db_config.get('Port', default_db_port)}"
286
+ sql_dbs["dbs"][db_name]["host"] = (
287
+ f"{db_config.get('Host', default_db_host)}:{db_config.get('Port', default_db_port)}"
288
+ )
290
289
  if not sql_dbs["dbs"][db_name]:
291
290
  sql_dbs["dbs"][db_name] = None
292
291
 
@@ -311,7 +310,7 @@ def generate_helm_values(
311
310
  },
312
311
  }
313
312
 
314
- for entry_point in select_from_extension(group="diracx.db.os"):
313
+ for entry_point in select_from_extension(group="diracx.dbs.os"):
315
314
  db_name = entry_point.name
316
315
  db_config = all_db_configs.get(db_name, {})
317
316
 
@@ -1,6 +1,7 @@
1
1
  DIRAC
2
2
  {
3
3
  VirtualOrganization = vo
4
+ PreferredURLPatterns = .*\.main\.invalid/.*
4
5
  Configuration
5
6
  {
6
7
  Name = Production
@@ -15,12 +15,7 @@ from azure.core.rest import HttpRequest, HttpResponse
15
15
  from . import models as _models
16
16
  from ._configuration import DiracConfiguration
17
17
  from ._utils.serialization import Deserializer, Serializer
18
- from .operations import (
19
- AuthOperations,
20
- ConfigOperations,
21
- JobsOperations,
22
- WellKnownOperations,
23
- )
18
+ from .operations import AuthOperations, ConfigOperations, JobsOperations, WellKnownOperations
24
19
 
25
20
 
26
21
  class Dirac: # pylint: disable=client-accepts-api-version-keyword
@@ -57,39 +52,21 @@ class Dirac: # pylint: disable=client-accepts-api-version-keyword
57
52
  self._config.custom_hook_policy,
58
53
  self._config.logging_policy,
59
54
  policies.DistributedTracingPolicy(**kwargs),
60
- (
61
- policies.SensitiveHeaderCleanupPolicy(**kwargs)
62
- if self._config.redirect_policy
63
- else None
64
- ),
55
+ policies.SensitiveHeaderCleanupPolicy(**kwargs) if self._config.redirect_policy else None,
65
56
  self._config.http_logging_policy,
66
57
  ]
67
- self._client: PipelineClient = PipelineClient(
68
- base_url=endpoint, policies=_policies, **kwargs
69
- )
58
+ self._client: PipelineClient = PipelineClient(base_url=endpoint, policies=_policies, **kwargs)
70
59
 
71
- client_models = {
72
- k: v for k, v in _models.__dict__.items() if isinstance(v, type)
73
- }
60
+ client_models = {k: v for k, v in _models.__dict__.items() if isinstance(v, type)}
74
61
  self._serialize = Serializer(client_models)
75
62
  self._deserialize = Deserializer(client_models)
76
63
  self._serialize.client_side_validation = False
77
- self.well_known = WellKnownOperations(
78
- self._client, self._config, self._serialize, self._deserialize
79
- )
80
- self.auth = AuthOperations(
81
- self._client, self._config, self._serialize, self._deserialize
82
- )
83
- self.config = ConfigOperations(
84
- self._client, self._config, self._serialize, self._deserialize
85
- )
86
- self.jobs = JobsOperations(
87
- self._client, self._config, self._serialize, self._deserialize
88
- )
89
-
90
- def send_request(
91
- self, request: HttpRequest, *, stream: bool = False, **kwargs: Any
92
- ) -> HttpResponse:
64
+ self.well_known = WellKnownOperations(self._client, self._config, self._serialize, self._deserialize)
65
+ self.auth = AuthOperations(self._client, self._config, self._serialize, self._deserialize)
66
+ self.config = ConfigOperations(self._client, self._config, self._serialize, self._deserialize)
67
+ self.jobs = JobsOperations(self._client, self._config, self._serialize, self._deserialize)
68
+
69
+ def send_request(self, request: HttpRequest, *, stream: bool = False, **kwargs: Any) -> HttpResponse:
93
70
  """Runs the network request through the client's chained policies.
94
71
 
95
72
  >>> from azure.core.rest import HttpRequest
@@ -25,24 +25,12 @@ class DiracConfiguration: # pylint: disable=too-many-instance-attributes
25
25
  self._configure(**kwargs)
26
26
 
27
27
  def _configure(self, **kwargs: Any) -> None:
28
- self.user_agent_policy = kwargs.get(
29
- "user_agent_policy"
30
- ) or policies.UserAgentPolicy(**kwargs)
31
- self.headers_policy = kwargs.get("headers_policy") or policies.HeadersPolicy(
32
- **kwargs
33
- )
28
+ self.user_agent_policy = kwargs.get("user_agent_policy") or policies.UserAgentPolicy(**kwargs)
29
+ self.headers_policy = kwargs.get("headers_policy") or policies.HeadersPolicy(**kwargs)
34
30
  self.proxy_policy = kwargs.get("proxy_policy") or policies.ProxyPolicy(**kwargs)
35
- self.logging_policy = kwargs.get(
36
- "logging_policy"
37
- ) or policies.NetworkTraceLoggingPolicy(**kwargs)
38
- self.http_logging_policy = kwargs.get(
39
- "http_logging_policy"
40
- ) or policies.HttpLoggingPolicy(**kwargs)
41
- self.custom_hook_policy = kwargs.get(
42
- "custom_hook_policy"
43
- ) or policies.CustomHookPolicy(**kwargs)
44
- self.redirect_policy = kwargs.get("redirect_policy") or policies.RedirectPolicy(
45
- **kwargs
46
- )
31
+ self.logging_policy = kwargs.get("logging_policy") or policies.NetworkTraceLoggingPolicy(**kwargs)
32
+ self.http_logging_policy = kwargs.get("http_logging_policy") or policies.HttpLoggingPolicy(**kwargs)
33
+ self.custom_hook_policy = kwargs.get("custom_hook_policy") or policies.CustomHookPolicy(**kwargs)
34
+ self.redirect_policy = kwargs.get("redirect_policy") or policies.RedirectPolicy(**kwargs)
47
35
  self.retry_policy = kwargs.get("retry_policy") or policies.RetryPolicy(**kwargs)
48
36
  self.authentication_policy = kwargs.get("authentication_policy")