Browse code

Run CLI tests with cgroups v2

Signed-off-by: Derek McGowan <derek@mcg.dev>

Derek McGowan authored on 2025/04/09 05:21:30
Showing 10 changed files
... ...
@@ -57,7 +57,6 @@ DOCKER_ENVS := \
57 57
 	-e TEST_INTEGRATION_FAIL_FAST \
58 58
 	-e TEST_SKIP_INTEGRATION \
59 59
 	-e TEST_SKIP_INTEGRATION_CLI \
60
-	-e TEST_IGNORE_CGROUP_CHECK \
61 60
 	-e TESTCOVERAGE \
62 61
 	-e TESTDEBUG \
63 62
 	-e TESTDIRS \
... ...
@@ -72,12 +72,6 @@ if [ "$DOCKER_EXPERIMENTAL" ]; then
72 72
 fi
73 73
 
74 74
 dockerd="dockerd"
75
-if [ -f "/sys/fs/cgroup/cgroup.controllers" ]; then
76
-	if [ -z "$TEST_IGNORE_CGROUP_CHECK" ] && [ -z "$TEST_SKIP_INTEGRATION_CLI" ]; then
77
-		echo >&2 '# cgroup v2 requires TEST_SKIP_INTEGRATION_CLI to be set'
78
-		exit 1
79
-	fi
80
-fi
81 75
 
82 76
 if [ -n "$DOCKER_ROOTLESS" ]; then
83 77
 	if [ -z "$TEST_SKIP_INTEGRATION_CLI" ]; then
