Skip to content

Commit 3c0c466

Browse files
committed
add nodeDrainTimeout to Machine
The machine controller now uses the configured timeout when deleting the Node belonging to a Machine. It will also requeue the Machine for reconciliation if deletion fails, which will lead to infinite retries.
1 parent 077921f commit 3c0c466

27 files changed

+283
-46
lines changed

api/v1alpha3/conversion.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ func (src *Machine) ConvertTo(dstRaw conversion.Hub) error {
9797
return err
9898
}
9999

100+
dst.Spec.NodeDeletionTimeout = restored.Spec.NodeDeletionTimeout
100101
dst.Status.NodeInfo = restored.Status.NodeInfo
101102
return nil
102103
}
@@ -139,6 +140,7 @@ func (src *MachineSet) ConvertTo(dstRaw conversion.Hub) error {
139140
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
140141
return err
141142
}
143+
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
142144
dst.Status.Conditions = restored.Status.Conditions
143145
return nil
144146
}
@@ -192,6 +194,7 @@ func (src *MachineDeployment) ConvertTo(dstRaw conversion.Hub) error {
192194
dst.Spec.Strategy.RollingUpdate.DeletePolicy = restored.Spec.Strategy.RollingUpdate.DeletePolicy
193195
}
194196

197+
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
195198
dst.Status.Conditions = restored.Status.Conditions
196199
return nil
197200
}
@@ -304,6 +307,11 @@ func Convert_v1beta1_MachineStatus_To_v1alpha3_MachineStatus(in *clusterv1.Machi
304307
return autoConvert_v1beta1_MachineStatus_To_v1alpha3_MachineStatus(in, out, s)
305308
}
306309

