Skip to content

Commit cf83a6f

Browse files
authored
chore: test memory limits are being set on inner container (#44)
- Fixed an issue where large integer CLI arguments were not parsed correctly - Added an integration test to validate CPU/memory are set correctly in the inner container.
1 parent b077add commit cf83a6f

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

cli/cliflag/cliflag.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,13 @@ func IntVarP(flagset *pflag.FlagSet, ptr *int, name string, shorthand string, en
110110
return
111111
}
112112

113-
vi64, err := strconv.ParseUint(val, 10, 8)
113+
vi64, err := strconv.Atoi(val)
114114
if err != nil {
115115
flagset.IntVarP(ptr, name, shorthand, def, fmtUsage(usage, env))
116116
return
117117
}
118118

119-
flagset.IntVarP(ptr, name, shorthand, int(vi64), fmtUsage(usage, env))
119+
flagset.IntVarP(ptr, name, shorthand, vi64, fmtUsage(usage, env))
120120
}
121121

122122
func Bool(flagset *pflag.FlagSet, name, shorthand, env string, def bool, usage string) {

integration/docker_test.go

+37-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88
"os"
99
"path/filepath"
10+
"strconv"
1011
"strings"
1112
"testing"
1213
"time"
@@ -80,8 +81,10 @@ func TestDocker(t *testing.T) {
8081
require.NoError(t, err)
8182

8283
var (
83-
tmpdir = integrationtest.TmpDir(t)
84-
binds = integrationtest.DefaultBinds(t, tmpdir)
84+
tmpdir = integrationtest.TmpDir(t)
85+
binds = integrationtest.DefaultBinds(t, tmpdir)
86+
expectedMemoryLimit = "1073741824"
87+
expectedCPULimit = 1
8588
)
8689

8790
homeDir := filepath.Join(tmpdir, "home")
@@ -116,6 +119,8 @@ func TestDocker(t *testing.T) {
116119
"TEST_VAR=hello=world",
117120
// Add a mount mapping to the inner container.
118121
fmt.Sprintf("%s=%s:%s,%s:%s:ro", cli.EnvMounts, "/home/coder", "/home/coder", "/var/secrets", "/var/secrets"),
122+
fmt.Sprintf("%s=%s", cli.EnvMemory, expectedMemoryLimit),
123+
fmt.Sprintf("%s=%d", cli.EnvCPUs, expectedCPULimit),
119124
}
120125
)
121126

@@ -141,6 +146,7 @@ func TestDocker(t *testing.T) {
141146
AddFUSE: true,
142147
AddTUN: true,
143148
BootstrapScript: bootstrapScript,
149+
CPUs: expectedCPULimit,
144150
})
145151

146152
// Validate that the envs are set correctly.
@@ -227,6 +233,35 @@ func TestDocker(t *testing.T) {
227233
})
228234
require.NoError(t, err)
229235
require.Equal(t, "1000", strings.TrimSpace(string(out)))
236+
237+
// Validate that the bootstrap script ran.
238+
out, err = integrationtest.ExecInnerContainer(t, pool, integrationtest.ExecConfig{
239+
ContainerID: resource.Container.ID,
240+
Cmd: []string{"cat", "/sys/fs/cgroup/memory/memory.limit_in_bytes"},
241+
})
242+
require.NoError(t, err)
243+
require.Equal(t, expectedMemoryLimit, strings.TrimSpace(string(out)))
244+
245+
// Validate that the bootstrap script ran.
246+
periodStr, err := integrationtest.ExecInnerContainer(t, pool, integrationtest.ExecConfig{
247+
ContainerID: resource.Container.ID,
248+
Cmd: []string{"cat", "/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us"},
249+
})
250+
require.NoError(t, err)
251+
period, err := strconv.ParseInt(strings.TrimSpace(string(periodStr)), 10, 64)
252+
require.NoError(t, err)
253+
254+
// Validate that the bootstrap script ran.
255+
quotaStr, err := integrationtest.ExecInnerContainer(t, pool, integrationtest.ExecConfig{
256+
ContainerID: resource.Container.ID,
257+
Cmd: []string{"cat", "/sys/fs/cgroup/cpu/cpu.cfs_quota_us"},
258+
})
259+
require.NoError(t, err)
260+
quota, err := strconv.ParseInt(strings.TrimSpace(string(quotaStr)), 10, 64)
261+
require.NoError(t, err)
262+
263+
actualLimit := float64(quota) / float64(period)
264+
require.Equal(t, expectedCPULimit, int(actualLimit))
230265
})
231266
}
232267

integration/integrationtest/docker.go

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020

2121
"github.com/coder/envbox/buildlog"
2222
"github.com/coder/envbox/cli"
23+
"github.com/coder/envbox/dockerutil"
2324
"github.com/coder/retry"
2425
)
2526

@@ -47,6 +48,7 @@ type CreateDockerCVMConfig struct {
4748
Mounts []string
4849
AddFUSE bool
4950
AddTUN bool
51+
CPUs int
5052
}
5153

5254
func (c CreateDockerCVMConfig) validate(t *testing.T) {
@@ -85,6 +87,8 @@ func RunEnvbox(t *testing.T, pool *dockertest.Pool, conf *CreateDockerCVMConfig)
8587
}, func(host *docker.HostConfig) {
8688
host.Binds = conf.Binds
8789
host.Privileged = true
90+
host.CPUPeriod = int64(dockerutil.DefaultCPUPeriod)
91+
host.CPUQuota = int64(conf.CPUs) * int64(dockerutil.DefaultCPUPeriod)
8892
})
8993
require.NoError(t, err)
9094
// t.Cleanup(func() { _ = pool.Purge(resource) })

0 commit comments

Comments
 (0)