@@ -24,6 +24,7 @@ import (
2424 "github.com/OT-CONTAINER-KIT/redis-operator/api/status"
2525 redisv1beta2 "github.com/OT-CONTAINER-KIT/redis-operator/api/v1beta2"
2626 "github.com/OT-CONTAINER-KIT/redis-operator/k8sutils"
27+ intctrlutil "github.com/OT-CONTAINER-KIT/redis-operator/pkg/controllerutil"
2728 "github.com/go-logr/logr"
2829 "k8s.io/apimachinery/pkg/api/errors"
2930 "k8s.io/apimachinery/pkg/runtime"
@@ -50,20 +51,16 @@ func (r *RedisClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request
5051
5152 err := r .Client .Get (context .TODO (), req .NamespacedName , instance )
5253 if err != nil {
53- if errors .IsNotFound (err ) {
54- return ctrl.Result {}, nil
55- }
56- return ctrl.Result {}, err
54+ return intctrlutil .RequeueWithErrorChecking (err , reqLogger , "failed to get redis cluster instance" )
5755 }
5856 if instance .ObjectMeta .GetDeletionTimestamp () != nil {
5957 if err = k8sutils .HandleRedisClusterFinalizer (r .Client , r .K8sClient , r .Log , instance ); err != nil {
60- return ctrl. Result {}, err
58+ return intctrlutil . RequeueWithError ( err , reqLogger , "failed to handle redis cluster finalizer" )
6159 }
62- return ctrl. Result {}, nil
60+ return intctrlutil . Reconciled ()
6361 }
6462 if _ , found := instance .ObjectMeta .GetAnnotations ()["rediscluster.opstreelabs.in/skip-reconcile" ]; found {
65- reqLogger .Info ("Found annotations rediscluster.opstreelabs.in/skip-reconcile, so skipping reconcile" )
66- return ctrl.Result {RequeueAfter : time .Second * 10 }, nil
63+ return intctrlutil .RequeueAfter (reqLogger , time .Second * 10 , "found skip reconcile annotation" )
6764 }
6865 instance .SetDefault ()
6966
@@ -72,7 +69,7 @@ func (r *RedisClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request
7269 totalReplicas := leaderReplicas + followerReplicas
7370
7471 if err = k8sutils .AddFinalizer (instance , k8sutils .RedisClusterFinalizer , r .Client ); err != nil {
75- return ctrl. Result {}, err
72+ return intctrlutil . RequeueWithError ( err , reqLogger , "failed to add finalizer" )
7673 }
7774
7875 // Check if the cluster is downscaled
@@ -98,41 +95,41 @@ func (r *RedisClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request
9895 // Step 3 Rebalance the cluster
9996 k8sutils .RebalanceRedisCluster (r .K8sClient , r .Log , instance )
10097 reqLogger .Info ("Redis cluster is downscaled... Rebalancing the cluster is done" )
101- return ctrl. Result { RequeueAfter : time .Second * 10 }, nil
98+ return intctrlutil . RequeueAfter ( reqLogger , time .Second * 10 , "" )
10299 }
103100
104101 // Mark the cluster status as initializing if there are no leader or follower nodes
105102 if (instance .Status .ReadyLeaderReplicas == 0 && instance .Status .ReadyFollowerReplicas == 0 ) ||
106103 instance .Status .ReadyLeaderReplicas != leaderReplicas {
107104 err = k8sutils .UpdateRedisClusterStatus (instance , status .RedisClusterInitializing , status .InitializingClusterLeaderReason , instance .Status .ReadyLeaderReplicas , instance .Status .ReadyFollowerReplicas , r .Dk8sClient )
108105 if err != nil {
109- return ctrl. Result {}, err
106+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
110107 }
111108 }
112109
113110 if leaderReplicas != 0 {
114111 err = k8sutils .CreateRedisLeaderService (instance , r .K8sClient )
115112 if err != nil {
116- return ctrl. Result {}, err
113+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
117114 }
118115 }
119116 err = k8sutils .CreateRedisLeader (instance , r .K8sClient )
120117 if err != nil {
121- return ctrl. Result {}, err
118+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
122119 }
123120
124121 err = k8sutils .ReconcileRedisPodDisruptionBudget (instance , "leader" , instance .Spec .RedisLeader .PodDisruptionBudget , r .K8sClient )
125122 if err != nil {
126- return ctrl. Result {}, err
123+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
127124 }
128125
129126 // todo: remove me after watch statefulset in controller
130127 redisLeaderInfo , err := k8sutils .GetStatefulSet (r .K8sClient , r .Log , instance .GetNamespace (), instance .GetName ()+ "-leader" )
131128 if err != nil {
132129 if errors .IsNotFound (err ) {
133- return ctrl. Result { RequeueAfter : time .Second * 60 }, nil
130+ return intctrlutil . RequeueAfter ( reqLogger , time .Second * 60 , "" )
134131 }
135- return ctrl. Result {}, err
132+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
136133 }
137134
138135 if r .IsStatefulSetReady (ctx , instance .Namespace , instance .Name + "-leader" ) {
@@ -141,54 +138,52 @@ func (r *RedisClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request
141138 instance .Status .ReadyFollowerReplicas != followerReplicas {
142139 err = k8sutils .UpdateRedisClusterStatus (instance , status .RedisClusterInitializing , status .InitializingClusterFollowerReason , leaderReplicas , instance .Status .ReadyFollowerReplicas , r .Dk8sClient )
143140 if err != nil {
144- return ctrl. Result {}, err
141+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
145142 }
146143 }
147144 // if we have followers create their service.
148145 if followerReplicas != 0 {
149146 err = k8sutils .CreateRedisFollowerService (instance , r .K8sClient )
150147 if err != nil {
151- return ctrl. Result {}, err
148+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
152149 }
153150 }
154151 err = k8sutils .CreateRedisFollower (instance , r .K8sClient )
155152 if err != nil {
156- return ctrl. Result {}, err
153+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
157154 }
158155 err = k8sutils .ReconcileRedisPodDisruptionBudget (instance , "follower" , instance .Spec .RedisFollower .PodDisruptionBudget , r .K8sClient )
159156 if err != nil {
160- return ctrl. Result {}, err
157+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
161158 }
162159 }
163160 // todo: remove me after watch statefulset in controller
164161 redisFollowerInfo , err := k8sutils .GetStatefulSet (r .K8sClient , r .Log , instance .GetNamespace (), instance .GetName ()+ "-follower" )
165162 if err != nil {
166163 if errors .IsNotFound (err ) {
167- return ctrl. Result { RequeueAfter : time .Second * 60 }, nil
164+ return intctrlutil . RequeueAfter ( reqLogger , time .Second * 60 , "" )
168165 }
169- return ctrl. Result {}, err
166+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
170167 }
171168
172169 if leaderReplicas == 0 {
173- reqLogger .Info ("Redis leaders Cannot be 0" , "Ready.Replicas" , strconv .Itoa (int (redisLeaderInfo .Status .ReadyReplicas )), "Expected.Replicas" , leaderReplicas )
174- return ctrl.Result {RequeueAfter : time .Second * 60 }, nil
170+ return intctrlutil .RequeueAfter (reqLogger , time .Second * 60 , "Redis leaders Cannot be 0" , "Ready.Replicas" , strconv .Itoa (int (redisLeaderInfo .Status .ReadyReplicas )), "Expected.Replicas" , leaderReplicas )
175171 }
176172
177173 if ! (r .IsStatefulSetReady (ctx , instance .Namespace , instance .Name + "-leader" ) && r .IsStatefulSetReady (ctx , instance .Namespace , instance .Name + "-follower" )) {
178- reqLogger .Info ("Redis leader and follower nodes are not ready yet" )
179- return ctrl.Result {RequeueAfter : time .Second * 30 }, nil
174+ return intctrlutil .RequeueAfter (reqLogger , time .Second * 60 , "Redis leader and follower nodes are not ready yet" )
180175 }
181176
182177 // Mark the cluster status as bootstrapping if all the leader and follower nodes are ready
183178 if ! (instance .Status .ReadyLeaderReplicas == leaderReplicas && instance .Status .ReadyFollowerReplicas == followerReplicas ) {
184179 err = k8sutils .UpdateRedisClusterStatus (instance , status .RedisClusterBootstrap , status .BootstrapClusterReason , leaderReplicas , followerReplicas , r .Dk8sClient )
185180 if err != nil {
186- return ctrl. Result {}, err
181+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
187182 }
188183 }
189184
190185 if nc := k8sutils .CheckRedisNodeCount (ctx , r .K8sClient , r .Log , instance , "" ); nc != totalReplicas {
191- reqLogger .Info ("Creating redis cluster by executing cluster creation commands" , "Leaders.Ready" , strconv . Itoa ( int ( redisLeaderInfo .Status .ReadyReplicas )) , "Followers.Ready" , strconv . Itoa ( int ( redisFollowerInfo .Status .ReadyReplicas )) )
186+ reqLogger .Info ("Creating redis cluster by executing cluster creation commands" , "Leaders.Ready" , redisLeaderInfo .Status .ReadyReplicas , "Followers.Ready" , redisFollowerInfo .Status .ReadyReplicas )
192187 leaderCount := k8sutils .CheckRedisNodeCount (ctx , r .K8sClient , r .Log , instance , "leader" )
193188 if leaderCount != leaderReplicas {
194189 reqLogger .Info ("Not all leader are part of the cluster..." , "Leaders.Count" , leaderCount , "Instance.Size" , leaderReplicas )
@@ -211,16 +206,15 @@ func (r *RedisClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request
211206 reqLogger .Info ("no follower/replicas configured, skipping replication configuration" , "Leaders.Count" , leaderCount , "Leader.Size" , leaderReplicas , "Follower.Replicas" , followerReplicas )
212207 }
213208 }
214- reqLogger .Info ("Redis cluster count is not desired" , "Current.Count" , nc , "Desired.Count" , totalReplicas )
215- return ctrl.Result {RequeueAfter : time .Second * 60 }, nil
209+ return intctrlutil .RequeueAfter (reqLogger , time .Second * 60 , "Redis cluster count is not desired" , "Current.Count" , nc , "Desired.Count" , totalReplicas )
216210 }
217211
218212 reqLogger .Info ("Redis cluster count is desired" )
219213 if int (totalReplicas ) > 1 && k8sutils .CheckRedisClusterState (ctx , r .K8sClient , r .Log , instance ) >= int (totalReplicas )- 1 {
220214 reqLogger .Info ("Redis leader is not desired, executing failover operation" )
221215 err = k8sutils .ExecuteFailoverOperation (ctx , r .K8sClient , r .Log , instance )
222216 if err != nil {
223- return ctrl. Result {}, err
217+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
224218 }
225219 }
226220
@@ -234,12 +228,11 @@ func (r *RedisClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request
234228 if k8sutils .RedisClusterStatusHealth (ctx , r .K8sClient , r .Log , instance ) {
235229 err = k8sutils .UpdateRedisClusterStatus (instance , status .RedisClusterReady , status .ReadyClusterReason , leaderReplicas , followerReplicas , r .Dk8sClient )
236230 if err != nil {
237- return ctrl. Result {}, err
231+ return intctrlutil . RequeueWithError ( err , reqLogger , "" )
238232 }
239233 }
240234 }
241- reqLogger .Info ("Will reconcile redis cluster operator in again 10 seconds" )
242- return ctrl.Result {RequeueAfter : time .Second * 10 }, nil
235+ return intctrlutil .RequeueAfter (reqLogger , time .Second * 10 , "" )
243236}
244237
245238// SetupWithManager sets up the controller with the Manager.
0 commit comments