pixie-lab 0.1.0__py3-none-any.whl

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 (70) hide show
  1. pixie/__init__.py +20 -0
  2. pixie/_util.py +38 -0
  3. pixie/catalog/__init__.py +25 -0
  4. pixie/catalog/_fetcher.py +513 -0
  5. pixie/catalog/_routes.py +392 -0
  6. pixie/catalog/_schema.py +263 -0
  7. pixie/catalog/_store.py +234 -0
  8. pixie/deploy/__init__.py +26 -0
  9. pixie/deploy/_main.py +321 -0
  10. pixie/deploy/_templates.py +153 -0
  11. pixie/disks.py +85 -0
  12. pixie/events/__init__.py +28 -0
  13. pixie/events/_kinds.py +203 -0
  14. pixie/events/_log.py +210 -0
  15. pixie/events/_routes.py +42 -0
  16. pixie/exports/__init__.py +17 -0
  17. pixie/exports/_routes.py +211 -0
  18. pixie/exports/_store.py +156 -0
  19. pixie/exports/_supervisor.py +240 -0
  20. pixie/flash.py +1971 -0
  21. pixie/images.py +473 -0
  22. pixie/machines/__init__.py +16 -0
  23. pixie/machines/_routes.py +190 -0
  24. pixie/machines/_store.py +623 -0
  25. pixie/oras.py +547 -0
  26. pixie/pivot/__init__.py +180 -0
  27. pixie/pivot/nbdboot +348 -0
  28. pixie/pxe/__init__.py +19 -0
  29. pixie/pxe/_renderer.py +244 -0
  30. pixie/pxe/_routes.py +386 -0
  31. pixie/tftp/__init__.py +21 -0
  32. pixie/tftp/_supervisor.py +129 -0
  33. pixie/tui/__init__.py +185 -0
  34. pixie/tui/_app.py +2219 -0
  35. pixie/tui_catalog.py +657 -0
  36. pixie/web/__init__.py +6 -0
  37. pixie/web/_auth.py +70 -0
  38. pixie/web/_settings_store.py +211 -0
  39. pixie/web/_static/.gitkeep +0 -0
  40. pixie/web/_static/bootstrap-icons.min.css +5 -0
  41. pixie/web/_static/bootstrap.min.css +12 -0
  42. pixie/web/_static/fonts/bootstrap-icons.woff +0 -0
  43. pixie/web/_static/fonts/bootstrap-icons.woff2 +0 -0
  44. pixie/web/_static/htmx.min.js +1 -0
  45. pixie/web/_static/pixie-favicon.png +0 -0
  46. pixie/web/_static/sse.js +290 -0
  47. pixie/web/_table_state.py +261 -0
  48. pixie/web/_templates/_partials/page_description.html +22 -0
  49. pixie/web/_templates/_partials/recent_events.html +47 -0
  50. pixie/web/_templates/_partials/table_helpers.html +189 -0
  51. pixie/web/_templates/catalog.html +364 -0
  52. pixie/web/_templates/catalog_detail.html +386 -0
  53. pixie/web/_templates/dashboard.html +256 -0
  54. pixie/web/_templates/events.html +125 -0
  55. pixie/web/_templates/ipxe/bootstrap.j2 +12 -0
  56. pixie/web/_templates/ipxe/exit.j2 +10 -0
  57. pixie/web/_templates/ipxe/nbdboot.j2 +57 -0
  58. pixie/web/_templates/ipxe/pixie-live-env.j2 +55 -0
  59. pixie/web/_templates/ipxe/unavailable.j2 +14 -0
  60. pixie/web/_templates/layout.html +345 -0
  61. pixie/web/_templates/login.html +40 -0
  62. pixie/web/_templates/machine_detail.html +786 -0
  63. pixie/web/_templates/machines.html +186 -0
  64. pixie/web/_templates/settings.html +265 -0
  65. pixie/web/main.py +1910 -0
  66. pixie_lab-0.1.0.dist-info/METADATA +107 -0
  67. pixie_lab-0.1.0.dist-info/RECORD +70 -0
  68. pixie_lab-0.1.0.dist-info/WHEEL +4 -0
  69. pixie_lab-0.1.0.dist-info/entry_points.txt +3 -0
  70. pixie_lab-0.1.0.dist-info/licenses/LICENSE +674 -0
