github.com/containers/podman/v4@v4.9.4/test/e2e/update_test.go (about)

     1  package integration
     2  
     3  import (
     4  	"github.com/containers/common/pkg/cgroupv2"
     5  	. "github.com/containers/podman/v4/test/utils"
     6  	. "github.com/onsi/ginkgo/v2"
     7  	. "github.com/onsi/gomega"
     8  )
     9  
    10  var _ = Describe("Podman update", func() {
    11  
    12  	It("podman update container all options v1", func() {
    13  		SkipIfCgroupV2("testing flags that only work in cgroup v1")
    14  		SkipIfRootless("many of these handlers are not enabled while rootless in CI")
    15  		session := podmanTest.Podman([]string{"run", "-dt", ALPINE})
    16  		session.WaitWithDefaultTimeout()
    17  		Expect(session).Should(ExitCleanly())
    18  
    19  		ctrID := session.OutputToString()
    20  
    21  		commonArgs := []string{
    22  			"update",
    23  			"--cpus", "5",
    24  			"--cpuset-cpus", "0",
    25  			"--cpu-shares", "123",
    26  			"--cpuset-mems", "0",
    27  			"--memory", "1G",
    28  			"--memory-swap", "2G",
    29  			"--memory-reservation", "2G",
    30  			"--memory-swappiness", "50",
    31  			"--pids-limit", "123", ctrID}
    32  
    33  		session = podmanTest.Podman(commonArgs)
    34  		session.WaitWithDefaultTimeout()
    35  		Expect(session).Should(ExitCleanly())
    36  
    37  		// checking cpu quota from --cpus
    38  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/cpu/cpu.cfs_quota_us"})
    39  		session.WaitWithDefaultTimeout()
    40  		Expect(session).Should(ExitCleanly())
    41  		Expect(session.OutputToString()).Should(ContainSubstring("500000"))
    42  
    43  		// checking cpuset-cpus
    44  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/cpuset/cpuset.cpus"})
    45  		session.WaitWithDefaultTimeout()
    46  		Expect(session).Should(ExitCleanly())
    47  		Expect(session.OutputToString()).Should(Equal("0"))
    48  
    49  		// checking cpuset-mems
    50  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/cpuset/cpuset.mems"})
    51  		session.WaitWithDefaultTimeout()
    52  		Expect(session).Should(ExitCleanly())
    53  		Expect(session.OutputToString()).Should(Equal("0"))
    54  
    55  		// checking memory limit
    56  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/memory/memory.limit_in_bytes"})
    57  		session.WaitWithDefaultTimeout()
    58  		Expect(session).Should(ExitCleanly())
    59  		Expect(session.OutputToString()).Should(ContainSubstring("1073741824"))
    60  
    61  		// checking memory-swap
    62  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes"})
    63  		session.WaitWithDefaultTimeout()
    64  		Expect(session).Should(ExitCleanly())
    65  		Expect(session.OutputToString()).Should(ContainSubstring("2147483648"))
    66  
    67  		// checking cpu-shares
    68  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/cpu/cpu.shares"})
    69  		session.WaitWithDefaultTimeout()
    70  		Expect(session).Should(ExitCleanly())
    71  		Expect(session.OutputToString()).Should(ContainSubstring("123"))
    72  
    73  		// checking pids-limit
    74  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/pids/pids.max"})
    75  		session.WaitWithDefaultTimeout()
    76  		Expect(session).Should(ExitCleanly())
    77  		Expect(session.OutputToString()).Should(ContainSubstring("123"))
    78  
    79  	})
    80  
    81  	It("podman update container unspecified pid limit", func() {
    82  		SkipIfCgroupV1("testing flags that only work in cgroup v2")
    83  		SkipIfRootless("many of these handlers are not enabled while rootless in CI")
    84  		session := podmanTest.Podman([]string{"run", "-dt", "--pids-limit", "-1", ALPINE})
    85  		session.WaitWithDefaultTimeout()
    86  		Expect(session).Should(ExitCleanly())
    87  
    88  		ctrID := session.OutputToString()
    89  
    90  		commonArgs := []string{
    91  			"update",
    92  			"--cpus", "5",
    93  			ctrID}
    94  
    95  		session = podmanTest.Podman(commonArgs)
    96  		session.WaitWithDefaultTimeout()
    97  		Expect(session).Should(ExitCleanly())
    98  
    99  		ctrID = session.OutputToString()
   100  
   101  		// checking pids-limit was not changed after update when not specified as an option
   102  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/pids.max"})
   103  		session.WaitWithDefaultTimeout()
   104  		Expect(session).Should(ExitCleanly())
   105  		Expect(session.OutputToString()).Should(ContainSubstring("max"))
   106  	})
   107  
   108  	It("podman update container all options v2", func() {
   109  		SkipIfCgroupV1("testing flags that only work in cgroup v2")
   110  		SkipIfRootless("many of these handlers are not enabled while rootless in CI")
   111  		session := podmanTest.Podman([]string{"run", "-dt", ALPINE})
   112  		session.WaitWithDefaultTimeout()
   113  		Expect(session).Should(ExitCleanly())
   114  
   115  		ctrID := session.OutputToString()
   116  
   117  		commonArgs := []string{
   118  			"update",
   119  			"--cpus", "5",
   120  			"--cpuset-cpus", "0",
   121  			"--cpu-shares", "123",
   122  			"--cpuset-mems", "0",
   123  			"--memory", "1G",
   124  			"--memory-swap", "2G",
   125  			"--memory-reservation", "2G",
   126  			"--blkio-weight", "123",
   127  			"--device-read-bps", "/dev/zero:10mb",
   128  			"--device-write-bps", "/dev/zero:10mb",
   129  			"--device-read-iops", "/dev/zero:1000",
   130  			"--device-write-iops", "/dev/zero:1000",
   131  			"--pids-limit", "123",
   132  			ctrID}
   133  
   134  		session = podmanTest.Podman(commonArgs)
   135  		session.WaitWithDefaultTimeout()
   136  		Expect(session).Should(ExitCleanly())
   137  
   138  		ctrID = session.OutputToString()
   139  
   140  		// checking cpu quota and period
   141  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/cpu.max"})
   142  		session.WaitWithDefaultTimeout()
   143  		Expect(session).Should(ExitCleanly())
   144  		Expect(session.OutputToString()).Should(ContainSubstring("500000"))
   145  
   146  		// checking blkio weight
   147  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/io.bfq.weight"})
   148  		session.WaitWithDefaultTimeout()
   149  		Expect(session).Should(ExitCleanly())
   150  		Expect(session.OutputToString()).Should(ContainSubstring("123"))
   151  
   152  		// checking device-read/write-bps/iops
   153  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/io.max"})
   154  		session.WaitWithDefaultTimeout()
   155  		Expect(session).Should(ExitCleanly())
   156  		Expect(session.OutputToString()).Should(ContainSubstring("rbps=10485760 wbps=10485760 riops=1000 wiops=1000"))
   157  
   158  		// checking cpuset-cpus
   159  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/cpuset.cpus"})
   160  		session.WaitWithDefaultTimeout()
   161  		Expect(session).Should(ExitCleanly())
   162  		Expect(session.OutputToString()).Should(Equal("0"))
   163  
   164  		// checking cpuset-mems
   165  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/cpuset.mems"})
   166  		session.WaitWithDefaultTimeout()
   167  		Expect(session).Should(ExitCleanly())
   168  		Expect(session.OutputToString()).Should(Equal("0"))
   169  
   170  		// checking memory limit
   171  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/memory.max"})
   172  		session.WaitWithDefaultTimeout()
   173  		Expect(session).Should(ExitCleanly())
   174  		Expect(session.OutputToString()).Should(ContainSubstring("1073741824"))
   175  
   176  		// checking memory-swap
   177  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/memory.swap.max"})
   178  		session.WaitWithDefaultTimeout()
   179  		Expect(session).Should(ExitCleanly())
   180  		Expect(session.OutputToString()).Should(ContainSubstring("1073741824"))
   181  
   182  		// checking cpu-shares
   183  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/cpu.weight"})
   184  		session.WaitWithDefaultTimeout()
   185  		Expect(session).Should(ExitCleanly())
   186  		Expect(session.OutputToString()).Should(ContainSubstring("5"))
   187  
   188  		// checking pids-limit
   189  		session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/pids.max"})
   190  		session.WaitWithDefaultTimeout()
   191  		Expect(session).Should(ExitCleanly())
   192  		Expect(session.OutputToString()).Should(ContainSubstring("123"))
   193  	})
   194  
   195  	It("podman update keep original resources if not overridden", func() {
   196  		SkipIfRootless("many of these handlers are not enabled while rootless in CI")
   197  		session := podmanTest.Podman([]string{"run", "-dt", "--cpus", "5", ALPINE})
   198  		session.WaitWithDefaultTimeout()
   199  		Expect(session).Should(ExitCleanly())
   200  
   201  		session = podmanTest.Podman([]string{
   202  			"update",
   203  			"--memory", "1G",
   204  			session.OutputToString(),
   205  		})
   206  
   207  		session.WaitWithDefaultTimeout()
   208  		Expect(session).Should(ExitCleanly())
   209  
   210  		ctrID := session.OutputToString()
   211  
   212  		if v2, _ := cgroupv2.Enabled(); v2 {
   213  			session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/cpu.max"})
   214  		} else {
   215  			session = podmanTest.Podman([]string{"exec", ctrID, "cat", "/sys/fs/cgroup/cpu/cpu.cfs_quota_us"})
   216  		}
   217  		session.WaitWithDefaultTimeout()
   218  		Expect(session).Should(ExitCleanly())
   219  		Expect(session.OutputToString()).Should(ContainSubstring("500000"))
   220  	})
   221  })