Skip to content

Commit 7ceedea

Browse files
authored
Fix VolumeClaimTemplates index out of range problem (#2493)
when the desired statefulset has different numbers of volume claim template with current cluster, will be panic because of index out of range
1 parent 9d52a95 commit 7ceedea

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

pkg/cluster/cluster.go

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -480,23 +480,24 @@ func (c *Cluster) compareStatefulSetWith(statefulSet *appsv1.StatefulSet) *compa
480480
if len(c.Statefulset.Spec.VolumeClaimTemplates) != len(statefulSet.Spec.VolumeClaimTemplates) {
481481
needsReplace = true
482482
reasons = append(reasons, "new statefulset's volumeClaimTemplates contains different number of volumes to the old one")
483-
}
484-
for i := 0; i < len(c.Statefulset.Spec.VolumeClaimTemplates); i++ {
485-
name := c.Statefulset.Spec.VolumeClaimTemplates[i].Name
486-
// Some generated fields like creationTimestamp make it not possible to use DeepCompare on ObjectMeta
487-
if name != statefulSet.Spec.VolumeClaimTemplates[i].Name {
488-
needsReplace = true
489-
reasons = append(reasons, fmt.Sprintf("new statefulset's name for volume %d does not match the current one", i))
490-
continue
491-
}
492-
if !reflect.DeepEqual(c.Statefulset.Spec.VolumeClaimTemplates[i].Annotations, statefulSet.Spec.VolumeClaimTemplates[i].Annotations) {
493-
needsReplace = true
494-
reasons = append(reasons, fmt.Sprintf("new statefulset's annotations for volume %q does not match the current one", name))
495-
}
496-
if !reflect.DeepEqual(c.Statefulset.Spec.VolumeClaimTemplates[i].Spec, statefulSet.Spec.VolumeClaimTemplates[i].Spec) {
483+
} else {
484+
for i := 0; i < len(c.Statefulset.Spec.VolumeClaimTemplates); i++ {
497485
name := c.Statefulset.Spec.VolumeClaimTemplates[i].Name
498-
needsReplace = true
499-
reasons = append(reasons, fmt.Sprintf("new statefulset's volumeClaimTemplates specification for volume %q does not match the current one", name))
486+
// Some generated fields like creationTimestamp make it not possible to use DeepCompare on ObjectMeta
487+
if name != statefulSet.Spec.VolumeClaimTemplates[i].Name {
488+
needsReplace = true
489+
reasons = append(reasons, fmt.Sprintf("new statefulset's name for volume %d does not match the current one", i))
490+
continue
491+
}
492+
if !reflect.DeepEqual(c.Statefulset.Spec.VolumeClaimTemplates[i].Annotations, statefulSet.Spec.VolumeClaimTemplates[i].Annotations) {
493+
needsReplace = true
494+
reasons = append(reasons, fmt.Sprintf("new statefulset's annotations for volume %q does not match the current one", name))
495+
}
496+
if !reflect.DeepEqual(c.Statefulset.Spec.VolumeClaimTemplates[i].Spec, statefulSet.Spec.VolumeClaimTemplates[i].Spec) {
497+
name := c.Statefulset.Spec.VolumeClaimTemplates[i].Name
498+
needsReplace = true
499+
reasons = append(reasons, fmt.Sprintf("new statefulset's volumeClaimTemplates specification for volume %q does not match the current one", name))
500+
}
500501
}
501502
}
502503

0 commit comments

Comments
 (0)