podman
1package machine2
3import (4"strings"5
6"github.com/containers/podman/v5/pkg/machine/vmconfigs"7)
8
9type Volume interface {10Kind() VolumeKind11}
12
13type VolumeKind string14
15var (16VirtIOFsVk VolumeKind = "virtiofs"17NinePVk VolumeKind = "9p"18)
19
20type VirtIoFs struct {21VolumeKind
22ReadOnly bool23Source string24Tag string25Target string26}
27
28func (v VirtIoFs) Kind() string {29return string(VirtIOFsVk)30}
31
32// unitName is the fq path where /'s are replaced with -'s
33func (v VirtIoFs) unitName() string {34// delete the leading -35unit := strings.ReplaceAll(v.Target, "/", "-")36if strings.HasPrefix(unit, "-") {37return unit[1:]38}39return unit40}
41
42func (v VirtIoFs) ToMount() vmconfigs.Mount {43return vmconfigs.Mount{44ReadOnly: v.ReadOnly,45Source: v.Source,46Tag: v.Tag,47Target: v.Target,48Type: v.Kind(),49}50}
51
52// NewVirtIoFsMount describes a machine volume mount for virtio-fs. With virtio-fs
53// the source/target are described as a "shared dir". With this style of volume mount
54// the Tag is used as the descriptor value for the mount (in Linux).
55func NewVirtIoFsMount(src, target string, readOnly bool) VirtIoFs {56vfs := VirtIoFs{57ReadOnly: readOnly,58Source: src,59Target: target,60}61vfs.Tag = vfs.unitName()62return vfs63}
64
65func MountToVirtIOFs(mnt *vmconfigs.Mount) VirtIoFs {66return VirtIoFs{67VolumeKind: VirtIOFsVk,68ReadOnly: mnt.ReadOnly,69Source: mnt.Source,70Tag: mnt.Tag,71Target: mnt.Target,72}73}
74