#!/usr/bin/env bats load helpers function teardown() { rm -f $BATS_TMPDIR/runc-cgroups-integration-test.json teardown_running_container test_update teardown_running_container test_update_rt teardown_busybox } function setup() { teardown setup_busybox set_cgroups_path "$BUSYBOX_BUNDLE" # Set some initial known values DATA=$(cat < /sys/fs/cgroup/cgroup.subtree_control" fails with EINVAL skip "memory controller not available" fi check_cgroup_value $MEM_LIMIT 33554432 check_cgroup_value $MEM_RESERVE 25165824 check_cgroup_value "pids.max" 20 # update cpuset if supported (i.e. we're running on a multicore cpu) cpu_count=$(grep -c '^processor' /proc/cpuinfo) if [ $cpu_count -gt 1 ]; then runc update test_update --cpuset-cpus "1" [ "$status" -eq 0 ] check_cgroup_value "cpuset.cpus" 1 fi # update memory limit runc update test_update --memory 67108864 [ "$status" -eq 0 ] check_cgroup_value $MEM_LIMIT 67108864 if [[ -n "${RUNC_USE_SYSTEMD}" ]] ; then if [ "$CGROUP_UNIFIED" != "yes" ]; then check_systemd_value "runc-cgroups-integration-test.scope" "MemoryLimit=" "MemoryLimit=67108864" else check_systemd_value "runc-cgroups-integration-test.scope" "MemoryMax=" "MemoryMax=67108864" fi fi runc update test_update --memory 50M [ "$status" -eq 0 ] check_cgroup_value $MEM_LIMIT 52428800 if [[ -n "${RUNC_USE_SYSTEMD}" ]] ; then if [ "$CGROUP_UNIFIED" != "yes" ]; then check_systemd_value "runc-cgroups-integration-test.scope" "MemoryLimit=" "MemoryLimit=52428800" else check_systemd_value "runc-cgroups-integration-test.scope" "MemoryMax=" "MemoryMax=52428800" fi fi # update memory soft limit runc update test_update --memory-reservation 33554432 [ "$status" -eq 0 ] check_cgroup_value "$MEM_RESERVE" 33554432 # Run swap memory tests if swap is available if [ -f "$CGROUP_MEMORY/$MEM_SWAP" ]; then # try to remove memory swap limit runc update test_update --memory-swap -1 [ "$status" -eq 0 ] check_cgroup_value "$MEM_SWAP" $SYSTEM_MEM_SWAP # update memory swap runc update test_update --memory-swap 96468992 [ "$status" -eq 0 ] check_cgroup_value "$MEM_SWAP" 96468992 fi # try to remove memory limit runc update test_update --memory -1 [ "$status" -eq 0 ] # check memory limit is gone check_cgroup_value $MEM_LIMIT $SYSTEM_MEM # check swap memory limited is gone if [ -f "$CGROUP_MEMORY/$MEM_SWAP" ]; then check_cgroup_value $MEM_SWAP $SYSTEM_MEM fi # update pids limit runc update test_update --pids-limit 10 [ "$status" -eq 0 ] check_cgroup_value "pids.max" 10 if [[ -n "${RUNC_USE_SYSTEMD}" ]] ; then check_systemd_value "runc-cgroups-integration-test.scope" "TasksMax=" "TasksMax=10" fi # Revert to the test initial value via json on stdin runc update -r - test_update < $BATS_TMPDIR/runc-cgroups-integration-test.json { "memory": { "limit": 33554432, "reservation": 25165824 }, "cpu": { "shares": 100, "quota": 500000, "period": 1000000, "cpus": "0" }, "pids": { "limit": 20 } } EOF runc update -r $BATS_TMPDIR/runc-cgroups-integration-test.json test_update [ "$status" -eq 0 ] check_cgroup_value "cpuset.cpus" 0 check_cgroup_value $MEM_LIMIT 33554432 check_cgroup_value $MEM_RESERVE 25165824 check_cgroup_value "pids.max" 20 } @test "update cgroup v1 cpu limits" { [[ "$ROOTLESS" -ne 0 ]] && requires rootless_cgroup requires cgroups_v1 # run a few busyboxes detached runc run -d --console-socket $CONSOLE_SOCKET test_update [ "$status" -eq 0 ] # check that initial values were properly set check_cgroup_value "cpu.cfs_period_us" 1000000 check_cgroup_value "cpu.cfs_quota_us" 500000 check_cgroup_value "cpu.shares" 100 # update cpu-period runc update test_update --cpu-period 900000 [ "$status" -eq 0 ] check_cgroup_value "cpu.cfs_period_us" 900000 # update cpu-quota runc update test_update --cpu-quota 600000 [ "$status" -eq 0 ] check_cgroup_value "cpu.cfs_quota_us" 600000 # update cpu-shares runc update test_update --cpu-share 200 [ "$status" -eq 0 ] check_cgroup_value "cpu.shares" 200 # Revert to the test initial value via json on stding runc update -r - test_update < $BATS_TMPDIR/runc-cgroups-integration-test.json { "cpu": { "shares": 100, "quota": 500000, "period": 1000000 } } EOF runc update -r $BATS_TMPDIR/runc-cgroups-integration-test.json test_update [ "$status" -eq 0 ] check_cgroup_value "cpu.cfs_period_us" 1000000 check_cgroup_value "cpu.cfs_quota_us" 500000 check_cgroup_value "cpu.shares" 100 } @test "update rt period and runtime" { [[ "$ROOTLESS" -ne 0 ]] && requires rootless_cgroup requires cgroups_rt # run a detached busybox runc run -d --console-socket $CONSOLE_SOCKET test_update_rt [ "$status" -eq 0 ] runc update -r - test_update_rt <