hst/fs: interface filesystem config
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
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>
This commit is contained in:
83
hst/fsephemeral.go
Normal file
83
hst/fsephemeral.go
Normal file
@@ -0,0 +1,83 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user