beakerhub 0.0.1__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 (204) hide show
  1. beakerhub-0.0.1/.dockerignore +16 -0
  2. beakerhub-0.0.1/.github/workflows/test-integration.yml +138 -0
  3. beakerhub-0.0.1/.github/workflows/test-unit.yml +63 -0
  4. beakerhub-0.0.1/.gitignore +114 -0
  5. beakerhub-0.0.1/CONTRIBUTING.md +436 -0
  6. beakerhub-0.0.1/LICENSE.txt +9 -0
  7. beakerhub-0.0.1/Makefile +238 -0
  8. beakerhub-0.0.1/PKG-INFO +230 -0
  9. beakerhub-0.0.1/README.md +198 -0
  10. beakerhub-0.0.1/docs/DEVELOPMENT.md +391 -0
  11. beakerhub-0.0.1/docs/QUICKSTART.md +240 -0
  12. beakerhub-0.0.1/docs/README.md +47 -0
  13. beakerhub-0.0.1/docs/local-tls.md +142 -0
  14. beakerhub-0.0.1/docs/vue-jupyterhub-integration.md +149 -0
  15. beakerhub-0.0.1/helm/Makefile +334 -0
  16. beakerhub-0.0.1/helm/README.md +239 -0
  17. beakerhub-0.0.1/helm/beakerhub/.helmignore +23 -0
  18. beakerhub-0.0.1/helm/beakerhub/Chart.yaml +15 -0
  19. beakerhub-0.0.1/helm/beakerhub/README.md +320 -0
  20. beakerhub-0.0.1/helm/beakerhub/templates/NOTES.txt +63 -0
  21. beakerhub-0.0.1/helm/beakerhub/templates/_helpers.tpl +60 -0
  22. beakerhub-0.0.1/helm/beakerhub/templates/beakerhub-config.yaml +216 -0
  23. beakerhub-0.0.1/helm/beakerhub/templates/configmap.yaml +53 -0
  24. beakerhub-0.0.1/helm/beakerhub/templates/dev-vite-server.yaml +129 -0
  25. beakerhub-0.0.1/helm/beakerhub/templates/hub-deployment.yaml +156 -0
  26. beakerhub-0.0.1/helm/beakerhub/templates/hub-service.yaml +27 -0
  27. beakerhub-0.0.1/helm/beakerhub/templates/ingress.yaml +79 -0
  28. beakerhub-0.0.1/helm/beakerhub/templates/notebook-serviceAccount.yaml +12 -0
  29. beakerhub-0.0.1/helm/beakerhub/templates/proxy-deployment.yaml +90 -0
  30. beakerhub-0.0.1/helm/beakerhub/templates/proxy-service.yaml +60 -0
  31. beakerhub-0.0.1/helm/beakerhub/templates/pvc.yaml +63 -0
  32. beakerhub-0.0.1/helm/beakerhub/templates/rbac.yaml +110 -0
  33. beakerhub-0.0.1/helm/beakerhub/templates/secret.yaml +60 -0
  34. beakerhub-0.0.1/helm/beakerhub/templates/serviceaccount.yaml +20 -0
  35. beakerhub-0.0.1/helm/beakerhub/templates/target-group-binding.yaml +27 -0
  36. beakerhub-0.0.1/helm/beakerhub/values.yaml +414 -0
  37. beakerhub-0.0.1/helm/kind/certs.d/registry.beakerhub.internal/hosts.toml +5 -0
  38. beakerhub-0.0.1/helm/kind/dev-setup.py +333 -0
  39. beakerhub-0.0.1/helm/kind/install-ingress-kind.sh +32 -0
  40. beakerhub-0.0.1/helm/kind/install-metallb-kind.sh +74 -0
  41. beakerhub-0.0.1/helm/kind/requirements.txt +2 -0
  42. beakerhub-0.0.1/helm/kind/update-hosts.sh +226 -0
  43. beakerhub-0.0.1/helm/values-local.yaml +96 -0
  44. beakerhub-0.0.1/images/Makefile +47 -0
  45. beakerhub-0.0.1/images/base.Dockerfile +50 -0
  46. beakerhub-0.0.1/images/beakerhub-ui-build.Dockerfile +17 -0
  47. beakerhub-0.0.1/images/config_files/bin/entry-point.sh +4 -0
  48. beakerhub-0.0.1/images/config_files/bin/task-reporter.py +116 -0
  49. beakerhub-0.0.1/images/default-node.Dockerfile +32 -0
  50. beakerhub-0.0.1/images/docker-bake.hcl +168 -0
  51. beakerhub-0.0.1/images/proxy.Dockerfile +12 -0
  52. beakerhub-0.0.1/images/server.Dockerfile +45 -0
  53. beakerhub-0.0.1/images/task-reporter.Dockerfile +6 -0
  54. beakerhub-0.0.1/package-lock.json +11515 -0
  55. beakerhub-0.0.1/package.json +21 -0
  56. beakerhub-0.0.1/pyproject.toml +157 -0
  57. beakerhub-0.0.1/src/beakerhub/__about__.py +4 -0
  58. beakerhub-0.0.1/src/beakerhub/__init__.py +2 -0
  59. beakerhub-0.0.1/src/beakerhub/admin_handlers.py +1020 -0
  60. beakerhub-0.0.1/src/beakerhub/api_handlers.py +641 -0
  61. beakerhub-0.0.1/src/beakerhub/app.py +222 -0
  62. beakerhub-0.0.1/src/beakerhub/auth/__init__.py +0 -0
  63. beakerhub-0.0.1/src/beakerhub/auth/base.py +23 -0
  64. beakerhub-0.0.1/src/beakerhub/auth/cognito.py +386 -0
  65. beakerhub-0.0.1/src/beakerhub/auth/dummy.py +67 -0
  66. beakerhub-0.0.1/src/beakerhub/auth/handlers.py +162 -0
  67. beakerhub-0.0.1/src/beakerhub/auth/node.py +42 -0
  68. beakerhub-0.0.1/src/beakerhub/auth/user.py +352 -0
  69. beakerhub-0.0.1/src/beakerhub/cli/__init__.py +0 -0
  70. beakerhub-0.0.1/src/beakerhub/cli/main.py +95 -0
  71. beakerhub-0.0.1/src/beakerhub/dashboard_handlers.py +604 -0
  72. beakerhub-0.0.1/src/beakerhub/handlers.py +128 -0
  73. beakerhub-0.0.1/src/beakerhub/nodes/__init__.py +0 -0
  74. beakerhub-0.0.1/src/beakerhub/nodes/import_handlers.py +271 -0
  75. beakerhub-0.0.1/src/beakerhub/nodes/tasks.py +250 -0
  76. beakerhub-0.0.1/src/beakerhub/orm.py +508 -0
  77. beakerhub-0.0.1/src/beakerhub/scripts/__init__.py +1 -0
  78. beakerhub-0.0.1/src/beakerhub/scripts/seed_contexts.py +179 -0
  79. beakerhub-0.0.1/src/beakerhub/services/__init__.py +137 -0
  80. beakerhub-0.0.1/src/beakerhub/services/idle_culler/__init__.py +22 -0
  81. beakerhub-0.0.1/src/beakerhub/services/idle_culler/idle_culler_service.py +178 -0
  82. beakerhub-0.0.1/src/beakerhub/services/secrets/__init__.py +21 -0
  83. beakerhub-0.0.1/src/beakerhub/services/secrets/beakerhub.py +139 -0
  84. beakerhub-0.0.1/src/beakerhub/spawner/__init__.py +0 -0
  85. beakerhub-0.0.1/src/beakerhub/spawner/base.py +39 -0
  86. beakerhub-0.0.1/src/beakerhub/spawner/kubernetes.py +207 -0
  87. beakerhub-0.0.1/src/beakerhub/spawner/provisioner.py +13 -0
  88. beakerhub-0.0.1/src/beakerhub/types.py +19 -0
  89. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminContextPanelHost-bexDkjBH.css +1 -0
  90. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminContextPanelHost-hnlSd1mE.js +124 -0
  91. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminContexts-CZq-LQdI.js +1 -0
  92. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminContexts-CiXz2557.css +1 -0
  93. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminDashboard-BwN4UuTj.js +1 -0
  94. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminDashboard-Y3yZLRp_.css +1 -0
  95. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminImages-DkO7guje.css +1 -0
  96. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminImages-WRFU-WNE.js +3 -0
  97. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminLayout-BpYUocq4.css +1 -0
  98. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminLayout-Dy4U-BEy.js +281 -0
  99. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminSessions-By18EyHo.js +1 -0
  100. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminSessions-CLVBIn-h.css +1 -0
  101. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminUsers-B65SBeyd.js +1 -0
  102. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminUsers-De0KtWuY.css +1 -0
  103. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminVault-CASrj1dY.css +1 -0
  104. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/AdminVault-DeIQGhnd.js +1 -0
  105. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/CustomDomainIcon.vue_vue_type_script_setup_true_lang-yc3agaj8.js +1 -0
  106. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Dashboard-BwG_Jtja.css +1 -0
  107. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Dashboard-PEomJHlV.js +1 -0
  108. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/EmailValidation-DTCdNm7u.css +1 -0
  109. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/EmailValidation-DuaeJwIA.js +1 -0
  110. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Home-DPljENVr.js +1 -0
  111. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/InviteSignup-D1IN1Qg3.css +1 -0
  112. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/InviteSignup-D47yy49P.js +1 -0
  113. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Launch-BYnWRiQ1.css +1 -0
  114. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Launch-C0CKO2S1.js +119 -0
  115. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Login-BMk_F4xb.js +1 -0
  116. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Login-Dz1l_6Tb.css +1 -0
  117. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Logout-Bs0qQQSD.js +1 -0
  118. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Logout-CGwRbyCg.css +1 -0
  119. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/NotFound-B2ZhUUje.js +1 -0
  120. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/NotFound-wgHBhNMg.css +1 -0
  121. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/PodLogViewer-FqhTOobf.css +1 -0
  122. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/PodLogViewer-cvtOsMYJ.js +1 -0
  123. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/ResetPassword-B6JW4R0V.css +1 -0
  124. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/ResetPassword-Bc8SJsJ-.js +1 -0
  125. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/SecretVaultEditor-Cgfl39jA.js +1 -0
  126. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/SecretVaultEditor-DVRgGMtO.css +1 -0
  127. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Session-DU0KeeD3.js +1 -0
  128. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Session-DjSpqDjk.css +1 -0
  129. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/SignUp-6_zLHf0V.js +1 -0
  130. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/SignUp-Bzy76BQQ.css +1 -0
  131. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Spinner-C5mn2bTE.css +1 -0
  132. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/Spinner-CnArUz7C.js +1 -0
  133. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/SplashPage-DNoN3V81.css +1 -0
  134. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/SplashPage-xj9m0mQ6.js +1 -0
  135. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/admin-D2Ttk0X1.js +1 -0
  136. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/context-DN7RtYKM.js +1 -0
  137. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-BSH8ioJS.js +101 -0
  138. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-BVsMB5V3.js +32 -0
  139. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-C-Yil3BG.js +142 -0
  140. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-CpEKboE9.js +14 -0
  141. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-CqnU8nj0.js +74 -0
  142. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-D--jZKOO.js +54 -0
  143. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-D4e7bUyq.js +360 -0
  144. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-D8-2Qwzt.js +82 -0
  145. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-D9QS9-Ff.js +115 -0
  146. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-DCf9fUJs.js +79 -0
  147. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-DEq4k__p.js +2 -0
  148. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-DFS_24Z7.js +1 -0
  149. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-DYdv4CUP.js +84 -0
  150. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-IyueznQ9.js +20483 -0
  151. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-KaB1vpZp.js +107 -0
  152. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-OWvAlgmT.css +1 -0
  153. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-TEITaxes.js +2 -0
  154. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-XSus88vE.js +1104 -0
  155. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/index-lgf3PSiQ.js +316 -0
  156. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/primeicons-C6QP2o4f.woff2 +0 -0
  157. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/primeicons-DMOk5skT.eot +0 -0
  158. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/primeicons-Dr5RGzOO.svg +345 -0
  159. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/primeicons-MpK4pl85.ttf +0 -0
  160. beakerhub-0.0.1/src/beakerhub/ui/beakerhub/static/primeicons-WjwUDZjB.woff +0 -0
  161. beakerhub-0.0.1/src/beakerhub/ui/favicon.ico +0 -0
  162. beakerhub-0.0.1/src/beakerhub/ui/images/beaker-agent-notebook.jpg +0 -0
  163. beakerhub-0.0.1/src/beakerhub/ui/images/beaker-biomedical-thumb.png +0 -0
  164. beakerhub-0.0.1/src/beakerhub/ui/images/beaker-datascience-thumb.png +0 -0
  165. beakerhub-0.0.1/src/beakerhub/ui/images/beaker-export-own.png +0 -0
  166. beakerhub-0.0.1/src/beakerhub/ui/images/beaker-hub-logo.svg +5 -0
  167. beakerhub-0.0.1/src/beakerhub/ui/images/beaker-weather-thumb.png +0 -0
  168. beakerhub-0.0.1/src/beakerhub/ui/images/biomedical-icon.svg +48 -0
  169. beakerhub-0.0.1/src/beakerhub/ui/images/biomedical-integrations.png +0 -0
  170. beakerhub-0.0.1/src/beakerhub/ui/images/custom-domain-icon.svg +11 -0
  171. beakerhub-0.0.1/src/beakerhub/ui/images/customize-agent.png +0 -0
  172. beakerhub-0.0.1/src/beakerhub/ui/images/data-science-icon.svg +44 -0
  173. beakerhub-0.0.1/src/beakerhub/ui/images/geospatial-icon.svg +27 -0
  174. beakerhub-0.0.1/src/beakerhub/ui/images/retrieval-training.png +0 -0
  175. beakerhub-0.0.1/src/beakerhub/ui/images/weather-icon.svg +15 -0
  176. beakerhub-0.0.1/src/beakerhub/ui/images/wildfire-icon.svg +23 -0
  177. beakerhub-0.0.1/src/beakerhub/ui/images/workflow-steps.png +0 -0
  178. beakerhub-0.0.1/src/beakerhub/ui/images/your-cells.jpg +0 -0
  179. beakerhub-0.0.1/src/beakerhub/ui/index.html +14 -0
  180. beakerhub-0.0.1/src/beakerhub/ui/routes.json +69 -0
  181. beakerhub-0.0.1/src/beakerhub/ui/videos/beaker_demo.mp4 +0 -0
  182. beakerhub-0.0.1/src/beakerhub/utils.py +892 -0
  183. beakerhub-0.0.1/tests/__init__.py +3 -0
  184. beakerhub-0.0.1/tests/integration/__init__.py +3 -0
  185. beakerhub-0.0.1/tests/integration/conftest.py +216 -0
  186. beakerhub-0.0.1/tests/integration/test_api.py +158 -0
  187. beakerhub-0.0.1/tests/integration/test_spawner.py +245 -0
  188. beakerhub-0.0.1/tests/unit/__init__.py +3 -0
  189. beakerhub-0.0.1/tests/unit/auth/__init__.py +3 -0
  190. beakerhub-0.0.1/tests/unit/auth/test_cognito.py +505 -0
  191. beakerhub-0.0.1/tests/unit/auth/test_dummy.py +50 -0
  192. beakerhub-0.0.1/tests/unit/auth/test_handlers.py +490 -0
  193. beakerhub-0.0.1/tests/unit/auth/test_user.py +189 -0
  194. beakerhub-0.0.1/tests/unit/conftest.py +134 -0
  195. beakerhub-0.0.1/tests/unit/services/__init__.py +3 -0
  196. beakerhub-0.0.1/tests/unit/services/test_secrets.py +320 -0
  197. beakerhub-0.0.1/tests/unit/spawner/__init__.py +3 -0
  198. beakerhub-0.0.1/tests/unit/spawner/test_base.py +109 -0
  199. beakerhub-0.0.1/tests/unit/spawner/test_kubernetes.py +478 -0
  200. beakerhub-0.0.1/tests/unit/test_admin_handlers.py +170 -0
  201. beakerhub-0.0.1/tests/unit/test_api_handlers.py +333 -0
  202. beakerhub-0.0.1/tests/unit/test_handlers.py +30 -0
  203. beakerhub-0.0.1/tests/unit/test_orm.py +253 -0
  204. beakerhub-0.0.1/tests/unit/test_utils.py +177 -0
