cache: add coverage for Mount readonly parameter.
This adds test coverage for ensuring the readonly parameter is honored as expected in the ref Mount methods. There was a regression introduced during #2335 that went unnoticed until identified and fixed in #2562. This test coverage should help prevent similar regressions in the future. Signed-off-by: Erik Sipsma <erik@sipsma.dev>master
parent
6471f316d3
commit
0eca53360b
|
@ -26,6 +26,7 @@ import (
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/leases"
|
"github.com/containerd/containerd/leases"
|
||||||
ctdmetadata "github.com/containerd/containerd/metadata"
|
ctdmetadata "github.com/containerd/containerd/metadata"
|
||||||
|
"github.com/containerd/containerd/mount"
|
||||||
"github.com/containerd/containerd/namespaces"
|
"github.com/containerd/containerd/namespaces"
|
||||||
"github.com/containerd/containerd/snapshots"
|
"github.com/containerd/containerd/snapshots"
|
||||||
"github.com/containerd/containerd/snapshots/native"
|
"github.com/containerd/containerd/snapshots/native"
|
||||||
|
@ -1683,6 +1684,75 @@ func TestMergeOp(t *testing.T) {
|
||||||
checkDiskUsage(ctx, t, cm, 0, 0)
|
checkDiskUsage(ctx, t, cm, 0, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMountReadOnly(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
if runtime.GOOS != "linux" {
|
||||||
|
t.Skipf("unsupported GOOS: %s", runtime.GOOS)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := namespaces.WithNamespace(context.Background(), "buildkit-test")
|
||||||
|
|
||||||
|
tmpdir, err := ioutil.TempDir("", "cachemanager")
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer os.RemoveAll(tmpdir)
|
||||||
|
|
||||||
|
snapshotter, err := native.NewSnapshotter(filepath.Join(tmpdir, "snapshots"))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
co, cleanup, err := newCacheManager(ctx, cmOpt{
|
||||||
|
snapshotter: snapshotter,
|
||||||
|
snapshotterName: "overlay",
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer cleanup()
|
||||||
|
cm := co.manager
|
||||||
|
|
||||||
|
mutRef, err := cm.New(ctx, nil, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
rwMntable, err := mutRef.Mount(ctx, false, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
rwMnts, release, err := rwMntable.Mount()
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer release()
|
||||||
|
require.Len(t, rwMnts, 1)
|
||||||
|
require.False(t, isReadOnly(rwMnts[0]))
|
||||||
|
|
||||||
|
roMntable, err := mutRef.Mount(ctx, true, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
roMnts, release, err := roMntable.Mount()
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer release()
|
||||||
|
require.Len(t, roMnts, 1)
|
||||||
|
require.True(t, isReadOnly(roMnts[0]))
|
||||||
|
|
||||||
|
immutRef, err := mutRef.Commit(ctx)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
roMntable, err = immutRef.Mount(ctx, true, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
roMnts, release, err = roMntable.Mount()
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer release()
|
||||||
|
require.Len(t, roMnts, 1)
|
||||||
|
require.True(t, isReadOnly(roMnts[0]))
|
||||||
|
|
||||||
|
rwMntable, err = immutRef.Mount(ctx, false, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
rwMnts, release, err = rwMntable.Mount()
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer release()
|
||||||
|
require.Len(t, rwMnts, 1)
|
||||||
|
// once immutable, even when readonly=false, the mount is still readonly
|
||||||
|
require.True(t, isReadOnly(rwMnts[0]))
|
||||||
|
|
||||||
|
// repeat with a ref that has a parent
|
||||||
|
mutRef, err = cm.New(ctx, immutRef, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func checkDiskUsage(ctx context.Context, t *testing.T, cm Manager, inuse, unused int) {
|
func checkDiskUsage(ctx context.Context, t *testing.T, cm Manager, inuse, unused int) {
|
||||||
du, err := cm.DiskUsage(ctx, client.DiskUsageInfo{})
|
du, err := cm.DiskUsage(ctx, client.DiskUsageInfo{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -1919,3 +1989,18 @@ func mapToSystemTarBlob(m map[string]string) ([]byte, ocispecs.Descriptor, error
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isReadOnly(mnt mount.Mount) bool {
|
||||||
|
var hasUpperdir bool
|
||||||
|
for _, o := range mnt.Options {
|
||||||
|
if o == "ro" {
|
||||||
|
return true
|
||||||
|
} else if strings.HasPrefix(o, "upperdir=") {
|
||||||
|
hasUpperdir = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if mnt.Type == "overlay" {
|
||||||
|
return !hasUpperdir
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue