Skip to content

Commit 179956b

Browse files
authored
Add ability to change UpdateStrategy for StatefulSets (#160)
* Add ability to change UpdateStrategy for StatefulSets
1 parent 375f5fa commit 179956b

File tree

6 files changed

+65
-3
lines changed

6 files changed

+65
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
88
## [unpublished]
99
- Add ability to specify key in failover password secret
1010
- Improve leader election logic
11+
- Add ability to change UpdateStrategy for StatefulSets
1112

1213
## [1.0.0-rc1]
1314

apis/v1beta1/role_types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55

66
"github.com/tarantool/tarantool-operator/pkg/api"
7+
appsv1 "k8s.io/api/apps/v1"
78
v1 "k8s.io/api/core/v1"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
)
@@ -65,6 +66,10 @@ type ReplicasetTemplate struct {
6566
// +optional
6667
// +kubebuilder:default=0
6768
MinReadySeconds int32 `json:"minReadySeconds,omitempty"`
69+
70+
// UpdateStrategy indicates the StatefulSetUpdateStrategy that will be
71+
// employed to update Pods in each StatefulSet of role when template is changed
72+
UpdateStrategy appsv1.StatefulSetUpdateStrategy `json:"updateStrategy"`
6873
}
6974

7075
// RoleVShardConfig defines config for vshard

apis/v1beta1/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.

config/crd/bases/tarantool.io_replicasettemplates.yaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6548,6 +6548,22 @@ spec:
65486548
default: 1
65496549
format: int32
65506550
type: integer
6551+
updateStrategy:
6552+
properties:
6553+
rollingUpdate:
6554+
properties:
6555+
maxUnavailable:
6556+
anyOf:
6557+
- type: integer
6558+
- type: string
6559+
x-kubernetes-int-or-string: true
6560+
partition:
6561+
format: int32
6562+
type: integer
6563+
type: object
6564+
type:
6565+
type: string
6566+
type: object
65516567
volumeClaimTemplates:
65526568
items:
65536569
properties:
@@ -6707,6 +6723,8 @@ spec:
67076723
type: object
67086724
type: object
67096725
type: array
6726+
required:
6727+
- updateStrategy
67106728
type: object
67116729
served: true
67126730
storage: false

config/crd/bases/tarantool.io_roles.yaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6632,6 +6632,22 @@ spec:
66326632
default: 1
66336633
format: int32
66346634
type: integer
6635+
updateStrategy:
6636+
properties:
6637+
rollingUpdate:
6638+
properties:
6639+
maxUnavailable:
6640+
anyOf:
6641+
- type: integer
6642+
- type: string
6643+
x-kubernetes-int-or-string: true
6644+
partition:
6645+
format: int32
6646+
type: integer
6647+
type: object
6648+
type:
6649+
type: string
6650+
type: object
66356651
volumeClaimTemplates:
66366652
items:
66376653
properties:
@@ -6791,6 +6807,8 @@ spec:
67916807
type: object
67926808
type: object
67936809
type: array
6810+
required:
6811+
- updateStrategy
67946812
type: object
67956813
replicasets:
67966814
default: 1

internal/implementation/replicasets_manger.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,6 @@ func (r *ReplicasetsManger) createStatefulSet(ctx context.Context, cluster api.C
128128
VolumeClaimTemplates: role.Spec.ReplicasetTemplate.VolumeClaimTemplates,
129129
ServiceName: cluster.GetName(),
130130
PodManagementPolicy: appsv1.ParallelPodManagement,
131-
UpdateStrategy: appsv1.StatefulSetUpdateStrategy{
132-
Type: appsv1.OnDeleteStatefulSetStrategyType,
133-
},
134131
RevisionHistoryLimit: &revisionHistoryLimit,
135132
PersistentVolumeClaimRetentionPolicy: &appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy{
136133
WhenDeleted: appsv1.RetainPersistentVolumeClaimRetentionPolicyType,
@@ -220,6 +217,28 @@ func (r *ReplicasetsManger) syncStatefulSet(
220217
changed = true
221218
}
222219

220+
if role.Spec.ReplicasetTemplate.UpdateStrategy.Type != sts.Spec.UpdateStrategy.Type {
221+
sts.Spec.UpdateStrategy.Type = role.Spec.ReplicasetTemplate.UpdateStrategy.Type
222+
223+
changed = true
224+
}
225+
226+
if sts.Spec.UpdateStrategy.Type == appsv1.OnDeleteStatefulSetStrategyType {
227+
if sts.Spec.UpdateStrategy.RollingUpdate != nil {
228+
sts.Spec.UpdateStrategy.RollingUpdate = nil
229+
230+
changed = true
231+
}
232+
}
233+
234+
if sts.Spec.UpdateStrategy.Type == appsv1.RollingUpdateStatefulSetStrategyType {
235+
if !cmp.Equal(role.Spec.ReplicasetTemplate.UpdateStrategy.RollingUpdate, sts.Spec.UpdateStrategy.RollingUpdate) {
236+
sts.Spec.UpdateStrategy.RollingUpdate = role.Spec.ReplicasetTemplate.UpdateStrategy.RollingUpdate
237+
238+
changed = true
239+
}
240+
}
241+
223242
// If current hash of pod template stored in StatefulSet labels does not match
224243
// calculated hash of role's pod template, when it means something changed.
225244
// So we need to update StatefulSet

0 commit comments

Comments
 (0)