Skip to content

Commit acdbc28

Browse files
committed
Fix vfs unit test and port VFS to the new IDMappings
The test was failing because TarOptions was using a non-pointer for ChownOpts, which meant the check for nil was never true, and createTarFile was never using the hdr.UID/GID Signed-off-by: Daniel Nephin <[email protected]>
1 parent 5672eeb commit acdbc28

File tree

6 files changed

+93
-153
lines changed

6 files changed

+93
-153
lines changed

daemon/archive_tarcopyoptions_unix.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ func (daemon *Daemon) tarCopyOptions(container *container.Container, noOverwrite
2020

2121
return &archive.TarOptions{
2222
NoOverwriteDirNonDir: noOverwriteDirNonDir,
23-
ChownOpts: idtools.IDPair{UID: user.Uid, GID: user.Gid},
23+
ChownOpts: &idtools.IDPair{UID: user.Uid, GID: user.Gid},
2424
}, nil
2525
}

daemon/graphdriver/devmapper/devmapper_test.go

+43-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ package devmapper
44

55
import (
66
"fmt"
7+
"os"
8+
"syscall"
79
"testing"
810
"time"
911

@@ -17,11 +19,51 @@ func init() {
1719
defaultMetaDataLoopbackSize = 200 * 1024 * 1024
1820
defaultBaseFsSize = 300 * 1024 * 1024
1921
defaultUdevSyncOverride = true
20-
if err := graphtest.InitLoopbacks(); err != nil {
22+
if err := initLoopbacks(); err != nil {
2123
panic(err)
2224
}
2325
}
2426

27+
// initLoopbacks ensures that the loopback devices are properly created within
28+
// the system running the device mapper tests.
29+
func initLoopbacks() error {
30+
statT, err := getBaseLoopStats()
31+
if err != nil {
32+
return err
33+
}
34+
// create at least 8 loopback files, ya, that is a good number
35+
for i := 0; i < 8; i++ {
36+
loopPath := fmt.Sprintf("/dev/loop%d", i)
37+
// only create new loopback files if they don't exist
38+
if _, err := os.Stat(loopPath); err != nil {
39+
if mkerr := syscall.Mknod(loopPath,
40+
uint32(statT.Mode|syscall.S_IFBLK), int((7<<8)|(i&0xff)|((i&0xfff00)<<12))); mkerr != nil {
41+
return mkerr
42+
}
43+
os.Chown(loopPath, int(statT.Uid), int(statT.Gid))
44+
}
45+
}
46+
return nil
47+
}
48+
49+
// getBaseLoopStats inspects /dev/loop0 to collect uid,gid, and mode for the
50+
// loop0 device on the system. If it does not exist we assume 0,0,0660 for the
51+
// stat data
52+
func getBaseLoopStats() (*syscall.Stat_t, error) {
53+
loop0, err := os.Stat("/dev/loop0")
54+
if err != nil {
55+
if os.IsNotExist(err) {
56+
return &syscall.Stat_t{
57+
Uid: 0,
58+
Gid: 0,
59+
Mode: 0660,
60+
}, nil
61+
}
62+
return nil, err
63+
}
64+
return loop0.Sys().(*syscall.Stat_t), nil
65+
}
66+
2567
// This avoids creating a new driver for each test if all tests are run
2668
// Make sure to put new tests between TestDevmapperSetup and TestDevmapperTeardown
2769
func TestDevmapperSetup(t *testing.T) {

daemon/graphdriver/graphtest/graphtest_unix.go

+15-37
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import (
1616
"github.com/docker/docker/daemon/graphdriver"
1717
"github.com/docker/docker/pkg/stringid"
1818
"github.com/docker/go-units"
19+
"github.com/stretchr/testify/assert"
20+
"github.com/stretchr/testify/require"
1921
)
2022

2123
var (
@@ -33,14 +35,9 @@ type Driver struct {
3335

3436
func newDriver(t testing.TB, name string, options []string) *Driver {
3537
root, err := ioutil.TempDir("", "docker-graphtest-")
36-
if err != nil {
37-
t.Fatal(err)
38-
}
39-
40-
if err := os.MkdirAll(root, 0755); err != nil {
41-
t.Fatal(err)
42-
}
38+
require.NoError(t, err)
4339

40+
require.NoError(t, os.MkdirAll(root, 0755))
4441
d, err := graphdriver.GetDriver(name, nil, graphdriver.Options{DriverOptions: options, Root: root})
4542
if err != nil {
4643
t.Logf("graphdriver: %v\n", err)
@@ -86,36 +83,26 @@ func DriverTestCreateEmpty(t testing.TB, drivername string, driverOptions ...str
8683
driver := GetDriver(t, drivername, driverOptions...)
8784
defer PutDriver(t)
8885

89-
if err := driver.Create("empty", "", nil); err != nil {
90-
t.Fatal(err)
91-
}
86+
err := driver.Create("empty", "", nil)
87+
require.NoError(t, err)
9288

9389
defer func() {
94-
if err := driver.Remove("empty"); err != nil {
95-
t.Fatal(err)
96-
}
90+
require.NoError(t, driver.Remove("empty"))
9791
}()
9892

9993
if !driver.Exists("empty") {
10094
t.Fatal("Newly created image doesn't exist")
10195
}
10296

10397
dir, err := driver.Get("empty", "")
104-
if err != nil {
105-
t.Fatal(err)
106-
}
98+
require.NoError(t, err)
10799

108100
verifyFile(t, dir, 0755|os.ModeDir, 0, 0)
109101

110102
// Verify that the directory is empty
111103
fis, err := readDir(dir)
112-
if err != nil {
113-
t.Fatal(err)
114-
}
115-
116-
if len(fis) != 0 {
117-
t.Fatal("New directory not empty")
118-
}
104+
require.NoError(t, err)
105+
assert.Len(t, fis, 0)
119106

120107
driver.Put("empty")
121108
}
@@ -127,9 +114,7 @@ func DriverTestCreateBase(t testing.TB, drivername string, driverOptions ...stri
127114

128115
createBase(t, driver, "Base")
129116
defer func() {
130-
if err := driver.Remove("Base"); err != nil {
131-
t.Fatal(err)
132-
}
117+
require.NoError(t, driver.Remove("Base"))
133118
}()
134119
verifyBase(t, driver, "Base")
135120
}
@@ -140,21 +125,14 @@ func DriverTestCreateSnap(t testing.TB, drivername string, driverOptions ...stri
140125
defer PutDriver(t)
141126

142127
createBase(t, driver, "Base")
143-
144128
defer func() {
145-
if err := driver.Remove("Base"); err != nil {
146-
t.Fatal(err)
147-
}
129+
require.NoError(t, driver.Remove("Base"))
148130
}()
149131

150-
if err := driver.Create("Snap", "Base", nil); err != nil {
151-
t.Fatal(err)
152-
}
153-
132+
err := driver.Create("Snap", "Base", nil)
133+
require.NoError(t, err)
154134
defer func() {
155-
if err := driver.Remove("Snap"); err != nil {
156-
t.Fatal(err)
157-
}
135+
require.NoError(t, driver.Remove("Snap"))
158136
}()
159137

160138
verifyBase(t, driver, "Snap")

daemon/graphdriver/graphtest/testutil_unix.go

+22-96
Original file line numberDiff line numberDiff line change
@@ -3,89 +3,31 @@
33
package graphtest
44

55
import (
6-
"fmt"
76
"io/ioutil"
87
"os"
98
"path"
109
"syscall"
1110
"testing"
1211

1312
"github.com/docker/docker/daemon/graphdriver"
13+
"github.com/stretchr/testify/assert"
14+
"github.com/stretchr/testify/require"
1415
)
1516

16-
// InitLoopbacks ensures that the loopback devices are properly created within
17-
// the system running the device mapper tests.
18-
func InitLoopbacks() error {
19-
statT, err := getBaseLoopStats()
20-
if err != nil {
21-
return err
22-
}
23-
// create at least 8 loopback files, ya, that is a good number
24-
for i := 0; i < 8; i++ {
25-
loopPath := fmt.Sprintf("/dev/loop%d", i)
26-
// only create new loopback files if they don't exist
27-
if _, err := os.Stat(loopPath); err != nil {
28-
if mkerr := syscall.Mknod(loopPath,
29-
uint32(statT.Mode|syscall.S_IFBLK), int((7<<8)|(i&0xff)|((i&0xfff00)<<12))); mkerr != nil {
30-
return mkerr
31-
}
32-
os.Chown(loopPath, int(statT.Uid), int(statT.Gid))
33-
}
34-
}
35-
return nil
36-
}
37-
38-
// getBaseLoopStats inspects /dev/loop0 to collect uid,gid, and mode for the
39-
// loop0 device on the system. If it does not exist we assume 0,0,0660 for the
40-
// stat data
41-
func getBaseLoopStats() (*syscall.Stat_t, error) {
42-
loop0, err := os.Stat("/dev/loop0")
43-
if err != nil {
44-
if os.IsNotExist(err) {
45-
return &syscall.Stat_t{
46-
Uid: 0,
47-
Gid: 0,
48-
Mode: 0660,
49-
}, nil
50-
}
51-
return nil, err
52-
}
53-
return loop0.Sys().(*syscall.Stat_t), nil
54-
}
55-
5617
func verifyFile(t testing.TB, path string, mode os.FileMode, uid, gid uint32) {
5718
fi, err := os.Stat(path)
58-
if err != nil {
59-
t.Fatal(err)
60-
}
61-
62-
if fi.Mode()&os.ModeType != mode&os.ModeType {
63-
t.Fatalf("Expected %s type 0x%x, got 0x%x", path, mode&os.ModeType, fi.Mode()&os.ModeType)
64-
}
19+
require.NoError(t, err)
6520

66-
if fi.Mode()&os.ModePerm != mode&os.ModePerm {
67-
t.Fatalf("Expected %s mode %o, got %o", path, mode&os.ModePerm, fi.Mode()&os.ModePerm)
68-
}
69-
70-
if fi.Mode()&os.ModeSticky != mode&os.ModeSticky {
71-
t.Fatalf("Expected %s sticky 0x%x, got 0x%x", path, mode&os.ModeSticky, fi.Mode()&os.ModeSticky)
72-
}
73-
74-
if fi.Mode()&os.ModeSetuid != mode&os.ModeSetuid {
75-
t.Fatalf("Expected %s setuid 0x%x, got 0x%x", path, mode&os.ModeSetuid, fi.Mode()&os.ModeSetuid)
76-
}
77-
78-
if fi.Mode()&os.ModeSetgid != mode&os.ModeSetgid {
79-
t.Fatalf("Expected %s setgid 0x%x, got 0x%x", path, mode&os.ModeSetgid, fi.Mode()&os.ModeSetgid)
80-
}
21+
actual := fi.Mode()
22+
assert.Equal(t, mode&os.ModeType, actual&os.ModeType, path)
23+
assert.Equal(t, mode&os.ModePerm, actual&os.ModePerm, path)
24+
assert.Equal(t, mode&os.ModeSticky, actual&os.ModeSticky, path)
25+
assert.Equal(t, mode&os.ModeSetuid, actual&os.ModeSetuid, path)
26+
assert.Equal(t, mode&os.ModeSetgid, actual&os.ModeSetgid, path)
8127

8228
if stat, ok := fi.Sys().(*syscall.Stat_t); ok {
83-
if stat.Uid != uid {
84-
t.Fatalf("%s no owned by uid %d", path, uid)
85-
}
86-
if stat.Gid != gid {
87-
t.Fatalf("%s not owned by gid %d", path, gid)
88-
}
29+
assert.Equal(t, uid, stat.Uid, path)
30+
assert.Equal(t, gid, stat.Gid, path)
8931
}
9032
}
9133

@@ -94,35 +36,25 @@ func createBase(t testing.TB, driver graphdriver.Driver, name string) {
9436
oldmask := syscall.Umask(0)
9537
defer syscall.Umask(oldmask)
9638

97-
if err := driver.CreateReadWrite(name, "", nil); err != nil {
98-
t.Fatal(err)
99-
}
39+
err := driver.CreateReadWrite(name, "", nil)
40+
require.NoError(t, err)
10041

10142
dir, err := driver.Get(name, "")
102-
if err != nil {
103-
t.Fatal(err)
104-
}
43+
require.NoError(t, err)
10544
defer driver.Put(name)
10645

10746
subdir := path.Join(dir, "a subdir")
108-
if err := os.Mkdir(subdir, 0705|os.ModeSticky); err != nil {
109-
t.Fatal(err)
110-
}
111-
if err := os.Chown(subdir, 1, 2); err != nil {
112-
t.Fatal(err)
113-
}
47+
require.NoError(t, os.Mkdir(subdir, 0705|os.ModeSticky))
48+
require.NoError(t, os.Chown(subdir, 1, 2))
11449

11550
file := path.Join(dir, "a file")
116-
if err := ioutil.WriteFile(file, []byte("Some data"), 0222|os.ModeSetuid); err != nil {
117-
t.Fatal(err)
118-
}
51+
err = ioutil.WriteFile(file, []byte("Some data"), 0222|os.ModeSetuid)
52+
require.NoError(t, err)
11953
}
12054

12155
func verifyBase(t testing.TB, driver graphdriver.Driver, name string) {
12256
dir, err := driver.Get(name, "")
123-
if err != nil {
124-
t.Fatal(err)
125-
}
57+
require.NoError(t, err)
12658
defer driver.Put(name)
12759

12860
subdir := path.Join(dir, "a subdir")
@@ -131,13 +63,7 @@ func verifyBase(t testing.TB, driver graphdriver.Driver, name string) {
13163
file := path.Join(dir, "a file")
13264
verifyFile(t, file, 0222|os.ModeSetuid, 0, 0)
13365

134-
fis, err := readDir(dir)
135-
if err != nil {
136-
t.Fatal(err)
137-
}
138-
139-
if len(fis) != 2 {
140-
t.Fatal("Unexpected files in base image")
141-
}
142-
66+
files, err := readDir(dir)
67+
require.NoError(t, err)
68+
assert.Len(t, files, 2)
14369
}

0 commit comments

Comments
 (0)