Files
volt/INTEGRATION-RESULTS.md
Karl Clinger 0ebe75b2ca Volt CLI: source-available under AGPSL v5.0
Complete infrastructure platform CLI:
- Container runtime (systemd-nspawn)
- VoltVisor VMs (Neutron Stardust / QEMU)
- Stellarium CAS (content-addressed storage)
- ORAS Registry
- GitOps integration
- Landlock LSM security
- Compose orchestration
- Mesh networking

Copyright (c) Armored Gates LLC. All rights reserved.
Licensed under AGPSL v5.0
2026-03-21 02:08:15 -05:00

14 KiB

Volt CLI v0.1.0 — Integration Test Results

Server: volt-test-01 (172.234.213.10)
Date: 2026-03-09
OS: Ubuntu 24.04.4 LTS / Kernel 6.8.0-71-generic
Hardware: AMD EPYC 7713, 4 cores, 7.8 GB RAM
Binary: /usr/local/bin/volt v0.1.0 (commit 5d251f1)
KVM: NOT available (shared Linode — no nested virtualization)


Summary

Phase Tests Pass Fail Stub/Partial Notes
5A: Containers 4 2 1 1 Non-boot works; boot fails (no init in rootfs)
5B: Services 6 6 0 0 Fully functional
5C: Network 5 5 0 0 Fully functional
5D: Tuning 4 3 0 1 Profile apply is stub
5E: Tasks 4 3 1 0 volt task run naming mismatch
5F: Output 4 4 0 0 Fully functional
5G: Compose 3 1 0 2 Config validates; up/down are stubs
Additional 10 8 0 2 volume list, events, top are stubs
TOTAL 40 32 2 6 80% pass, 15% stub, 5% fail

Phase 5A: Container Integration Tests (systemd-nspawn)

Test 5A-1: Non-boot container execution — PASS

systemd-nspawn -D /var/lib/volt/containers/test-container --machine=volt-test-2 \
  /bin/sh -c "echo Hello; hostname; id; cat /etc/os-release"

Result: Container launched, executed commands, showed hostname volt-test-2, ran as uid=0(root). Rootfs identified as Debian 12 (bookworm). Exited cleanly.

Test 5A-1b: Boot mode container — FAIL

systemd-nspawn -D /var/lib/volt/containers/test-container --machine=volt-test-1 -b --network-bridge=volt0

Result: execv(/usr/lib/systemd/systemd, /lib/systemd/systemd, /sbin/init) failed: No such file or directory Root cause: The bootstrapped rootfs is a minimal Debian install without systemd/init inside. This is an infrastructure issue — the rootfs needs systemd installed to support boot mode. Fix: debootstrap --include=systemd,dbus or chroot /var/lib/volt/containers/test-container apt install systemd

Test 5A-2: volt ps shows containers — ⚠️ PARTIAL

volt ps containers → "No container workloads found."

Result: volt ps correctly shows services, but the container started via systemd-nspawn directly was not tracked by volt. This is expected — volt needs its own container orchestration layer (via volt container create) to track containers. Currently, volt container list returns "No containers running" even with a running nspawn. The volt container createvolt container startvolt ps containers pipeline is what needs to be implemented.

Test 5A-3: Execute in container — FAIL (dependent on 5A-1b)

Result: Failed because boot container never started. The machinectl shell command requires a booted machine. Non-boot containers exit immediately after the command.

Test 5A-4: Container networking — PASS

systemd-nspawn ... --network-bridge=volt0

Result: Network bridge attachment succeeded. vb-volt-netDLIN veth pair was created. The rootfs lacks ip/iproute2 so we couldn't verify IP assignment inside, but the host-side plumbing worked. Bridge linkage with volt0 confirmed.


Phase 5B: Service Management Tests

Test 5B-1: volt service create — PASS

volt service create --name volt-test-svc --exec "/bin/sh -c 'while true; do echo heartbeat; sleep 5; done'"
→ "Service unit written to /etc/systemd/system/volt-test-svc.service"

Result: Unit file created correctly with proper [Unit], [Service], and [Install] sections. Added Description=Volt managed service: volt-test-svc, After=network.target, Restart=on-failure, RestartSec=5.

Test 5B-2: volt service start — PASS

volt service start volt-test-svc → "Service volt-test-svc.service started."
volt service status volt-test-svc → Active: active (running)

Result: Service started, PID assigned (25669), cgroup created, heartbeat messages in journal.

Test 5B-3: volt ps shows service — PASS

volt ps | grep volt-test → volt-test-svc  service  running  -  388.0 KB  25669  3s

Result: Service correctly appears in volt ps with type, status, memory, PID, and uptime.

Test 5B-4: volt logs — PASS

volt logs volt-test-svc --tail 5

