github.com/AbhinandanKurakure/podman/v3@v3.4.10/test/e2e/run_cgroup_parent_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "strings" 9 10 . "github.com/containers/podman/v3/test/utils" 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13 . "github.com/onsi/gomega/gexec" 14 ) 15 16 const cgroupRoot = "/sys/fs/cgroup" 17 18 var _ = Describe("Podman run with --cgroup-parent", func() { 19 var ( 20 tempdir string 21 err error 22 podmanTest *PodmanTestIntegration 23 ) 24 25 BeforeEach(func() { 26 SkipIfRootlessCgroupsV1("cgroup parent is not supported in cgroups v1") 27 tempdir, err = CreateTempDirInTempDir() 28 if err != nil { 29 os.Exit(1) 30 } 31 podmanTest = PodmanTestCreate(tempdir) 32 podmanTest.Setup() 33 podmanTest.SeedImages() 34 }) 35 36 AfterEach(func() { 37 podmanTest.Cleanup() 38 f := CurrentGinkgoTestDescription() 39 processTestResult(f) 40 41 }) 42 43 Specify("valid --cgroup-parent using cgroupfs", func() { 44 if !Containerized() { 45 Skip("Must be containerized to run this test.") 46 } 47 cgroup := "/zzz" 48 run := podmanTest.Podman([]string{"run", "--cgroupns=host", "--cgroup-parent", cgroup, fedoraMinimal, "cat", "/proc/self/cgroup"}) 49 run.WaitWithDefaultTimeout() 50 Expect(run).Should(Exit(0)) 51 ok, _ := run.GrepString(cgroup) 52 Expect(ok).To(BeTrue()) 53 }) 54 55 Specify("no --cgroup-parent", func() { 56 SkipIfRootless("FIXME This seems to be broken in rootless mode") 57 cgroup := "/libpod_parent" 58 if !Containerized() && podmanTest.CgroupManager != "cgroupfs" { 59 cgroup = "/machine.slice" 60 } 61 run := podmanTest.Podman([]string{"run", "--cgroupns=host", fedoraMinimal, "cat", "/proc/self/cgroup"}) 62 run.WaitWithDefaultTimeout() 63 Expect(run).Should(Exit(0)) 64 ok, _ := run.GrepString(cgroup) 65 Expect(ok).To(BeTrue()) 66 }) 67 68 Specify("always honor --cgroup-parent", func() { 69 SkipIfCgroupV1("test not supported in cgroups v1") 70 if Containerized() || podmanTest.CgroupManager == "cgroupfs" { 71 Skip("Requires Systemd cgroup manager support") 72 } 73 if IsRemote() { 74 Skip("Not supported for remote") 75 } 76 77 run := podmanTest.Podman([]string{"run", "-d", "--cgroupns=host", fedoraMinimal, "sleep", "100"}) 78 run.WaitWithDefaultTimeout() 79 Expect(run).Should(Exit(0)) 80 cid := run.OutputToString() 81 82 exec := podmanTest.Podman([]string{"exec", cid, "cat", "/proc/1/cgroup"}) 83 exec.WaitWithDefaultTimeout() 84 Expect(exec).Should(Exit(0)) 85 86 containerCgroup := strings.TrimRight(strings.Replace(exec.OutputToString(), "0::", "", -1), "\n") 87 88 // Move the container process to a sub cgroup 89 content, err := ioutil.ReadFile(filepath.Join(cgroupRoot, containerCgroup, "cgroup.procs")) 90 Expect(err).To(BeNil()) 91 oldSubCgroupPath := filepath.Join(filepath.Join(cgroupRoot, containerCgroup, "old-container")) 92 err = os.MkdirAll(oldSubCgroupPath, 0755) 93 Expect(err).To(BeNil()) 94 err = ioutil.WriteFile(filepath.Join(oldSubCgroupPath, "cgroup.procs"), content, 0644) 95 Expect(err).To(BeNil()) 96 97 newCgroup := fmt.Sprintf("%s/new-container", containerCgroup) 98 err = os.MkdirAll(filepath.Join(cgroupRoot, newCgroup), 0755) 99 Expect(err).To(BeNil()) 100 101 run = podmanTest.Podman([]string{"--cgroup-manager=cgroupfs", "run", "--rm", "--cgroupns=host", fmt.Sprintf("--cgroup-parent=%s", newCgroup), fedoraMinimal, "cat", "/proc/self/cgroup"}) 102 run.WaitWithDefaultTimeout() 103 Expect(run).Should(Exit(0)) 104 cgroupEffective := strings.TrimRight(strings.Replace(run.OutputToString(), "0::", "", -1), "\n") 105 106 Expect(newCgroup).To(Equal(filepath.Dir(cgroupEffective))) 107 }) 108 109 Specify("valid --cgroup-parent using slice", func() { 110 if Containerized() || podmanTest.CgroupManager == "cgroupfs" { 111 Skip("Requires Systemd cgroup manager support") 112 } 113 cgroup := "aaaa.slice" 114 run := podmanTest.Podman([]string{"run", "--cgroupns=host", "--cgroup-parent", cgroup, fedoraMinimal, "cat", "/proc/1/cgroup"}) 115 run.WaitWithDefaultTimeout() 116 Expect(run).Should(Exit(0)) 117 ok, _ := run.GrepString(cgroup) 118 Expect(ok).To(BeTrue()) 119 }) 120 })