@@ -0,0 +1,16 @@
1
+ **
2
+
3
+ !src/
4
+ !ui/
5
+ !README.md
6
+ !pyproject.toml
7
+ !images/config_files
8
+
9
+ **/dist
10
+ **/build
11
+
12
+ ui/node_modules
13
+ **/node_modules
14
+ **/venv
15
+ **/.venv
16
+ **/.env
@@ -0,0 +1,138 @@
1
+ # Integration Tests Workflow
2
+ #
3
+ # This workflow runs integration tests against a BeakerHub instance
4
+ # deployed in a kind (Kubernetes in Docker) cluster.
5
+ #
6
+ # TO ENABLE: Uncomment the 'push' trigger below.
7
+ # Note: Integration tests are resource-intensive and typically run
8
+ # on merge to main or on a schedule, not on every PR.
9
+
10
+ name: Integration Tests
11
+
12
+ on:
13
+ # Uncomment to enable on push to main:
14
+ # push:
15
+ # branches: [main]
16
+
17
+ # Uncomment to run on a schedule (e.g., nightly):
18
+ # schedule:
19
+ # - cron: '0 2 * * *' # 2 AM UTC daily
20
+
21
+ # Manual trigger for testing the workflow
22
+ workflow_dispatch:
23
+
24
+ env:
25
+ CLUSTER_NAME: beakerhub-test
26
+ REGISTRY_NAME: beaker-local-registry
27
+
28
+ jobs:
29
+ integration-tests:
30
+ name: Integration Tests
31
+ runs-on: ubuntu-latest
32
+ timeout-minutes: 45
33
+
34
+ steps:
35
+ - name: Checkout code
36
+ uses: actions/checkout@v4
37
+
38
+ - name: Set up Python
39
+ uses: actions/setup-python@v5
40
+ with:
41
+ python-version: '3.11'
42
+ cache: 'pip'
43
+
44
+ - name: Install Python dependencies
45
+ run: |
46
+ pip install pytest requests
47
+
48
+ - name: Set up Docker Buildx
49
+ uses: docker/setup-buildx-action@v3
50
+
51
+ - name: Create local registry
52
+ run: |
53
+ docker run -d \
54
+ -p 5000:5000 \
55
+ --name ${{ env.REGISTRY_NAME }} \
56
+ --restart=always \
57
+ registry:2
58
+
59
+ - name: Install kind
60
+ run: |
61
+ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
62
+ chmod +x ./kind
63
+ sudo mv ./kind /usr/local/bin/kind
64
+
65
+ - name: Install kubectl
66
+ run: |
67
+ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
68
+ chmod +x kubectl
69
+ sudo mv kubectl /usr/local/bin/kubectl
70
+
71
+ - name: Install Helm
72
+ run: |
73
+ curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
74
+
75
+ - name: Create kind cluster
76
+ run: |
77
+ cat <<EOF | kind create cluster --name ${{ env.CLUSTER_NAME }} --config=-
78
+ kind: Cluster
79
+ apiVersion: kind.x-k8s.io/v1alpha4
80
+ containerdConfigPatches:
81
+ - |-
82
+ [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"]
83
+ endpoint = ["http://${{ env.REGISTRY_NAME }}:5000"]
84
+ EOF
85
+
86
+ - name: Connect registry to kind network
87
+ run: |
88
+ docker network connect kind ${{ env.REGISTRY_NAME }} || true
89
+
90
+ - name: Build and push images to local registry
91
+ run: |
92
+ cd images
93
+ make dev
94
+ env:
95
+ REGISTRY: localhost:5000
96
+
97
+ - name: Deploy BeakerHub via Helm
98
+ run: |
99
+ helm upgrade --install beakerhub-test \
100
+ kubernetes/helm-charts/beakerhub \
101
+ -n beakerhub \
102
+ --create-namespace \
103
+ -f kubernetes/values-local.yaml \
104
+ --wait \
105
+ --timeout 10m
106
+
107
+ - name: Wait for deployment
108
+ run: |
109
+ kubectl wait --for=condition=available deployment/hub -n beakerhub --timeout=300s
110
+ kubectl wait --for=condition=available deployment/proxy -n beakerhub --timeout=300s
111
+
112
+ - name: Run integration tests
113
+ run: |
114
+ # Start port-forward in background
115
+ kubectl port-forward -n beakerhub svc/proxy-public 8888:80 &
116
+ sleep 5
117
+
118
+ # Run tests
119
+ python -m pytest tests/integration -v --tb=short
120
+ env:
121
+ KEEP_TEST_CLUSTER: "1"
122
+
123
+ - name: Collect logs on failure
124
+ if: failure()
125
+ run: |
126
+ echo "=== Hub Logs ==="
127
+ kubectl logs -n beakerhub deployment/hub --tail=100 || true
128
+ echo "=== Proxy Logs ==="
129
+ kubectl logs -n beakerhub deployment/proxy --tail=100 || true
130
+ echo "=== Pod Status ==="
131
+ kubectl get pods -n beakerhub -o wide || true
132
+ echo "=== Events ==="
133
+ kubectl get events -n beakerhub --sort-by='.lastTimestamp' | tail -50 || true
134
+
135
+ - name: Delete kind cluster
136
+ if: always()
137
+ run: |
138
+ kind delete cluster --name ${{ env.CLUSTER_NAME }} || true
@@ -0,0 +1,63 @@
1
+ # Unit Tests Workflow
2
+ #
3
+ # This workflow runs Python and Vue unit tests on PRs and pushes to main.
4
+ #
5
+ # TO ENABLE: Uncomment the 'push' and 'pull_request' triggers below.
6
+
7
+ name: Unit Tests
8
+
9
+ on:
10
+ push:
11
+ branches: [ main ]
12
+ pull_request:
13
+ branches: [ dev, main ]
14
+ # Allow this workflow to be invoked by other workflows (e.g. the release
15
+ # flow calls it as an inline fallback when a commit has not yet been tested).
16
+ workflow_call:
17
+ # Manual trigger for testing the workflow
18
+ workflow_dispatch:
19
+
20
+ jobs:
21
+ python-unit-tests:
22
+ name: Python Unit Tests
23
+ timeout-minutes: 30
24
+ runs-on: ubuntu-latest
25
+ strategy:
26
+ fail-fast: false
27
+ matrix:
28
+ python-version: ['3.11', '3.12', '3.13']
29
+
30
+ steps:
31
+ - uses: actions/checkout@v5
32
+ - name: python-setup
33
+ uses: actions/setup-python@v6
34
+ with:
35
+ python-version: ${{ matrix.python-version }}
36
+ - name: install-dependencies
37
+ run: |
38
+ python -m pip install --upgrade pip
39
+ pip install hatch uv
40
+ # One interpreter per job, so run the default hatch env's test script.
41
+ - name: Run unit tests
42
+ run: hatch run test:unit
43
+
44
+ vue-tests:
45
+ timeout-minutes: 30
46
+ name: Vue Unit Tests
47
+ runs-on: ubuntu-latest
48
+
49
+ defaults:
50
+ run:
51
+ working-directory: ui
52
+
53
+ steps:
54
+ - name: Checkout code
55
+ uses: actions/checkout@v5
56
+ - name: Set up Node.js
57
+ uses: actions/setup-node@v5
58
+ with:
59
+ node-version: lts/*
60
+ - name: Install dependencies
61
+ run: npm i
62
+ - name: Run unit tests
63
+ run: npm run test:unit -- --run
@@ -0,0 +1,114 @@
1
+ # Python
2
+ **/__pycache__/**
3
+ *.pyc
4
+ .ipynb_checkpoints
5
+ /*.ipynb
6
+ **/.cache
7
+ **/.ipython
8
+ **/.notebooks/
9
+
10
+ # Secret bearing files
11
+ beakerhub_cookie_secret
12
+ beakerhub_vault_secret
13
+ beakerhub.sqlite
14
+
15
+ # Local Development artifacts
16
+ **/dev-config.yaml
17
+ **/dev-config.mk
18
+ **/dev-helm-values.yaml
19
+ **/kind-config.yaml
20
+ **/values-secret.yaml
21
+
22
+ # UI build artifacts
23
+ src/beakerhub/ui/
24
+
25
+ # Jupyterhub config files
26
+ jupyterhub*
27
+
28
+ # Gradle
29
+ .gradle/
30
+ build/
31
+
32
+ # Eclipse
33
+ .project
34
+ .classpath
35
+ .settings/
36
+ bin/
37
+
38
+ # IntelliJ
39
+ .idea/*
40
+ *.ipr
41
+ *.iml
42
+ *.iws
43
+
44
+ # NetBeans
45
+ nb-configuration.xml
46
+
47
+ # Visual Studio Code
48
+ .vscode/*
49
+ .factorypath
50
+
51
+ # Nova
52
+ .nova/*
53
+
54
+ # OSX
55
+ .DS_Store
56
+
57
+ # Vim
58
+ *.swp
59
+ *.swo
60
+
61
+ # patch
62
+ *.orig
63
+ *.rej
64
+
65
+ # Local environment
66
+ .env
67
+
68
+ # Yarn
69
+ **/.yarn/*
70
+ **/!.yarn/patches
71
+ **/!.yarn/plugins
72
+ **/!.yarn/releases
73
+ **/!.yarn/sdks
74
+ **/!.yarn/versions
75
+ **/.pnp.*
76
+
77
+ # NPM
78
+ node_modules
79
+ dist
80
+ build
81
+
82
+ # MISC
83
+ create.sql
84
+ .eslintcache
85
+ **/.venv/
86
+ .openai.toml
87
+ shell.nix
88
+ **/.jekyll-cache
89
+ **/tmp
90
+
91
+ # Helm
92
+ kubernetes/packages
93
+
94
+ # Local dev TLS certs (generated by mkcert or `make openssl-certs`)
95
+ helm/kind/certs.d/tls.crt
96
+ helm/kind/certs.d/tls.key
97
+ helm/kind/certs.d/rootCA.pem
98
+ helm/kind/certs.d/rootCA-key.pem
99
+ helm/kind/certs.d/rootCA.srl
100
+
101
+ # Image builder
102
+ images/config_files/*_config.py
103
+ images/build-metadata.json
104
+ !images/config_files/bin
105
+
106
+ # Beaker
107
+ .beaker.conf
108
+ beaker_config.py
109
+ beaker_*_config.py
110
+ beaker_kernel/**/ui/*
111
+
112
+ # LLM
113
+ .claude/
114
+ .plans/