mirror of
https://github.com/getcompanion-ai/computer-host.git
synced 2026-04-15 05:02:05 +00:00
feat: firecracker best path
This commit is contained in:
parent
74e54d4c36
commit
54a4c423a6
7 changed files with 176 additions and 28 deletions
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
40
internal/config/config_test.go
Normal file
40
internal/config/config_test.go
Normal 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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue