diff --git a/pkg/limayaml/defaults.go b/pkg/limayaml/defaults.go index 079f09f9702..8e1e8213247 100644 --- a/pkg/limayaml/defaults.go +++ b/pkg/limayaml/defaults.go @@ -89,6 +89,19 @@ func defaultContainerdArchives() []File { } } +func defaultMounts() []Mount { + return []Mount{ + { + Location: "~", + Writable: ptr.Of(false), + }, + { + Location: "/tmp/lima", + Writable: ptr.Of(true), + }, + } +} + // FirstUsernetIndex gets the index of first usernet network under l.Network[]. Returns -1 if no usernet network found func FirstUsernetIndex(l *LimaYAML) int { return slices.IndexFunc(l.Networks, func(network Network) bool { return networks.IsUsernet(network.Lima) }) @@ -633,6 +646,17 @@ func FillDefault(y, d, o *LimaYAML, filePath string) { } y.Mounts = mounts + mounts = []Mount{} + for _, mount := range y.Mounts { + if mount.Name == "default" { + mounts = append(mounts, defaultMounts()...) + continue + } else { + mounts = append(mounts, mount) + } + } + y.Mounts = mounts + for i := range y.Mounts { mount := &y.Mounts[i] if mount.SSHFS.Cache == nil { diff --git a/pkg/limayaml/limayaml.go b/pkg/limayaml/limayaml.go index 71c2716451a..ebc26fbb579 100644 --- a/pkg/limayaml/limayaml.go +++ b/pkg/limayaml/limayaml.go @@ -111,6 +111,7 @@ type Disk struct { } type Mount struct { + Name string `yaml:"name,omitempty" json:"name,omitempty"` Location string `yaml:"location" json:"location"` // REQUIRED MountPoint string `yaml:"mountPoint,omitempty" json:"mountPoint,omitempty"` Writable *bool `yaml:"writable,omitempty" json:"writable,omitempty"` diff --git a/pkg/limayaml/load.go b/pkg/limayaml/load.go index b6de3664958..4dbd1e51ee6 100644 --- a/pkg/limayaml/load.go +++ b/pkg/limayaml/load.go @@ -13,6 +13,15 @@ import ( yamlv3 "gopkg.in/yaml.v3" ) +func unmarshalMount(dst *Mount, b []byte) error { + var s string + if err := yaml.Unmarshal(b, &s); err == nil { + *dst = Mount{Name: s} + return nil + } + return yaml.Unmarshal(b, dst) +} + func unmarshalDisk(dst *Disk, b []byte) error { var s string if err := yaml.Unmarshal(b, &s); err == nil { @@ -32,10 +41,22 @@ func unmarshalImage(dst *Image, b []byte) error { } var customMarshalers = []yaml.DecodeOption{ + yaml.CustomUnmarshaler[Mount](unmarshalMount), yaml.CustomUnmarshaler[Disk](unmarshalDisk), yaml.CustomUnmarshaler[Image](unmarshalImage), } +func (d *Mount) UnmarshalYAML(value *yamlv3.Node) error { + var v interface{} + if err := value.Decode(&v); err != nil { + return err + } + if s, ok := v.(string); ok { + *d = Mount{Name: s} + } + return nil +} + func (d *Disk) UnmarshalYAML(value *yamlv3.Node) error { var v interface{} if err := value.Decode(&v); err != nil { diff --git a/pkg/limayaml/validate.go b/pkg/limayaml/validate.go index 11e0ae02e82..f0791dff6fb 100644 --- a/pkg/limayaml/validate.go +++ b/pkg/limayaml/validate.go @@ -133,6 +133,13 @@ func Validate(y *LimaYAML, warn bool) error { reservedHome := fmt.Sprintf("/home/%s.linux", u.Username) for i, f := range y.Mounts { + if f.Name != "" { + if f.Name != "default" { + return fmt.Errorf("field `mounts[%d].name` refers to an unknown name: %q", + i, f.Name) + } + continue + } if !filepath.IsAbs(f.Location) && !strings.HasPrefix(f.Location, "~") { return fmt.Errorf("field `mounts[%d].location` must be an absolute path, got %q", i, f.Location)