|
@@ -4,8 +4,19 @@
|
|
|
package vfs // import "github.com/docker/docker/daemon/graphdriver/vfs"
|
|
|
|
|
|
import (
|
|
|
+ "archive/tar"
|
|
|
+ "bytes"
|
|
|
+ "errors"
|
|
|
+ "io"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "syscall"
|
|
|
"testing"
|
|
|
|
|
|
+ "github.com/moby/sys/mount"
|
|
|
+ "gotest.tools/v3/assert"
|
|
|
+
|
|
|
+ "github.com/docker/docker/daemon/graphdriver"
|
|
|
"github.com/docker/docker/daemon/graphdriver/graphtest"
|
|
|
)
|
|
|
|
|
@@ -34,3 +45,71 @@ func TestVfsSetQuota(t *testing.T) {
|
|
|
func TestVfsTeardown(t *testing.T) {
|
|
|
graphtest.PutDriver(t)
|
|
|
}
|
|
|
+
|
|
|
+func TestXattrUnsupportedByBackingFS(t *testing.T) {
|
|
|
+ rootdir := t.TempDir()
|
|
|
+ // The ramfs filesystem is unconditionally compiled into the kernel,
|
|
|
+ // and does not support extended attributes.
|
|
|
+ err := mount.Mount("ramfs", rootdir, "ramfs", "")
|
|
|
+ if errors.Is(err, syscall.EPERM) {
|
|
|
+ t.Skip("test requires the ability to mount a filesystem")
|
|
|
+ }
|
|
|
+ assert.NilError(t, err)
|
|
|
+ defer mount.Unmount(rootdir)
|
|
|
+
|
|
|
+ var buf bytes.Buffer
|
|
|
+ tw := tar.NewWriter(&buf)
|
|
|
+ const (
|
|
|
+ filename = "test.txt"
|
|
|
+ content = "hello world\n"
|
|
|
+ )
|
|
|
+ assert.NilError(t, tw.WriteHeader(&tar.Header{
|
|
|
+ Name: filename,
|
|
|
+ Mode: 0o644,
|
|
|
+ Size: int64(len(content)),
|
|
|
+ PAXRecords: map[string]string{
|
|
|
+ "SCHILY.xattr.user.test": "helloxattr",
|
|
|
+ },
|
|
|
+ }))
|
|
|
+ _, err = io.WriteString(tw, content)
|
|
|
+ assert.NilError(t, err)
|
|
|
+ assert.NilError(t, tw.Close())
|
|
|
+ testlayer := buf.Bytes()
|
|
|
+
|
|
|
+ for _, tt := range []struct {
|
|
|
+ name string
|
|
|
+ opts []string
|
|
|
+ expectErrIs error
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ name: "Default",
|
|
|
+ expectErrIs: syscall.EOPNOTSUPP,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "xattrs=i_want_broken_containers",
|
|
|
+ opts: []string{"xattrs=i_want_broken_containers"},
|
|
|
+ },
|
|
|
+ } {
|
|
|
+ t.Run(tt.name, func(t *testing.T) {
|
|
|
+ subdir := filepath.Join(rootdir, tt.name)
|
|
|
+ assert.NilError(t, os.Mkdir(subdir, 0o755))
|
|
|
+ d, err := graphdriver.GetDriver("vfs", nil,
|
|
|
+ graphdriver.Options{DriverOptions: tt.opts, Root: subdir})
|
|
|
+ assert.NilError(t, err)
|
|
|
+ defer d.Cleanup()
|
|
|
+
|
|
|
+ assert.NilError(t, d.Create("test", "", nil))
|
|
|
+ _, err = d.ApplyDiff("test", "", bytes.NewReader(testlayer))
|
|
|
+ assert.ErrorIs(t, err, tt.expectErrIs)
|
|
|
+
|
|
|
+ if err == nil {
|
|
|
+ path, err := d.Get("test", "")
|
|
|
+ assert.NilError(t, err)
|
|
|
+ defer d.Put("test")
|
|
|
+ actual, err := os.ReadFile(filepath.Join(path, filename))
|
|
|
+ assert.NilError(t, err)
|
|
|
+ assert.Equal(t, string(actual), content)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|