@@ -0,0 +1,107 @@
1
+ Metadata-Version: 2.4
2
+ Name: pixie-lab
3
+ Version: 0.1.0
4
+ Summary: Bare-metal netboot appliance: catalog + fetch + NBD + PXE + TFTP + operator TUI in one container
5
+ Project-URL: Homepage, https://github.com/safl/pixie
6
+ Project-URL: Repository, https://github.com/safl/pixie
7
+ Author-email: "Simon A. F. Lund" <os@safl.dk>
8
+ License-Expression: GPL-3.0-only
9
+ License-File: LICENSE
10
+ Keywords: appliance,bare-metal,flashing,imaging,ipxe,nbd,netboot,pxe
11
+ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
12
+ Classifier: Operating System :: POSIX :: Linux
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: 3.14
18
+ Requires-Python: >=3.11
19
+ Requires-Dist: fastapi>=0.115
20
+ Requires-Dist: httpx>=0.27
21
+ Requires-Dist: itsdangerous>=2.1
22
+ Requires-Dist: jinja2>=3.1
23
+ Requires-Dist: python-multipart>=0.0.9
24
+ Requires-Dist: rich>=13
25
+ Requires-Dist: tomlkit>=0.12
26
+ Requires-Dist: uvicorn[standard]>=0.30
27
+ Description-Content-Type: text/markdown
28
+
29
+ # pixie
30
+
31
+ Bare-metal netboot appliance in one container. Catalog + fetch + NBD
32
+ serving + PXE plan renderer + TFTP + operator UI, on one FastAPI
33
+ process with one state.db and one admin password.
34
+
35
+ Pixie folds into a single service what bty (operator UI + machine
36
+ registry + PXE plan renderer + Rich TUI), nbdmux (NBD-export
37
+ multiplexer + netboot artifact serve), and a hard-fork of withcache
38
+ (catalog + fetch + blob store) implement as three separate FastAPI
39
+ services. bty, nbdmux, and withcache continue as their own projects;
40
+ pixie is a sibling appliance that starts from a merged design. See
41
+ `PLAN.md` for the design rationale, locked decisions, and roadmap.
42
+
43
+ ## Run
44
+
45
+ The reference deploy is a single podman-compose stack under
46
+ `--network=host`. The `pixie-lab` CLI (installed with the package)
47
+ generates the compose file, the envvars template, and a per-deploy
48
+ README:
49
+
50
+ pixie-lab init /opt/pixie
51
+ "$EDITOR" /opt/pixie/envvars.example # set PIXIE_HOST_ADDR + PIXIE_ADMIN_PASSWORD
52
+ mv /opt/pixie/envvars.example /opt/pixie/envvars
53
+ cd /opt/pixie
54
+ podman compose --env-file envvars up -d
55
+
56
+ `pixie-lab deploy` fills in an admin password + host address + waits
57
+ for `/healthz` in one shot, useful for a fresh lab machine.
58
+
59
+ Log in at http://<host>:8080/. First landing after login is a
60
+ dashboard summarising machines, catalog, and NBD-serving state; the
61
+ top nav has Machines, Catalog, Events, and Settings.
62
+
63
+ ## Operator workflow
64
+
65
+ 1. Point catalog import at a `catalog.toml` URL on `/ui/catalog`.
66
+ Entries land staged (rows only, no bytes yet).
67
+ 2. Click Fetch on a row to download it. The status pill ticks
68
+ through downloading -> decompressing -> unpacking with a
69
+ `bytes / total` counter so you see progress live.
70
+ 3. Power-cycle a target with pixie in its DHCP next-server chain.
71
+ A first contact shows up on `/ui/machines` with the default
72
+ `ipxe-exit` boot mode. Open the row to bind a mode + image.
73
+ 4. `pixie-inventory` prompts the live env to POST an inventory
74
+ blob; the target's disks + NICs + memory show up on the
75
+ machine detail page.
76
+ 5. Flash modes (`pixie-flash-once`, `pixie-flash-always`) require
77
+ a target disk serial that came in on the inventory. The
78
+ binding form disables Save until that prerequisite is met.
79
+
80
+ ## State
81
+
82
+ Everything writable lives under `PIXIE_DATA_DIR` (default
83
+ `/var/lib/pixie`). `state.db` holds catalog rows, machine rows,
84
+ event log, settings, and NBD-export records. `blobs/<sha>/blob`
85
+ holds fetched disk images. `artifacts/<sha>/{vmlinuz,initrd,
86
+ manifest.json}` holds unpacked netboot bundles. `live-env/` holds
87
+ the pixie live env kernel + initrd + squashfs the netboot-pc bake
88
+ produced.
89
+
90
+ Both admin password and display timezone / strftime pattern have
91
+ env-var overrides plus DB overrides via `/ui/settings`; env wins
92
+ so a compose deploy pins behaviour deterministically.
93
+
94
+ ## Development
95
+
96
+ uv sync
97
+ uv run pytest
98
+ uv run ruff check src tests
99
+ uv run mypy src
100
+
101
+ The integration tests spin real QEMU VMs behind a real pixie
102
+ container to exercise the PXE bootstrap + ramboot chains. They are
103
+ gated behind a marker so plain `pytest` skips them.
104
+
105
+ ## License
106
+
107
+ pixie is licensed under GPL-3.0-only. See `LICENSE`.
@@ -0,0 +1,70 @@
1
+ pixie/__init__.py,sha256=XhfE52sqfEOUpzoYuuO8GpRNTCjigL28LBiNKVrHf2A,615
2
+ pixie/_util.py,sha256=BdjD_n0pGGrnZJYTN2rwrEvKpXFQN5d6hzZDkKNYa5c,1221
3
+ pixie/disks.py,sha256=RTATvHaBEpDJzC5y1YiLe1P1GzkHfTDRRMUZDbCdPio,3388
4
+ pixie/flash.py,sha256=xG7f9EG5EUd6MmA-qfkTF7fnauWbMlme_lNSwoo7R3k,78414
5
+ pixie/images.py,sha256=rlzylYayYjKdg9mVmV5hW49o8WJRLxB0UeCEsDNsWVk,17495
6
+ pixie/oras.py,sha256=zKKqYcSghgguOIIrGcJ6C3hZusmORZmDfv7zZDDFslM,22509
7
+ pixie/tui_catalog.py,sha256=1lmweyRTZg3lLMbDTozxTY5VQi0m6-xZw9rkCXnpsdI,26679
8
+ pixie/catalog/__init__.py,sha256=Ipv-Uxes1sC0Irb9qA9c_PfClsz3EOGcQKqEdWVUwIY,1160
9
+ pixie/catalog/_fetcher.py,sha256=j4rwDs6RX_iC8hNjUIfWRDnrDDBqhetj7XmzWnE-tIY,20130
10
+ pixie/catalog/_routes.py,sha256=QJPwAiX2qtvyuUwyXojG--5R1iKm8CricG2ppv8MBV4,14771
11
+ pixie/catalog/_schema.py,sha256=KC6RcKlToX1DgcRjn25djKMx78-eS-4WzNRY267h0I0,9769
12
+ pixie/catalog/_store.py,sha256=5nZ69Md65cnHWIAVG2TVH2BMXqHGN0lX_KKnGm_8GhQ,8936
13
+ pixie/deploy/__init__.py,sha256=3PvSvrIRdqxLCz0nTdVSBiPzEtDl359XSUBgyMBkMT8,1019
14
+ pixie/deploy/_main.py,sha256=JzYTfU57wAxuHaG1MNEtxdR8dXg72hNJ5IvT1orlDL4,10483
15
+ pixie/deploy/_templates.py,sha256=WkkKRDU00FDWVZM0XeKR-BCtSBPvaZ2QHM1TBeq0RYg,5418
16
+ pixie/events/__init__.py,sha256=3Quxl56ePkKD9-PjbomCOOZOpmqJ3wHcYa7VcT9KXv8,923
17
+ pixie/events/_kinds.py,sha256=EJjTFU1Aacl8AX8l5wjCAb6XiB3ysFBjL-4O5LQ7YoM,8081
18
+ pixie/events/_log.py,sha256=UT8KCXqZv95_FoNq93GKPRcKvKtz2UCyK0DnnYbehO0,6569
19
+ pixie/events/_routes.py,sha256=MbY69aZKDEzy4O8AizHtv_POPbdNMqz94imccFbtelM,1363
20
+ pixie/exports/__init__.py,sha256=Hmst9a3zd_8a8s9UQhpDSeer6q6viEbHijk-xMU0ls8,814
21
+ pixie/exports/_routes.py,sha256=_snNhDakW5AAG2iWGFR5rDAUUXnVPtXBAX2132tPv5A,7528
22
+ pixie/exports/_store.py,sha256=Ma5oVFZPCNmqp4juzts6DD6JxK8oqY9G8IPPezupw7c,4784
23
+ pixie/exports/_supervisor.py,sha256=bB9bm0Zy4qMctDWgUCVtcmsZF2zCsL3ql9hvrmPTFGg,8717
24
+ pixie/machines/__init__.py,sha256=iSyEkYm6_oP5TNRVks-HrudMjX2Wr7v6t3RSOyl3eps,725
25
+ pixie/machines/_routes.py,sha256=e240Ui01fC8VKuk82V_1lkcivDpivp4Xi6oJAHJk1Gs,7431
26
+ pixie/machines/_store.py,sha256=-GOPqPa4DUXzbQ7E5Tg9BVZDgdzqpthitN8DhOSaWx4,25033
27
+ pixie/pivot/__init__.py,sha256=k_yIUOrIu-DKCJ_8XmRtnoVV7Rr9URagHU2Y76HB2ew,6195
28
+ pixie/pivot/nbdboot,sha256=TdOPFqCv-248Ya90mpSLcUe4JImOkMWjRF824FRnP6w,16321
29
+ pixie/pxe/__init__.py,sha256=AKBRKQYdlH7DdNBvES9EwYTzPOkeNbWBN1S7IH1UEyw,784
30
+ pixie/pxe/_renderer.py,sha256=pO5ZXir5yF4U2B2OkBCaaZCzEFhZkuljB9Fg8UQgCZE,9914
31
+ pixie/pxe/_routes.py,sha256=PrR4i1fHVfYQhWwxpcNmcQpNH69AYVEwTy63OF1F0FA,16673
32
+ pixie/tftp/__init__.py,sha256=FuHn1KF5_NoGOM_dHXSbubX5lJr0tuMugJGFxxwuUws,774
33
+ pixie/tftp/_supervisor.py,sha256=khpjgWqdMzdnhRaPYM4j25PoKijbBnvr-GjJLybP_rY,4659
34
+ pixie/tui/__init__.py,sha256=oo46ZLI1QMDQngb277PcDLCVNNS-qcuxhUOJzhtTUPo,8602
35
+ pixie/tui/_app.py,sha256=eoJE0kA89tBWSlmDOD54avBs2ZmlTtgHdAS5pV6a3dk,96101
36
+ pixie/web/__init__.py,sha256=xuFjJvK82vsOOVayEstgErHicVb0nyepXtSOObkhaTY,200
37
+ pixie/web/_auth.py,sha256=ppFJaFft5IykgKoNgCEpHcU9e6oh2TgaBxiaSO9ZPNI,2471
38
+ pixie/web/_settings_store.py,sha256=xDrRmE0irbEH9JTiVwPeSUDHSDm2S-OXKf6iWYjNSJ4,8276
39
+ pixie/web/_table_state.py,sha256=zGH5oZ-XlMqUFQqmYglYqT_fu1Yrtaw-g5yhPtAKAEc,9524
40
+ pixie/web/main.py,sha256=WxNbWS_qwRc2T_aNmch2mAkB4mearSk2j1BkmsINkWw,79426
41
+ pixie/web/_static/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ pixie/web/_static/bootstrap-icons.min.css,sha256=pdY4ejLKO67E0CM2tbPtq1DJ3VGDVVdqAR6j3ZwdiE4,87008
43
+ pixie/web/_static/bootstrap.min.css,sha256=NXgoHLHuUWz0lbqh8PRwCIl7_QhZE74v-FCwrYdCW1E,234717
44
+ pixie/web/_static/htmx.min.js,sha256=4gndpcgjVHnzFm3vx3UOHbzVpcGAi3eS_C5nM3aPtEc,50917
45
+ pixie/web/_static/pixie-favicon.png,sha256=lZMkON01uQbkeCI2bOYaoGAaDBdRPlEjhLaNb3TXoo4,31810
46
+ pixie/web/_static/sse.js,sha256=g-ym-gYR_isL8XALQkuIteztOO9Ejvl2Ci6gj7yHVhE,8896
47
+ pixie/web/_static/fonts/bootstrap-icons.woff,sha256=9VUTt7WRy4SjuH_w406iTUgx1v7cIuVLkRymS1tUShU,180288
48
+ pixie/web/_static/fonts/bootstrap-icons.woff2,sha256=bHVxA2ShylYEJncW9tKJl7JjGf2weM8R4LQqtm_y6mE,134044
49
+ pixie/web/_templates/catalog.html,sha256=Z7LwkbC39ouonnlxYdFllpxpqjIwvYEt7lx7IHJcL74,19411
50
+ pixie/web/_templates/catalog_detail.html,sha256=u7Q0Fk8eyQL6mK4QOsE2NTmnmYfXydKOjFMkbM4_z_8,18182
51
+ pixie/web/_templates/dashboard.html,sha256=IfxhT8rvFc1w5CedD0rUmHBvuuQipWIeGzN6ixor0UY,11745
52
+ pixie/web/_templates/events.html,sha256=7-xTokjdv1jqA0XbePHqqz77jWg74vh2wY7_ks5_MqM,6587
53
+ pixie/web/_templates/layout.html,sha256=2z4lMbp_8TLyrr-p1s4D5nFkJ0SWApqar3LEd5ECpZQ,13454
54
+ pixie/web/_templates/login.html,sha256=d60N8kmr7YaAoTKRBaOiGN5Srdy8-BgB8_Zz9TQvGwc,1810
55
+ pixie/web/_templates/machine_detail.html,sha256=B6ITlu6BqbjxFDL9-wKDtNvU3l6LQ470XjFGQlbavqY,38623
56
+ pixie/web/_templates/machines.html,sha256=5fbpEVZXh0nCZo4On7ZPXApIZwau5dJukTcM2OJ3H4U,9146
57
+ pixie/web/_templates/settings.html,sha256=m3XqfqPsQ3wufAz_SBgT9i_B2uxgZd3QsUyl8ind2Qs,13211
58
+ pixie/web/_templates/_partials/page_description.html,sha256=ubJFzFvmu5NcX1w4wk7X3yp6Hb2O9QPC_yxKVWWCSwE,962
59
+ pixie/web/_templates/_partials/recent_events.html,sha256=CrpMr-q1RaNYi0pWHrc5Aa_3zdMbOz9yDYS-ekUhJ7E,1886
60
+ pixie/web/_templates/_partials/table_helpers.html,sha256=xObkXvfOSoM9rB5Ni_W3nnUO78T2ans8eMOz_bDdZyM,8116
61
+ pixie/web/_templates/ipxe/bootstrap.j2,sha256=xt13H2dHf-SeLhWRQvptqGY51sJ_L24C2ExnLj9uXPc,490
62
+ pixie/web/_templates/ipxe/exit.j2,sha256=pbTXTwjgiEsPZlRuv7_J0Q3BepXEqXnb82mv1sxDW24,371
63
+ pixie/web/_templates/ipxe/nbdboot.j2,sha256=cNmGyrqBDzg7l48TqlEJ_CXHOtZTj7lXnOjeu9SFCIQ,3426
64
+ pixie/web/_templates/ipxe/pixie-live-env.j2,sha256=dPWuYCFrkXwwatPSnTRSfWuMUMgvs3VLDHqbJTG1pP0,3048
65
+ pixie/web/_templates/ipxe/unavailable.j2,sha256=zt4DYfYRXmOIjL13diYPxEApTP3CRnn5Beszeh3BPBw,440
66
+ pixie_lab-0.1.0.dist-info/METADATA,sha256=iQ7ftVF-Ixmf3fNvs0LzChyAQEyZEERZBG2LGY1RNTc,4315
67
+ pixie_lab-0.1.0.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
68
+ pixie_lab-0.1.0.dist-info/entry_points.txt,sha256=G3vtKpg_gQtisiyS31EjdvC4QC52Kfw2K7iMsfsnj5A,71
69
+ pixie_lab-0.1.0.dist-info/licenses/LICENSE,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
70
+ pixie_lab-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.31.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ pixie = pixie.tui:main
3
+ pixie-lab = pixie.deploy:main