Skip to content

Commit 0d8d072

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 cca725c commit 0d8d072

28 files changed

+481
-48
lines changed

api/v1alpha3/conversion.go

+8
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

+6-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha4/conversion.go

+63-6
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,33 @@ func (dst *ClusterClassList) ConvertFrom(srcRaw conversion.Hub) error {
131131
func (src *Machine) ConvertTo(dstRaw conversion.Hub) error {
132132
dst := dstRaw.(*clusterv1.Machine)
133133

134-
return Convert_v1alpha4_Machine_To_v1beta1_Machine(src, dst, nil)
134+
if err := Convert_v1alpha4_Machine_To_v1beta1_Machine(src, dst, nil); err != nil {
135+
return err
136+
}
137+
138+
// Manually restore data.
139+
restored := &clusterv1.Machine{}
140+
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
141+
return err
142+
}
143+
144+
dst.Spec.NodeDeletionTimeout = restored.Spec.NodeDeletionTimeout
145+
return nil
135146
}
136147

137148
func (dst *Machine) ConvertFrom(srcRaw conversion.Hub) error {
138149
src := srcRaw.(*clusterv1.Machine)
139150

140-
return Convert_v1beta1_Machine_To_v1alpha4_Machine(src, dst, nil)
151+
if err := Convert_v1beta1_Machine_To_v1alpha4_Machine(src, dst, nil); err != nil {
152+
return err
153+
}
154+
155+
// Preserve Hub data on down-conversion except for metadata
156+
if err := utilconversion.MarshalData(src, dst); err != nil {
157+
return err
158+
}
159+
160+
return nil
141161
}
142162

143163
func (src *MachineList) ConvertTo(dstRaw conversion.Hub) error {
@@ -155,13 +175,29 @@ func (dst *MachineList) ConvertFrom(srcRaw conversion.Hub) error {
155175
func (src *MachineSet) ConvertTo(dstRaw conversion.Hub) error {
156176
dst := dstRaw.(*clusterv1.MachineSet)
157177

158-
return Convert_v1alpha4_MachineSet_To_v1beta1_MachineSet(src, dst, nil)
178+
if err := Convert_v1alpha4_MachineSet_To_v1beta1_MachineSet(src, dst, nil); err != nil {
179+
return err
180+
}
181+
182+
// Manually restore data.
183+
restored := &clusterv1.MachineSet{}
184+
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
185+
return err
186+
}
187+
188+
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
189+
return nil
159190
}
160191

161192
func (dst *MachineSet) ConvertFrom(srcRaw conversion.Hub) error {
162193
src := srcRaw.(*clusterv1.MachineSet)
163194

164-
return Convert_v1beta1_MachineSet_To_v1alpha4_MachineSet(src, dst, nil)
195+
if err := Convert_v1beta1_MachineSet_To_v1alpha4_MachineSet(src, dst, nil); err != nil {
196+
return err
197+
}
198+
199+
// Preserve Hub data on down-conversion except for metadata
200+
return utilconversion.MarshalData(src, dst)
165201
}
166202

167203
func (src *MachineSetList) ConvertTo(dstRaw conversion.Hub) error {
@@ -179,13 +215,29 @@ func (dst *MachineSetList) ConvertFrom(srcRaw conversion.Hub) error {
179215
func (src *MachineDeployment) ConvertTo(dstRaw conversion.Hub) error {
180216
dst := dstRaw.(*clusterv1.MachineDeployment)
181217

182-
return Convert_v1alpha4_MachineDeployment_To_v1beta1_MachineDeployment(src, dst, nil)
218+
if err := Convert_v1alpha4_MachineDeployment_To_v1beta1_MachineDeployment(src, dst, nil); err != nil {
219+
return err
220+
}
221+
222+
// Manually restore data.
223+
restored := &clusterv1.MachineDeployment{}
224+
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
225+
return err
226+
}
227+
228+
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
229+
return nil
183230
}
184231

185232
func (dst *MachineDeployment) ConvertFrom(srcRaw conversion.Hub) error {
186233
src := srcRaw.(*clusterv1.MachineDeployment)
187234

188-
return Convert_v1beta1_MachineDeployment_To_v1alpha4_MachineDeployment(src, dst, nil)
235+
if err := Convert_v1beta1_MachineDeployment_To_v1alpha4_MachineDeployment(src, dst, nil); err != nil {
236+
return err
237+
}
238+
239+
// Preserve Hub data on down-conversion except for metadata
240+
return utilconversion.MarshalData(src, dst)
189241
}
190242

191243
func (src *MachineDeploymentList) ConvertTo(dstRaw conversion.Hub) error {
@@ -234,6 +286,11 @@ func Convert_v1beta1_ClusterClassSpec_To_v1alpha4_ClusterClassSpec(in *clusterv1
234286
return autoConvert_v1beta1_ClusterClassSpec_To_v1alpha4_ClusterClassSpec(in, out, s)
235287
}
236288

289+
func Convert_v1beta1_MachineSpec_To_v1alpha4_MachineSpec(in *clusterv1.MachineSpec, out *MachineSpec, s apiconversion.Scope) error {
290+
// spec.nodeDeletionTimeout has been added with v1beta1.
291+
return autoConvert_v1beta1_MachineSpec_To_v1alpha4_MachineSpec(in, out, s)
292+
}
293+
237294
func Convert_v1beta1_Topology_To_v1alpha4_Topology(in *clusterv1.Topology, out *Topology, s apiconversion.Scope) error {
238295
// spec.topology.variables has been added with v1beta1.
239296
return autoConvert_v1beta1_Topology_To_v1alpha4_Topology(in, out, s)

api/v1alpha4/zz_generated.conversion.go

+50-14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta1/machine_types.go

+6
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

+8
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

+1
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

+5
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

+6
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

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

+6
Original file line numberDiff line numberDiff line change
@@ -1165,6 +1165,12 @@ spec:
11651165
description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
11661166
type: string
11671167
type: object
1168+
nodeDeletionTimeout:
1169+
description: NodeDeletionTimeout defines how long the controller
1170+
will attempt to delete the Node that the Machine hosts after
1171+
the Machine is marked for deletion. A duration of 0 will
1172+
retry deletion indefinitely. Defaults to 10 seconds.
1173+
type: string
11681174
nodeDrainTimeout:
11691175
description: 'NodeDrainTimeout is the total amount of time
11701176
that the controller will spend on draining a node. The default

0 commit comments

Comments
 (0)