Skip to content

Commit c39a3bd

Browse files
committed
fix: avoid panic because of VPA objects without target ref
Signed-off-by: m.nabokikh <maksim.nabokikh@flant.com>
1 parent ef61220 commit c39a3bd

2 files changed

Lines changed: 47 additions & 1 deletion

File tree

internal/store/verticalpodautoscaler.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,9 +274,15 @@ func vpaResourcesToMetrics(containerName string, resources v1.ResourceList) []*m
274274
func wrapVPAFunc(f func(*autoscaling.VerticalPodAutoscaler) *metric.Family) func(interface{}) *metric.Family {
275275
return func(obj interface{}) *metric.Family {
276276
vpa := obj.(*autoscaling.VerticalPodAutoscaler)
277+
targetRef := vpa.Spec.TargetRef
278+
279+
// targetRef was not a mandatory field, which can lead to a nil pointer exception here.
280+
// Since it is pointless to have a VPA object without target ref, skip exporting metrics.
281+
if targetRef == nil {
282+
return &metric.Family{}
283+
}
277284

278285
metricFamily := f(vpa)
279-
targetRef := vpa.Spec.TargetRef
280286

281287
for _, m := range metricFamily.Metrics {
282288
m.LabelKeys = append(descVerticalPodAutoscalerLabelsDefaultLabels, m.LabelKeys...)

internal/store/verticalpodautoscaler_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,46 @@ func TestVPAStore(t *testing.T) {
131131
"kube_verticalpodautoscaler_status_recommendation_containerrecommendations_uncappedtarget",
132132
},
133133
},
134+
{
135+
Obj: &autoscaling.VerticalPodAutoscaler{
136+
ObjectMeta: metav1.ObjectMeta{
137+
Generation: 2,
138+
Name: "vpa-without-target-ref",
139+
Namespace: "ns2",
140+
Labels: map[string]string{
141+
"app": "foobar",
142+
},
143+
},
144+
Spec: autoscaling.VerticalPodAutoscalerSpec{
145+
UpdatePolicy: &autoscaling.PodUpdatePolicy{
146+
UpdateMode: &updateMode,
147+
},
148+
ResourcePolicy: &autoscaling.PodResourcePolicy{
149+
ContainerPolicies: []autoscaling.ContainerResourcePolicy{
150+
{
151+
ContainerName: "*",
152+
MinAllowed: v1Resource("1", "4Gi"),
153+
MaxAllowed: v1Resource("4", "8Gi"),
154+
},
155+
},
156+
},
157+
},
158+
Status: autoscaling.VerticalPodAutoscalerStatus{
159+
Recommendation: &autoscaling.RecommendedPodResources{
160+
ContainerRecommendations: []autoscaling.RecommendedContainerResources{
161+
{
162+
ContainerName: "container1",
163+
LowerBound: v1Resource("1", "4Gi"),
164+
UpperBound: v1Resource("4", "8Gi"),
165+
Target: v1Resource("3", "7Gi"),
166+
UncappedTarget: v1Resource("6", "10Gi"),
167+
},
168+
},
169+
},
170+
},
171+
},
172+
Want: metadata,
173+
},
134174
}
135175
for i, c := range cases {
136176
c.Func = generator.ComposeMetricGenFuncs(vpaMetricFamilies(nil, nil))

0 commit comments

Comments
 (0)