vm defaults: host-aware sizing + spec line on spawn + doctor check
Replaces the static model.Default* constants that drove --vcpu / --memory / --disk-size with a three-layer resolver: 1. [vm_defaults] in ~/.config/banger/config.toml (if set) 2. host-derived heuristics (cpus/4 capped at 4; ram/8 capped at 8 GiB) 3. baked-in constants (floor) Visibility: - Every `vm run` / `vm create` prints a `spec:` line before progress begins: `spec: 4 vcpu · 8192 MiB · 8G disk`. Matches the VM that actually gets created because the CLI is now the single source of truth — it resolves, populates the flag defaults, and forwards the explicit values to the daemon. - `banger doctor` adds a "vm defaults" check showing per-field provenance (config|auto|builtin) and the config file path for overrides. - `--help` shows the resolved defaults (e.g. `--vcpu int (default 4)` on an 8-core host). No `banger config init` command, no first-run side effects, no writes to the user's filesystem behind their back. Users who want explicit control set the keys; everyone else gets sensible numbers that track their hardware.
This commit is contained in:
parent
78ff482bfa
commit
21b74639d8
10 changed files with 594 additions and 56 deletions
|
|
@ -2,6 +2,7 @@ package daemon
|
|||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"banger/internal/config"
|
||||
|
|
@ -40,11 +41,34 @@ func (d *Daemon) doctorReport(ctx context.Context) system.Report {
|
|||
report.AddPreflight("host runtime", d.runtimeChecks(), runtimeStatus(d.config))
|
||||
report.AddPreflight("core vm lifecycle", d.coreVMLifecycleChecks(), "required host tools available")
|
||||
report.AddPreflight("vsock guest agent", d.vsockChecks(), "vsock guest agent prerequisites available")
|
||||
d.addVMDefaultsCheck(&report)
|
||||
d.addCapabilityDoctorChecks(ctx, &report)
|
||||
|
||||
return report
|
||||
}
|
||||
|
||||
// addVMDefaultsCheck surfaces the effective VM sizing that `vm run` /
|
||||
// `vm create` will apply when the user omits the flags. Shown as a
|
||||
// PASS check so it always renders, with per-field provenance
|
||||
// (config|auto|builtin) so users can tell what's driving each number.
|
||||
func (d *Daemon) addVMDefaultsCheck(report *system.Report) {
|
||||
host, err := system.ReadHostResources()
|
||||
var cpus int
|
||||
var memBytes int64
|
||||
if err == nil {
|
||||
cpus = host.CPUCount
|
||||
memBytes = host.TotalMemoryBytes
|
||||
}
|
||||
defaults := model.ResolveVMDefaults(d.config.VMDefaults, cpus, memBytes)
|
||||
details := []string{
|
||||
fmt.Sprintf("vcpu: %d (%s)", defaults.VCPUCount, defaults.VCPUSource),
|
||||
fmt.Sprintf("memory: %d MiB (%s)", defaults.MemoryMiB, defaults.MemorySource),
|
||||
fmt.Sprintf("disk: %s (%s)", model.FormatSizeBytes(defaults.WorkDiskSizeBytes), defaults.WorkDiskSource),
|
||||
"override any of these in ~/.config/banger/config.toml under [vm_defaults]",
|
||||
}
|
||||
report.AddPass("vm defaults", details...)
|
||||
}
|
||||
|
||||
func (d *Daemon) runtimeChecks() *system.Preflight {
|
||||
checks := system.NewPreflight()
|
||||
checks.RequireExecutable(d.config.FirecrackerBin, "firecracker binary", `install firecracker or set "firecracker_bin"`)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue