Skip to content

Commit 4c44d05

Browse files
authored
Merge pull request #5608 from schrej/feature/node-drain-timeout-flag
✨ Add nodeDeletionTimeout property to Machine
2 parents 0c73082 + 0d8d072 commit 4c44d05

28 files changed

+481
-48
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
@@ -137,13 +137,33 @@ func (dst *ClusterClassList) ConvertFrom(srcRaw conversion.Hub) error {
137137
func (src *Machine) ConvertTo(dstRaw conversion.Hub) error {
138138
dst := dstRaw.(*clusterv1.Machine)
139139

140-
return Convert_v1alpha4_Machine_To_v1beta1_Machine(src, dst, nil)
140+
if err := Convert_v1alpha4_Machine_To_v1beta1_Machine(src, dst, nil); err != nil {
141+
return err
142+
}
143+
144+
// Manually restore data.
145+
restored := &clusterv1.Machine{}
146+
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
147+
return err
148+
}
149+
150+
dst.Spec.NodeDeletionTimeout = restored.Spec.NodeDeletionTimeout
151+
return nil
141152
}
142153

143154
func (dst *Machine) ConvertFrom(srcRaw conversion.Hub) error {
144155
src := srcRaw.(*clusterv1.Machine)
145156

146-
return Convert_v1beta1_Machine_To_v1alpha4_Machine(src, dst, nil)
157+
if err := Convert_v1beta1_Machine_To_v1alpha4_Machine(src, dst, nil); err != nil {
158+
return err
159+
}
160+
161+
// Preserve Hub data on down-conversion except for metadata
162+
if err := utilconversion.MarshalData(src, dst); err != nil {
163+
return err
164+
}
165+
166+
return nil
147167
}
148168

149169
func (src *MachineList) ConvertTo(dstRaw conversion.Hub) error {
@@ -161,13 +181,29 @@ func (dst *MachineList) ConvertFrom(srcRaw conversion.Hub) error {
161181
func (src *MachineSet) ConvertTo(dstRaw conversion.Hub) error {
162182
dst := dstRaw.(*clusterv1.MachineSet)
163183

164-
return Convert_v1alpha4_MachineSet_To_v1beta1_MachineSet(src, dst, nil)
184+
if err := Convert_v1alpha4_MachineSet_To_v1beta1_MachineSet(src, dst, nil); err != nil {
185+
return err
186+
}
187+
188+
// Manually restore data.
189+
restored := &clusterv1.MachineSet{}
190+
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
191+
return err
192+
}
193+
194+
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
195+
return nil
165196
}
166197

167198
func (dst *MachineSet) ConvertFrom(srcRaw conversion.Hub) error {
168199
src := srcRaw.(*clusterv1.MachineSet)
169200

170-
return Convert_v1beta1_MachineSet_To_v1alpha4_MachineSet(src, dst, nil)
201+
if err := Convert_v1beta1_MachineSet_To_v1alpha4_MachineSet(src, dst, nil); err != nil {
202+
return err
203+
}
204+
205+
// Preserve Hub data on down-conversion except for metadata
206+
return utilconversion.MarshalData(src, dst)
171207
}
172208

173209
func (src *MachineSetList) ConvertTo(dstRaw conversion.Hub) error {
@@ -185,13 +221,29 @@ func (dst *MachineSetList) ConvertFrom(srcRaw conversion.Hub) error {
185221
func (src *MachineDeployment) ConvertTo(dstRaw conversion.Hub) error {
186222
dst := dstRaw.(*clusterv1.MachineDeployment)
187223

188-
return Convert_v1alpha4_MachineDeployment_To_v1beta1_MachineDeployment(src, dst, nil)
224+
if err := Convert_v1alpha4_MachineDeployment_To_v1beta1_MachineDeployment(src, dst, nil); err != nil {
225+
return err
226+
}
227+
228+
// Manually restore data.
229+
restored := &clusterv1.MachineDeployment{}
230+
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
231+
return err
232+
}
233+
234+
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
235+
return nil
189236
}
190237

191238
func (dst *MachineDeployment) ConvertFrom(srcRaw conversion.Hub) error {
192239
src := srcRaw.(*clusterv1.MachineDeployment)
193240

194-
return Convert_v1beta1_MachineDeployment_To_v1alpha4_MachineDeployment(src, dst, nil)
241+
if err := Convert_v1beta1_MachineDeployment_To_v1alpha4_MachineDeployment(src, dst, nil); err != nil {
242+
return err
243+
}
244+
245+
// Preserve Hub data on down-conversion except for metadata
246+
return utilconversion.MarshalData(src, dst)
195247
}
196248

197249
func (src *MachineDeploymentList) ConvertTo(dstRaw conversion.Hub) error {
@@ -240,6 +292,11 @@ func Convert_v1beta1_ClusterClassSpec_To_v1alpha4_ClusterClassSpec(in *clusterv1
240292
return autoConvert_v1beta1_ClusterClassSpec_To_v1alpha4_ClusterClassSpec(in, out, s)
241293
}
242294

295+
func Convert_v1beta1_MachineSpec_To_v1alpha4_MachineSpec(in *clusterv1.MachineSpec, out *MachineSpec, s apiconversion.Scope) error {
296+
// spec.nodeDeletionTimeout has been added with v1beta1.
297+
return autoConvert_v1beta1_MachineSpec_To_v1alpha4_MachineSpec(in, out, s)
298+
}
299+
243300
func Convert_v1beta1_Topology_To_v1alpha4_Topology(in *clusterv1.Topology, out *Topology, s apiconversion.Scope) error {
244301
// spec.topology.variables has been added with v1beta1.
245302
return autoConvert_v1beta1_Topology_To_v1alpha4_Topology(in, out, s)

api/v1alpha4/zz_generated.conversion.go

Lines changed: 50 additions & 14 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

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

Lines changed: 6 additions & 0 deletions
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)