github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/test/e2e/run_cpu_test.go (about)

     1  // +build !remoteclient
     2  
     3  package integration
     4  
     5  import (
     6  	"io/ioutil"
     7  	"os"
     8  
     9  	"github.com/containers/libpod/pkg/cgroups"
    10  	. "github.com/containers/libpod/test/utils"
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  )
    14  
    15  var _ = Describe("Podman run cpu", func() {
    16  	var (
    17  		tempdir    string
    18  		err        error
    19  		podmanTest *PodmanTestIntegration
    20  	)
    21  
    22  	BeforeEach(func() {
    23  		tempdir, err = CreateTempDirInTempDir()
    24  		if err != nil {
    25  			os.Exit(1)
    26  		}
    27  
    28  		cgroupsv2, err := cgroups.IsCgroup2UnifiedMode()
    29  		Expect(err).To(BeNil())
    30  
    31  		if cgroupsv2 {
    32  			if err := ioutil.WriteFile("/sys/fs/cgroup/cgroup.subtree_control", []byte("+cpuset"), 0644); err != nil {
    33  				Skip("cpuset controller not available on the current kernel")
    34  			}
    35  		}
    36  
    37  		podmanTest = PodmanTestCreate(tempdir)
    38  		podmanTest.Setup()
    39  		podmanTest.SeedImages()
    40  	})
    41  
    42  	AfterEach(func() {
    43  		podmanTest.Cleanup()
    44  		f := CurrentGinkgoTestDescription()
    45  		processTestResult(f)
    46  
    47  	})
    48  
    49  	It("podman run cpu-period", func() {
    50  		SkipIfRootless()
    51  
    52  		cgroupsv2, err := cgroups.IsCgroup2UnifiedMode()
    53  		Expect(err).To(BeNil())
    54  
    55  		var result *PodmanSessionIntegration
    56  		if cgroupsv2 {
    57  			result = podmanTest.Podman([]string{"run", "--rm", "--cpu-period=5000", ALPINE, "sh", "-c", "cat /sys/fs/cgroup/$(sed -e 's|0::||' < /proc/self/cgroup)/cpu.max"})
    58  		} else {
    59  			result = podmanTest.Podman([]string{"run", "--rm", "--cpu-period=5000", ALPINE, "cat", "/sys/fs/cgroup/cpu/cpu.cfs_period_us"})
    60  		}
    61  		result.WaitWithDefaultTimeout()
    62  		Expect(result.ExitCode()).To(Equal(0))
    63  		Expect(result.LineInOutputContains("5000")).To(BeTrue())
    64  	})
    65  
    66  	It("podman run cpu-quota", func() {
    67  		SkipIfRootless()
    68  
    69  		cgroupsv2, err := cgroups.IsCgroup2UnifiedMode()
    70  		Expect(err).To(BeNil())
    71  
    72  		var result *PodmanSessionIntegration
    73  
    74  		if cgroupsv2 {
    75  			result = podmanTest.Podman([]string{"run", "--rm", "--cpu-quota=5000", ALPINE, "sh", "-c", "cat /sys/fs/cgroup/$(sed -e 's|0::||' < /proc/self/cgroup)/cpu.max"})
    76  		} else {
    77  			result = podmanTest.Podman([]string{"run", "--rm", "--cpu-quota=5000", ALPINE, "cat", "/sys/fs/cgroup/cpu/cpu.cfs_quota_us"})
    78  		}
    79  		result.WaitWithDefaultTimeout()
    80  		Expect(result.ExitCode()).To(Equal(0))
    81  		Expect(result.LineInOutputContains("5000")).To(BeTrue())
    82  	})
    83  
    84  	It("podman run cpus", func() {
    85  		SkipIfRootless()
    86  
    87  		cgroupsv2, err := cgroups.IsCgroup2UnifiedMode()
    88  		Expect(err).To(BeNil())
    89  
    90  		if cgroupsv2 {
    91  			result := podmanTest.Podman([]string{"run", "--rm", "--cpu-quota=5000", ALPINE, "sh", "-c", "cat /sys/fs/cgroup/$(sed -e 's|0::||' < /proc/self/cgroup)/cpu.max"})
    92  			result.WaitWithDefaultTimeout()
    93  			Expect(result.ExitCode()).To(Equal(0))
    94  			Expect(result.OutputToString()).To(Equal("5000 100000"))
    95  		} else {
    96  			result := podmanTest.Podman([]string{"run", "--rm", "--cpus=0.5", ALPINE, "cat", "/sys/fs/cgroup/cpu/cpu.cfs_period_us"})
    97  			result.WaitWithDefaultTimeout()
    98  			Expect(result.ExitCode()).To(Equal(0))
    99  			Expect(result.OutputToString()).To(Equal("100000"))
   100  
   101  			result = podmanTest.Podman([]string{"run", "--rm", "--cpus=0.5", ALPINE, "cat", "/sys/fs/cgroup/cpu/cpu.cfs_quota_us"})
   102  			result.WaitWithDefaultTimeout()
   103  			Expect(result.ExitCode()).To(Equal(0))
   104  			Expect(result.OutputToString()).To(Equal("50000"))
   105  		}
   106  	})
   107  
   108  	It("podman run cpu-shares", func() {
   109  		SkipIfRootless()
   110  
   111  		cgroupsv2, err := cgroups.IsCgroup2UnifiedMode()
   112  		Expect(err).To(BeNil())
   113  
   114  		if cgroupsv2 {
   115  			// [2-262144] is mapped to [1-10000]
   116  			result := podmanTest.Podman([]string{"run", "--rm", "--cpu-shares=262144", ALPINE, "sh", "-c", "cat /sys/fs/cgroup/$(sed -e 's|0::||' < /proc/self/cgroup)/cpu.weight"})
   117  			result.WaitWithDefaultTimeout()
   118  			Expect(result.ExitCode()).To(Equal(0))
   119  			Expect(result.OutputToString()).To(Equal("10000"))
   120  		} else {
   121  			result := podmanTest.Podman([]string{"run", "--rm", "--cpu-shares=2", ALPINE, "cat", "/sys/fs/cgroup/cpu/cpu.shares"})
   122  			result.WaitWithDefaultTimeout()
   123  			Expect(result.ExitCode()).To(Equal(0))
   124  			Expect(result.OutputToString()).To(Equal("2"))
   125  		}
   126  	})
   127  
   128  	It("podman run cpuset-cpus", func() {
   129  		SkipIfRootless()
   130  
   131  		cgroupsv2, err := cgroups.IsCgroup2UnifiedMode()
   132  		Expect(err).To(BeNil())
   133  
   134  		var result *PodmanSessionIntegration
   135  
   136  		if cgroupsv2 {
   137  			result = podmanTest.Podman([]string{"run", "--rm", "--cpuset-cpus=0", ALPINE, "sh", "-c", "cat /sys/fs/cgroup/$(sed -e 's|0::||' < /proc/self/cgroup)/cpuset.cpus.effective"})
   138  		} else {
   139  			result = podmanTest.Podman([]string{"run", "--rm", "--cpuset-cpus=0", ALPINE, "cat", "/sys/fs/cgroup/cpuset/cpuset.cpus"})
   140  		}
   141  		result.WaitWithDefaultTimeout()
   142  		Expect(result.ExitCode()).To(Equal(0))
   143  		Expect(result.OutputToString()).To(Equal("0"))
   144  	})
   145  
   146  	It("podman run cpuset-mems", func() {
   147  		SkipIfRootless()
   148  
   149  		cgroupsv2, err := cgroups.IsCgroup2UnifiedMode()
   150  		Expect(err).To(BeNil())
   151  
   152  		var result *PodmanSessionIntegration
   153  
   154  		if cgroupsv2 {
   155  			result = podmanTest.Podman([]string{"run", "--rm", "--cpuset-mems=0", ALPINE, "sh", "-c", "cat /sys/fs/cgroup/$(sed -e 's|0::||' < /proc/self/cgroup)/cpuset.mems.effective"})
   156  		} else {
   157  			result = podmanTest.Podman([]string{"run", "--rm", "--cpuset-mems=0", ALPINE, "cat", "/sys/fs/cgroup/cpuset/cpuset.mems"})
   158  		}
   159  		result.WaitWithDefaultTimeout()
   160  		Expect(result.ExitCode()).To(Equal(0))
   161  		Expect(result.OutputToString()).To(Equal("0"))
   162  	})
   163  
   164  	It("podman run cpus and cpu-period", func() {
   165  		result := podmanTest.Podman([]string{"run", "--rm", "--cpu-period=5000", "--cpus=0.5", ALPINE, "ls"})
   166  		result.WaitWithDefaultTimeout()
   167  		Expect(result).To(ExitWithError())
   168  	})
   169  
   170  	It("podman run cpus and cpu-quota", func() {
   171  		result := podmanTest.Podman([]string{"run", "--rm", "--cpu-quota=5000", "--cpus=0.5", ALPINE, "ls"})
   172  		result.WaitWithDefaultTimeout()
   173  		Expect(result).To(ExitWithError())
   174  	})
   175  })