mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 05:40:42 +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)
 | |
| 		}
 | |
| 	}
 | |
| }
 |