Skip to content

Commit 8b9569b

Browse files
authored
Merge pull request kubernetes#132895 from yue9944882/bugfix-nil-scheduler-limit-request
Fixes scheduler nil panic due to empty init container request&limit
2 parents 1b273b3 + 29d1951 commit 8b9569b

File tree

2 files changed

+78
-15
lines changed

2 files changed

+78
-15
lines changed

staging/src/k8s.io/component-helpers/resource/helpers.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,12 @@ func maxResourceList(list, newList v1.ResourceList) {
430430
// max returns the result of max(a, b...) for each named resource and is only used if we can't
431431
// accumulate into an existing resource list
432432
func max(a v1.ResourceList, b ...v1.ResourceList) v1.ResourceList {
433-
result := a.DeepCopy()
433+
var result v1.ResourceList
434+
if a != nil {
435+
result = a.DeepCopy()
436+
} else {
437+
result = v1.ResourceList{}
438+
}
434439
for _, other := range b {
435440
maxResourceList(result, other)
436441
}

staging/src/k8s.io/component-helpers/resource/helpers_test.go

Lines changed: 72 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
v1 "k8s.io/api/core/v1"
2424
"k8s.io/apimachinery/pkg/api/equality"
2525
"k8s.io/apimachinery/pkg/api/resource"
26+
"k8s.io/utils/ptr"
2627
)
2728

2829
func TestPodRequestsAndLimits(t *testing.T) {
@@ -2019,11 +2020,14 @@ func TestIsSupportedPodLevelResource(t *testing.T) {
20192020
func TestAggregateContainerRequestsAndLimits(t *testing.T) {
20202021
restartAlways := v1.ContainerRestartPolicyAlways
20212022
cases := []struct {
2022-
containers []v1.Container
2023-
initContainers []v1.Container
2024-
name string
2025-
expectedRequests v1.ResourceList
2026-
expectedLimits v1.ResourceList
2023+
options PodResourcesOptions
2024+
containers []v1.Container
2025+
containerStatuses []v1.ContainerStatus
2026+
initContainers []v1.Container
2027+
initContainerStatuses []v1.ContainerStatus
2028+
name string
2029+
expectedRequests v1.ResourceList
2030+
expectedLimits v1.ResourceList
20272031
}{
20282032
{
20292033
name: "one container with limits",
@@ -2187,20 +2191,74 @@ func TestAggregateContainerRequestsAndLimits(t *testing.T) {
21872191
v1.ResourceName(v1.ResourceCPU): resource.MustParse("17"),
21882192
},
21892193
},
2194+
{
2195+
name: "regularcontainers with empty requests, but status with non-empty requests",
2196+
options: PodResourcesOptions{UseStatusResources: true},
2197+
containers: []v1.Container{
2198+
{
2199+
Name: "container-1",
2200+
Resources: v1.ResourceRequirements{},
2201+
},
2202+
},
2203+
containerStatuses: []v1.ContainerStatus{
2204+
{
2205+
Name: "container-1",
2206+
Resources: &v1.ResourceRequirements{
2207+
Requests: v1.ResourceList{
2208+
v1.ResourceCPU: resource.MustParse("2"),
2209+
},
2210+
},
2211+
},
2212+
},
2213+
expectedRequests: v1.ResourceList{
2214+
v1.ResourceCPU: resource.MustParse("2"),
2215+
},
2216+
expectedLimits: v1.ResourceList{},
2217+
},
2218+
{
2219+
name: "always-restart init containers with empty requests, but status with non-empty requests",
2220+
options: PodResourcesOptions{UseStatusResources: true},
2221+
initContainers: []v1.Container{
2222+
{
2223+
Name: "container-1",
2224+
RestartPolicy: ptr.To[v1.ContainerRestartPolicy](v1.ContainerRestartPolicyAlways),
2225+
Resources: v1.ResourceRequirements{},
2226+
},
2227+
},
2228+
initContainerStatuses: []v1.ContainerStatus{
2229+
{
2230+
Name: "container-1",
2231+
Resources: &v1.ResourceRequirements{
2232+
Requests: v1.ResourceList{
2233+
v1.ResourceCPU: resource.MustParse("2"),
2234+
},
2235+
},
2236+
},
2237+
},
2238+
expectedRequests: v1.ResourceList{
2239+
v1.ResourceCPU: resource.MustParse("2"),
2240+
},
2241+
expectedLimits: v1.ResourceList{},
2242+
},
21902243
}
21912244

21922245
for idx, tc := range cases {
2193-
testPod := &v1.Pod{Spec: v1.PodSpec{Containers: tc.containers, InitContainers: tc.initContainers}}
2194-
resRequests := AggregateContainerRequests(testPod, PodResourcesOptions{})
2195-
resLimits := AggregateContainerLimits(testPod, PodResourcesOptions{})
2246+
t.Run(tc.name, func(t *testing.T) {
2247+
testPod := &v1.Pod{
2248+
Spec: v1.PodSpec{Containers: tc.containers, InitContainers: tc.initContainers},
2249+
Status: v1.PodStatus{ContainerStatuses: tc.containerStatuses, InitContainerStatuses: tc.initContainerStatuses},
2250+
}
2251+
resRequests := AggregateContainerRequests(testPod, tc.options)
2252+
resLimits := AggregateContainerLimits(testPod, tc.options)
21962253

2197-
if !equality.Semantic.DeepEqual(tc.expectedRequests, resRequests) {
2198-
t.Errorf("test case failure[%d]: %v, requests:\n expected:\t%v\ngot\t\t%v", idx, tc.name, tc.expectedRequests, resRequests)
2199-
}
2254+
if !equality.Semantic.DeepEqual(tc.expectedRequests, resRequests) {
2255+
t.Errorf("test case failure[%d]: %v, requests:\n expected:\t%v\ngot\t\t%v", idx, tc.name, tc.expectedRequests, resRequests)
2256+
}
22002257

2201-
if !equality.Semantic.DeepEqual(tc.expectedLimits, resLimits) {
2202-
t.Errorf("test case failure[%d]: %v, limits:\n expected:\t%v\ngot\t\t%v", idx, tc.name, tc.expectedLimits, resLimits)
2203-
}
2258+
if !equality.Semantic.DeepEqual(tc.expectedLimits, resLimits) {
2259+
t.Errorf("test case failure[%d]: %v, limits:\n expected:\t%v\ngot\t\t%v", idx, tc.name, tc.expectedLimits, resLimits)
2260+
}
2261+
})
22042262
}
22052263
}
22062264

0 commit comments

Comments
 (0)