mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Fix an issue in which, when trying to specify the `--kube-reserved-cgroup` (or `--system-reserved-cgroup`) with `--cgroup-driver=systemd`, we will not properly convert the `systemd` cgroup name into the internal cgroup name that k8s expects. Without this change, specifying `--kube-reserved-cgroup=/test.slice --cgroup-driver=systemd` will fail, and only `--kube-reserved-cgroup=/test --crgroup-driver=systemd` will succeed, even if the actual cgroup existing on the host is `/test.slice`. Additionally, add light unit testing of our process from converting to a systemd cgroup name to kubernetes internal cgroup name.
		
			
				
	
	
		
			171 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// +build linux
 | 
						|
 | 
						|
/*
 | 
						|
Copyright 2016 The Kubernetes Authors.
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
package cm
 | 
						|
 | 
						|
import (
 | 
						|
	"path"
 | 
						|
	"reflect"
 | 
						|
	"testing"
 | 
						|
)
 | 
						|
 | 
						|
// TestNewCgroupName tests confirms that #68416 is fixed
 | 
						|
func TestNewCgroupName(t *testing.T) {
 | 
						|
	a := ParseCgroupfsToCgroupName("/a/")
 | 
						|
	ab := NewCgroupName(a, "b")
 | 
						|
 | 
						|
	expectedAB := CgroupName([]string{"a", "", "b"})
 | 
						|
	if !reflect.DeepEqual(ab, expectedAB) {
 | 
						|
		t.Errorf("Expected %d%+v; got %d%+v", len(expectedAB), expectedAB, len(ab), ab)
 | 
						|
	}
 | 
						|
 | 
						|
	abc := NewCgroupName(ab, "c")
 | 
						|
 | 
						|
	expectedABC := CgroupName([]string{"a", "", "b", "c"})
 | 
						|
	if !reflect.DeepEqual(abc, expectedABC) {
 | 
						|
		t.Errorf("Expected %d%+v; got %d%+v", len(expectedABC), expectedABC, len(abc), abc)
 | 
						|
	}
 | 
						|
 | 
						|
	_ = NewCgroupName(ab, "d")
 | 
						|
 | 
						|
	if !reflect.DeepEqual(abc, expectedABC) {
 | 
						|
		t.Errorf("Expected %d%+v; got %d%+v", len(expectedABC), expectedABC, len(abc), abc)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestCgroupNameToSystemdBasename(t *testing.T) {
 | 
						|
	testCases := []struct {
 | 
						|
		input    CgroupName
 | 
						|
		expected string
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			input:    RootCgroupName,
 | 
						|
			expected: "/",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "system"),
 | 
						|
			expected: "system.slice",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "system", "Burstable"),
 | 
						|
			expected: "system-Burstable.slice",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "Burstable", "pod-123"),
 | 
						|
			expected: "Burstable-pod_123.slice",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "test", "a", "b"),
 | 
						|
			expected: "test-a-b.slice",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "test", "a", "b", "Burstable"),
 | 
						|
			expected: "test-a-b-Burstable.slice",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "Burstable"),
 | 
						|
			expected: "Burstable.slice",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "BestEffort", "pod-6c1a4e95-6bb6-11e6-bc26-28d2444e470d"),
 | 
						|
			expected: "BestEffort-pod_6c1a4e95_6bb6_11e6_bc26_28d2444e470d.slice",
 | 
						|
		},
 | 
						|
	}
 | 
						|
	for _, testCase := range testCases {
 | 
						|
		if actual := path.Base(testCase.input.ToSystemd()); actual != testCase.expected {
 | 
						|
			t.Errorf("Unexpected result, input: %v, expected: %v, actual: %v", testCase.input, testCase.expected, actual)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestCgroupNameToSystemd(t *testing.T) {
 | 
						|
	testCases := []struct {
 | 
						|
		input    CgroupName
 | 
						|
		expected string
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			input:    RootCgroupName,
 | 
						|
			expected: "/",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "Burstable"),
 | 
						|
			expected: "/Burstable.slice",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "Burstable", "pod-123"),
 | 
						|
			expected: "/Burstable.slice/Burstable-pod_123.slice",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "BestEffort", "pod-6c1a4e95-6bb6-11e6-bc26-28d2444e470d"),
 | 
						|
			expected: "/BestEffort.slice/BestEffort-pod_6c1a4e95_6bb6_11e6_bc26_28d2444e470d.slice",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "kubepods"),
 | 
						|
			expected: "/kubepods.slice",
 | 
						|
		},
 | 
						|
	}
 | 
						|
	for _, testCase := range testCases {
 | 
						|
		if actual := testCase.input.ToSystemd(); actual != testCase.expected {
 | 
						|
			t.Errorf("Unexpected result, input: %v, expected: %v, actual: %v", testCase.input, testCase.expected, actual)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestCgroupNameToCgroupfs(t *testing.T) {
 | 
						|
	testCases := []struct {
 | 
						|
		input    CgroupName
 | 
						|
		expected string
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			input:    RootCgroupName,
 | 
						|
			expected: "/",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    NewCgroupName(RootCgroupName, "Burstable"),
 | 
						|
			expected: "/Burstable",
 | 
						|
		},
 | 
						|
	}
 | 
						|
	for _, testCase := range testCases {
 | 
						|
		if actual := testCase.input.ToCgroupfs(); actual != testCase.expected {
 | 
						|
			t.Errorf("Unexpected result, input: %v, expected: %v, actual: %v", testCase.input, testCase.expected, actual)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestParseSystemdToCgroupName(t *testing.T) {
 | 
						|
	testCases := []struct {
 | 
						|
		input    string
 | 
						|
		expected CgroupName
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			input:    "/test",
 | 
						|
			expected: []string{"test"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input:    "/test.slice",
 | 
						|
			expected: []string{"test"},
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, testCase := range testCases {
 | 
						|
		if actual := ParseSystemdToCgroupName(testCase.input); !reflect.DeepEqual(actual, testCase.expected) {
 | 
						|
			t.Errorf("Unexpected result, input: %v, expected: %v, actual: %v", testCase.input, testCase.expected, actual)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |