diracx 0.0.1a44__tar.gz → 0.0.1a46__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 (408) hide show
  1. diracx-0.0.1a46/.coveragerc +33 -0
  2. diracx-0.0.1a46/.gitattributes +2 -0
  3. diracx-0.0.1a46/.github/dependabot.yml +11 -0
  4. diracx-0.0.1a46/.github/workflows/deployment.yml +221 -0
  5. diracx-0.0.1a46/.github/workflows/integration.yml +76 -0
  6. diracx-0.0.1a46/.github/workflows/main.yml +241 -0
  7. diracx-0.0.1a46/.github/workflows/make_release.py +74 -0
  8. diracx-0.0.1a46/.github/workflows/update_security_txt_expiry.yml +88 -0
  9. diracx-0.0.1a46/.github/workflows/vulnerabilities.yml +92 -0
  10. diracx-0.0.1a46/.gitignore +98 -0
  11. diracx-0.0.1a46/.pre-commit-config.yaml +63 -0
  12. diracx-0.0.1a46/.readthedocs.yaml +16 -0
  13. diracx-0.0.1a46/MANIFEST.in +5 -0
  14. {diracx-0.0.1a44 → diracx-0.0.1a46}/PKG-INFO +6 -8
  15. {diracx-0.0.1a44 → diracx-0.0.1a46}/README.md +2 -3
  16. diracx-0.0.1a46/codecov.yml +21 -0
  17. diracx-0.0.1a46/containers/client/Dockerfile +12 -0
  18. diracx-0.0.1a46/containers/services/Dockerfile +12 -0
  19. diracx-0.0.1a46/diracx-api/README.md +0 -0
  20. diracx-0.0.1a46/diracx-api/pyproject.toml +51 -0
  21. diracx-0.0.1a46/diracx-api/src/diracx/api/__init__.py +5 -0
  22. diracx-0.0.1a46/diracx-api/src/diracx/api/jobs.py +94 -0
  23. diracx-0.0.1a46/diracx-api/src/diracx/api/py.typed +0 -0
  24. diracx-0.0.1a46/diracx-api/src/diracx/api/utils.py +25 -0
  25. diracx-0.0.1a46/diracx-api/tests/test_jobs.py +47 -0
  26. diracx-0.0.1a46/diracx-api/tests/test_utils.py +24 -0
  27. diracx-0.0.1a46/diracx-cli/README.md +0 -0
  28. diracx-0.0.1a46/diracx-cli/pyproject.toml +73 -0
  29. diracx-0.0.1a46/diracx-cli/src/diracx/cli/__init__.py +31 -0
  30. diracx-0.0.1a46/diracx-cli/src/diracx/cli/__main__.py +6 -0
  31. diracx-0.0.1a46/diracx-cli/src/diracx/cli/auth.py +150 -0
  32. diracx-0.0.1a46/diracx-cli/src/diracx/cli/config.py +34 -0
  33. diracx-0.0.1a46/diracx-cli/src/diracx/cli/internal/__init__.py +8 -0
  34. diracx-0.0.1a46/diracx-cli/src/diracx/cli/internal/config.py +192 -0
  35. diracx-0.0.1a46/diracx-cli/src/diracx/cli/internal/legacy.py +387 -0
  36. diracx-0.0.1a46/diracx-cli/src/diracx/cli/jobs.py +158 -0
  37. diracx-0.0.1a46/diracx-cli/src/diracx/cli/py.typed +0 -0
  38. diracx-0.0.1a46/diracx-cli/src/diracx/cli/utils.py +34 -0
  39. diracx-0.0.1a46/diracx-cli/tests/legacy/cs_sync/integration_test.cfg +1837 -0
  40. diracx-0.0.1a46/diracx-cli/tests/legacy/cs_sync/integration_test.yaml +863 -0
  41. diracx-0.0.1a46/diracx-cli/tests/legacy/cs_sync/integration_test_buggy.cfg +17 -0
  42. diracx-0.0.1a46/diracx-cli/tests/legacy/cs_sync/integration_test_secret.cfg +131 -0
  43. diracx-0.0.1a46/diracx-cli/tests/legacy/cs_sync/test_cssync.py +58 -0
  44. diracx-0.0.1a46/diracx-cli/tests/legacy/test_legacy.py +35 -0
  45. diracx-0.0.1a46/diracx-cli/tests/test_internal.py +224 -0
  46. diracx-0.0.1a46/diracx-cli/tests/test_jobs.py +122 -0
  47. diracx-0.0.1a46/diracx-cli/tests/test_login.py +42 -0
  48. diracx-0.0.1a46/diracx-client/README.md +0 -0
  49. diracx-0.0.1a46/diracx-client/pyproject.toml +50 -0
  50. diracx-0.0.1a46/diracx-client/src/_diracx_client_importer.pth +1 -0
  51. diracx-0.0.1a46/diracx-client/src/diracx/_client_importer.py +384 -0
  52. diracx-0.0.1a46/diracx-client/src/diracx/client/__init__.py +15 -0
  53. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/__init__.py +27 -0
  54. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_client.py +99 -0
  55. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_configuration.py +36 -0
  56. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_patch.py +22 -0
  57. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_serialization.py +2184 -0
  58. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_utils/__init__.py +4 -0
  59. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_utils/serialization.py +2030 -0
  60. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_utils/utils.py +49 -0
  61. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_vendor.py +55 -0
  62. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/__init__.py +27 -0
  63. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/_client.py +101 -0
  64. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/_configuration.py +36 -0
  65. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/_patch.py +20 -0
  66. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/_vendor.py +55 -0
  67. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/operations/__init__.py +29 -0
  68. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/operations/_operations.py +2215 -0
  69. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/operations/_patch.py +26 -0
  70. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/models/__init__.py +107 -0
  71. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/models/_enums.py +71 -0
  72. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/models/_models.py +1285 -0
  73. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/models/_patch.py +57 -0
  74. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/operations/__init__.py +29 -0
  75. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/operations/_operations.py +2755 -0
  76. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/operations/_patch.py +26 -0
  77. diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/py.typed +1 -0
  78. diracx-0.0.1a46/diracx-client/src/diracx/client/aio.py +13 -0
  79. diracx-0.0.1a46/diracx-client/src/diracx/client/models.py +4 -0
  80. diracx-0.0.1a46/diracx-client/src/diracx/client/patches/auth/aio.py +45 -0
  81. diracx-0.0.1a46/diracx-client/src/diracx/client/patches/auth/common.py +56 -0
  82. diracx-0.0.1a46/diracx-client/src/diracx/client/patches/auth/sync.py +41 -0
  83. diracx-0.0.1a46/diracx-client/src/diracx/client/patches/client/aio.py +160 -0
  84. diracx-0.0.1a46/diracx-client/src/diracx/client/patches/client/common.py +196 -0
  85. diracx-0.0.1a46/diracx-client/src/diracx/client/patches/client/sync.py +141 -0
  86. diracx-0.0.1a46/diracx-client/src/diracx/client/patches/jobs/aio.py +34 -0
  87. diracx-0.0.1a46/diracx-client/src/diracx/client/patches/jobs/common.py +85 -0
  88. diracx-0.0.1a46/diracx-client/src/diracx/client/patches/jobs/sync.py +34 -0
  89. diracx-0.0.1a46/diracx-client/src/diracx/client/patches/utils.py +324 -0
  90. diracx-0.0.1a46/diracx-client/src/diracx/client/py.typed +0 -0
  91. diracx-0.0.1a46/diracx-client/src/diracx/client/sync.py +13 -0
  92. diracx-0.0.1a46/diracx-client/tests/test_auth.py +235 -0
  93. diracx-0.0.1a46/diracx-core/README.md +0 -0
  94. diracx-0.0.1a46/diracx-core/pyproject.toml +71 -0
  95. diracx-0.0.1a46/diracx-core/src/diracx/core/__init__.py +0 -0
  96. diracx-0.0.1a46/diracx-core/src/diracx/core/config/__init__.py +21 -0
  97. diracx-0.0.1a46/diracx-core/src/diracx/core/config/schema.py +181 -0
  98. diracx-0.0.1a46/diracx-core/src/diracx/core/config/sources.py +294 -0
  99. diracx-0.0.1a46/diracx-core/src/diracx/core/exceptions.py +102 -0
  100. diracx-0.0.1a46/diracx-core/src/diracx/core/extensions.py +55 -0
  101. diracx-0.0.1a46/diracx-core/src/diracx/core/models.py +274 -0
  102. diracx-0.0.1a46/diracx-core/src/diracx/core/preferences.py +62 -0
  103. diracx-0.0.1a46/diracx-core/src/diracx/core/properties.py +161 -0
  104. diracx-0.0.1a46/diracx-core/src/diracx/core/py.typed +0 -0
  105. diracx-0.0.1a46/diracx-core/src/diracx/core/s3.py +108 -0
  106. diracx-0.0.1a46/diracx-core/src/diracx/core/settings.py +209 -0
  107. diracx-0.0.1a46/diracx-core/src/diracx/core/utils.py +273 -0
  108. diracx-0.0.1a46/diracx-core/tests/test_config_source.py +38 -0
  109. diracx-0.0.1a46/diracx-core/tests/test_extensions.py +8 -0
  110. diracx-0.0.1a46/diracx-core/tests/test_s3.py +167 -0
  111. diracx-0.0.1a46/diracx-core/tests/test_secrets.py +45 -0
  112. diracx-0.0.1a46/diracx-core/tests/test_utils.py +170 -0
  113. diracx-0.0.1a46/diracx-db/README.md +0 -0
  114. diracx-0.0.1a46/diracx-db/pyproject.toml +62 -0
  115. diracx-0.0.1a46/diracx-db/src/diracx/db/__init__.py +5 -0
  116. diracx-0.0.1a46/diracx-db/src/diracx/db/__main__.py +56 -0
  117. diracx-0.0.1a46/diracx-db/src/diracx/db/exceptions.py +5 -0
  118. diracx-0.0.1a46/diracx-db/src/diracx/db/os/__init__.py +5 -0
  119. diracx-0.0.1a46/diracx-db/src/diracx/db/os/job_parameters.py +37 -0
  120. diracx-0.0.1a46/diracx-db/src/diracx/db/os/utils.py +303 -0
  121. diracx-0.0.1a46/diracx-db/src/diracx/db/py.typed +0 -0
  122. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/__init__.py +17 -0
  123. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/auth/__init__.py +0 -0
  124. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/auth/db.py +266 -0
  125. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/auth/schema.py +101 -0
  126. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/dummy/__init__.py +0 -0
  127. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/dummy/db.py +51 -0
  128. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/dummy/schema.py +24 -0
  129. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job/__init__.py +0 -0
  130. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job/db.py +335 -0
  131. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job/schema.py +158 -0
  132. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job_logging/__init__.py +0 -0
  133. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job_logging/db.py +152 -0
  134. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job_logging/schema.py +64 -0
  135. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/pilot_agents/__init__.py +0 -0
  136. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/pilot_agents/db.py +45 -0
  137. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/pilot_agents/schema.py +60 -0
  138. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/sandbox_metadata/__init__.py +0 -0
  139. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/sandbox_metadata/db.py +278 -0
  140. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/sandbox_metadata/schema.py +57 -0
  141. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/task_queue/__init__.py +0 -0
  142. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/task_queue/db.py +180 -0
  143. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/task_queue/schema.py +111 -0
  144. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/utils/__init__.py +25 -0
  145. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/utils/base.py +328 -0
  146. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/utils/functions.py +142 -0
  147. diracx-0.0.1a46/diracx-db/src/diracx/db/sql/utils/types.py +43 -0
  148. diracx-0.0.1a46/diracx-db/tests/auth/test_authorization_flow.py +76 -0
  149. diracx-0.0.1a46/diracx-db/tests/auth/test_device_flow.py +141 -0
  150. diracx-0.0.1a46/diracx-db/tests/auth/test_refresh_token.py +258 -0
  151. diracx-0.0.1a46/diracx-db/tests/jobs/test_job_db.py +289 -0
  152. diracx-0.0.1a46/diracx-db/tests/jobs/test_job_logging_db.py +96 -0
  153. diracx-0.0.1a46/diracx-db/tests/jobs/test_sandbox_metadata.py +212 -0
  154. diracx-0.0.1a46/diracx-db/tests/opensearch/test_connection.py +90 -0
  155. diracx-0.0.1a46/diracx-db/tests/opensearch/test_index_template.py +51 -0
  156. diracx-0.0.1a46/diracx-db/tests/opensearch/test_search.py +477 -0
  157. diracx-0.0.1a46/diracx-db/tests/pilot_agents/__init__.py +0 -0
  158. diracx-0.0.1a46/diracx-db/tests/pilot_agents/test_pilot_agents_db.py +30 -0
  159. diracx-0.0.1a46/diracx-db/tests/test_dummy_db.py +275 -0
  160. diracx-0.0.1a46/diracx-db/tests/test_freeze_time.py +153 -0
  161. diracx-0.0.1a46/diracx-logic/README.md +0 -0
  162. diracx-0.0.1a46/diracx-logic/pyproject.toml +53 -0
  163. diracx-0.0.1a46/diracx-logic/src/diracx/logic/__init__.py +0 -0
  164. diracx-0.0.1a46/diracx-logic/src/diracx/logic/__main__.py +129 -0
  165. diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/__init__.py +0 -0
  166. diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/authorize_code_flow.py +99 -0
  167. diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/device_flow.py +100 -0
  168. diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/management.py +43 -0
  169. diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/token.py +435 -0
  170. diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/utils.py +300 -0
  171. diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/well_known.py +74 -0
  172. diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/__init__.py +0 -0
  173. diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/query.py +100 -0
  174. diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/sandboxes.py +237 -0
  175. diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/status.py +645 -0
  176. diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/submission.py +257 -0
  177. diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/utils.py +40 -0
  178. diracx-0.0.1a46/diracx-logic/src/diracx/logic/py.typed +0 -0
  179. diracx-0.0.1a46/diracx-logic/src/diracx/logic/task_queues/__init__.py +0 -0
  180. diracx-0.0.1a46/diracx-logic/src/diracx/logic/task_queues/priority.py +151 -0
  181. diracx-0.0.1a46/diracx-logic/tests/logic/test_sandboxes.py +154 -0
  182. diracx-0.0.1a46/diracx-routers/README.md +0 -0
  183. diracx-0.0.1a46/diracx-routers/pyproject.toml +87 -0
  184. diracx-0.0.1a46/diracx-routers/src/diracx/routers/__init__.py +12 -0
  185. diracx-0.0.1a46/diracx-routers/src/diracx/routers/access_policies.py +164 -0
  186. diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/__init__.py +17 -0
  187. diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/authorize_code_flow.py +159 -0
  188. diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/device_flow.py +207 -0
  189. diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/management.py +134 -0
  190. diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/token.py +248 -0
  191. diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/utils.py +28 -0
  192. diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/well_known.py +63 -0
  193. diracx-0.0.1a46/diracx-routers/src/diracx/routers/configuration.py +64 -0
  194. diracx-0.0.1a46/diracx-routers/src/diracx/routers/dependencies.py +67 -0
  195. diracx-0.0.1a46/diracx-routers/src/diracx/routers/factory.py +542 -0
  196. diracx-0.0.1a46/diracx-routers/src/diracx/routers/fastapi_classes.py +112 -0
  197. diracx-0.0.1a46/diracx-routers/src/diracx/routers/health/__init__.py +9 -0
  198. diracx-0.0.1a46/diracx-routers/src/diracx/routers/health/probes.py +54 -0
  199. diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/__init__.py +17 -0
  200. diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/access_policies.py +163 -0
  201. diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/legacy.py +0 -0
  202. diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/query.py +192 -0
  203. diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/sandboxes.py +176 -0
  204. diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/status.py +181 -0
  205. diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/submission.py +76 -0
  206. diracx-0.0.1a46/diracx-routers/src/diracx/routers/otel.py +131 -0
  207. diracx-0.0.1a46/diracx-routers/src/diracx/routers/py.typed +0 -0
  208. diracx-0.0.1a46/diracx-routers/src/diracx/routers/utils/__init__.py +0 -0
  209. diracx-0.0.1a46/diracx-routers/src/diracx/routers/utils/users.py +116 -0
  210. diracx-0.0.1a46/diracx-routers/tests/auth/test_legacy_exchange.py +202 -0
  211. diracx-0.0.1a46/diracx-routers/tests/auth/test_standard.py +1399 -0
  212. diracx-0.0.1a46/diracx-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +1 -0
  213. diracx-0.0.1a46/diracx-routers/tests/health/test_probes.py +98 -0
  214. diracx-0.0.1a46/diracx-routers/tests/jobs/conftest.py +99 -0
  215. diracx-0.0.1a46/diracx-routers/tests/jobs/test_query.py +861 -0
  216. diracx-0.0.1a46/diracx-routers/tests/jobs/test_sandboxes.py +306 -0
  217. diracx-0.0.1a46/diracx-routers/tests/jobs/test_status.py +1138 -0
  218. diracx-0.0.1a46/diracx-routers/tests/jobs/test_wms_access_policy.py +359 -0
  219. diracx-0.0.1a46/diracx-routers/tests/test_config_manager.py +116 -0
  220. diracx-0.0.1a46/diracx-routers/tests/test_generic.py +73 -0
  221. diracx-0.0.1a46/diracx-routers/tests/test_policy.py +50 -0
  222. diracx-0.0.1a46/diracx-testing/README.md +0 -0
  223. diracx-0.0.1a46/diracx-testing/pyproject.toml +42 -0
  224. diracx-0.0.1a46/diracx-testing/src/diracx/testing/__init__.py +45 -0
  225. diracx-0.0.1a46/diracx-testing/src/diracx/testing/__main__.py +67 -0
  226. diracx-0.0.1a46/diracx-testing/src/diracx/testing/client_generation.py +231 -0
  227. diracx-0.0.1a46/diracx-testing/src/diracx/testing/client_generation_pytest.py +37 -0
  228. diracx-0.0.1a46/diracx-testing/src/diracx/testing/dummy_osdb.py +30 -0
  229. diracx-0.0.1a46/diracx-testing/src/diracx/testing/entrypoints.py +69 -0
  230. diracx-0.0.1a46/diracx-testing/src/diracx/testing/mock_osdb.py +168 -0
  231. diracx-0.0.1a46/diracx-testing/src/diracx/testing/osdb.py +101 -0
  232. diracx-0.0.1a46/diracx-testing/src/diracx/testing/routers.py +36 -0
  233. diracx-0.0.1a46/diracx-testing/src/diracx/testing/scripts/collect_demo_coverage.sh +147 -0
  234. diracx-0.0.1a46/diracx-testing/src/diracx/testing/time.py +135 -0
  235. diracx-0.0.1a46/diracx-testing/src/diracx/testing/utils.py +703 -0
  236. diracx-0.0.1a46/docs/SECURITY.md +7 -0
  237. diracx-0.0.1a46/docs/admin/explanations/authentication.md +3 -0
  238. diracx-0.0.1a46/docs/admin/explanations/configuration.md +32 -0
  239. diracx-0.0.1a46/docs/admin/explanations/opentelemetry.md +11 -0
  240. diracx-0.0.1a46/docs/admin/explanations/user-management.md +4 -0
  241. diracx-0.0.1a46/docs/admin/how-to/convert-cs.md +40 -0
  242. diracx-0.0.1a46/docs/admin/how-to/register-a-vo.md +83 -0
  243. diracx-0.0.1a46/docs/admin/how-to/register-the-admin-vo.md +96 -0
  244. diracx-0.0.1a46/docs/admin/reference/security_model.md +288 -0
  245. diracx-0.0.1a46/docs/admin/reference/settings-and-preferences.md +0 -0
  246. diracx-0.0.1a46/docs/admin/tutorials/authentication.md +5 -0
  247. diracx-0.0.1a46/docs/assets/css/extra.css +54 -0
  248. diracx-0.0.1a46/docs/assets/css/fontawesome-all.min.css +101 -0
  249. diracx-0.0.1a46/docs/assets/css/images/arrow.svg +5 -0
  250. diracx-0.0.1a46/docs/assets/css/images/overlay.png +0 -0
  251. diracx-0.0.1a46/docs/assets/css/main.css +3378 -0
  252. diracx-0.0.1a46/docs/assets/home.html +146 -0
  253. diracx-0.0.1a46/docs/assets/images/diracx-logo-square.svg +279 -0
  254. diracx-0.0.1a46/docs/assets/images/logo.svg +273 -0
  255. diracx-0.0.1a46/docs/assets/images/pic02.jpg +0 -0
  256. diracx-0.0.1a46/docs/assets/styles/extra.css +13 -0
  257. diracx-0.0.1a46/docs/assets/webfonts/fa-brands-400.woff2 +0 -0
  258. diracx-0.0.1a46/docs/assets/webfonts/fa-solid-900.woff +0 -0
  259. diracx-0.0.1a46/docs/dev/explanations/client.md +73 -0
  260. diracx-0.0.1a46/docs/dev/explanations/components/api.md +34 -0
  261. diracx-0.0.1a46/docs/dev/explanations/components/cli.md +63 -0
  262. diracx-0.0.1a46/docs/dev/explanations/components/db.md +56 -0
  263. diracx-0.0.1a46/docs/dev/explanations/components/index.md +136 -0
  264. diracx-0.0.1a46/docs/dev/explanations/components/routes.md +205 -0
  265. diracx-0.0.1a46/docs/dev/explanations/designing-functionality.md +1 -0
  266. diracx-0.0.1a46/docs/dev/explanations/extensions.md +5 -0
  267. diracx-0.0.1a46/docs/dev/explanations/index.md +0 -0
  268. diracx-0.0.1a46/docs/dev/explanations/testing.md +13 -0
  269. diracx-0.0.1a46/docs/dev/how-to/add-a-db.md +13 -0
  270. diracx-0.0.1a46/docs/dev/how-to/add-a-route.md +28 -0
  271. diracx-0.0.1a46/docs/dev/how-to/add-a-setting.md +6 -0
  272. diracx-0.0.1a46/docs/dev/how-to/add-a-test.md +4 -0
  273. diracx-0.0.1a46/docs/dev/how-to/client-customization.md +18 -0
  274. diracx-0.0.1a46/docs/dev/how-to/client-generation.md +2 -0
  275. diracx-0.0.1a46/docs/dev/how-to/extend-diracx/index.md +3 -0
  276. diracx-0.0.1a46/docs/dev/reference/application-state.md +11 -0
  277. diracx-0.0.1a46/docs/dev/reference/client-metapathfinder.md +0 -0
  278. diracx-0.0.1a46/docs/dev/reference/coding-conventions.md +131 -0
  279. diracx-0.0.1a46/docs/dev/reference/configuration.md +5 -0
  280. diracx-0.0.1a46/docs/dev/reference/db-transaction-model.md +0 -0
  281. diracx-0.0.1a46/docs/dev/reference/dependency-injection.md +16 -0
  282. diracx-0.0.1a46/docs/dev/reference/entrypoints.md +3 -0
  283. diracx-0.0.1a46/docs/dev/reference/security-policies.md +3 -0
  284. diracx-0.0.1a46/docs/dev/reference/security-properties.md +3 -0
  285. diracx-0.0.1a46/docs/dev/tutorials/advanced-tutorial.md +8 -0
  286. diracx-0.0.1a46/docs/dev/tutorials/getting-started.md +67 -0
  287. diracx-0.0.1a46/docs/dev/tutorials/making-changes.md +18 -0
  288. diracx-0.0.1a46/docs/dev/tutorials/run-locally.md +32 -0
  289. diracx-0.0.1a46/docs/dev/tutorials/write-docs.md +6 -0
  290. diracx-0.0.1a46/docs/index.md +45 -0
  291. diracx-0.0.1a46/docs/project/consortium.md +24 -0
  292. diracx-0.0.1a46/docs/project/index.md +3 -0
  293. diracx-0.0.1a46/docs/roadmap.md +79 -0
  294. diracx-0.0.1a46/docs/user/reference/client-configuration.md +14 -0
  295. diracx-0.0.1a46/extensions/README.md +217 -0
  296. diracx-0.0.1a46/extensions/containers/client/Dockerfile +13 -0
  297. diracx-0.0.1a46/extensions/containers/services/Dockerfile +15 -0
  298. diracx-0.0.1a46/extensions/gubbins/.github/workflows/main.yml +69 -0
  299. diracx-0.0.1a46/extensions/gubbins/README.md +6 -0
  300. diracx-0.0.1a46/extensions/gubbins/gubbins-api/README.md +0 -0
  301. diracx-0.0.1a46/extensions/gubbins/gubbins-api/pyproject.toml +47 -0
  302. diracx-0.0.1a46/extensions/gubbins/gubbins-api/src/gubbins/api/__init__.py +0 -0
  303. diracx-0.0.1a46/extensions/gubbins/gubbins-api/src/gubbins/api/py.typed +0 -0
  304. diracx-0.0.1a46/extensions/gubbins/gubbins-api/tests/test_gubbins_api.py +2 -0
  305. diracx-0.0.1a46/extensions/gubbins/gubbins-cli/README.md +0 -0
  306. diracx-0.0.1a46/extensions/gubbins/gubbins-cli/pyproject.toml +54 -0
  307. diracx-0.0.1a46/extensions/gubbins/gubbins-cli/src/gubbins/cli/__init__.py +0 -0
  308. diracx-0.0.1a46/extensions/gubbins/gubbins-cli/src/gubbins/cli/config.py +20 -0
  309. diracx-0.0.1a46/extensions/gubbins/gubbins-cli/src/gubbins/cli/lollygag.py +38 -0
  310. diracx-0.0.1a46/extensions/gubbins/gubbins-cli/src/gubbins/cli/py.typed +0 -0
  311. diracx-0.0.1a46/extensions/gubbins/gubbins-cli/tests/test_gubbins_cli.py +62 -0
  312. diracx-0.0.1a46/extensions/gubbins/gubbins-client/README.md +0 -0
  313. diracx-0.0.1a46/extensions/gubbins/gubbins-client/pyproject.toml +51 -0
  314. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/__init__.py +9 -0
  315. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/__init__.py +27 -0
  316. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_client.py +102 -0
  317. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_configuration.py +36 -0
  318. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_patch.py +28 -0
  319. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_serialization.py +2184 -0
  320. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/__init__.py +4 -0
  321. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/serialization.py +2030 -0
  322. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/utils.py +49 -0
  323. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_vendor.py +55 -0
  324. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/__init__.py +27 -0
  325. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_client.py +104 -0
  326. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_configuration.py +36 -0
  327. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_patch.py +25 -0
  328. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_vendor.py +55 -0
  329. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/__init__.py +31 -0
  330. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_operations.py +2382 -0
  331. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_patch.py +26 -0
  332. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/__init__.py +107 -0
  333. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_enums.py +71 -0
  334. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_models.py +1306 -0
  335. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/__init__.py +31 -0
  336. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_operations.py +2968 -0
  337. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_patch.py +20 -0
  338. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/py.typed +1 -0
  339. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/aio.py +16 -0
  340. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/models.py +4 -0
  341. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/py.typed +1 -0
  342. diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/sync.py +16 -0
  343. diracx-0.0.1a46/extensions/gubbins/gubbins-client/tests/test_gubbins_client.py +102 -0
  344. diracx-0.0.1a46/extensions/gubbins/gubbins-core/README.md +0 -0
  345. diracx-0.0.1a46/extensions/gubbins/gubbins-core/pyproject.toml +57 -0
  346. diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/__init__.py +1 -0
  347. diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/config/__init__.py +1 -0
  348. diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/config/schema.py +30 -0
  349. diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/models.py +6 -0
  350. diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/properties.py +5 -0
  351. diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/py.typed +0 -0
  352. diracx-0.0.1a46/extensions/gubbins/gubbins-core/tests/test_config.py +38 -0
  353. diracx-0.0.1a46/extensions/gubbins/gubbins-core/tests/test_properties.py +9 -0
  354. diracx-0.0.1a46/extensions/gubbins/gubbins-db/README.md +0 -0
  355. diracx-0.0.1a46/extensions/gubbins/gubbins-db/pyproject.toml +55 -0
  356. diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/__init__.py +6 -0
  357. diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/py.typed +0 -0
  358. diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/__init__.py +6 -0
  359. diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/__init__.py +0 -0
  360. diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/db.py +60 -0
  361. diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/schema.py +19 -0
  362. diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/__init__.py +0 -0
  363. diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/db.py +59 -0
  364. diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/schema.py +21 -0
  365. diracx-0.0.1a46/extensions/gubbins/gubbins-db/tests/test_gubbins_job_db.py +57 -0
  366. diracx-0.0.1a46/extensions/gubbins/gubbins-db/tests/test_lollygag_db.py +85 -0
  367. diracx-0.0.1a46/extensions/gubbins/gubbins-logic/README.md +0 -0
  368. diracx-0.0.1a46/extensions/gubbins/gubbins-logic/pyproject.toml +49 -0
  369. diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/__init__.py +0 -0
  370. diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/__init__.py +0 -0
  371. diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/well_known.py +28 -0
  372. diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/__init__.py +0 -0
  373. diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/lollygag.py +23 -0
  374. diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/py.typed +0 -0
  375. diracx-0.0.1a46/extensions/gubbins/gubbins-logic/tests/test_gubbins_logic.py +2 -0
  376. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/README.md +0 -0
  377. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/pyproject.toml +69 -0
  378. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/__init__.py +1 -0
  379. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/dependencies.py +14 -0
  380. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/__init__.py +2 -0
  381. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/access_policy.py +43 -0
  382. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/lollygag.py +57 -0
  383. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/py.typed +0 -0
  384. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/well_known.py +28 -0
  385. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +1 -0
  386. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/tests/test_gubbins_job_manager.py +113 -0
  387. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/tests/test_lollybag.py +34 -0
  388. diracx-0.0.1a46/extensions/gubbins/gubbins-routers/tests/test_wellknown.py +37 -0
  389. diracx-0.0.1a46/extensions/gubbins/gubbins-testing/README.md +0 -0
  390. diracx-0.0.1a46/extensions/gubbins/gubbins-testing/pyproject.toml +31 -0
  391. diracx-0.0.1a46/extensions/gubbins/gubbins-testing/src/gubbins/testing/__init__.py +1 -0
  392. diracx-0.0.1a46/extensions/gubbins/pixi.toml +91 -0
  393. diracx-0.0.1a46/extensions/gubbins/pyproject.toml +134 -0
  394. diracx-0.0.1a46/extensions/gubbins/release.notes +2 -0
  395. diracx-0.0.1a46/extensions/gubbins_values.yaml +16 -0
  396. diracx-0.0.1a46/mkdocs.yml +144 -0
  397. diracx-0.0.1a46/pixi.toml +169 -0
  398. {diracx-0.0.1a44 → diracx-0.0.1a46}/pyproject.toml +34 -13
  399. diracx-0.0.1a46/release.notes +2 -0
  400. diracx-0.0.1a46/release.notes.new +30 -0
  401. diracx-0.0.1a46/release.notes.old +2 -0
  402. diracx-0.0.1a46/run_local.sh +95 -0
  403. diracx-0.0.1a46/tests/__init__.py +0 -0
  404. diracx-0.0.1a46/tests/make_token_local.py +56 -0
  405. diracx-0.0.1a46/tests/test_generic.py +8 -0
  406. diracx-0.0.1a44/diracx.egg-info/SOURCES.txt +0 -3
  407. diracx-0.0.1a44/setup.cfg +0 -4
  408. {diracx-0.0.1a44 → diracx-0.0.1a46}/LICENSE +0 -0
