All checks were successful
Test / Create distribution (push) Successful in 33s
Test / Sandbox (push) Successful in 2m14s
Test / Hakurei (push) Successful in 3m37s
Test / Hpkg (push) Successful in 4m27s
Test / Sandbox (race detector) (push) Successful in 4m23s
Test / Hakurei (race detector) (push) Successful in 5m22s
Test / Flake checks (push) Successful in 1m22s
This allows mount points to be represented by different underlying structs. Signed-off-by: Ophestra <cat@gensokyo.uk>
84 lines
1.7 KiB
Go
84 lines
1.7 KiB
Go
package hst
|
|
|
|
import (
|
|
"encoding/gob"
|
|
"os"
|
|
"strings"
|
|
|
|
"hakurei.app/container"
|
|
)
|
|
|
|
func init() { gob.Register(new(FSEphemeral)) }
|
|
|
|
// FilesystemEphemeral is the [FilesystemConfig.Type] name of a mount point with ephemeral state.
|
|
const FilesystemEphemeral = "ephemeral"
|
|
|
|
// FSEphemeral represents an ephemeral container mount point.
|
|
type FSEphemeral struct {
|
|
// mount point in container
|
|
Dst *container.Absolute `json:"dst,omitempty"`
|
|
// do not mount filesystem read-only
|
|
Write bool `json:"write,omitempty"`
|
|
// upper limit on the size of the filesystem
|
|
Size int `json:"size,omitempty"`
|
|
// initial permission bits of the new filesystem
|
|
Perm os.FileMode `json:"perm,omitempty"`
|
|
}
|
|
|
|
func (e *FSEphemeral) Type() string { return FilesystemEphemeral }
|
|
|
|
func (e *FSEphemeral) Target() *container.Absolute {
|
|
if e == nil {
|
|
return nil
|
|
}
|
|
return e.Dst
|
|
}
|
|
|
|
func (e *FSEphemeral) Host() []*container.Absolute { return nil }
|
|
|
|
const fsEphemeralDefaultPerm = os.FileMode(0755)
|
|
|
|
func (e *FSEphemeral) Apply(ops *container.Ops) {
|
|
if e == nil || e.Dst == nil {
|
|
return
|
|
}
|
|
|
|
size := e.Size
|
|
if size < 0 {
|
|
size = 0
|
|
}
|
|
|
|
perm := e.Perm
|
|
if perm == 0 {
|
|
perm = fsEphemeralDefaultPerm
|
|
}
|
|
|
|
if e.Write {
|
|
ops.Tmpfs(e.Dst, size, perm)
|
|
} else {
|
|
ops.Readonly(e.Dst, perm)
|
|
}
|
|
}
|
|
|
|
func (e *FSEphemeral) String() string {
|
|
if e == nil || e.Dst == nil {
|
|
return "<invalid>"
|
|
}
|
|
|
|
expr := new(strings.Builder)
|
|
expr.Grow(15 + len(FilesystemEphemeral) + len(e.Dst.String()))
|
|
|
|
if e.Write {
|
|
expr.WriteString("w")
|
|
}
|
|
expr.WriteString("+" + FilesystemEphemeral + "(")
|
|
if e.Perm != 0 {
|
|
expr.WriteString(e.Perm.String())
|
|
} else {
|
|
expr.WriteString(fsEphemeralDefaultPerm.String())
|
|
}
|
|
expr.WriteString("):" + e.Dst.String())
|
|
|
|
return expr.String()
|
|
}
|