feat: firecracker best path

This commit is contained in:
Harivansh Rathi 2026-04-10 03:17:48 +00:00
parent 74e54d4c36
commit 54a4c423a6
7 changed files with 176 additions and 28 deletions

View file

@ -20,6 +20,7 @@ type Config struct {
MachineDisksDir string
SnapshotsDir string
RuntimeDir string
DiskCloneMode DiskCloneMode
SocketPath string
HTTPAddr string
EgressInterface string
@ -28,6 +29,16 @@ type Config struct {
GuestLoginCAPublicKey string
}
// DiskCloneMode controls how the daemon materializes writable machine disks.
type DiskCloneMode string
const (
// DiskCloneModeReflink requires an O(1) copy-on-write clone and never falls back to a full copy.
DiskCloneModeReflink DiskCloneMode = "reflink"
// DiskCloneModeCopy performs a full sparse copy. Use only for local development or emergency fallback.
DiskCloneModeCopy DiskCloneMode = "copy"
)
// Load loads and validates the firecracker-host daemon configuration from the environment.
func Load() (Config, error) {
rootDir := filepath.Clean(strings.TrimSpace(os.Getenv("FIRECRACKER_HOST_ROOT_DIR")))
@ -39,6 +50,7 @@ func Load() (Config, error) {
MachineDisksDir: filepath.Join(rootDir, "machine-disks"),
SnapshotsDir: filepath.Join(rootDir, "snapshots"),
RuntimeDir: filepath.Join(rootDir, "runtime"),
DiskCloneMode: loadDiskCloneMode(os.Getenv("FIRECRACKER_HOST_DISK_CLONE_MODE")),
SocketPath: filepath.Join(rootDir, defaultSocketName),
HTTPAddr: strings.TrimSpace(os.Getenv("FIRECRACKER_HOST_HTTP_ADDR")),
EgressInterface: strings.TrimSpace(os.Getenv("FIRECRACKER_HOST_EGRESS_INTERFACE")),
@ -81,6 +93,9 @@ func (c Config) Validate() error {
if strings.TrimSpace(c.RuntimeDir) == "" {
return fmt.Errorf("runtime dir is required")
}
if err := c.DiskCloneMode.Validate(); err != nil {
return err
}
if strings.TrimSpace(c.SocketPath) == "" {
return fmt.Errorf("socket path is required")
}
@ -99,3 +114,21 @@ func (c Config) FirecrackerRuntimeConfig() firecracker.RuntimeConfig {
JailerBinaryPath: c.JailerBinaryPath,
}
}
func loadDiskCloneMode(raw string) DiskCloneMode {
value := strings.TrimSpace(raw)
if value == "" {
return DiskCloneModeReflink
}
return DiskCloneMode(value)
}
// Validate reports whether the clone mode is safe to use.
func (m DiskCloneMode) Validate() error {
switch m {
case DiskCloneModeReflink, DiskCloneModeCopy:
return nil
default:
return fmt.Errorf("FIRECRACKER_HOST_DISK_CLONE_MODE must be %q or %q", DiskCloneModeReflink, DiskCloneModeCopy)
}
}

View file

@ -0,0 +1,40 @@
package config
import "testing"
func TestLoadDiskCloneModeDefaultsToReflink(t *testing.T) {
t.Parallel()
if got := loadDiskCloneMode(""); got != DiskCloneModeReflink {
t.Fatalf("disk clone mode = %q, want %q", got, DiskCloneModeReflink)
}
}
func TestDiskCloneModeValidate(t *testing.T) {
t.Parallel()
tests := []struct {
name string
mode DiskCloneMode
wantErr bool
}{
{name: "reflink", mode: DiskCloneModeReflink},
{name: "copy", mode: DiskCloneModeCopy},
{name: "empty", mode: "", wantErr: true},
{name: "unknown", mode: "auto", wantErr: true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
err := tt.mode.Validate()
if tt.wantErr && err == nil {
t.Fatal("Validate() error = nil, want error")
}
if !tt.wantErr && err != nil {
t.Fatalf("Validate() error = %v, want nil", err)
}
})
}
}