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.
- pixie/__init__.py +20 -0
- pixie/_util.py +38 -0
- pixie/catalog/__init__.py +25 -0
- pixie/catalog/_fetcher.py +513 -0
- pixie/catalog/_routes.py +392 -0
- pixie/catalog/_schema.py +263 -0
- pixie/catalog/_store.py +234 -0
- pixie/deploy/__init__.py +26 -0
- pixie/deploy/_main.py +321 -0
- pixie/deploy/_templates.py +153 -0
- pixie/disks.py +85 -0
- pixie/events/__init__.py +28 -0
- pixie/events/_kinds.py +203 -0
- pixie/events/_log.py +210 -0
- pixie/events/_routes.py +42 -0
- pixie/exports/__init__.py +17 -0
- pixie/exports/_routes.py +211 -0
- pixie/exports/_store.py +156 -0
- pixie/exports/_supervisor.py +240 -0
- pixie/flash.py +1971 -0
- pixie/images.py +473 -0
- pixie/machines/__init__.py +16 -0
- pixie/machines/_routes.py +190 -0
- pixie/machines/_store.py +623 -0
- pixie/oras.py +547 -0
- pixie/pivot/__init__.py +180 -0
- pixie/pivot/nbdboot +348 -0
- pixie/pxe/__init__.py +19 -0
- pixie/pxe/_renderer.py +244 -0
- pixie/pxe/_routes.py +386 -0
- pixie/tftp/__init__.py +21 -0
- pixie/tftp/_supervisor.py +129 -0
- pixie/tui/__init__.py +185 -0
- pixie/tui/_app.py +2219 -0
- pixie/tui_catalog.py +657 -0
- pixie/web/__init__.py +6 -0
- pixie/web/_auth.py +70 -0
- pixie/web/_settings_store.py +211 -0
- pixie/web/_static/.gitkeep +0 -0
- pixie/web/_static/bootstrap-icons.min.css +5 -0
- pixie/web/_static/bootstrap.min.css +12 -0
- pixie/web/_static/fonts/bootstrap-icons.woff +0 -0
- pixie/web/_static/fonts/bootstrap-icons.woff2 +0 -0
- pixie/web/_static/htmx.min.js +1 -0
- pixie/web/_static/pixie-favicon.png +0 -0
- pixie/web/_static/sse.js +290 -0
- pixie/web/_table_state.py +261 -0
- pixie/web/_templates/_partials/page_description.html +22 -0
- pixie/web/_templates/_partials/recent_events.html +47 -0
- pixie/web/_templates/_partials/table_helpers.html +189 -0
- pixie/web/_templates/catalog.html +364 -0
- pixie/web/_templates/catalog_detail.html +386 -0
- pixie/web/_templates/dashboard.html +256 -0
- pixie/web/_templates/events.html +125 -0
- pixie/web/_templates/ipxe/bootstrap.j2 +12 -0
- pixie/web/_templates/ipxe/exit.j2 +10 -0
- pixie/web/_templates/ipxe/nbdboot.j2 +57 -0
- pixie/web/_templates/ipxe/pixie-live-env.j2 +55 -0
- pixie/web/_templates/ipxe/unavailable.j2 +14 -0
- pixie/web/_templates/layout.html +345 -0
- pixie/web/_templates/login.html +40 -0
- pixie/web/_templates/machine_detail.html +786 -0
- pixie/web/_templates/machines.html +186 -0
- pixie/web/_templates/settings.html +265 -0
- pixie/web/main.py +1910 -0
- pixie_lab-0.1.0.dist-info/METADATA +107 -0
- pixie_lab-0.1.0.dist-info/RECORD +70 -0
- pixie_lab-0.1.0.dist-info/WHEEL +4 -0
- pixie_lab-0.1.0.dist-info/entry_points.txt +3 -0
- 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,,
|