mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 22:17:14 +00:00
Merge pull request #89567 from giuseppe/cgroupv2-unit-test
kubelet: add tests for cgroup v2 conversions
This commit is contained in:
commit
4e6a12223b
@ -181,6 +181,7 @@ go_test(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
||||||
|
"//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library",
|
||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
"//vendor/github.com/stretchr/testify/require:go_default_library",
|
"//vendor/github.com/stretchr/testify/require:go_default_library",
|
||||||
"//vendor/k8s.io/utils/mount:go_default_library",
|
"//vendor/k8s.io/utils/mount:go_default_library",
|
||||||
@ -193,6 +194,7 @@ go_test(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
||||||
|
"//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library",
|
||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
"//vendor/github.com/stretchr/testify/require:go_default_library",
|
"//vendor/github.com/stretchr/testify/require:go_default_library",
|
||||||
"//vendor/k8s.io/utils/mount:go_default_library",
|
"//vendor/k8s.io/utils/mount:go_default_library",
|
||||||
|
@ -364,6 +364,30 @@ func setSupportedSubsystems(cgroupConfig *libcontainerconfigs.Cgroup) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getCpuWeight converts from the range [2, 262144] to [1, 10000]
|
||||||
|
func getCpuWeight(cpuShares *uint64) uint64 {
|
||||||
|
if cpuShares == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if *cpuShares >= 262144 {
|
||||||
|
return 10000
|
||||||
|
}
|
||||||
|
return 1 + ((*cpuShares-2)*9999)/262142
|
||||||
|
}
|
||||||
|
|
||||||
|
// getCpuMax returns the cgroup v2 cpu.max setting given the cpu quota and the cpu period
|
||||||
|
func getCpuMax(cpuQuota *int64, cpuPeriod *uint64) string {
|
||||||
|
quotaStr := "max"
|
||||||
|
periodStr := "100000"
|
||||||
|
if cpuQuota != nil {
|
||||||
|
quotaStr = strconv.FormatInt(*cpuQuota, 10)
|
||||||
|
}
|
||||||
|
if cpuPeriod != nil {
|
||||||
|
periodStr = strconv.FormatUint(*cpuPeriod, 10)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s %s", quotaStr, periodStr)
|
||||||
|
}
|
||||||
|
|
||||||
func (m *cgroupManagerImpl) toResources(resourceConfig *ResourceConfig) *libcontainerconfigs.Resources {
|
func (m *cgroupManagerImpl) toResources(resourceConfig *ResourceConfig) *libcontainerconfigs.Resources {
|
||||||
resources := &libcontainerconfigs.Resources{}
|
resources := &libcontainerconfigs.Resources{}
|
||||||
if resourceConfig == nil {
|
if resourceConfig == nil {
|
||||||
@ -373,20 +397,8 @@ func (m *cgroupManagerImpl) toResources(resourceConfig *ResourceConfig) *libcont
|
|||||||
resources.Memory = *resourceConfig.Memory
|
resources.Memory = *resourceConfig.Memory
|
||||||
}
|
}
|
||||||
if libcontainercgroups.IsCgroup2UnifiedMode() {
|
if libcontainercgroups.IsCgroup2UnifiedMode() {
|
||||||
if resourceConfig.CpuShares != nil {
|
resources.CpuWeight = getCpuWeight(resourceConfig.CpuShares)
|
||||||
// Convert from the range [2-262144] to [1-10000]
|
resources.CpuMax = getCpuMax(resourceConfig.CpuQuota, resourceConfig.CpuPeriod)
|
||||||
resources.CpuWeight = (1 + ((*resourceConfig.CpuShares-2)*9999)/262142)
|
|
||||||
}
|
|
||||||
|
|
||||||
quota := "max"
|
|
||||||
period := "100000"
|
|
||||||
if resourceConfig.CpuQuota != nil {
|
|
||||||
quota = strconv.FormatInt(*resourceConfig.CpuQuota, 10)
|
|
||||||
}
|
|
||||||
if resourceConfig.CpuPeriod != nil {
|
|
||||||
period = strconv.FormatUint(*resourceConfig.CpuPeriod, 10)
|
|
||||||
}
|
|
||||||
resources.CpuMax = fmt.Sprintf("%s %s", quota, period)
|
|
||||||
} else {
|
} else {
|
||||||
if resourceConfig.CpuShares != nil {
|
if resourceConfig.CpuShares != nil {
|
||||||
resources.CpuShares = *resourceConfig.CpuShares
|
resources.CpuShares = *resourceConfig.CpuShares
|
||||||
|
@ -24,6 +24,7 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
@ -63,6 +64,9 @@ func TestCgroupMountValidationSuccess(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCgroupMountValidationMemoryMissing(t *testing.T) {
|
func TestCgroupMountValidationMemoryMissing(t *testing.T) {
|
||||||
|
if cgroups.IsCgroup2UnifiedMode() {
|
||||||
|
t.Skip("skipping cgroup v1 test on a cgroup v2 system")
|
||||||
|
}
|
||||||
mountInt := mount.NewFakeMounter(
|
mountInt := mount.NewFakeMounter(
|
||||||
[]mount.MountPoint{
|
[]mount.MountPoint{
|
||||||
{
|
{
|
||||||
@ -86,6 +90,9 @@ func TestCgroupMountValidationMemoryMissing(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCgroupMountValidationMultipleSubsystem(t *testing.T) {
|
func TestCgroupMountValidationMultipleSubsystem(t *testing.T) {
|
||||||
|
if cgroups.IsCgroup2UnifiedMode() {
|
||||||
|
t.Skip("skipping cgroup v1 test on a cgroup v2 system")
|
||||||
|
}
|
||||||
mountInt := mount.NewFakeMounter(
|
mountInt := mount.NewFakeMounter(
|
||||||
[]mount.MountPoint{
|
[]mount.MountPoint{
|
||||||
{
|
{
|
||||||
@ -109,6 +116,9 @@ func TestCgroupMountValidationMultipleSubsystem(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSoftRequirementsValidationSuccess(t *testing.T) {
|
func TestSoftRequirementsValidationSuccess(t *testing.T) {
|
||||||
|
if cgroups.IsCgroup2UnifiedMode() {
|
||||||
|
t.Skip("skipping cgroup v1 test on a cgroup v2 system")
|
||||||
|
}
|
||||||
req := require.New(t)
|
req := require.New(t)
|
||||||
tempDir, err := ioutil.TempDir("", "")
|
tempDir, err := ioutil.TempDir("", "")
|
||||||
req.NoError(err)
|
req.NoError(err)
|
||||||
@ -138,3 +148,28 @@ func TestSoftRequirementsValidationSuccess(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, f.cpuHardcapping, "cpu hardcapping is expected to be enabled")
|
assert.True(t, f.cpuHardcapping, "cpu hardcapping is expected to be enabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetCpuWeight(t *testing.T) {
|
||||||
|
assert.Equal(t, uint64(0), getCpuWeight(nil))
|
||||||
|
|
||||||
|
v := uint64(2)
|
||||||
|
assert.Equal(t, uint64(1), getCpuWeight(&v))
|
||||||
|
|
||||||
|
v = uint64(262144)
|
||||||
|
assert.Equal(t, uint64(10000), getCpuWeight(&v))
|
||||||
|
|
||||||
|
v = uint64(1000000000)
|
||||||
|
assert.Equal(t, uint64(10000), getCpuWeight(&v))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetCpuMax(t *testing.T) {
|
||||||
|
assert.Equal(t, getCpuMax(nil, nil), "max 100000")
|
||||||
|
|
||||||
|
quota := int64(50000)
|
||||||
|
period := uint64(200000)
|
||||||
|
assert.Equal(t, "50000 200000", getCpuMax("a, &period))
|
||||||
|
|
||||||
|
assert.Equal(t, "max 200000", getCpuMax(nil, &period))
|
||||||
|
|
||||||
|
assert.Equal(t, "50000 100000", getCpuMax("a, nil))
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user