package orchestrator import ( "os" "strconv" ) // Config holds all tunables for the orchestrator. type Config struct { FCBin string // path to firecracker binary BaseDir string // working directory for all state Kernel string // path to vmlinux Rootfs string // path to base rootfs.ext4 VCPUs int64 MemMiB int64 Bridge string // host bridge name, or "none" to skip networking BridgeCIDR string // e.g. "172.30.0.1/24" GuestPrefix string // e.g. "172.30.0" — clones get .10, .11, ... GuestGW string BootArgs string } func DefaultConfig() Config { c := Config{ FCBin: envOr("FC_BIN", "firecracker"), BaseDir: envOr("FC_BASE_DIR", "/tmp/fc-orch"), VCPUs: envOrInt("FC_VCPUS", 1), MemMiB: envOrInt("FC_MEM_MIB", 128), Bridge: envOr("FC_BRIDGE", "fcbr0"), BridgeCIDR: envOr("FC_BRIDGE_CIDR", "172.30.0.1/24"), GuestPrefix: envOr("FC_GUEST_PREFIX", "172.30.0"), GuestGW: envOr("FC_GUEST_GW", "172.30.0.1"), BootArgs: "console=ttyS0 reboot=k panic=1 pci=off i8042.noaux quiet loglevel=0", } c.Kernel = envOr("FC_KERNEL", c.BaseDir+"/vmlinux") c.Rootfs = envOr("FC_ROOTFS", c.BaseDir+"/rootfs.ext4") return c } func envOr(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } func envOrInt(key string, fallback int64) int64 { if v := os.Getenv(key); v != "" { if n, err := strconv.ParseInt(v, 10, 64); err == nil { return n } } return fallback }