Skip to content

Commit 1b5df75

Browse files
committed
VPA updater: fix unready DaemonSet updates
Signed-off-by: Luke Addison <lukeaddison785@gmail.com>
1 parent 5e07dd5 commit 1b5df75

2 files changed

Lines changed: 55 additions & 34 deletions

File tree

vertical-pod-autoscaler/pkg/updater/restriction/pods_restriction_factory.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,10 @@ func (f *PodsRestrictionFactoryImpl) getReplicaCount(creator podReplicaCreator)
148148
if !ok {
149149
return 0, errors.New("failed to parse DaemonSet")
150150
}
151-
if ds.Status.NumberReady == 0 {
152-
return 0, fmt.Errorf("daemon set %s/%s has no number ready pods", creator.Namespace, creator.Name)
151+
if ds.Status.DesiredNumberScheduled == 0 {
152+
return 0, fmt.Errorf("daemon set %s/%s has no desired scheduled pods", creator.Namespace, creator.Name)
153153
}
154-
return int(ds.Status.NumberReady), nil
154+
return int(ds.Status.DesiredNumberScheduled), nil
155155
}
156156
return 0, nil
157157
}

vertical-pod-autoscaler/pkg/updater/restriction/pods_restriction_factory_test.go

Lines changed: 52 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -639,44 +639,65 @@ func TestEvictReplicatedByStatefulSet(t *testing.T) {
639639
}
640640

641641
func TestEvictReplicatedByDaemonSet(t *testing.T) {
642-
livePods := int32(5)
643-
644-
ds := appsv1.DaemonSet{
645-
ObjectMeta: metav1.ObjectMeta{
646-
Name: "ds",
647-
Namespace: "default",
648-
},
649-
TypeMeta: metav1.TypeMeta{
650-
Kind: "DaemonSet",
642+
testCases := []struct {
643+
name string
644+
desiredNumberScheduled int32
645+
numberReady int32
646+
}{
647+
{
648+
name: "Evict two pods (half of 5).",
649+
desiredNumberScheduled: 5,
650+
numberReady: 5,
651651
},
652-
Status: appsv1.DaemonSetStatus{
653-
NumberReady: livePods,
652+
{
653+
name: "Evict two pods (half of 5) even if no pods are ready.",
654+
desiredNumberScheduled: 5,
655+
numberReady: 0,
654656
},
655657
}
656658

657-
pods := make([]*corev1.Pod, livePods)
658-
for i := range pods {
659-
pods[i] = test.Pod().WithName(getTestPodName(i)).WithCreator(&ds.ObjectMeta, &ds.TypeMeta).Get()
660-
}
659+
for _, tc := range testCases {
660+
t.Run(tc.name, func(t *testing.T) {
661+
ds := appsv1.DaemonSet{
662+
ObjectMeta: metav1.ObjectMeta{
663+
Name: "ds",
664+
Namespace: "default",
665+
},
666+
TypeMeta: metav1.TypeMeta{
667+
Kind: "DaemonSet",
668+
},
669+
Status: appsv1.DaemonSetStatus{
670+
DesiredNumberScheduled: tc.desiredNumberScheduled,
671+
NumberReady: tc.numberReady,
672+
},
673+
}
661674

662-
basicVpa := getBasicVpa()
663-
factory, err := getRestrictionFactory(nil, nil, nil, &ds, 2, 0.5, nil, nil, nil, false)
664-
assert.NoError(t, err)
665-
creatorToSingleGroupStatsMap, podToReplicaCreatorMap, err := factory.GetCreatorMaps(pods, basicVpa)
666-
assert.NoError(t, err)
667-
eviction := factory.NewPodsEvictionRestriction(creatorToSingleGroupStatsMap, podToReplicaCreatorMap)
675+
pods := make([]*corev1.Pod, tc.desiredNumberScheduled)
676+
for i := range pods {
677+
pods[i] = test.Pod().WithName(getTestPodName(i)).WithCreator(&ds.ObjectMeta, &ds.TypeMeta).Get()
678+
}
668679

669-
for _, pod := range pods {
670-
assert.True(t, eviction.CanEvict(pod))
671-
}
680+
basicVpa := getBasicVpa()
681+
factory, err := getRestrictionFactory(nil, nil, nil, &ds, 2, 0.5, nil, nil, nil, false)
682+
assert.NoError(t, err)
683+
creatorToSingleGroupStatsMap, podToReplicaCreatorMap, err := factory.GetCreatorMaps(pods, basicVpa)
684+
assert.NoError(t, err)
685+
assert.Len(t, creatorToSingleGroupStatsMap, 1, "DaemonSet should not be skipped")
686+
eviction := factory.NewPodsEvictionRestriction(creatorToSingleGroupStatsMap, podToReplicaCreatorMap)
672687

673-
for _, pod := range pods[:2] {
674-
err := eviction.Evict(pod, basicVpa, test.FakeEventRecorder())
675-
assert.Nil(t, err, "Should evict with no error")
676-
}
677-
for _, pod := range pods[2:] {
678-
err := eviction.Evict(pod, basicVpa, test.FakeEventRecorder())
679-
assert.Error(t, err, "Error expected")
688+
for _, pod := range pods {
689+
assert.True(t, eviction.CanEvict(pod))
690+
}
691+
692+
for _, pod := range pods[:2] {
693+
err := eviction.Evict(pod, basicVpa, test.FakeEventRecorder())
694+
assert.Nil(t, err, "Should evict with no error")
695+
}
696+
for _, pod := range pods[2:] {
697+
err := eviction.Evict(pod, basicVpa, test.FakeEventRecorder())
698+
assert.Error(t, err, "Error expected")
699+
}
700+
})
680701
}
681702
}
682703

0 commit comments

Comments
 (0)