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  })