github.com/zhouyu0/docker-note@v0.0.0-20190722021225-b8d3825084db/integration/container/update_linux_test.go (about) 1 package container // import "github.com/docker/docker/integration/container" 2 3 import ( 4 "context" 5 "strconv" 6 "strings" 7 "testing" 8 "time" 9 10 containertypes "github.com/docker/docker/api/types/container" 11 "github.com/docker/docker/integration/internal/container" 12 "gotest.tools/assert" 13 is "gotest.tools/assert/cmp" 14 "gotest.tools/poll" 15 "gotest.tools/skip" 16 ) 17 18 func TestUpdateMemory(t *testing.T) { 19 skip.If(t, testEnv.DaemonInfo.OSType == "windows") 20 skip.If(t, !testEnv.DaemonInfo.MemoryLimit) 21 skip.If(t, !testEnv.DaemonInfo.SwapLimit) 22 23 defer setupTest(t)() 24 client := testEnv.APIClient() 25 ctx := context.Background() 26 27 cID := container.Run(t, ctx, client, func(c *container.TestContainerConfig) { 28 c.HostConfig.Resources = containertypes.Resources{ 29 Memory: 200 * 1024 * 1024, 30 } 31 }) 32 33 poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond)) 34 35 const ( 36 setMemory int64 = 314572800 37 setMemorySwap int64 = 524288000 38 ) 39 40 _, err := client.ContainerUpdate(ctx, cID, containertypes.UpdateConfig{ 41 Resources: containertypes.Resources{ 42 Memory: setMemory, 43 MemorySwap: setMemorySwap, 44 }, 45 }) 46 assert.NilError(t, err) 47 48 inspect, err := client.ContainerInspect(ctx, cID) 49 assert.NilError(t, err) 50 assert.Check(t, is.Equal(setMemory, inspect.HostConfig.Memory)) 51 assert.Check(t, is.Equal(setMemorySwap, inspect.HostConfig.MemorySwap)) 52 53 res, err := container.Exec(ctx, client, cID, 54 []string{"cat", "/sys/fs/cgroup/memory/memory.limit_in_bytes"}) 55 assert.NilError(t, err) 56 assert.Assert(t, is.Len(res.Stderr(), 0)) 57 assert.Equal(t, 0, res.ExitCode) 58 assert.Check(t, is.Equal(strconv.FormatInt(setMemory, 10), strings.TrimSpace(res.Stdout()))) 59 60 res, err = container.Exec(ctx, client, cID, 61 []string{"cat", "/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes"}) 62 assert.NilError(t, err) 63 assert.Assert(t, is.Len(res.Stderr(), 0)) 64 assert.Equal(t, 0, res.ExitCode) 65 assert.Check(t, is.Equal(strconv.FormatInt(setMemorySwap, 10), strings.TrimSpace(res.Stdout()))) 66 } 67 68 func TestUpdateCPUQuota(t *testing.T) { 69 defer setupTest(t)() 70 client := testEnv.APIClient() 71 ctx := context.Background() 72 73 cID := container.Run(t, ctx, client) 74 75 for _, test := range []struct { 76 desc string 77 update int64 78 }{ 79 {desc: "some random value", update: 15000}, 80 {desc: "a higher value", update: 20000}, 81 {desc: "a lower value", update: 10000}, 82 {desc: "unset value", update: -1}, 83 } { 84 if _, err := client.ContainerUpdate(ctx, cID, containertypes.UpdateConfig{ 85 Resources: containertypes.Resources{ 86 CPUQuota: test.update, 87 }, 88 }); err != nil { 89 t.Fatal(err) 90 } 91 92 inspect, err := client.ContainerInspect(ctx, cID) 93 assert.NilError(t, err) 94 assert.Check(t, is.Equal(test.update, inspect.HostConfig.CPUQuota)) 95 96 res, err := container.Exec(ctx, client, cID, 97 []string{"/bin/cat", "/sys/fs/cgroup/cpu/cpu.cfs_quota_us"}) 98 assert.NilError(t, err) 99 assert.Assert(t, is.Len(res.Stderr(), 0)) 100 assert.Equal(t, 0, res.ExitCode) 101 102 assert.Check(t, is.Equal(strconv.FormatInt(test.update, 10), strings.TrimSpace(res.Stdout()))) 103 } 104 }