9
. "github.com/containers/podman/v5/test/utils"
10
. "github.com/onsi/ginkgo/v2"
11
. "github.com/onsi/gomega"
14
const cgroupRoot = "/sys/fs/cgroup"
16
var _ = Describe("Podman run with --cgroup-parent", func() {
19
SkipIfRootlessCgroupsV1("cgroup parent is not supported in cgroups v1")
22
Specify("valid --cgroup-parent using cgroupfs", func() {
24
Skip("Must be containerized to run this test.")
27
run := podmanTest.Podman([]string{"run", "--cgroupns=host", "--cgroup-parent", cgroup, fedoraMinimal, "cat", "/proc/self/cgroup"})
28
run.WaitWithDefaultTimeout()
29
Expect(run).Should(ExitCleanly())
30
Expect(run.OutputToString()).To(ContainSubstring(cgroup))
33
Specify("no --cgroup-parent", func() {
34
cgroup := "/libpod_parent"
35
if !Containerized() && podmanTest.CgroupManager != "cgroupfs" {
37
cgroup = "/user.slice"
39
cgroup = "/machine.slice"
42
run := podmanTest.Podman([]string{"run", "--cgroupns=host", fedoraMinimal, "cat", "/proc/self/cgroup"})
43
run.WaitWithDefaultTimeout()
44
Expect(run).Should(ExitCleanly())
45
Expect(run.OutputToString()).To(ContainSubstring(cgroup))
48
Specify("always honor --cgroup-parent", func() {
49
SkipIfCgroupV1("test not supported in cgroups v1")
50
if Containerized() || podmanTest.CgroupManager == "cgroupfs" {
51
Skip("Requires Systemd cgroup manager support")
54
Skip("Not supported for remote")
57
run := podmanTest.Podman([]string{"run", "-d", "--cgroupns=host", fedoraMinimal, "sleep", "100"})
58
run.WaitWithDefaultTimeout()
59
Expect(run).Should(ExitCleanly())
60
cid := run.OutputToString()
62
exec := podmanTest.Podman([]string{"exec", cid, "cat", "/proc/1/cgroup"})
63
exec.WaitWithDefaultTimeout()
64
Expect(exec).Should(ExitCleanly())
66
containerCgroup := strings.TrimRight(strings.ReplaceAll(exec.OutputToString(), "0::", ""), "\n")
68
// Move the container process to a sub cgroup
69
content, err := os.ReadFile(filepath.Join(cgroupRoot, containerCgroup, "cgroup.procs"))
70
Expect(err).ToNot(HaveOccurred())
71
oldSubCgroupPath := filepath.Join(cgroupRoot, containerCgroup, "old-container")
72
err = os.MkdirAll(oldSubCgroupPath, 0755)
73
Expect(err).ToNot(HaveOccurred())
74
err = os.WriteFile(filepath.Join(oldSubCgroupPath, "cgroup.procs"), content, 0644)
75
Expect(err).ToNot(HaveOccurred())
77
newCgroup := fmt.Sprintf("%s/new-container", containerCgroup)
78
err = os.MkdirAll(filepath.Join(cgroupRoot, newCgroup), 0755)
79
Expect(err).ToNot(HaveOccurred())
81
run = podmanTest.Podman([]string{"--cgroup-manager=cgroupfs", "run", "--rm", "--cgroupns=host", fmt.Sprintf("--cgroup-parent=%s", newCgroup), fedoraMinimal, "cat", "/proc/self/cgroup"})
82
run.WaitWithDefaultTimeout()
83
Expect(run).Should(ExitCleanly())
84
cgroupEffective := strings.TrimRight(strings.ReplaceAll(run.OutputToString(), "0::", ""), "\n")
86
Expect(newCgroup).To(Equal(filepath.Dir(cgroupEffective)))
89
Specify("valid --cgroup-parent using slice", func() {
90
if Containerized() || podmanTest.CgroupManager == "cgroupfs" {
91
Skip("Requires Systemd cgroup manager support")
93
cgroup := "aaaa.slice"
94
run := podmanTest.Podman([]string{"run", "--cgroupns=host", "--cgroup-parent", cgroup, fedoraMinimal, "cat", "/proc/1/cgroup"})
95
run.WaitWithDefaultTimeout()
96
Expect(run).Should(ExitCleanly())
97
Expect(run.OutputToString()).To(ContainSubstring(cgroup))