Skip to content

Commit 6bc3d47

Browse files
authored
Ideas and tidy (#17)
* Update ideas * don't allow long workload names to mess up alignment in status output * another idea
1 parent c060973 commit 6bc3d47

2 files changed

Lines changed: 17 additions & 103 deletions

File tree

docs/ideas.md

Lines changed: 2 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,13 @@
44
>
55
> Review periodically and pick what sounds interesting.
66
7-
**Last Updated:** 2026-03-16
7+
**Last Updated:** 2026-04-12
88

99
---
1010

1111
## Active Consideration
1212
*Currently thinking about these*
1313

14-
### Workload Library - Practical Services
15-
**Why:** Validate workload system with real services, build useful infrastructure
16-
**Effort:** Medium (incremental, ~1 day per service)
17-
**Value:** High (validates system, immediately useful)
18-
**Interest:** High
19-
20-
**Services to implement:**
21-
- [x] Pi-hole (DNS/ad blocking)
22-
- [x] Local container registry (private image storage)
23-
- [x] Squid proxy (caching HTTP/rpm proxy)
24-
- [x] VPN web proxy (route traffic through VPN tunnel)
25-
- [x] Fileserver (Samba)
26-
- [x] Gitea or other self-hosted git
27-
- [x] Monitoring stack (Prometheus + Grafana)
28-
29-
---
30-
31-
### Gaming/Desktop Streaming
32-
Stream games from beefy computer to thin client in another room
33-
- **Effort:** Unknown (depends on headless display solution)
34-
- **Value:** High (primary use case)
35-
- **Interest:** High
36-
37-
**Unknowns:**
38-
- Does headless Steam work in container?
39-
- What display server is needed? (Xvfb, Wayland headless, virtual DRM?)
40-
- Does Sunshine capture containerized apps properly?
41-
- Resource limits work
42-
43-
**Already validated:**
44-
- [Cosy](https://github.com/BenSmith/cosy) proves GPU-accelerated apps in containers work
45-
- Device passthrough (GPU, audio, input) works
46-
47-
**Notes:**
48-
**Next action:** Test headless Steam (with Cosy?) to validate feasibility
49-
**Status:** Blocked on validation test
50-
51-
5214
---
5315
### Full Desktop Environments in Containers
5416
**Why:** lots of flexibility in desktop environments, easy to add/remove, and little hypervisor pollution
@@ -138,24 +100,6 @@ Stream games from beefy computer to thin client in another room
138100

139101
---
140102

141-
### Standalone Workload System RPM
142-
**Why:** Make workload system usable on any Fedora/RHEL, not just bootc
143-
- **Effort:** Medium (RPM spec, testing on non-bootc systems)
144-
- **Value:** Medium-High (enables broader adoption)
145-
- **Interest:** Medium
146-
147-
**What gets packaged:**
148-
- workloadctl
149-
- workload-generator
150-
- workload-ensure-user
151-
- systemd integration files
152-
- Documentation
153-
154-
**When:** After workload library proves value (have examples to show)
155-
**Status:** Not started
156-
157-
---
158-
159103
### Advanced Networking Features
160104
**Current state:** Basic networking works (pasta, host, none, custom networks)
161105

@@ -193,51 +137,11 @@ Stream games from beefy computer to thin client in another room
193137

194138
## Research/Validation Needed
195139

196-
### Headless Gaming Validation
197-
**Question:** Can Steam run in container without physical display?
198-
**Method:** Test with Cosy first (already validates GPU apps in containers)
199-
**Display options:**
200-
- Xvfb (virtual X11)
201-
- Wayland headless backend (wlroots)
202-
- Virtual GPU (DRM render node only)
203-
204-
**Blocks:** Gaming workload implementation
205-
**Status:** Not tested yet
206-
207-
---
208-
209-
### Sunshine Streaming Integration
210-
**Question:** Does Sunshine capture containerized apps properly?
211-
**Test:** Run Sunshine alongside containerized Steam, verify capture works
212-
**Considerations:**
213-
- Same container vs separate containers (multi-container question)
214-
- Does Sunshine need special access?
215-
- Performance overhead?
216-
217-
**Blocks:** Gaming streaming setup
218-
**Status:** Not tested yet
219-
220-
---
221-
222140
## Easy, High Value
223141

224142
Start here when unsure what to work on:
225143

226-
- [x] **Pi-hole workload** (1 day, immediately useful)
227-
- [x] **Local container registry** (1 day, useful for dev)
228144
- [ ] **Simple dev container** (1 day, one language stack)
229-
- [x] **Prometheus node exporter** (1 day, easy containerization example)
230-
231-
---
232-
233-
## Investigate / Validate
234-
235-
### SELinux fcontext for workload directories
236-
**Question:** Do we actually need the `semanage fcontext -a -t container_file_t` rule for `/var/lib/workloads`?
237-
- `workload-ensure-user` currently calls `setup_selinux_policy()` + `restore_selinux_labels()` on every service start
238-
- If the default context works fine in practice (podman may handle this itself), this is dead code
239-
- **Test:** Disable the SELinux functions, run a workload, check `ls -Z /var/lib/workloads/`
240-
- **Status:** Not tested yet
241145

242146
---
243147

@@ -247,11 +151,8 @@ Start here when unsure what to work on:
247151

248152
- Web UI for workload management
249153
- Workload health monitoring with alerts (email/webhook on failures)
250-
- Container image builder workload (dedicated build environment)
251154
- CI/CD runner workload (GitLab/GitHub/Gitea runner)
252155
- Game server workloads (Valheim, Factorio, etc.)
253-
- Home automation appliance bootc variant (minimal + HA)
254-
- Gaming-optimized image variant (tuned, low latency kernel)
255156
- Workload templates/scaffolding (generate from template)
256157
- Import docker-compose files to workload TOML (migration tool)
257158
- Ansible integration for provisioning (manage workloads as code)
@@ -264,3 +165,4 @@ Start here when unsure what to work on:
264165
Pulls newer images for updatable workloads (skip pull=never), restarts only if image changed.
265166
Could add configurable schedule, notification on updates, and update log.
266167
- Workloads get LVM provisioned to cap or flex storage
168+
- consider python3-tomlkit for toml edits that preserve comments

workloadctl/bin/workloadctl

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -442,9 +442,16 @@ def cmd_list(args, manager: WorkloadManager):
442442
print(" No workload configs found")
443443
return
444444

445+
# Size the NAME column to fit the longest name, within sensible bounds.
446+
# Names longer than the cap are elided with an ellipsis.
447+
NAME_MIN = 18
448+
NAME_MAX = 28
449+
longest = max((len(c.name) for c in configs), default=0)
450+
name_w = max(NAME_MIN, min(longest, NAME_MAX))
451+
445452
# Print header
446-
print(f" {'NAME':<18} {'STATUS':<10} {'STATE':<12} {'IMAGE_ID':<14} {'PORTS':<20} {'IMAGE':<30}")
447-
print(f" {'-'*18} {'-'*10} {'-'*12} {'-'*14} {'-'*20} {'-'*30}")
453+
print(f" {'NAME':<{name_w}} {'STATUS':<10} {'STATE':<12} {'IMAGE_ID':<14} {'PORTS':<20} {'IMAGE':<30}")
454+
print(f" {'-'*name_w} {'-'*10} {'-'*12} {'-'*14} {'-'*20} {'-'*30}")
448455

449456
for config in configs:
450457
status = "enabled" if config.enabled else "disabled"
@@ -490,7 +497,12 @@ def cmd_list(args, manager: WorkloadManager):
490497
if len(image) > 30:
491498
image = image[:27] + "..."
492499

493-
print(f" {config.name:<18} {status:<10} {state:<12} {image_id:<14} {ports_str:<20} {image:<30}")
500+
# Elide long workload names so the column never overflows
501+
name = config.name
502+
if len(name) > name_w:
503+
name = name[:name_w - 3] + "..."
504+
505+
print(f" {name:<{name_w}} {status:<10} {state:<12} {image_id:<14} {ports_str:<20} {image:<30}")
494506

495507

496508
def cmd_status(args, manager: WorkloadManager):

0 commit comments

Comments
 (0)