summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiuseppe Scrivano <gscrivan@redhat.com>2021-02-10 14:46:08 +0100
committerGiuseppe Scrivano <gscrivan@redhat.com>2021-02-11 16:46:42 +0100
commit660a06f2f79fc1edf68e286ee452ceb9dcd5e03a (patch)
tree9c57cc161f90886116a77065b8a179313cfd0365
parent1b5f3ed24d367cc30432b8a260d1e9465b979c2b (diff)
downloadpodman-660a06f2f79fc1edf68e286ee452ceb9dcd5e03a.tar.gz
podman-660a06f2f79fc1edf68e286ee452ceb9dcd5e03a.tar.bz2
podman-660a06f2f79fc1edf68e286ee452ceb9dcd5e03a.zip
utils: takes the longest path on cgroup v1
now getCgroupProcess takes the longest path on cgroup v1, instead of complaining if the paths are different. This should help when --cgroups=split is used on cgroup v1 and the process cgroups look like: $ cat /proc/self/cgroup 11:pids:/user.slice/user-0.slice/session-4.scope 10:blkio:/ 9:cpuset:/ 8:devices:/user.slice 7:freezer:/ 6:memory:/user.slice/user-0.slice/session-4.scope 5:net_cls,net_prio:/ 4:hugetlb:/ 3:cpu,cpuacct:/ 2:perf_event:/ Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
-rw-r--r--test/e2e/common_test.go7
-rw-r--r--test/e2e/run_test.go31
-rw-r--r--utils/utils_supported.go11
3 files changed, 40 insertions, 9 deletions
diff --git a/test/e2e/common_test.go b/test/e2e/common_test.go
index 53810d882..d033cc646 100644
--- a/test/e2e/common_test.go
+++ b/test/e2e/common_test.go
@@ -619,6 +619,13 @@ func SkipIfNotRootless(reason string) {
}
}
+func SkipIfNotSystemd(manager, reason string) {
+ checkReason(reason)
+ if manager != "systemd" {
+ ginkgo.Skip("[notSystemd]: " + reason)
+ }
+}
+
func SkipIfNotFedora() {
info := GetHostDistributionInfo()
if info.Distribution != "fedora" {
diff --git a/test/e2e/run_test.go b/test/e2e/run_test.go
index 934b78202..18db63c15 100644
--- a/test/e2e/run_test.go
+++ b/test/e2e/run_test.go
@@ -1191,6 +1191,37 @@ USER mail`
Expect(found).To(BeTrue())
})
+ It("podman run with cgroups=split", func() {
+ SkipIfNotSystemd(podmanTest.CgroupManager, "do not test --cgroups=split if not running on systemd")
+ SkipIfRootlessCgroupsV1("Disable cgroups not supported on cgroupv1 for rootless users")
+ SkipIfRemote("--cgroups=split cannot be used in remote mode")
+
+ container := podmanTest.Podman([]string{"run", "--rm", "--cgroups=split", ALPINE, "cat", "/proc/self/cgroup"})
+ container.WaitWithDefaultTimeout()
+ Expect(container.ExitCode()).To(Equal(0))
+ lines := container.OutputToStringArray()
+
+ cgroup := ""
+ for _, line := range lines {
+ parts := strings.SplitN(line, ":", 3)
+ if !CGROUPSV2 {
+ // ignore unified on cgroup v1
+ // both runc and crun do not set it.
+ if parts[1] == "" {
+ continue
+ }
+ }
+ if parts[2] == "/" {
+ continue
+ }
+ if cgroup == "" {
+ cgroup = parts[2]
+ continue
+ }
+ Expect(cgroup).To(Equal(parts[2]))
+ }
+ })
+
It("podman run with cgroups=disabled runs without cgroups", func() {
SkipIfRootless("FIXME: I believe this should work but need to fix this test")
SkipIfRootlessCgroupsV1("Disable cgroups not supported on cgroupv1 for rootless users")
diff --git a/utils/utils_supported.go b/utils/utils_supported.go
index 7a0417c6c..73313cf5e 100644
--- a/utils/utils_supported.go
+++ b/utils/utils_supported.go
@@ -81,16 +81,9 @@ func getCgroupProcess(procFile string) (string, error) {
cgroup = line[3:]
break
}
- // root cgroup, skip it
- if parts[2] == "/" {
- continue
- }
- // The process must have the same cgroup path for all controllers
- // The OCI runtime spec file allow us to specify only one path.
- if cgroup != "/" && cgroup != parts[2] {
- return "", errors.Errorf("cgroup configuration not supported, the process is in two different cgroups")
+ if len(parts[2]) > len(cgroup) {
+ cgroup = parts[2]
}
- cgroup = parts[2]
}
if cgroup == "/" {
return "", errors.Errorf("could not find cgroup mount in %q", procFile)