Skip to content

Commit 5ce87b6

Browse files
authored
Merge pull request #8184 from sbueringer/pr-md-fix-nil-pointer
🐛 MD controller: fix nil pointer when OnDelete policy is used
2 parents 4fd3696 + e9a265f commit 5ce87b6

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

internal/controllers/machinedeployment/machinedeployment_sync.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,11 @@ func (r *Reconciler) computeDesiredMachineSet(deployment *clusterv1.MachineDeplo
336336

337337
// Set all other in-place mutable fields.
338338
desiredMS.Spec.MinReadySeconds = pointer.Int32Deref(deployment.Spec.MinReadySeconds, 0)
339-
desiredMS.Spec.DeletePolicy = pointer.StringDeref(deployment.Spec.Strategy.RollingUpdate.DeletePolicy, "")
339+
if deployment.Spec.Strategy != nil && deployment.Spec.Strategy.RollingUpdate != nil {
340+
desiredMS.Spec.DeletePolicy = pointer.StringDeref(deployment.Spec.Strategy.RollingUpdate.DeletePolicy, "")
341+
} else {
342+
desiredMS.Spec.DeletePolicy = ""
343+
}
340344
desiredMS.Spec.Template.Spec.NodeDrainTimeout = deployment.Spec.Template.Spec.NodeDrainTimeout
341345
desiredMS.Spec.Template.Spec.NodeDeletionTimeout = deployment.Spec.Template.Spec.NodeDeletionTimeout
342346
desiredMS.Spec.Template.Spec.NodeVolumeDetachTimeout = deployment.Spec.Template.Spec.NodeVolumeDetachTimeout

internal/controllers/machinedeployment/machinedeployment_sync_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,52 @@ func TestComputeDesiredMachineSet(t *testing.T) {
671671
g.Expect(err).To(BeNil())
672672
assertMachineSet(g, actualMS, expectedMS)
673673
})
674+
675+
t.Run("should compute the updated MachineSet when no old MachineSets exists (", func(t *testing.T) {
676+
// Set rollout strategy to "OnDelete".
677+
deployment := deployment.DeepCopy()
678+
deployment.Spec.Strategy = &clusterv1.MachineDeploymentStrategy{
679+
Type: clusterv1.OnDeleteMachineDeploymentStrategyType,
680+
RollingUpdate: nil,
681+
}
682+
683+
uniqueID := apirand.String(5)
684+
existingMS := skeletonMSBasedOnMD.DeepCopy()
685+
// computeDesiredMachineSet should retain the UID, name and the "machine-template-hash" label value
686+
// of the existing machine.
687+
// Other fields like labels, annotations, node timeout, etc are expected to change.
688+
existingMSUID := types.UID("abc-123-uid")
689+
existingMS.UID = existingMSUID
690+
existingMS.Name = deployment.Name + "-" + uniqueID
691+
existingMS.Labels = map[string]string{
692+
clusterv1.MachineDeploymentUniqueLabel: uniqueID,
693+
"ms-label-1": "ms-value-1",
694+
}
695+
existingMS.Annotations = nil
696+
existingMS.Spec.Template.Labels = map[string]string{
697+
clusterv1.MachineDeploymentUniqueLabel: uniqueID,
698+
"ms-label-2": "ms-value-2",
699+
}
700+
existingMS.Spec.Template.Annotations = nil
701+
existingMS.Spec.Template.Spec.NodeDrainTimeout = duration5s
702+
existingMS.Spec.Template.Spec.NodeDeletionTimeout = duration5s
703+
existingMS.Spec.Template.Spec.NodeVolumeDetachTimeout = duration5s
704+
existingMS.Spec.DeletePolicy = string(clusterv1.NewestMachineSetDeletePolicy)
705+
existingMS.Spec.MinReadySeconds = 0
706+
707+
expectedMS := skeletonMSBasedOnMD.DeepCopy()
708+
expectedMS.UID = existingMSUID
709+
expectedMS.Name = deployment.Name + "-" + uniqueID
710+
expectedMS.Labels[clusterv1.MachineDeploymentUniqueLabel] = uniqueID
711+
expectedMS.Spec.Template.Labels[clusterv1.MachineDeploymentUniqueLabel] = uniqueID
712+
// DeletePolicy should be empty with rollout strategy "OnDelete".
713+
expectedMS.Spec.DeletePolicy = ""
714+
715+
g := NewWithT(t)
716+
actualMS, err := (&Reconciler{}).computeDesiredMachineSet(deployment, existingMS, nil, log)
717+
g.Expect(err).To(BeNil())
718+
assertMachineSet(g, actualMS, expectedMS)
719+
})
674720
}
675721

676722
func assertMachineSet(g *WithT, actualMS *clusterv1.MachineSet, expectedMS *clusterv1.MachineSet) {

0 commit comments

Comments
 (0)