Skip to content

Commit ad11058

Browse files
authored
Merge pull request #8216 from ykakarap/machinedeployment-rollout-after
✨ MachineDeployment rolloutAfter support
2 parents a8841fb + 99d7559 commit ad11058

19 files changed

+215
-69
lines changed

api/v1alpha3/conversion.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ func (src *MachineDeployment) ConvertTo(dstRaw conversion.Hub) error {
199199

200200
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
201201
dst.Spec.Template.Spec.NodeVolumeDetachTimeout = restored.Spec.Template.Spec.NodeVolumeDetachTimeout
202+
dst.Spec.RolloutAfter = restored.Spec.RolloutAfter
202203
dst.Status.Conditions = restored.Status.Conditions
203204
return nil
204205
}
@@ -316,6 +317,10 @@ func Convert_v1beta1_MachineSpec_To_v1alpha3_MachineSpec(in *clusterv1.MachineSp
316317
return autoConvert_v1beta1_MachineSpec_To_v1alpha3_MachineSpec(in, out, s)
317318
}
318319

320+
func Convert_v1beta1_MachineDeploymentSpec_To_v1alpha3_MachineDeploymentSpec(in *clusterv1.MachineDeploymentSpec, out *MachineDeploymentSpec, s apiconversion.Scope) error {
321+
return autoConvert_v1beta1_MachineDeploymentSpec_To_v1alpha3_MachineDeploymentSpec(in, out, s)
322+
}
323+
319324
func Convert_v1beta1_MachineDeploymentStatus_To_v1alpha3_MachineDeploymentStatus(in *clusterv1.MachineDeploymentStatus, out *MachineDeploymentStatus, s apiconversion.Scope) error {
320325
// 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
321326
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: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ func (src *MachineDeployment) ConvertTo(dstRaw conversion.Hub) error {
270270

271271
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
272272
dst.Spec.Template.Spec.NodeVolumeDetachTimeout = restored.Spec.Template.Spec.NodeVolumeDetachTimeout
273+
dst.Spec.RolloutAfter = restored.Spec.RolloutAfter
273274
return nil
274275
}
275276

@@ -335,6 +336,10 @@ func Convert_v1beta1_MachineSpec_To_v1alpha4_MachineSpec(in *clusterv1.MachineSp
335336
return autoConvert_v1beta1_MachineSpec_To_v1alpha4_MachineSpec(in, out, s)
336337
}
337338

339+
func Convert_v1beta1_MachineDeploymentSpec_To_v1alpha4_MachineDeploymentSpec(in *clusterv1.MachineDeploymentSpec, out *MachineDeploymentSpec, s apiconversion.Scope) error {
340+
return autoConvert_v1beta1_MachineDeploymentSpec_To_v1alpha4_MachineDeploymentSpec(in, out, s)
341+
}
342+
338343
func Convert_v1beta1_Topology_To_v1alpha4_Topology(in *clusterv1.Topology, out *Topology, s apiconversion.Scope) error {
339344
// spec.topology.variables has been added with v1beta1.
340345
return autoConvert_v1beta1_Topology_To_v1alpha4_Topology(in, out, s)

api/v1alpha4/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/v1beta1/machinedeployment_types.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ const (
6666
// As a result, we use the hash of the machine template while ignoring all in-place mutable fields, i.e. the
6767
// machine template with only fields that could trigger a rollout for the machine-template-hash, making it
6868
// independent of the changes to any in-place mutable fields.
69+
// A random string is appended at the end of the label value (label value format is "<hash>-<random string>"))
70+
// to distinguish duplicate MachineSets that have the exact same spec but were created as a result of rolloutAfter.
6971
MachineDeploymentUniqueLabel = "machine-template-hash"
7072
)
7173

@@ -97,6 +99,15 @@ type MachineDeploymentSpec struct {
9799
// +optional
98100
Replicas *int32 `json:"replicas,omitempty"`
99101

102+
// RolloutAfter is a field to indicate a rollout should be performed
103+
// after the specified time even if no changes have been made to the
104+
// MachineDeployment.
105+
// Example: In the YAML the time can be specified in the RFC3339 format.
106+
// To specify the rolloutAfter target as March 9, 2023, at 9 am UTC
107+
// use "2023-03-09T09:00:00Z".
108+
// +optional
109+
RolloutAfter *metav1.Time `json:"rolloutAfter,omitempty"`
110+
100111
// Label selector for machines. Existing MachineSets whose machines are
101112
// selected by this will be the ones affected by this deployment.
102113
// It must match the machine template's labels.

api/v1beta1/zz_generated.deepcopy.go

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

api/v1beta1/zz_generated.openapi.go

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/clusterctl/client/alpha/kubeadmcontrolplane.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ func getKubeadmControlPlane(proxy cluster.Proxy, name, namespace string) (*contr
4646
return kcpObj, nil
4747
}
4848

49-
// setRolloutAfter sets KubeadmControlPlane.spec.rolloutAfter.
50-
func setRolloutAfter(proxy cluster.Proxy, name, namespace string) error {
49+
// setRolloutAfterOnKCP sets KubeadmControlPlane.spec.rolloutAfter.
50+
func setRolloutAfterOnKCP(proxy cluster.Proxy, name, namespace string) error {
5151
patch := client.RawPatch(types.MergePatchType, []byte(fmt.Sprintf(`{"spec":{"rolloutAfter":"%v"}}`, time.Now().Format(time.RFC3339))))
5252
return patchKubeadmControlPlane(proxy, name, namespace, patch)
5353
}

cmd/clusterctl/client/alpha/machinedeployment.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ func getMachineDeployment(proxy cluster.Proxy, name, namespace string) (*cluster
5252
return mdObj, nil
5353
}
5454

55-
// setRestartedAtAnnotation sets the restartedAt annotation in the MachineDeployment's spec.template.objectmeta.
56-
func setRestartedAtAnnotation(proxy cluster.Proxy, name, namespace string) error {
57-
patch := client.RawPatch(types.MergePatchType, []byte(fmt.Sprintf(`{"spec":{"template":{"metadata":{"annotations":{"cluster.x-k8s.io/restartedAt":"%v"}}}}}`, time.Now().Format(time.RFC3339))))
55+
// setRolloutAfterOnMachineDeployment sets MachineDeployment.spec.rolloutAfter.
56+
func setRolloutAfterOnMachineDeployment(proxy cluster.Proxy, name, namespace string) error {
57+
patch := client.RawPatch(types.MergePatchType, []byte(fmt.Sprintf(`{"spec":{"rolloutAfter":"%v"}}`, time.Now().Format(time.RFC3339))))
5858
return patchMachineDeployment(proxy, name, namespace, patch)
5959
}
6060

cmd/clusterctl/client/alpha/rollout_restarter.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ func (r *rollout) ObjectRestarter(proxy cluster.Proxy, ref corev1.ObjectReferenc
3737
if deployment.Spec.Paused {
3838
return errors.Errorf("can't restart paused MachineDeployment (run rollout resume first): %v/%v", ref.Kind, ref.Name)
3939
}
40-
if err := setRestartedAtAnnotation(proxy, ref.Name, ref.Namespace); err != nil {
40+
if deployment.Spec.RolloutAfter != nil && deployment.Spec.RolloutAfter.After(time.Now()) {
41+
return errors.Errorf("can't update MachineDeployment (remove 'spec.rolloutAfter' first): %v/%v", ref.Kind, ref.Name)
42+
}
43+
if err := setRolloutAfterOnMachineDeployment(proxy, ref.Name, ref.Namespace); err != nil {
4144
return err
4245
}
4346
case KubeadmControlPlane:
@@ -51,7 +54,7 @@ func (r *rollout) ObjectRestarter(proxy cluster.Proxy, ref corev1.ObjectReferenc
5154
if kcp.Spec.RolloutAfter != nil && kcp.Spec.RolloutAfter.After(time.Now()) {
5255
return errors.Errorf("can't update KubeadmControlPlane (remove 'spec.rolloutAfter' first): %v/%v", ref.Kind, ref.Name)
5356
}
54-
if err := setRolloutAfter(proxy, ref.Name, ref.Namespace); err != nil {
57+
if err := setRolloutAfterOnKCP(proxy, ref.Name, ref.Namespace); err != nil {
5558
return err
5659
}
5760
default:

0 commit comments

Comments
 (0)