container/initbind: optional ensure host directory
All checks were successful
Test / Create distribution (push) Successful in 35s
Test / Sandbox (push) Successful in 2m19s
Test / Hakurei (push) Successful in 3m15s
Test / Hpkg (push) Successful in 4m19s
Test / Sandbox (race detector) (push) Successful in 4m34s
Test / Hakurei (race detector) (push) Successful in 5m11s
Test / Flake checks (push) Successful in 1m46s
All checks were successful
Test / Create distribution (push) Successful in 35s
Test / Sandbox (push) Successful in 2m19s
Test / Hakurei (push) Successful in 3m15s
Test / Hpkg (push) Successful in 4m19s
Test / Sandbox (race detector) (push) Successful in 4m34s
Test / Hakurei (race detector) (push) Successful in 5m11s
Test / Flake checks (push) Successful in 1m46s
This is used for ensuring persistent data directories specific to the container. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
parent
c328b584c0
commit
2e0a4795f6
@ -23,8 +23,6 @@ type BindMountOp struct {
|
|||||||
Flags int
|
Flags int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *BindMountOp) Valid() bool { return b != nil && b.Source != nil && b.Target != nil }
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// BindOptional skips nonexistent host paths.
|
// BindOptional skips nonexistent host paths.
|
||||||
BindOptional = 1 << iota
|
BindOptional = 1 << iota
|
||||||
@ -32,9 +30,23 @@ const (
|
|||||||
BindWritable
|
BindWritable
|
||||||
// BindDevice allows access to devices (special files) on this filesystem.
|
// BindDevice allows access to devices (special files) on this filesystem.
|
||||||
BindDevice
|
BindDevice
|
||||||
|
// BindEnsure attempts to create the host path if it does not exist.
|
||||||
|
BindEnsure
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (b *BindMountOp) Valid() bool {
|
||||||
|
return b != nil &&
|
||||||
|
b.Source != nil && b.Target != nil &&
|
||||||
|
b.Flags&(BindOptional|BindEnsure) != (BindOptional|BindEnsure)
|
||||||
|
}
|
||||||
|
|
||||||
func (b *BindMountOp) early(_ *setupState, k syscallDispatcher) error {
|
func (b *BindMountOp) early(_ *setupState, k syscallDispatcher) error {
|
||||||
|
if b.Flags&BindEnsure != 0 {
|
||||||
|
if err := k.mkdirAll(b.Source.String(), 0700); err != nil {
|
||||||
|
return wrapErrSelf(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if pathname, err := k.evalSymlinks(b.Source.String()); err != nil {
|
if pathname, err := k.evalSymlinks(b.Source.String()); err != nil {
|
||||||
if os.IsNotExist(err) && b.Flags&BindOptional != 0 {
|
if os.IsNotExist(err) && b.Flags&BindOptional != 0 {
|
||||||
// leave sourceFinal as nil
|
// leave sourceFinal as nil
|
||||||
|
@ -47,6 +47,27 @@ func TestBindMountOp(t *testing.T) {
|
|||||||
{"ensureFile", expectArgs{"/sysroot/dev/null", os.FileMode(0444), os.FileMode(0700)}, nil, errUnique},
|
{"ensureFile", expectArgs{"/sysroot/dev/null", os.FileMode(0444), os.FileMode(0700)}, nil, errUnique},
|
||||||
}, errUnique},
|
}, errUnique},
|
||||||
|
|
||||||
|
{"mkdirAll ensure", new(Params), &BindMountOp{
|
||||||
|
Source: MustAbs("/bin/"),
|
||||||
|
Target: MustAbs("/bin/"),
|
||||||
|
Flags: BindEnsure,
|
||||||
|
}, []kexpect{
|
||||||
|
{"mkdirAll", expectArgs{"/bin/", os.FileMode(0700)}, nil, errUnique},
|
||||||
|
}, wrapErrSelf(errUnique), nil, nil},
|
||||||
|
|
||||||
|
{"success ensure", new(Params), &BindMountOp{
|
||||||
|
Source: MustAbs("/bin/"),
|
||||||
|
Target: MustAbs("/usr/bin/"),
|
||||||
|
Flags: BindEnsure,
|
||||||
|
}, []kexpect{
|
||||||
|
{"mkdirAll", expectArgs{"/bin/", os.FileMode(0700)}, nil, nil},
|
||||||
|
{"evalSymlinks", expectArgs{"/bin/"}, "/usr/bin", nil},
|
||||||
|
}, nil, []kexpect{
|
||||||
|
{"stat", expectArgs{"/host/usr/bin"}, isDirFi(true), nil},
|
||||||
|
{"mkdirAll", expectArgs{"/sysroot/usr/bin", os.FileMode(0700)}, nil, nil},
|
||||||
|
{"bindMount", expectArgs{"/host/usr/bin", "/sysroot/usr/bin", uintptr(0x4005), false}, nil, nil},
|
||||||
|
}, nil},
|
||||||
|
|
||||||
{"success device ro", new(Params), &BindMountOp{
|
{"success device ro", new(Params), &BindMountOp{
|
||||||
Source: MustAbs("/dev/null"),
|
Source: MustAbs("/dev/null"),
|
||||||
Target: MustAbs("/dev/null"),
|
Target: MustAbs("/dev/null"),
|
||||||
@ -134,6 +155,7 @@ func TestBindMountOp(t *testing.T) {
|
|||||||
{"zero", new(BindMountOp), false},
|
{"zero", new(BindMountOp), false},
|
||||||
{"nil source", &BindMountOp{Target: MustAbs("/")}, false},
|
{"nil source", &BindMountOp{Target: MustAbs("/")}, false},
|
||||||
{"nil target", &BindMountOp{Source: MustAbs("/")}, false},
|
{"nil target", &BindMountOp{Source: MustAbs("/")}, false},
|
||||||
|
{"flag optional ensure", &BindMountOp{Source: MustAbs("/"), Target: MustAbs("/"), Flags: BindOptional | BindEnsure}, false},
|
||||||
{"valid", &BindMountOp{Source: MustAbs("/"), Target: MustAbs("/")}, true},
|
{"valid", &BindMountOp{Source: MustAbs("/"), Target: MustAbs("/")}, true},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user