... ...
@@ -25,6 +25,7 @@ var expectedNetworkInterfaceStats = strings.Split("rx_bytes rx_dropped rx_errors
25 25
 
26 26
 func (s *DockerAPISuite) TestAPIStatsNoStreamGetCpu(c *testing.T) {
27 27
 	skip.If(c, RuntimeIsWindowsContainerd(), "FIXME: Broken on Windows + containerd combination")
28
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
28 29
 	out := cli.DockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "while true;usleep 100; do echo 'Hello'; done").Stdout()
29 30
 	id := strings.TrimSpace(out)
30 31
 	cli.WaitRun(c, id)
... ...
@@ -3949,6 +3949,7 @@ func (s *DockerCLIBuildSuite) TestBuildEmptyStringVolume(c *testing.T) {
3949 3949
 
3950 3950
 func (s *DockerCLIBuildSuite) TestBuildContainerWithCgroupParent(c *testing.T) {
3951 3951
 	testRequires(c, testEnv.IsLocalDaemon, DaemonIsLinux)
3952
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
3952 3953
 
3953 3954
 	cgroupParent := "test"
3954 3955
 	data, err := os.ReadFile("/proc/self/cgroup")
... ...
@@ -1619,6 +1619,7 @@ func (s *DockerDaemonSuite) TestDaemonRestartContainerLinksRestart(c *testing.T)
1619 1619
 
1620 1620
 func (s *DockerDaemonSuite) TestDaemonCgroupParent(c *testing.T) {
1621 1621
 	testRequires(c, DaemonIsLinux)
1622
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
1622 1623
 
1623 1624
 	cgroupParent := "test"
1624 1625
 	name := "cgroup-test"
... ...
@@ -3209,6 +3209,7 @@ func (s *DockerCLIRunSuite) TestRunWithUlimits(c *testing.T) {
3209 3209
 func (s *DockerCLIRunSuite) TestRunContainerWithCgroupParent(c *testing.T) {
3210 3210
 	// Not applicable on Windows as uses Unix specific functionality
3211 3211
 	testRequires(c, DaemonIsLinux)
3212
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
3212 3213
 
3213 3214
 	// cgroup-parent relative path
3214 3215
 	testRunContainerWithCgroupParent(c, "test", "cgroup-test")
... ...
@@ -3244,6 +3245,7 @@ func testRunContainerWithCgroupParent(c *testing.T, cgroupParent, name string) {
3244 3244
 func (s *DockerCLIRunSuite) TestRunInvalidCgroupParent(c *testing.T) {
3245 3245
 	// Not applicable on Windows as uses Unix specific functionality
3246 3246
 	testRequires(c, DaemonIsLinux)
3247
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
3247 3248
 
3248 3249
 	testRunInvalidCgroupParent(c, "../../../../../../../../SHOULD_NOT_EXIST", "SHOULD_NOT_EXIST", "cgroup-invalid-test")
3249 3250
 
... ...
@@ -3284,6 +3286,7 @@ func (s *DockerCLIRunSuite) TestRunContainerWithCgroupMountRO(c *testing.T) {
3284 3284
 	// Not applicable on Windows as uses Unix specific functionality
3285 3285
 	// --read-only + userns has remount issues
3286 3286
 	testRequires(c, DaemonIsLinux, NotUserNamespace)
3287
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
3287 3288
 
3288 3289
 	filename := "/sys/fs/cgroup/devices/test123"
3289 3290
 	out, _, err := dockerCmdWithError("run", "busybox", "touch", filename)
... ...
@@ -4433,6 +4436,7 @@ func (s *DockerCLIRunSuite) TestRunHostnameInHostMode(c *testing.T) {
4433 4433
 
4434 4434
 func (s *DockerCLIRunSuite) TestRunAddDeviceCgroupRule(c *testing.T) {
4435 4435
 	testRequires(c, DaemonIsLinux)
4436
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
4436 4437
 
4437 4438
 	const deviceRule = "c 7:128 rwm"
4438 4439
 
... ...
@@ -26,6 +26,7 @@ import (
26 26
 	"gotest.tools/v3/assert"
27 27
 	is "gotest.tools/v3/assert/cmp"
28 28
 	"gotest.tools/v3/icmd"
29
+	"gotest.tools/v3/skip"
29 30
 )
30 31
 
31 32
 // #6509
... ...
@@ -453,6 +454,7 @@ func (s *DockerCLIRunSuite) TestRunAttachInvalidDetachKeySequencePreserved(c *te
453 453
 // "test" should be printed
454 454
 func (s *DockerCLIRunSuite) TestRunWithCPUQuota(c *testing.T) {
455 455
 	testRequires(c, cpuCfsQuota)
456
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
456 457
 
457 458
 	const file = "/sys/fs/cgroup/cpu/cpu.cfs_quota_us"
458 459
 	out := cli.DockerCmd(c, "run", "--cpu-quota", "8000", "--name", "test", "busybox", "cat", file).Combined()
... ...
@@ -464,6 +466,7 @@ func (s *DockerCLIRunSuite) TestRunWithCPUQuota(c *testing.T) {
464 464
 
465 465
 func (s *DockerCLIRunSuite) TestRunWithCpuPeriod(c *testing.T) {
466 466
 	testRequires(c, cpuCfsPeriod)
467
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
467 468
 
468 469
 	const file = "/sys/fs/cgroup/cpu/cpu.cfs_period_us"
469 470
 	out := cli.DockerCmd(c, "run", "--cpu-period", "50000", "--name", "test", "busybox", "cat", file).Combined()
... ...
@@ -494,6 +497,7 @@ func (s *DockerCLIRunSuite) TestRunWithInvalidCpuPeriod(c *testing.T) {
494 494
 
495 495
 func (s *DockerCLIRunSuite) TestRunWithCPUShares(c *testing.T) {
496 496
 	testRequires(c, cpuShare)
497
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
497 498
 
498 499
 	const file = "/sys/fs/cgroup/cpu/cpu.shares"
499 500
 	out := cli.DockerCmd(c, "run", "--cpu-shares", "1000", "--name", "test", "busybox", "cat", file).Combined()
... ...
@@ -514,6 +518,7 @@ func (s *DockerCLIRunSuite) TestRunEchoStdoutWithCPUSharesAndMemoryLimit(c *test
514 514
 
515 515
 func (s *DockerCLIRunSuite) TestRunWithCpusetCpus(c *testing.T) {
516 516
 	testRequires(c, cgroupCpuset)
517
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
517 518
 
518 519
 	const file = "/sys/fs/cgroup/cpuset/cpuset.cpus"
519 520
 	out := cli.DockerCmd(c, "run", "--cpuset-cpus", "0", "--name", "test", "busybox", "cat", file).Combined()
... ...
@@ -525,6 +530,7 @@ func (s *DockerCLIRunSuite) TestRunWithCpusetCpus(c *testing.T) {
525 525
 
526 526
 func (s *DockerCLIRunSuite) TestRunWithCpusetMems(c *testing.T) {
527 527
 	testRequires(c, cgroupCpuset)
528
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
528 529
 
529 530
 	const file = "/sys/fs/cgroup/cpuset/cpuset.mems"
530 531
 	out := cli.DockerCmd(c, "run", "--cpuset-mems", "0", "--name", "test", "busybox", "cat", file).Combined()
... ...
@@ -536,6 +542,7 @@ func (s *DockerCLIRunSuite) TestRunWithCpusetMems(c *testing.T) {
536 536
 
537 537
 func (s *DockerCLIRunSuite) TestRunWithBlkioWeight(c *testing.T) {
538 538
 	testRequires(c, blkioWeight)
539
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
539 540
 
540 541
 	const file = "/sys/fs/cgroup/blkio/blkio.weight"
541 542
 	out := cli.DockerCmd(c, "run", "--blkio-weight", "300", "--name", "test", "busybox", "cat", file).Combined()
... ...
@@ -547,6 +554,7 @@ func (s *DockerCLIRunSuite) TestRunWithBlkioWeight(c *testing.T) {
547 547
 
548 548
 func (s *DockerCLIRunSuite) TestRunWithInvalidBlkioWeight(c *testing.T) {
549 549
 	testRequires(c, blkioWeight)
550
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
550 551
 	out, _, err := dockerCmdWithError("run", "--blkio-weight", "5", "busybox", "true")
551 552
 	assert.ErrorContains(c, err, "", out)
552 553
 	expected := "Range of blkio weight is from 10 to 1000"
... ...
@@ -605,6 +613,7 @@ func (s *DockerCLIRunSuite) TestRunOOMExitCode(c *testing.T) {
605 605
 
606 606
 func (s *DockerCLIRunSuite) TestRunWithMemoryLimit(c *testing.T) {
607 607
 	testRequires(c, memoryLimitSupport)
608
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
608 609
 
609 610
 	const file = "/sys/fs/cgroup/memory/memory.limit_in_bytes"
610 611
 	cli.DockerCmd(c, "run", "-m", "32M", "--name", "test", "busybox", "cat", file).Assert(c, icmd.Expected{
... ...
@@ -649,6 +658,7 @@ func (s *DockerCLIRunSuite) TestRunWithSwappinessInvalid(c *testing.T) {
649 649
 
650 650
 func (s *DockerCLIRunSuite) TestRunWithMemoryReservation(c *testing.T) {
651 651
 	testRequires(c, testEnv.IsLocalDaemon, memoryReservationSupport)
652
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
652 653
 
653 654
 	const file = "/sys/fs/cgroup/memory/memory.soft_limit_in_bytes"
654 655
 	out := cli.DockerCmd(c, "run", "--memory-reservation", "200M", "--name", "test", "busybox", "cat", file).Combined()
... ...
@@ -1364,6 +1374,7 @@ func (s *DockerCLIRunSuite) TestRunDeviceSymlink(c *testing.T) {
1364 1364
 // TestRunPIDsLimit makes sure the pids cgroup is set with --pids-limit
1365 1365
 func (s *DockerCLIRunSuite) TestRunPIDsLimit(c *testing.T) {
1366 1366
 	testRequires(c, testEnv.IsLocalDaemon, pidsLimit)
1367
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
1367 1368
 
1368 1369
 	const file = "/sys/fs/cgroup/pids/pids.max"
1369 1370
 	out := cli.DockerCmd(c, "run", "--name", "skittles", "--pids-limit", "4", "busybox", "cat", file).Combined()
... ...
@@ -1375,6 +1386,7 @@ func (s *DockerCLIRunSuite) TestRunPIDsLimit(c *testing.T) {
1375 1375
 
1376 1376
 func (s *DockerCLIRunSuite) TestRunPrivilegedAllowedDevices(c *testing.T) {
1377 1377
 	testRequires(c, DaemonIsLinux, NotUserNamespace)
1378
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
1378 1379
 
1379 1380
 	const file = "/sys/fs/cgroup/devices/devices.list"
1380 1381
 	out := cli.DockerCmd(c, "run", "--privileged", "busybox", "cat", file).Combined()
... ...
@@ -1529,6 +1541,7 @@ func (s *DockerDaemonSuite) TestRunWithDaemonDefaultSeccompProfile(c *testing.T)
1529 1529
 
1530 1530
 func (s *DockerCLIRunSuite) TestRunWithNanoCPUs(c *testing.T) {
1531 1531
 	testRequires(c, cpuCfsQuota, cpuCfsPeriod)
1532
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
1532 1533
 
1533 1534
 	const file1 = "/sys/fs/cgroup/cpu/cpu.cfs_quota_us"
1534 1535
 	const file2 = "/sys/fs/cgroup/cpu/cpu.cfs_period_us"
... ...
@@ -19,6 +19,7 @@ import (
19 19
 	"github.com/docker/docker/testutil/request"
20 20
 	"gotest.tools/v3/assert"
21 21
 	is "gotest.tools/v3/assert/cmp"
22
+	"gotest.tools/v3/skip"
22 23
 )
23 24
 
24 25
 func (s *DockerCLIUpdateSuite) TearDownTest(ctx context.Context, c *testing.T) {
... ...
@@ -32,6 +33,7 @@ func (s *DockerCLIUpdateSuite) OnTimeout(c *testing.T) {
32 32
 func (s *DockerCLIUpdateSuite) TestUpdateRunningContainer(c *testing.T) {
33 33
 	testRequires(c, DaemonIsLinux)
34 34
 	testRequires(c, memoryLimitSupport)
35
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
35 36
 
36 37
 	const name = "test-update-container"
37 38
 	cli.DockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "busybox", "top")
... ...
@@ -47,6 +49,7 @@ func (s *DockerCLIUpdateSuite) TestUpdateRunningContainer(c *testing.T) {
47 47
 func (s *DockerCLIUpdateSuite) TestUpdateRunningContainerWithRestart(c *testing.T) {
48 48
 	testRequires(c, DaemonIsLinux)
49 49
 	testRequires(c, memoryLimitSupport)
50
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
50 51
 
51 52
 	const name = "test-update-container"
52 53
 	cli.DockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "busybox", "top")
... ...
@@ -63,6 +66,7 @@ func (s *DockerCLIUpdateSuite) TestUpdateRunningContainerWithRestart(c *testing.
63 63
 func (s *DockerCLIUpdateSuite) TestUpdateStoppedContainer(c *testing.T) {
64 64
 	testRequires(c, DaemonIsLinux)
65 65
 	testRequires(c, memoryLimitSupport)
66
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
66 67
 
67 68
 	const name = "test-update-container"
68 69
 	const file = "/sys/fs/cgroup/memory/memory.limit_in_bytes"
... ...
@@ -78,6 +82,7 @@ func (s *DockerCLIUpdateSuite) TestUpdateStoppedContainer(c *testing.T) {
78 78
 func (s *DockerCLIUpdateSuite) TestUpdatePausedContainer(c *testing.T) {
79 79
 	testRequires(c, DaemonIsLinux)
80 80
 	testRequires(c, cpuShare)
81
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
81 82
 
82 83
 	const name = "test-update-container"
83 84
 	cli.DockerCmd(c, "run", "-d", "--name", name, "--cpu-shares", "1000", "busybox", "top")
... ...
@@ -96,6 +101,7 @@ func (s *DockerCLIUpdateSuite) TestUpdateWithUntouchedFields(c *testing.T) {
96 96
 	testRequires(c, DaemonIsLinux)
97 97
 	testRequires(c, memoryLimitSupport)
98 98
 	testRequires(c, cpuShare)
99
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
99 100
 
100 101
 	const name = "test-update-container"
101 102
 	cli.DockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "--cpu-shares", "800", "busybox", "top")
... ...
@@ -136,6 +142,7 @@ func (s *DockerCLIUpdateSuite) TestUpdateSwapMemoryOnly(c *testing.T) {
136 136
 	testRequires(c, DaemonIsLinux)
137 137
 	testRequires(c, memoryLimitSupport)
138 138
 	testRequires(c, swapMemorySupport)
139
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
139 140
 
140 141
 	const name = "test-update-container"
141 142
 	cli.DockerCmd(c, "run", "-d", "--name", name, "--memory", "300M", "--memory-swap", "500M", "busybox", "top")
... ...
@@ -152,6 +159,7 @@ func (s *DockerCLIUpdateSuite) TestUpdateInvalidSwapMemory(c *testing.T) {
152 152
 	testRequires(c, DaemonIsLinux)
153 153
 	testRequires(c, memoryLimitSupport)
154 154
 	testRequires(c, swapMemorySupport)
155
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
155 156
 
156 157
 	const name = "test-update-container"
157 158
 	cli.DockerCmd(c, "run", "-d", "--name", name, "--memory", "300M", "--memory-swap", "500M", "busybox", "top")
... ...
@@ -245,6 +253,7 @@ func (s *DockerCLIUpdateSuite) TestUpdateNotAffectMonitorRestartPolicy(c *testin
245 245
 
246 246
 func (s *DockerCLIUpdateSuite) TestUpdateWithNanoCPUs(c *testing.T) {
247 247
 	testRequires(c, cpuCfsQuota, cpuCfsPeriod)
248
+	skip.If(c, onlyCgroupsv2(), "FIXME: cgroupsV2 not supported yet")
248 249
 
249 250
 	const file1 = "/sys/fs/cgroup/cpu/cpu.cfs_quota_us"
250 251
 	const file2 = "/sys/fs/cgroup/cpu/cpu.cfs_period_us"
... ...
@@ -6,6 +6,7 @@ import (
6 6
 	"os"
7 7
 	"strings"
8 8
 
9
+	"github.com/containerd/cgroups/v3"
9 10
 	"github.com/docker/docker/pkg/sysinfo"
10 11
 )
11 12
 
... ...
@@ -68,6 +69,11 @@ func bridgeNfIptables() bool {
68 68
 	return err == nil && strings.TrimSpace(string(content)) == "1"
69 69
 }
70 70
 
71
+func onlyCgroupsv2() bool {
72
+	// Only check for unified, cgroup v1 tests can run under other modes
73
+	return cgroups.Mode() == cgroups.Unified
74
+}
75
+
71 76
 func unprivilegedUsernsClone() bool {
72 77
 	content, err := os.ReadFile("/proc/sys/kernel/unprivileged_userns_clone")
73 78
 	return err != nil || !strings.Contains(string(content), "0")
... ...
@@ -2,3 +2,7 @@ package main
2 2
 
3 3
 func setupLocalInfo() {
4 4
 }
5
+
6
+func onlyCgroupsv2() bool {
7
+	return false
8
+}