310+
func Convert_v1beta1_MachineSpec_To_v1alpha3_MachineSpec(in *clusterv1.MachineSpec, out *MachineSpec, s apiconversion.Scope) error {
311+
// spec.nodeDeletionTimeout has been added with v1beta1.
312+
return autoConvert_v1beta1_MachineSpec_To_v1alpha3_MachineSpec(in, out, s)
313+
}
314+
307315
func Convert_v1beta1_MachineDeploymentStatus_To_v1alpha3_MachineDeploymentStatus(in *clusterv1.MachineDeploymentStatus, out *MachineDeploymentStatus, s apiconversion.Scope) error {
308316
// Status.Conditions was introduced in v1alpha4, thus requiring a custom conversion function; the values is going to be preserved in an annotation thus allowing roundtrip without loosing informations
309317
return autoConvert_v1beta1_MachineDeploymentStatus_To_v1alpha3_MachineDeploymentStatus(in, out, s)

api/v1alpha3/zz_generated.conversion.go

Lines changed: 6 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha4/conversion.go

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,33 @@ func (dst *ClusterClassList) ConvertFrom(srcRaw conversion.Hub) error {
125125
func (src *Machine) ConvertTo(dstRaw conversion.Hub) error {
126126
dst := dstRaw.(*clusterv1.Machine)
127127

128-
return Convert_v1alpha4_Machine_To_v1beta1_Machine(src, dst, nil)
128+
if err := Convert_v1alpha4_Machine_To_v1beta1_Machine(src, dst, nil); err != nil {
129+
return err
130+
}
131+
132+
// Manually restore data.
133+
restored := &clusterv1.Machine{}
134+
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
135+
return err
136+
}
137+
138+
dst.Spec.NodeDeletionTimeout = restored.Spec.NodeDeletionTimeout
139+
return nil
129140
}
130141

131142
func (dst *Machine) ConvertFrom(srcRaw conversion.Hub) error {
132143
src := srcRaw.(*clusterv1.Machine)
133144

134-
return Convert_v1beta1_Machine_To_v1alpha4_Machine(src, dst, nil)
145+
if err := Convert_v1beta1_Machine_To_v1alpha4_Machine(src, dst, nil); err != nil {
146+
return err
147+
}
148+
149+
// Preserve Hub data on down-conversion except for metadata
150+
if err := utilconversion.MarshalData(src, dst); err != nil {
151+
return err
152+
}
153+
154+
return nil
135155
}
136156

137157
func (src *MachineList) ConvertTo(dstRaw conversion.Hub) error {
@@ -149,13 +169,29 @@ func (dst *MachineList) ConvertFrom(srcRaw conversion.Hub) error {
149169
func (src *MachineSet) ConvertTo(dstRaw conversion.Hub) error {
150170
dst := dstRaw.(*clusterv1.MachineSet)
151171

152-
return Convert_v1alpha4_MachineSet_To_v1beta1_MachineSet(src, dst, nil)
172+
if err := Convert_v1alpha4_MachineSet_To_v1beta1_MachineSet(src, dst, nil); err != nil {
173+
return err
174+
}
175+
176+
// Manually restore data.
177+
restored := &clusterv1.MachineSet{}
178+
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
179+
return err
180+
}
181+
182+
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
183+
return nil
153184
}
154185

155186
func (dst *MachineSet) ConvertFrom(srcRaw conversion.Hub) error {
156187
src := srcRaw.(*clusterv1.MachineSet)
157188

158-
return Convert_v1beta1_MachineSet_To_v1alpha4_MachineSet(src, dst, nil)
189+
if err := Convert_v1beta1_MachineSet_To_v1alpha4_MachineSet(src, dst, nil); err != nil {
190+
return err
191+
}
192+
193+
// Preserve Hub data on down-conversion except for metadata
194+
return utilconversion.MarshalData(src, dst)
159195
}
160196

161197
func (src *MachineSetList) ConvertTo(dstRaw conversion.Hub) error {
@@ -173,13 +209,29 @@ func (dst *MachineSetList) ConvertFrom(srcRaw conversion.Hub) error {
173209
func (src *MachineDeployment) ConvertTo(dstRaw conversion.Hub) error {
174210
dst := dstRaw.(*clusterv1.MachineDeployment)
175211

176-
return Convert_v1alpha4_MachineDeployment_To_v1beta1_MachineDeployment(src, dst, nil)
212+
if err := Convert_v1alpha4_MachineDeployment_To_v1beta1_MachineDeployment(src, dst, nil); err != nil {
213+
return err
214+
}
215+
216+
// Manually restore data.
217+
restored := &clusterv1.MachineDeployment{}
218+
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
219+
return err
220+
}
221+
222+
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
223+
return nil
177224
}
178225

179226
func (dst *MachineDeployment) ConvertFrom(srcRaw conversion.Hub) error {
180227
src := srcRaw.(*clusterv1.MachineDeployment)
181228

182-
return Convert_v1beta1_MachineDeployment_To_v1alpha4_MachineDeployment(src, dst, nil)
229+
if err := Convert_v1beta1_MachineDeployment_To_v1alpha4_MachineDeployment(src, dst, nil); err != nil {
230+
return err
231+
}
232+
233+
// Preserve Hub data on down-conversion except for metadata
234+
return utilconversion.MarshalData(src, dst)
183235
}
184236

185237
func (src *MachineDeploymentList) ConvertTo(dstRaw conversion.Hub) error {
@@ -228,6 +280,11 @@ func Convert_v1beta1_ClusterClassSpec_To_v1alpha4_ClusterClassSpec(in *clusterv1
228280
return autoConvert_v1beta1_ClusterClassSpec_To_v1alpha4_ClusterClassSpec(in, out, s)
229281
}
230282

283+
func Convert_v1beta1_MachineSpec_To_v1alpha4_MachineSpec(in *clusterv1.MachineSpec, out *MachineSpec, s apiconversion.Scope) error {
284+
// spec.nodeDeletionTimeout has been added with v1beta1.
285+
return autoConvert_v1beta1_MachineSpec_To_v1alpha4_MachineSpec(in, out, s)
286+
}
287+
231288
func Convert_v1beta1_Topology_To_v1alpha4_Topology(in *clusterv1.Topology, out *Topology, s apiconversion.Scope) error {
232289
// spec.topology.variables has been added with v1beta1.
233290
return autoConvert_v1beta1_Topology_To_v1alpha4_Topology(in, out, s)

api/v1alpha4/zz_generated.conversion.go

Lines changed: 51 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha4/zz_generated.deepcopy.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta1/machine_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ type MachineSpec struct {
9696
// NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`
9797
// +optional
9898
NodeDrainTimeout *metav1.Duration `json:"nodeDrainTimeout,omitempty"`
99+
100+
// NodeDeletionTimeout defines how long the controller will attempt to delete the Node that the Machine
101+
// hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely.
102+
// Defaults to 10 seconds.
103+
// +optional
104+
NodeDeletionTimeout *metav1.Duration `json:"nodeDeletionTimeout,omitempty"`
99105
}
100106

101107
// ANCHOR_END: MachineSpec

api/v1beta1/machine_webhook.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ package v1beta1
1919
import (
2020
"fmt"
2121
"strings"
22+
"time"
2223

2324
apierrors "k8s.io/apimachinery/pkg/api/errors"
25+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2426
"k8s.io/apimachinery/pkg/runtime"
2527
"k8s.io/apimachinery/pkg/util/validation/field"
2628
ctrl "sigs.k8s.io/controller-runtime"
@@ -29,6 +31,8 @@ import (
2931
"sigs.k8s.io/cluster-api/util/version"
3032
)
3133

34+
const defaultNodeDeletionTimeout = 10 * time.Second
35+
3236
func (m *Machine) SetupWebhookWithManager(mgr ctrl.Manager) error {
3337
return ctrl.NewWebhookManagedBy(mgr).
3438
For(m).
@@ -60,6 +64,10 @@ func (m *Machine) Default() {
6064
normalizedVersion := "v" + *m.Spec.Version
6165
m.Spec.Version = &normalizedVersion
6266
}
67+
68+
if m.Spec.NodeDeletionTimeout == nil {
69+
m.Spec.NodeDeletionTimeout = &metav1.Duration{Duration: defaultNodeDeletionTimeout}
70+
}
6371
}
6472

6573
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type.

api/v1beta1/machine_webhook_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ func TestMachineDefault(t *testing.T) {
4646
g.Expect(m.Spec.Bootstrap.ConfigRef.Namespace).To(Equal(m.Namespace))
4747
g.Expect(m.Spec.InfrastructureRef.Namespace).To(Equal(m.Namespace))
4848
g.Expect(*m.Spec.Version).To(Equal("v1.17.5"))
49+
g.Expect(m.Spec.NodeDeletionTimeout.Duration).To(Equal(defaultNodeDeletionTimeout))
4950
}
5051

5152
func TestMachineBootstrapValidation(t *testing.T) {

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/cluster.x-k8s.io_machinedeployments.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,6 +1285,12 @@ spec:
12851285
description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
12861286
type: string
12871287
type: object
1288+
nodeDeletionTimeout:
1289+
description: NodeDeletionTimeout defines how long the controller
1290+
will attempt to delete the Node that the Machine hosts after
1291+
the Machine is marked for deletion. A duration of 0 will
1292+
retry deletion indefinitely. Defaults to 10 seconds.
1293+
type: string
12881294
nodeDrainTimeout:
12891295
description: 'NodeDrainTimeout is the total amount of time
12901296
that the controller will spend on draining a node. The default

0 commit comments

Comments
 (0)