Result: Shows journal entries including systemd start message and heartbeat output. Correctly wraps journalctl.

Test 5B-5: volt service stop — PASS

volt service stop volt-test-svc → "Service volt-test-svc.service stopped."
volt service status → Active: inactive (dead)

Result: Service stopped cleanly. Note: volt service status exits with code 3 for stopped services (mirrors systemctl behavior). The exit code triggers usage output — minor UX issue.

Test 5B-6: volt service disable — PASS

volt service disable volt-test-svc → "Service volt-test-svc.service disabled."

Result: Service disabled correctly.


Phase 5C: Network Tests

Test 5C-1: volt net status — PASS

Result: Comprehensive output showing:

  • Bridges: virbr0 (DOWN), volt0 (DOWN/no-carrier — expected, no containers attached)
  • IP addresses: eth0 172.234.213.10/24, volt0 10.0.0.1/24, virbr0 192.168.122.1/24
  • Routes: default via 172.234.213.1
  • Listening ports: SSH (22), DNS (53 systemd-resolved + dnsmasq)

Test 5C-2: volt net bridge list — PASS

Result: Shows detailed bridge info for virbr0 and volt0 via ip -d link show type bridge. Includes STP state, VLAN filtering, multicast settings. Production-quality output.

Test 5C-3: volt0 bridge details — PASS

Result: volt0 bridge confirmed: 10.0.0.1/24, fe80::d04d:94ff:fe6c:5414/64. State DOWN (expected — no containers attached yet).

Test 5C-4: volt net firewall list — PASS

Result: Full nftables ruleset displayed including:

  • ip filter table with libvirt chains (LIBVIRT_INP, LIBVIRT_OUT, LIBVIRT_FWO, LIBVIRT_FWI, LIBVIRT_FWX)
  • ip nat table with masquerade for virbr0 subnet + eth0
  • ip6 filter and ip6 nat tables
  • All tables show proper chain hooks and policies

Test 5C-5: Dynamic bridge creation visible — PASS

Result: After creating volt-test bridge via ip link add, volt net bridge list immediately showed all 3 bridges (virbr0, volt0, volt-test). Cleanup via ip link del worked.


Phase 5D: Performance Tuning Tests

Test 5D-1: Sysctl get — PASS

volt tune sysctl get net.core.somaxconn → 4096
volt tune sysctl get vm.swappiness → 60

Test 5D-2: Sysctl set — PASS

volt tune sysctl set vm.swappiness 10 → vm.swappiness = 10
sysctl vm.swappiness → vm.swappiness = 10  (confirmed)
volt tune sysctl set vm.swappiness 60 → restored

Result: Reads and writes sysctl values correctly. Changes verified with system sysctl command.

Test 5D-3: Profile list — PASS

Result: Shows 8 tuning profiles: server, desktop, latency, throughput, balanced, powersave, vm-host, container-host. Good naming and descriptions.

Test 5D-4: volt tune show — PASS

Result: Shows overview: CPU Governor (unavailable — no cpufreq on VM), Swappiness (60), IP Forwarding (1), Overcommit (0), Max Open Files, Somaxconn (4096).

Test 5D-5: volt tune profile apply — ⚠️ STUB

volt tune profile apply server → "not yet implemented"

Note: No --dry-run flag either. Profile apply is planned but not yet implemented.


Phase 5E: Task/Timer Tests

Test 5E-1: volt task list — PASS

Result: Lists all 13 system timers with NEXT, LEFT, LAST, PASSED, UNIT, and ACTIVATES columns. Wraps systemctl list-timers cleanly.

Test 5E-2: Custom timer visible — PASS

Result: After creating volt-test-task.timer and starting it, volt task list showed 14 timers with the new one at the top (next fire in ~19s).

Test 5E-3: volt task run — FAIL

volt task run volt-test-task
→ "Failed to start volt-task-volt-test-task.service: Unit volt-task-volt-test-task.service not found."

Root cause: volt task run prepends volt-task- to the name, looking for volt-task-volt-test-task.service instead of volt-test-task.service. This is a naming convention issue — volt expects tasks it created (with volt-task- prefix) rather than arbitrary systemd timers. Fix: Either document the naming convention or allow volt task run to try both volt-task-<name> and <name> directly.

Test 5E-4: Manual task execution — PASS

systemctl start volt-test-task.service → success
journalctl shows: "Volt task executed"

Result: The underlying systemd timer/service mechanism works correctly.


Phase 5F: Output Format Validation

Test 5F-1: JSON output — PASS

volt ps -o json | python3 -m json.tool → valid JSON

Result: Outputs valid JSON array of objects with fields: name, type, status, cpu, mem, pid, uptime.

Test 5F-2: YAML output — PASS

volt ps -o yaml → valid YAML

