github.com/containers/podman/v5@v5.1.0-rc1/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/v5/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  })