diff --git a/cmd/limactl/factory-reset.go b/cmd/limactl/factory-reset.go index 2f91f60ec91..b7a87edc0bc 100644 --- a/cmd/limactl/factory-reset.go +++ b/cmd/limactl/factory-reset.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/lima-vm/lima/pkg/store" + "github.com/lima-vm/lima/pkg/store/filenames" "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) @@ -45,7 +46,7 @@ func factoryResetAction(_ *cobra.Command, args []string) error { } for _, f := range fi { path := filepath.Join(inst.Dir, f.Name()) - if !strings.HasSuffix(path, ".yaml") && !strings.HasSuffix(path, ".yml") { + if !strings.HasSuffix(path, ".yaml") && !strings.HasSuffix(path, ".yml") && f.Name() != filenames.VzIdentifier { logrus.Infof("Removing %q", path) if err := os.Remove(path); err != nil { logrus.Error(err) diff --git a/pkg/driver/driver.go b/pkg/driver/driver.go index 84c65f40aa1..837a16e5ca5 100644 --- a/pkg/driver/driver.go +++ b/pkg/driver/driver.go @@ -16,6 +16,14 @@ type Driver interface { // Validate returns error if the current driver isn't support for given config Validate() error + // Initialize is called on creating the instance for initialization. + // (e.g., creating "vz-identifier" file) + // + // Initialize MUST return nil when it is called against an existing instance. + // + // Initialize does not create the disks. + Initialize(_ context.Context) error + // CreateDisk returns error if the current driver fails in creating disk CreateDisk() error @@ -69,6 +77,10 @@ func (d *BaseDriver) Validate() error { return nil } +func (d *BaseDriver) Initialize(_ context.Context) error { + return nil +} + func (d *BaseDriver) CreateDisk() error { return nil } diff --git a/pkg/osutil/osversion_darwin.go b/pkg/osutil/osversion_darwin.go new file mode 100644 index 00000000000..9a9338dcb5c --- /dev/null +++ b/pkg/osutil/osversion_darwin.go @@ -0,0 +1,29 @@ +package osutil + +import ( + "fmt" + "os/exec" + "strings" + + "github.com/coreos/go-semver/semver" +) + +// ProductVersion returns the macOS product version like "12.3.1". +func ProductVersion() (*semver.Version, error) { + cmd := exec.Command("sw_vers", "-productVersion") + // output is like "12.3.1\n" + b, err := cmd.Output() + if err != nil { + return nil, fmt.Errorf("failed to execute %v: %w", cmd.Args, err) + } + verTrimmed := strings.TrimSpace(string(b)) + // macOS 12.4 returns just "12.4\n" + for strings.Count(verTrimmed, ".") < 2 { + verTrimmed += ".0" + } + verSem, err := semver.NewVersion(verTrimmed) + if err != nil { + return nil, fmt.Errorf("failed to parse macOS version %q: %w", verTrimmed, err) + } + return verSem, nil +} diff --git a/pkg/osutil/osversion_others.go b/pkg/osutil/osversion_others.go new file mode 100644 index 00000000000..c54d0f1dfc9 --- /dev/null +++ b/pkg/osutil/osversion_others.go @@ -0,0 +1,14 @@ +//go:build !darwin + +package osutil + +import ( + "errors" + + "github.com/coreos/go-semver/semver" +) + +// ProductVersion returns the OS product version, not the kernel version. +func ProductVersion() (*semver.Version, error) { + return nil, errors.New("not implemented") +} diff --git a/pkg/qemu/qemu.go b/pkg/qemu/qemu.go index 90189a45eb4..0d0d7f50ac4 100644 --- a/pkg/qemu/qemu.go +++ b/pkg/qemu/qemu.go @@ -17,6 +17,7 @@ import ( "time" "github.com/lima-vm/lima/pkg/networks/usernet" + "github.com/lima-vm/lima/pkg/osutil" "github.com/coreos/go-semver/semver" "github.com/digitalocean/go-qemu/qmp" @@ -398,25 +399,6 @@ func showDarwinARM64HVFQEMU620Warning(exe, accel string, features *features) { logrus.Warn(w) } -func getMacOSProductVersion() (*semver.Version, error) { - cmd := exec.Command("sw_vers", "-productVersion") - // output is like "12.3.1\n" - b, err := cmd.Output() - if err != nil { - return nil, fmt.Errorf("failed to execute %v: %w", cmd.Args, err) - } - verTrimmed := strings.TrimSpace(string(b)) - // macOS 12.4 returns just "12.4\n" - for strings.Count(verTrimmed, ".") < 2 { - verTrimmed += ".0" - } - verSem, err := semver.NewVersion(verTrimmed) - if err != nil { - return nil, fmt.Errorf("failed to parse macOS version %q: %w", verTrimmed, err) - } - return verSem, nil -} - // adjustMemBytesDarwinARM64HVF adjusts the memory to be <= 3 GiB, only when the following conditions are met: // // - Host OS < macOS 12.4 @@ -443,7 +425,7 @@ func adjustMemBytesDarwinARM64HVF(memBytes int64, accel string, features *featur if !features.VersionGEQ7 { return memBytes } - macOSProductVersion, err := getMacOSProductVersion() + macOSProductVersion, err := osutil.ProductVersion() if err != nil { logrus.Warn(err) return memBytes diff --git a/pkg/start/start.go b/pkg/start/start.go index ccfb0ab9041..a5c49c8a00b 100644 --- a/pkg/start/start.go +++ b/pkg/start/start.go @@ -72,7 +72,7 @@ type Prepared struct { } // Prepare ensures the disk, the nerdctl archive, etc. -func Prepare(_ context.Context, inst *store.Instance) (*Prepared, error) { +func Prepare(ctx context.Context, inst *store.Instance) (*Prepared, error) { y, err := inst.LoadYAML() if err != nil { return nil, err @@ -87,6 +87,10 @@ func Prepare(_ context.Context, inst *store.Instance) (*Prepared, error) { return nil, err } + if err := limaDriver.Initialize(ctx); err != nil { + return nil, err + } + // Check if the instance has been created (the base disk already exists) created := false baseDisk := filepath.Join(inst.Dir, filenames.BaseDisk) @@ -114,6 +118,7 @@ func Start(ctx context.Context, inst *store.Instance) error { if _, err := os.Stat(haPIDPath); !errors.Is(err, os.ErrNotExist) { return fmt.Errorf("instance %q seems running (hint: remove %q if the instance is not actually running)", inst.Name, haPIDPath) } + logrus.Infof("Starting the instance %q with VM driver %q", inst.Name, inst.VMType) haSockPath := filepath.Join(inst.Dir, filenames.HostAgentSock) diff --git a/pkg/vz/vz_driver_darwin.go b/pkg/vz/vz_driver_darwin.go index a95c40e750a..7a12be75192 100644 --- a/pkg/vz/vz_driver_darwin.go +++ b/pkg/vz/vz_driver_darwin.go @@ -130,6 +130,11 @@ func (l *LimaVzDriver) Validate() error { return nil } +func (l *LimaVzDriver) Initialize(_ context.Context) error { + _, err := getMachineIdentifier(l.BaseDriver) + return err +} + func (l *LimaVzDriver) CreateDisk() error { return EnsureDisk(l.BaseDriver) }