Result: Proper YAML list with - delimiters and key-value pairs.

Test 5F-3: volt system info — PASS

Result: Beautiful formatted output with:

  • Version/build info
  • Hostname, OS, kernel, arch
  • CPU model and core count
  • Memory total/available
  • Disk usage
  • System uptime

Test 5F-4: volt ps --all — PASS

Result: Shows 60 services including exited oneshots. Table formatting is clean with proper column alignment. ANSI color codes used for status (green=running, yellow=exited).


Phase 5G: Compose File Validation

Test 5G-1: volt compose config — PASS

volt compose config → "✓ Compose file is valid"

Result: Parses and validates the compose YAML correctly. Re-outputs the normalized config showing services and networks.

Test 5G-2: volt compose up — ⚠️ STUB

volt compose up → "Stack creation not yet fully implemented."

Result: Parses the file, shows what it would create (2 services, 1 network with types), but doesn't actually create anything. Good progress indication.

Test 5G-3: volt compose down — ⚠️ STUB

volt compose down → "not yet implemented"

Additional Tests

volt help — PASS

Comprehensive help with 6 categories: Workload, Infrastructure, Observability, Composition, System, Shortcuts. 30+ commands listed.

volt version — PASS

Shows version, build date, git commit.

Error handling — PASS

  • Unknown command: clear error message + help suggestion
  • Nonexistent service status: proper error with exit code 4
  • Nonexistent service logs: "No entries" (graceful, no crash)

volt status — PASS

Same as volt system info. Clean system overview.

volt cluster status — PASS

Shows cluster overview with density comparison (32x over traditional VMs). Currently 0 nodes.

volt container list — PASS

Returns "No containers running" (correct — no containers managed by volt).

volt volume list — ⚠️ STUB

"Not yet implemented"

volt top — ⚠️ STUB

"Not yet implemented" with helpful alternatives (volt ps, htop, systemd-cgtop).

volt events — ⚠️ STUB

"Not yet implemented"


What Works Fully (Production-Ready)

  1. Service lifecycle — create, start, stop, disable, status, logs — complete pipeline
  2. Process listingvolt ps with JSON/YAML/table/wide output, --all flag
  3. Network status — bridges, firewall, interfaces, routes, ports
  4. Sysctl tuning — read and write kernel parameters
  5. Task listing — system timer enumeration
  6. System info — comprehensive platform information
  7. Config validation — compose file parsing and validation
  8. Error handling — proper exit codes, clear error messages
  9. Help system — well-organized command hierarchy with examples

What's Skeleton/Stub (Needs Implementation)

  1. volt compose up/down — Parses config but doesn't create services
  2. volt tune profile apply — Profiles listed but can't be applied
  3. volt volume list — Not implemented
  4. volt top — Not implemented (real-time monitoring)
  5. volt events — Not implemented
  6. volt container create/start — The container management pipeline needs the daemon to track nspawn instances

Bugs/Issues Found

  1. volt task run naming — Prepends volt-task- prefix, won't run tasks not created by volt. Should either fall back to direct name or document the convention clearly.
  2. volt service status exit code — Returns exit 3 for stopped services (mirrors systemctl) but then prints full usage/help text, which is confusing. Should suppress usage output when the command syntax is correct.
  3. Container rootfs — Bootstrapped rootfs at /var/lib/volt/containers/test-container lacks systemd (can't boot) and iproute2 (can't verify networking). Needs enrichment for full testing.

Infrastructure Limitations

  • No KVM/nested virt — Shared Linode doesn't support KVM. Cannot test volt vm commands. Need bare-metal or KVM-enabled VPS for VM testing.
  • No cpufreq — CPU governor unavailable in VM, so volt tune show reports "unavailable".
  • Container rootfs minimal — Debian 12 debootstrap without systemd or networking tools.

Recommendations for Next Steps

  1. Priority: Implement volt container create/start/stop — This is the core Voltainer pipeline. Wire it to systemd-nspawn with machinectl registration so volt ps containers tracks them.
  2. Priority: Implement volt compose up — Convert validated compose config into actual volt service create calls + bridge creation.
  3. Fix volt task run — Allow running arbitrary timers, not just volt-prefixed ones.
  4. Fix volt service status — Don't print usage text when exit code comes from systemctl.
  5. Enrich test rootfs — Add systemd, iproute2, curl to container rootfs for boot mode and network testing.
  6. Add --dry-run — To volt tune profile apply, volt compose up, etc.
  7. Get bare-metal Linode — For KVM/Voltvisor testing (dedicated instance required).
  8. Implement volt top — Use cgroup stats + polling for real-time monitoring.
  9. Container image managementvolt image pull/list to download and manage rootfs images.
  10. Daemon modevolt daemon for long-running container orchestration with health checks.