github.com/containers/podman/v4@v4.9.4/test/e2e/run_cgroup_parent_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "strings" 8 9 . "github.com/containers/podman/v4/test/utils" 10 . "github.com/onsi/ginkgo/v2" 11 . "github.com/onsi/gomega" 12 ) 13 14 const cgroupRoot = "/sys/fs/cgroup" 15 16 var _ = Describe("Podman run with --cgroup-parent", func() { 17 18 BeforeEach(func() { 19 SkipIfRootlessCgroupsV1("cgroup parent is not supported in cgroups v1") 20 }) 21 22 Specify("valid --cgroup-parent using cgroupfs", func() { 23 if !Containerized() { 24 Skip("Must be containerized to run this test.") 25 } 26 cgroup := "/zzz" 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)) 31 }) 32 33 Specify("no --cgroup-parent", func() { 34 cgroup := "/libpod_parent" 35 if !Containerized() && podmanTest.CgroupManager != "cgroupfs" { 36 if isRootless() { 37 cgroup = "/user.slice" 38 } else { 39 cgroup = "/machine.slice" 40 } 41 } 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)) 46 }) 47 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") 52 } 53 if IsRemote() { 54 Skip("Not supported for remote") 55 } 56 57 run := podmanTest.Podman([]string{"run", "-d", "--cgroupns=host", fedoraMinimal, "sleep", "100"}) 58 run.WaitWithDefaultTimeout() 59 Expect(run).Should(ExitCleanly()) 60 cid := run.OutputToString() 61 62 exec := podmanTest.Podman([]string{"exec", cid, "cat", "/proc/1/cgroup"}) 63 exec.WaitWithDefaultTimeout() 64 Expect(exec).Should(ExitCleanly()) 65 66 containerCgroup := strings.TrimRight(strings.ReplaceAll(exec.OutputToString(), "0::", ""), "\n") 67 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()) 76 77 newCgroup := fmt.Sprintf("%s/new-container", containerCgroup) 78 err = os.MkdirAll(filepath.Join(cgroupRoot, newCgroup), 0755) 79 Expect(err).ToNot(HaveOccurred()) 80 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") 85 86 Expect(newCgroup).To(Equal(filepath.Dir(cgroupEffective))) 87 }) 88 89 Specify("valid --cgroup-parent using slice", func() { 90 if Containerized() || podmanTest.CgroupManager == "cgroupfs" { 91 Skip("Requires Systemd cgroup manager support") 92 } 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)) 98 }) 99 })