Skip to content

Commit 7b2b886

Browse files
committed
Make TerminationGracePeriodSeconds configurable
- related to issue #419
1 parent 5d74b52 commit 7b2b886

File tree

6 files changed

+52
-19
lines changed

6 files changed

+52
-19
lines changed

api/v1beta1/rabbitmqcluster_types.go

+6
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ type RabbitmqClusterSpec struct {
6363
// Has no effect if the cluster only consists of one node.
6464
// For more information, see https://www.rabbitmq.com/rabbitmq-queues.8.html#rebalance
6565
SkipPostDeploySteps bool `json:"skipPostDeploySteps,omitempty"`
66+
// TerminationGracePeriodSeconds is the timeout that each rabbitmqcluster pod will have to terminate gracefully
67+
// It defaults to 604800 seconds ( a week long) to ensure that the container preStop lifecycle hook can finish running
68+
// For more information, see: https://github.com/rabbitmq/cluster-operator/blob/main/docs/design/20200520-graceful-pod-termination.md
69+
// +kubebuilder:validation:Minimum:=0
70+
// +kubebuilder:default:=604800
71+
TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty"`
6672
}
6773

6874
type RabbitmqClusterOverrideSpec struct {

api/v1beta1/rabbitmqcluster_types_test.go

+8-5
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ var _ = Describe("RabbitmqCluster", func() {
179179

180180
When("CR is fully populated", func() {
181181
It("outputs the CR", func() {
182+
zero := int64(0)
182183
storage := k8sresource.MustParse("987Gi")
183184
storageClassName := "some-class"
184185
rmqClusterInstance = RabbitmqCluster{
@@ -187,9 +188,10 @@ var _ = Describe("RabbitmqCluster", func() {
187188
Namespace: "default",
188189
},
189190
Spec: RabbitmqClusterSpec{
190-
Replicas: &three,
191-
Image: "rabbitmq-image-from-cr",
192-
ImagePullSecrets: []corev1.LocalObjectReference{{Name: "my-super-secret"}},
191+
Replicas: &three,
192+
Image: "rabbitmq-image-from-cr",
193+
ImagePullSecrets: []corev1.LocalObjectReference{{Name: "my-super-secret"}},
194+
TerminationGracePeriodSeconds: &zero,
193195
Service: RabbitmqClusterServiceSpec{
194196
Type: "NodePort",
195197
Annotations: map[string]string{
@@ -476,8 +478,9 @@ func generateRabbitmqClusterObject(clusterName string) *RabbitmqCluster {
476478
Namespace: "default",
477479
},
478480
Spec: RabbitmqClusterSpec{
479-
Replicas: pointer.Int32Ptr(1),
480-
Image: "rabbitmq:3.8.9",
481+
Replicas: pointer.Int32Ptr(1),
482+
Image: "rabbitmq:3.8.9",
483+
TerminationGracePeriodSeconds: pointer.Int64Ptr(604800),
481484
Service: RabbitmqClusterServiceSpec{
482485
Type: "ClusterIP",
483486
},

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/rabbitmq.com_rabbitmqclusters.yaml

+9
Original file line numberDiff line numberDiff line change
@@ -3723,6 +3723,15 @@ spec:
37233723
the cluster only consists of one node. For more information, see
37243724
https://www.rabbitmq.com/rabbitmq-queues.8.html#rebalance
37253725
type: boolean
3726+
terminationGracePeriodSeconds:
3727+
default: 604800
3728+
description: 'TerminationGracePeriodSeconds is the timeout that each
3729+
rabbitmqcluster pod will have to terminate gracefully It defaults
3730+
to 604800 seconds ( a week long) to ensure that the container preStop
3731+
lifecycle hook can finish running For more information, see: https://github.com/rabbitmq/cluster-operator/blob/main/docs/design/20200520-graceful-pod-termination.md'
3732+
format: int64
3733+
minimum: 0
3734+
type: integer
37263735
tls:
37273736
properties:
37283737
caCertName:

internal/resource/statefulset.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ import (
2929
)
3030

3131
const (
32-
defaultGracePeriodTimeoutSeconds int64 = 60 * 60 * 24 * 7
33-
initContainerCPU string = "100m"
34-
initContainerMemory string = "500Mi"
35-
DeletionMarker string = "skipPreStopChecks"
32+
initContainerCPU string = "100m"
33+
initContainerMemory string = "500Mi"
34+
DeletionMarker string = "skipPreStopChecks"
3635
)
3736

3837
type StatefulSetBuilder struct {
@@ -247,8 +246,6 @@ func (builder *StatefulSetBuilder) podTemplateSpec(annotations, labels map[strin
247246
rabbitmqGID := int64(999)
248247
rabbitmqUID := int64(999)
249248

250-
terminationGracePeriod := defaultGracePeriodTimeoutSeconds
251-
252249
volumes := []corev1.Volume{
253250
{
254251
Name: "server-conf",
@@ -512,7 +509,7 @@ func (builder *StatefulSetBuilder) podTemplateSpec(annotations, labels map[strin
512509
RunAsUser: &rabbitmqUID,
513510
},
514511
ImagePullSecrets: builder.Instance.Spec.ImagePullSecrets,
515-
TerminationGracePeriodSeconds: &terminationGracePeriod,
512+
TerminationGracePeriodSeconds: builder.Instance.Spec.TerminationGracePeriodSeconds,
516513
ServiceAccountName: builder.Instance.ChildResourceName(serviceAccountName),
517514
AutomountServiceAccountToken: &automountServiceAccountToken,
518515
Affinity: builder.Instance.Spec.Affinity,
@@ -653,7 +650,10 @@ func (builder *StatefulSetBuilder) podTemplateSpec(annotations, labels map[strin
653650
fmt.Sprintf("if [ ! -z \"$(cat /etc/pod-info/%s)\" ]; then exit 0; fi;", DeletionMarker) +
654651
fmt.Sprintf(" rabbitmq-upgrade await_online_quorum_plus_one -t %d;"+
655652
" rabbitmq-upgrade await_online_synchronized_mirror -t %d;"+
656-
" rabbitmq-upgrade drain -t %d", defaultGracePeriodTimeoutSeconds, defaultGracePeriodTimeoutSeconds, defaultGracePeriodTimeoutSeconds),
653+
" rabbitmq-upgrade drain -t %d",
654+
*builder.Instance.Spec.TerminationGracePeriodSeconds,
655+
*builder.Instance.Spec.TerminationGracePeriodSeconds,
656+
*builder.Instance.Spec.TerminationGracePeriodSeconds),
657657
},
658658
},
659659
},

internal/resource/statefulset_test.go

+16-6
Original file line numberDiff line numberDiff line change
@@ -1022,13 +1022,22 @@ var _ = Describe("StatefulSet", func() {
10221022
}))
10231023
})
10241024

1025-
It("adds the required terminationGracePeriodSeconds", func() {
1025+
It("sets TerminationGracePeriodSeconds in podTemplate as provided in instance spec", func() {
1026+
instance.Spec.TerminationGracePeriodSeconds = pointer.Int64Ptr(10)
1027+
builder = &resource.RabbitmqResourceBuilder{
1028+
Instance: &instance,
1029+
Scheme: scheme,
1030+
}
1031+
10261032
stsBuilder := builder.StatefulSet()
10271033
Expect(stsBuilder.Update(statefulSet)).To(Succeed())
10281034

10291035
gracePeriodSeconds := statefulSet.Spec.Template.Spec.TerminationGracePeriodSeconds
1030-
expectedGracePeriodSeconds := int64(60 * 60 * 24 * 7)
1031-
Expect(gracePeriodSeconds).To(Equal(&expectedGracePeriodSeconds))
1036+
Expect(gracePeriodSeconds).To(Equal(pointer.Int64Ptr(10)))
1037+
1038+
// TerminationGracePeriodSeconds is used to set commands timeouts in the preStop hook
1039+
expectedPreStopCommand := []string{"/bin/bash", "-c", "if [ ! -z \"$(cat /etc/pod-info/skipPreStopChecks)\" ]; then exit 0; fi; rabbitmq-upgrade await_online_quorum_plus_one -t 10; rabbitmq-upgrade await_online_synchronized_mirror -t 10; rabbitmq-upgrade drain -t 10"}
1040+
Expect(statefulSet.Spec.Template.Spec.Containers[0].Lifecycle.PreStop.Exec.Command).To(Equal(expectedPreStopCommand))
10321041
})
10331042

10341043
It("checks mirror and querum queue status in preStop hook", func() {
@@ -1473,9 +1482,10 @@ func generateRabbitmqCluster() rabbitmqv1beta1.RabbitmqCluster {
14731482
Namespace: "foo-namespace",
14741483
},
14751484
Spec: rabbitmqv1beta1.RabbitmqClusterSpec{
1476-
Replicas: &one,
1477-
Image: "rabbitmq-image-from-cr",
1478-
ImagePullSecrets: []corev1.LocalObjectReference{{Name: "my-super-secret"}},
1485+
Replicas: &one,
1486+
Image: "rabbitmq-image-from-cr",
1487+
ImagePullSecrets: []corev1.LocalObjectReference{{Name: "my-super-secret"}},
1488+
TerminationGracePeriodSeconds: pointer.Int64Ptr(604800),
14791489
Service: rabbitmqv1beta1.RabbitmqClusterServiceSpec{
14801490
Type: "this-is-a-service",
14811491
Annotations: map[string]string{},

0 commit comments

Comments
 (0)