@@ -0,0 +1,33 @@
1
+ [run]
2
+ omit =
3
+ tests/*
4
+ */tests/*
5
+ **/diracx/client/_generated/*
6
+ **/diracx/testing/*
7
+ **/gubbins/testing/*
8
+ **/gubbins/client/_generated/*
9
+
10
+ [paths]
11
+ source =
12
+ src/
13
+ */src/
14
+ */site-packages/
15
+ /diracx_source/*/src/
16
+ /diracx_source/*/*/src/
17
+
18
+ [report]
19
+ include_namespace_packages = true
20
+ exclude_lines =
21
+ # Have to re-enable the standard pragma
22
+ pragma: no cover
23
+
24
+ # Don't complain if tests don't hit defensive assertion code:
25
+ raise NotImplementedError
26
+
27
+ # Ignore the default implementation of abstract methods
28
+ ^\s*\.\.\.$
29
+
30
+ if TYPE_CHECKING:
31
+ omit =
32
+ **/diracx/client/*
33
+ **/diracx/testing/*
@@ -0,0 +1,2 @@
1
+ # SCM syntax highlighting & preventing 3-way merges
2
+ pixi.lock merge=binary linguist-language=YAML linguist-generated=true
@@ -0,0 +1,11 @@
1
+ version: 2
2
+ updates:
3
+ # Maintain dependencies for GitHub Actions
4
+ - package-ecosystem: "github-actions"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ groups:
9
+ actions:
10
+ patterns:
11
+ - "*"
@@ -0,0 +1,221 @@
1
+ name: Deployment
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ schedule:
7
+ - cron: '0 10 * * *'
8
+ workflow_dispatch:
9
+ inputs:
10
+ check-ci:
11
+ description: "Require the CI to have passed for this commit"
12
+ required: true
13
+ default: "yes"
14
+ version:
15
+ description: "Override the release version number (e.g. 8.0.0a5)"
16
+
17
+ jobs:
18
+ deploy-pypi:
19
+ name: PyPI deployment
20
+ runs-on: "ubuntu-latest"
21
+ if: github.event_name != 'push' || github.repository == 'DIRACGrid/diracx'
22
+ outputs:
23
+ new-version: ${{ steps.check-tag.outputs.new-version }}
24
+ create-release: ${{ steps.check-tag.outputs.create-release }}
25
+ permissions:
26
+ id-token: write # IMPORTANT: this permission is mandatory for trusted publishing on pypi
27
+ actions: write
28
+ checks: write
29
+ contents: write
30
+ deployments: write
31
+ discussions: write
32
+ issues: write
33
+ packages: write
34
+ pages: write
35
+ pull-requests: write
36
+ repository-projects: write
37
+ security-events: write
38
+ statuses: write
39
+ defaults:
40
+ run:
41
+ # We need extglob for REFERENCE_BRANCH substitution
42
+ shell: bash -l -O extglob {0}
43
+ steps:
44
+ - uses: actions/checkout@v4
45
+ with:
46
+ token: ${{ github.token }}
47
+ - run: |
48
+ git fetch --prune --unshallow
49
+ git config --global user.email "ci@diracgrid.org"
50
+ git config --global user.name "DIRACGrid CI"
51
+ - uses: actions/setup-python@v5
52
+ with:
53
+ python-version: '3.11'
54
+ - name: Installing dependencies
55
+ run: |
56
+ python -m pip install \
57
+ build \
58
+ python-dateutil \
59
+ pytz \
60
+ readme_renderer[md] \
61
+ requests \
62
+ setuptools_scm
63
+ - name: Validate README for PyPI
64
+ run: |
65
+ python -m readme_renderer README.md -o /tmp/README.html
66
+ - name: Prepare release notes
67
+ run: |
68
+ set -xeuo pipefail
69
+ IFS=$'\n\t'
70
+ # Needed for the advanced pattern matching used in REFERENCE_BRANCH
71
+ PREV_VERSION=$(git describe --tags --abbrev=0)
72
+ # In case of manual trigger,
73
+ # GITHUB_REF is of the form refs/heads/main -> we want main
74
+ # In case of PR it is of the form refs/pull/59/merge -> we want pull/59/merge
75
+ REFERENCE_BRANCH=${GITHUB_REF##refs*(/heads)/}
76
+ echo "Making release notes for ${REFERENCE_BRANCH} since ${PREV_VERSION}"
77
+ (git log ${PREV_VERSION}...${REFERENCE_BRANCH} --oneline --no-merges --) > release.notes.new
78
+ cat release.notes.new
79
+ - name: Create tag if required
80
+ id: check-tag
81
+ run: |
82
+ set -xeuo pipefail
83
+ IFS=$'\n\t'
84
+ # Only do a real release for workflow_dispatch events
85
+ if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
86
+ echo "Will create a real release"
87
+ export NEW_VERSION="v${{ github.event.inputs.version }}"
88
+ if [[ "${NEW_VERSION}" == "v" ]]; then
89
+ # If version wasn't given as an input to the workflow, use setuptools_scm to guess while removing "dev" portion of the version number
90
+ NEW_VERSION=v$(python -m setuptools_scm | sed 's@Guessed Version @@g' | sed -E 's@(\.dev|\+g).+@@g')
91
+ export NEW_VERSION
92
+ fi
93
+ echo "Release will be named $NEW_VERSION"
94
+ # Validate the version
95
+ # Ensure the version doesn't look like a PEP-440 "dev release" (which might happen if the automatic version bump has issues)
96
+ python -c $'from packaging.version import Version; v = Version('"'$NEW_VERSION'"$')\nif v.is_devrelease:\n raise ValueError(v)'
97
+ # Make sure we always only create pre-releases
98
+ python -c $'from packaging.version import Version; v = Version('"'$NEW_VERSION'"$')\nif not v.is_prerelease:\n raise ValueError("integration should only be used for pre-releases")'
99
+ # Commit the release notes
100
+ mv release.notes release.notes.old
101
+ cat release.notes.old
102
+ (echo -e "[${NEW_VERSION}]" && cat release.notes.new release.notes.old) > release.notes
103
+ ###################3
104
+ # TODO: we should add the release notes somewhere at some point
105
+ # now we just don't do it because main branch is protected
106
+ # and we can't push directly from the CI
107
+ #git add release.notes
108
+ #git commit -m "docs: Add release notes for $NEW_VERSION"
109
+ # Stash is mandatory not to leave the repo dirty
110
+ git stash
111
+ ########################
112
+ git show
113
+ # Create the tag
114
+ git tag "$NEW_VERSION"
115
+ echo "create-release=true" >> $GITHUB_OUTPUT
116
+ echo "new-version=$NEW_VERSION" >> $GITHUB_OUTPUT
117
+ fi
118
+ - name: Build distributions
119
+ run: |
120
+ for pkg_dir in $PWD/diracx-*; do
121
+ echo "Building $pkg_dir"
122
+ python -m build --outdir $PWD/dist $pkg_dir
123
+ done
124
+ # Also build the diracx metapackage
125
+ python -m build --outdir $PWD/dist .
126
+ - name: 'Upload Artifact'
127
+ uses: actions/upload-artifact@v4
128
+ with:
129
+ name: diracx-whl
130
+ path: dist/diracx*.whl
131
+ retention-days: 5
132
+ - name: Make release on GitHub
133
+ if: steps.check-tag.outputs.create-release == 'true'
134
+ run: |
135
+ set -e
136
+ export NEW_VERSION=${{ steps.check-tag.outputs.new-version }}
137
+ REFERENCE_BRANCH=${GITHUB_REF##refs*(/heads)/}
138
+ echo "Pushing tagged release notes to ${REFERENCE_BRANCH}"
139
+ git push "origin" "${REFERENCE_BRANCH}"
140
+ echo "Making GitHub release for ${NEW_VERSION}"
141
+ .github/workflows/make_release.py \
142
+ --repo="${{ github.repository }}" \
143
+ --token="${{ secrets.GITHUB_TOKEN }}" \
144
+ --version="${NEW_VERSION}" \
145
+ --rev="$(git rev-parse HEAD)" \
146
+ --release-notes-fn="release.notes.new"
147
+ # Use trusted publisher for pypi
148
+ # https://docs.pypi.org/trusted-publishers/
149
+ - name: Publish package on PyPI
150
+ if: steps.check-tag.outputs.create-release == 'true'
151
+ uses: pypa/gh-action-pypi-publish@release/v1
152
+
153
+ docker:
154
+ needs: deploy-pypi
155
+ timeout-minutes: 30
156
+ runs-on: ubuntu-latest
157
+ steps:
158
+ - name: Checkout
159
+ uses: actions/checkout@v4
160
+ - name: Set up QEMU
161
+ uses: docker/setup-qemu-action@v3
162
+ - name: Set up Docker Buildx
163
+ uses: docker/setup-buildx-action@v3
164
+ - name: Login to GitHub container registry
165
+ uses: docker/login-action@v3
166
+ with:
167
+ registry: ghcr.io
168
+ username: ${{ github.actor }}
169
+ password: ${{ secrets.GITHUB_TOKEN }}
170
+ - name: Download diracx wheels
171
+ uses: actions/download-artifact@v4
172
+ with:
173
+ name: diracx-whl
174
+ - name: "Find wheels"
175
+ id: find_wheel
176
+ run: |
177
+ # We need to copy them there to be able to access them in the RUN --mount
178
+ cp diracx*.whl containers/client/
179
+ cp diracx*.whl containers/services/
180
+ for wheel_fn in *.whl; do
181
+ pkg_name=$(basename "${wheel_fn}" | cut -d '-' -f 1)
182
+ echo "${pkg_name}-wheel-name=$(ls "${pkg_name}"-*.whl)" >> $GITHUB_OUTPUT
183
+ done
184
+
185
+ - name: Build and push client (release)
186
+ uses: docker/build-push-action@v6
187
+ if: ${{ needs.deploy-pypi.outputs.create-release == 'true' }}
188
+ with:
189
+ context: containers/client/
190
+ push: ${{ needs.deploy-pypi.outputs.create-release == 'true' }}
191
+ tags: "ghcr.io/diracgrid/diracx/client:${{ needs.deploy-pypi.outputs.new-version }}"
192
+ platforms: linux/amd64,linux/arm64
193
+ build-args: EXTRA_PACKAGES_TO_INSTALL=DIRAC~=9.0.0a1
194
+ - name: Build and push services (release)
195
+ uses: docker/build-push-action@v6
196
+ if: ${{ needs.deploy-pypi.outputs.create-release == 'true' }}
197
+ with:
198
+ context: containers/services/
199
+ push: ${{ needs.deploy-pypi.outputs.create-release == 'true' }}
200
+ tags: "ghcr.io/diracgrid/diracx/services:${{ needs.deploy-pypi.outputs.new-version }}"
201
+ platforms: linux/amd64,linux/arm64
202
+ build-args: EXTRA_PACKAGES_TO_INSTALL=DIRAC~=9.0.0a1
203
+
204
+ - name: Build and push client (dev)
205
+ uses: docker/build-push-action@v6
206
+ with:
207
+ context: containers/client/
208
+ push: ${{ github.event_name != 'pull_request' && github.repository == 'DIRACGrid/diracx' && github.ref_name == 'main' }}
209
+ tags: ghcr.io/diracgrid/diracx/client:dev
210
+ platforms: linux/amd64,linux/arm64
211
+ build-args: |
212
+ EXTRA_PACKAGES_TO_INSTALL=git+https://github.com/DIRACGrid/DIRAC.git@integration
213
+ - name: Build and push services (dev)
214
+ uses: docker/build-push-action@v6
215
+ with:
216
+ context: containers/services/
217
+ push: ${{ github.event_name != 'pull_request' && github.repository == 'DIRACGrid/diracx' && github.ref_name == 'main' }}
218
+ tags: ghcr.io/diracgrid/diracx/services:dev
219
+ platforms: linux/amd64,linux/arm64
220
+ build-args: |
221
+ EXTRA_PACKAGES_TO_INSTALL=git+https://github.com/DIRACGrid/DIRAC.git@integration
@@ -0,0 +1,76 @@
1
+ name: Integration Tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+ branches:
9
+ - main
10
+
11
+ defaults:
12
+ run:
13
+ shell: bash -el {0}
14
+
15
+ jobs:
16
+ dirac-integration-tests:
17
+ name: DIRAC Integration tests
18
+ if: github.repository == 'DIRACGrid/diracx'
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ dirac-branch:
24
+ - integration
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+ - uses: actions/setup-python@v5
28
+ with:
29
+ python-version: '3.11'
30
+ - name: Build wheels
31
+ run: |
32
+ pip install build
33
+ for pkg_dir in $PWD/diracx-* .; do
34
+ echo "Building $pkg_dir"
35
+ python -m build --outdir "${GITHUB_WORKSPACE}/dist" $pkg_dir
36
+ done
37
+ - name: Clone DIRAC
38
+ run: |
39
+ pip install typer pyyaml gitpython packaging
40
+ git clone https://github.com/DIRACGrid/DIRAC.git -b "${{ matrix.dirac-branch }}" /tmp/DIRACRepo
41
+ echo "Current revision: $(git -C /tmp/DIRACRepo rev-parse HEAD)"
42
+ # We need to cd in the directory for the integration_tests.py to work
43
+ - name: Prepare environment
44
+ run: cd /tmp/DIRACRepo && ./integration_tests.py prepare-environment "TEST_DIRACX=Yes" --diracx-dist-dir "${GITHUB_WORKSPACE}/dist"
45
+ - name: Install server
46
+ run: cd /tmp/DIRACRepo && ./integration_tests.py install-server
47
+ - name: Install client
48
+ run: cd /tmp/DIRACRepo && ./integration_tests.py install-client
49
+ - name: Install pilot
50
+ run: cd /tmp/DIRACRepo && ./integration_tests.py install-pilot
51
+ - name: Server tests
52
+ run: cd /tmp/DIRACRepo && ./integration_tests.py test-server || touch server-tests-failed
53
+ - name: Client tests
54
+ run: cd /tmp/DIRACRepo && ./integration_tests.py test-client || touch client-tests-failed
55
+ - name: Pilot tests
56
+ run: cd /tmp/DIRACRepo && ./integration_tests.py test-pilot || touch pilot-tests-failed
57
+ - name: Check test status
58
+ run: |
59
+ has_error=0
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
64
+ if [ ${has_error} = 1 ]; then exit 1; fi
65
+ - name: diracx logs
66
+ if: ${{ failure() }}
67
+ run: |
68
+ mkdir -p /tmp/service-logs
69
+ docker logs diracx 2>&1 | tee /tmp/service-logs/diracx.log
70
+ cd /tmp/DIRACRepo
71
+ ./integration_tests.py logs --no-follow --lines 1000 2>&1 | tee /tmp/service-logs/dirac.log
72
+ - uses: actions/upload-artifact@v4
73
+ if: ${{ failure() }}
74
+ with:
75
+ name: service-logs-${{ github.job }}
76
+ path: /tmp/service-logs/
@@ -0,0 +1,241 @@
1
+ name: Basic Tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+ branches:
9
+ - main
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+
17
+ shellcheck:
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - name: Checkout code
21
+ uses: actions/checkout@v4
22
+ - uses: prefix-dev/setup-pixi@v0.8.11
23
+ with:
24
+ run-install: false
25
+ post-cleanup: false
26
+ - name: Apply workarounds
27
+ run: |
28
+ # Workaround for https://github.com/prefix-dev/pixi/issues/3762
29
+ sed -i.bak 's@editable = true@editable = false@g' pixi.toml
30
+ rm pixi.toml.bak
31
+ # Add annotations to github actions
32
+ pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
33
+ # Show any changes
34
+ git diff
35
+ - uses: prefix-dev/setup-pixi@v0.8.11
36
+ with:
37
+ cache: false
38
+ environments: shellcheck
39
+ - name: Run shellcheck
40
+ run: pixi run shellcheck
41
+
42
+ unittest:
43
+ name: Unit test - ${{ matrix.package }}
44
+ runs-on: ubuntu-latest
45
+ strategy:
46
+ fail-fast: false
47
+ matrix:
48
+ package:
49
+ - diracx-core
50
+ - diracx-db
51
+ - diracx-logic
52
+ - diracx-routers
53
+ - diracx-client
54
+ - diracx-api
55
+ - diracx-cli
56
+ - gubbins-core
57
+ - gubbins-db
58
+ - gubbins-logic
59
+ - gubbins-routers
60
+ - gubbins-client
61
+ - gubbins-api
62
+ - gubbins-cli
63
+ steps:
64
+ - name: Checkout code
65
+ uses: actions/checkout@v4
66
+ - uses: prefix-dev/setup-pixi@v0.8.11
67
+ with:
68
+ run-install: false
69
+ post-cleanup: false
70
+ - name: Apply workarounds
71
+ run: |
72
+ # Workaround for https://github.com/prefix-dev/pixi/issues/3762
73
+ sed -i.bak 's@editable = true@editable = false@g' pixi.toml
74
+ rm pixi.toml.bak
75
+ # Add annotations to github actions
76
+ pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
77
+ # Show any changes
78
+ git diff
79
+ - uses: prefix-dev/setup-pixi@v0.8.11
80
+ with:
81
+ cache: false
82
+ environments: ${{ matrix.package }}
83
+ - name: Run pytest
84
+ run: pixi run pytest-${{ matrix.package }} --cov-report=xml:coverage.xml --junitxml=report.xml
85
+ - name: Upload coverage report
86
+ uses: codecov/codecov-action@v5.4.3
87
+
88
+ pytest-integration:
89
+ runs-on: ubuntu-latest
90
+ strategy:
91
+ fail-fast: false
92
+ matrix:
93
+ extension:
94
+ - diracx
95
+ - gubbins
96
+ steps:
97
+ - name: Checkout code
98
+ uses: actions/checkout@v4
99
+ - uses: prefix-dev/setup-pixi@v0.8.11
100
+ with:
101
+ run-install: false
102
+ post-cleanup: false
103
+ - name: Apply workarounds
104
+ run: |
105
+ # Workaround for https://github.com/prefix-dev/pixi/issues/3762
106
+ sed -i.bak 's@editable = true@editable = false@g' pixi.toml
107
+ rm pixi.toml.bak
108
+ # Add annotations to github actions
109
+ pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
110
+ # Show any changes
111
+ git diff
112
+ - uses: prefix-dev/setup-pixi@v0.8.11
113
+ with:
114
+ cache: false
115
+ environments: ${{ matrix.extension == 'diracx' && 'default' || 'default-gubbins' }}
116
+ - name: Build gubbins wheels
117
+ if: ${{ matrix.extension == 'gubbins' }}
118
+ run: |
119
+ for pkg_dir in $PWD/diracx-*; do
120
+ echo "Building $pkg_dir"
121
+ pixi exec python-build --outdir $PWD/extensions/containers/services/ $pkg_dir
122
+ done
123
+ # Also build the diracx metapackage
124
+ pixi exec python-build --outdir $PWD/extensions/containers/services/ .
125
+ # And build the gubbins package
126
+ for pkg_dir in $PWD/extensions/gubbins/gubbins-*; do
127
+ # Skip the testing package
128
+ if [[ "${pkg_dir}" =~ .*testing.* ]];
129
+ then
130
+ echo "Do not build ${pkg_dir}";
131
+ continue;
132
+ fi
133
+ echo "Building $pkg_dir"
134
+ pixi exec python-build --outdir $PWD/extensions/containers/services/ $pkg_dir
135
+ done
136
+ - name: Set up Docker Buildx
137
+ if: ${{ matrix.extension == 'gubbins' }}
138
+ uses: docker/setup-buildx-action@v3
139
+ - name: Build container for gubbins
140
+ if: ${{ matrix.extension == 'gubbins' }}
141
+ uses: docker/build-push-action@v6
142
+ with:
143
+ context: extensions/containers/services
144
+ tags: gubbins/services:dev
145
+ outputs: type=docker,dest=/tmp/gubbins_services_image.tar
146
+ build-args: |
147
+ EXTENSION_CUSTOM_SOURCES_TO_INSTALL=/bindmount/gubbins_db*.whl,/bindmount/gubbins_logic*.whl,/bindmount/gubbins_routers*.whl,/bindmount/gubbins_client*.whl
148
+ - name: Load image
149
+ if: ${{ matrix.extension == 'gubbins' }}
150
+ run: |
151
+ docker load --input /tmp/gubbins_services_image.tar
152
+ docker image ls -a
153
+ - name: Start demo
154
+ run: |
155
+ git clone https://github.com/DIRACGrid/diracx-charts.git ../diracx-charts
156
+
157
+ declare -a demo_args=()
158
+ demo_args+=("--enable-open-telemetry")
159
+ demo_args+=("--enable-coverage")
160
+ demo_args+=("--exit-when-done")
161
+ demo_args+=("--set-value" "developer.autoReload=false")
162
+ demo_args+=("--ci-values" "../diracx-charts/demo/ci_values.yaml")
163
+
164
+ declare -a demo_source_dirs=("$PWD")
165
+
166
+ if [ ${{ matrix.extension }} == 'gubbins' ]; then
167
+ # We have to copy the code to another directory
168
+ # and make it a git repository by itself because otherwise the
169
+ # root in the pyproject to do not make sense once mounted
170
+ # in the containers.
171
+ cp -r ./extensions/gubbins /tmp/
172
+ sed -i 's@../..@.@g' /tmp/gubbins/pyproject.toml
173
+ sed -i 's@../../@@g' /tmp/gubbins/gubbins-*/pyproject.toml
174
+ git init /tmp/gubbins/
175
+
176
+ demo_args+=("--ci-values" "./extensions/gubbins_values.yaml")
177
+ demo_args+=("--load-docker-image" "gubbins/services:dev")
178
+ demo_source_dirs+=("/tmp/gubbins/")
179
+ elif [ ${{ matrix.extension }} != 'diracx' ]; then
180
+ echo "Unknown extension: ${{ matrix.extension }}"
181
+ exit 1
182
+ fi
183
+
184
+ # Run the demo with the provided arguments
185
+ set -x
186
+ ../diracx-charts/run_demo.sh "${demo_args[@]}" "${demo_source_dirs[@]}"
187
+ - name: Debugging information
188
+ run: |
189
+ DIRACX_DEMO_DIR=$PWD/../diracx-charts/.demo
190
+ export KUBECONFIG=${DIRACX_DEMO_DIR}/kube.conf
191
+ export PATH=${DIRACX_DEMO_DIR}:$PATH
192
+ kubectl get pods
193
+ for pod_name in $(kubectl get pods -o json | jq -r '.items[] | .metadata.name' | grep -vE '(dex|minio|mysql|rabbitmq|opensearch)'); do
194
+ echo "${pod_name}"
195
+ kubectl describe pod/"${pod_name}" || true
196
+ for container_name in $(kubectl get pods $pod_name -o jsonpath='{.spec.initContainers[*].name} {.spec.containers[*].name}'); do
197
+ echo $pod_name $container_name
198
+ kubectl logs "${pod_name}" -c "${container_name}" || true
199
+ done
200
+ done
201
+ if [ ! -f "${DIRACX_DEMO_DIR}/.success" ]; then
202
+ cat "${DIRACX_DEMO_DIR}/.failed"
203
+ exit 1
204
+ fi
205
+ - name: Run pytest
206
+ run: |
207
+ pixi run pytest-${{ matrix.extension }} --demo-dir="$PWD/../diracx-charts/" --cov-report=xml:coverage-pytest.xml --junitxml=report.xml
208
+ - name: Collect demo coverage
209
+ run: |
210
+ pixi run -e ${{ matrix.extension == 'diracx' && 'default' || 'default-gubbins' }} python -m diracx.testing coverage collect-demo --demo-dir=../diracx-charts/.demo
211
+ - name: Upload coverage report
212
+ uses: codecov/codecov-action@v5.4.3
213
+ with:
214
+ files: ./coverage-pytest.xml,./coverage-demo.xml
215
+
216
+ client-generation:
217
+ runs-on: ubuntu-latest
218
+ strategy:
219
+ fail-fast: false
220
+ matrix:
221
+ package: [diracx, gubbins]
222
+ steps:
223
+ - name: Checkout code
224
+ uses: actions/checkout@v4
225
+ - uses: prefix-dev/setup-pixi@v0.8.11
226
+ with:
227
+ run-install: false
228
+ post-cleanup: false
229
+ - name: Apply workarounds
230
+ run: |
231
+ # Add annotations to github actions
232
+ pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
233
+ # Show any changes
234
+ git diff
235
+ - uses: prefix-dev/setup-pixi@v0.8.11
236
+ with:
237
+ cache: false
238
+ locked: false
239
+ environments: ${{ matrix.package }}-generate-client
240
+ - name: Run autorest
241
+ run: pixi run -e ${{ matrix.package }}-generate-client generate-client
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env python
2
+ from __future__ import annotations
3
+
4
+ import argparse
5
+ from pathlib import Path
6
+
7
+ import requests
8
+ from packaging.version import Version
9
+
10
+
11
+ def make_release(version, commit_hash, release_notes=""):
12
+ """Create a new GitHub release using the given data.
13
+
14
+ This function always makes a pre-release first to ensure the "latest" release never corresponds
15
+ to one without artifacts uploaded. If the new version number is not a pre-release, as
16
+ determined by PEP-440, it is promoted to at full release after the uploads have completed
17
+ successfully.
18
+
19
+ :param str version: The version of the new release
20
+ :param str commit_hash: Git revision used for the release
21
+ :param str release_notes: Release notes
22
+ """
23
+ # Create a draft release
24
+ r = requests.post(
25
+ f"{api_root}/releases",
26
+ json={
27
+ "tag_name": version,
28
+ "target_commitish": commit_hash,
29
+ "body": release_notes,
30
+ "draft": True,
31
+ "prerelease": Version(version).is_prerelease,
32
+ },
33
+ headers=headers,
34
+ timeout=60,
35
+ )
36
+ r.raise_for_status()
37
+ release_data = r.json()
38
+ print(f"Created draft release at: {release_data['html_url']}")
39
+
40
+ # Publish the release
41
+ r = requests.patch(
42
+ release_data["url"],
43
+ json={
44
+ "draft": False,
45
+ },
46
+ headers=headers,
47
+ timeout=60,
48
+ )
49
+ r.raise_for_status()
50
+ release_data = r.json()
51
+ print(f"Published release at: {release_data['html_url']}")
52
+
53
+
54
+ if __name__ == "__main__":
55
+ parser = argparse.ArgumentParser()
56
+ parser.add_argument("--token", required=True)
57
+ parser.add_argument("--repo", default="DIRACGrid/DIRAC")
58
+ parser.add_argument("--version", required=True)
59
+ parser.add_argument("--rev", required=True)
60
+ parser.add_argument("--release-notes-fn", required=True)
61
+ args = parser.parse_args()
62
+
63
+ token = args.token
64
+ headers = {
65
+ "Accept": "application/vnd.github.v3+json",
66
+ "Authorization": f"token {token}",
67
+ }
68
+ api_root = f"https://api.github.com/repos/{args.repo}"
69
+ release_notes = Path(args.release_notes_fn).read_text()
70
+
71
+ if not args.version.startswith("v"):
72
+ raise ValueError('For consistency versions must start with "v"')
73
+
74
+ make_release(args.version, args.rev, release_notes=release_notes)