1aa17222e7
gotest.tools has an init() which registers a '-update' flag;
a80f057529/internal/source/update.go (L21-L23)
The quota helper contains a testhelpers file, which is meant for usage
in (integration) tests, but as it's in the same pacakge as production
code, would also trigger the gotest.tools init.
This patch removes the gotest.tools code from this file.
Before this patch:
$ (exec -a libnetwork-setkey "$(which dockerd)" -help)
Usage of libnetwork-setkey:
-exec-root string
docker exec root (default "/run/docker")
-update
update golden values
With this patch applied:
$ (exec -a libnetwork-setkey "$(which dockerd)" -help)
Usage of libnetwork-setkey:
-exec-root string
docker exec root (default "/run/docker")
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
128 lines
3.4 KiB
Go
128 lines
3.4 KiB
Go
//go:build linux && !exclude_disk_quota && cgo
|
|
|
|
package quota // import "github.com/docker/docker/quota"
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"testing"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
const imageSize = 64 * 1024 * 1024
|
|
|
|
// CanTestQuota - checks if xfs prjquota can be tested
|
|
// returns a reason if not
|
|
func CanTestQuota() (string, bool) {
|
|
if os.Getuid() != 0 {
|
|
return "requires mounts", false
|
|
}
|
|
_, err := exec.LookPath("mkfs.xfs")
|
|
if err != nil {
|
|
return "mkfs.xfs not found in PATH", false
|
|
}
|
|
return "", true
|
|
}
|
|
|
|
// PrepareQuotaTestImage - prepares an xfs prjquota test image
|
|
// returns the path the the image on success
|
|
func PrepareQuotaTestImage(t *testing.T) (string, error) {
|
|
mkfs, err := exec.LookPath("mkfs.xfs")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// create a sparse image
|
|
imageFile, err := os.CreateTemp("", "xfs-image")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
imageFileName := imageFile.Name()
|
|
if _, err = imageFile.Seek(imageSize-1, 0); err != nil {
|
|
os.Remove(imageFileName)
|
|
return "", err
|
|
}
|
|
if _, err = imageFile.Write([]byte{0}); err != nil {
|
|
os.Remove(imageFileName)
|
|
return "", err
|
|
}
|
|
if err = imageFile.Close(); err != nil {
|
|
os.Remove(imageFileName)
|
|
return "", err
|
|
}
|
|
|
|
// The reason for disabling these options is sometimes people run with a newer userspace
|
|
// than kernelspace
|
|
out, err := exec.Command(mkfs, "-m", "crc=0,finobt=0", imageFileName).CombinedOutput()
|
|
if len(out) > 0 {
|
|
t.Log(string(out))
|
|
}
|
|
if err != nil {
|
|
os.Remove(imageFileName)
|
|
return "", err
|
|
}
|
|
|
|
return imageFileName, nil
|
|
}
|
|
|
|
// WrapMountTest - wraps a test function such that it has easy access to a mountPoint and testDir
|
|
// with guaranteed prjquota or guaranteed no prjquota support.
|
|
func WrapMountTest(imageFileName string, enableQuota bool, testFunc func(t *testing.T, mountPoint, backingFsDev, testDir string)) func(*testing.T) {
|
|
return func(t *testing.T) {
|
|
mountOptions := "loop"
|
|
|
|
if enableQuota {
|
|
mountOptions = mountOptions + ",prjquota"
|
|
}
|
|
|
|
mountPoint := t.TempDir()
|
|
out, err := exec.Command("mount", "-o", mountOptions, imageFileName, mountPoint).CombinedOutput()
|
|
if err != nil {
|
|
_, err := os.Stat("/proc/fs/xfs")
|
|
if os.IsNotExist(err) {
|
|
t.Skip("no /proc/fs/xfs")
|
|
}
|
|
}
|
|
|
|
if err != nil {
|
|
t.Fatalf("assertion failed: error is not nil: %v: mount failed: %s", err, out)
|
|
}
|
|
|
|
defer func() {
|
|
if err := unix.Unmount(mountPoint, 0); err != nil {
|
|
t.Fatalf("assertion failed: error is not nil: %v", err)
|
|
}
|
|
}()
|
|
|
|
backingFsDev, err := makeBackingFsDev(mountPoint)
|
|
if err != nil {
|
|
t.Fatalf("assertion failed: error is not nil: %v", err)
|
|
}
|
|
|
|
testDir, err := os.MkdirTemp(mountPoint, "per-test")
|
|
if err != nil {
|
|
t.Fatalf("assertion failed: error is not nil: %v", err)
|
|
}
|
|
defer os.RemoveAll(testDir)
|
|
|
|
testFunc(t, mountPoint, backingFsDev, testDir)
|
|
}
|
|
}
|
|
|
|
// WrapQuotaTest - wraps a test function such that is has easy and guaranteed access to a quota Control
|
|
// instance with a quota test dir under its control.
|
|
func WrapQuotaTest(testFunc func(t *testing.T, ctrl *Control, mountPoint, testDir, testSubDir string)) func(t *testing.T, mountPoint, backingFsDev, testDir string) {
|
|
return func(t *testing.T, mountPoint, backingFsDev, testDir string) {
|
|
ctrl, err := NewControl(testDir)
|
|
if err != nil {
|
|
t.Fatalf("assertion failed: error is not nil: %v", err)
|
|
}
|
|
|
|
testSubDir, err := os.MkdirTemp(testDir, "quota-test")
|
|
if err != nil {
|
|
t.Fatalf("assertion failed: error is not nil: %v", err)
|
|
}
|
|
testFunc(t, ctrl, mountPoint, testDir, testSubDir)
|
|
}
|
|
}
|