diff --git a/pkg/controller/worker/machines.go b/pkg/controller/worker/machines.go index 89172439..cb857120 100644 --- a/pkg/controller/worker/machines.go +++ b/pkg/controller/worker/machines.go @@ -250,6 +250,11 @@ func (w *workerDelegate) generateMachineConfig(ctx context.Context) error { } } + var preserveMax int32 + if pool.MachineControllerManagerSettings != nil { + preserveMax = ptr.Deref(pool.MachineControllerManagerSettings.AutoPreserveFailedMachineMax, 0) + } + machineDeployments = append(machineDeployments, worker.MachineDeployment{ Name: deploymentName, ClassName: className, @@ -264,6 +269,7 @@ func (w *workerDelegate) generateMachineConfig(ctx context.Context) error { Taints: pool.Taints, MachineConfiguration: genericworkeractuator.ReadMachineConfiguration(pool), ClusterAutoscalerAnnotations: extensionsv1alpha1helper.GetMachineDeploymentClusterAutoscalerAnnotations(pool.ClusterAutoscaler), + AutoPreserveFailedMachineMax: worker.DistributeOverZones(zoneIdx, preserveMax, zoneLen), }) machineClassSpec["name"] = className diff --git a/pkg/controller/worker/machines_test.go b/pkg/controller/worker/machines_test.go index 90758bbb..4c5f5fba 100644 --- a/pkg/controller/worker/machines_test.go +++ b/pkg/controller/worker/machines_test.go @@ -1164,6 +1164,43 @@ var _ = Describe("Machines", func() { Expect(result[1].ClusterAutoscalerAnnotations[extensionsv1alpha1.ScaleDownUtilizationThresholdAnnotation]).To(Equal("0.5")) }) + It("should distribute autoPreserveFailedMachineMax across zones", func() { + w.Spec.Pools[0].MachineControllerManagerSettings = &gardencorev1beta1.MachineControllerManagerSettings{ + AutoPreserveFailedMachineMax: new(int32(4)), + } + workerDelegate, _ = NewWorkerDelegate(c, scheme, chartApplier, "", w, cluster, "") + + result, err := workerDelegate.GenerateMachineDeployments(ctx) + Expect(err).NotTo(HaveOccurred()) + Expect(result).NotTo(BeNil()) + Expect(result[0].AutoPreserveFailedMachineMax).To(Equal(int32(2))) + Expect(result[1].AutoPreserveFailedMachineMax).To(Equal(int32(2))) + }) + + It("should set autoPreserveFailedMachineMax to 0 per zone when machineControllerManagerSettings is nil", func() { + w.Spec.Pools[0].MachineControllerManagerSettings = nil + workerDelegate, _ = NewWorkerDelegate(c, scheme, chartApplier, "", w, cluster, "") + + result, err := workerDelegate.GenerateMachineDeployments(ctx) + Expect(err).NotTo(HaveOccurred()) + Expect(result).NotTo(BeNil()) + Expect(result[0].AutoPreserveFailedMachineMax).To(Equal(int32(0))) + Expect(result[1].AutoPreserveFailedMachineMax).To(Equal(int32(0))) + }) + + It("should set autoPreserveFailedMachineMax to 0 per zone when autoPreserveFailedMachineMax is nil", func() { + w.Spec.Pools[0].MachineControllerManagerSettings = &gardencorev1beta1.MachineControllerManagerSettings{ + AutoPreserveFailedMachineMax: nil, + } + workerDelegate, _ = NewWorkerDelegate(c, scheme, chartApplier, "", w, cluster, "") + + result, err := workerDelegate.GenerateMachineDeployments(ctx) + Expect(err).NotTo(HaveOccurred()) + Expect(result).NotTo(BeNil()) + Expect(result[0].AutoPreserveFailedMachineMax).To(Equal(int32(0))) + Expect(result[1].AutoPreserveFailedMachineMax).To(Equal(int32(0))) + }) + DescribeTable("customLabelDomain in machineclass helm chart", func(customDomain string) { workerDelegate, _ := NewWorkerDelegate(c, scheme, chartApplier, "", w, cluster, customDomain)