@@ -23,6 +23,7 @@ import (
2323 "context"
2424 "encoding/json"
2525 "fmt"
26+ "reflect"
2627 "time"
2728
2829 "github.com/pkg/errors"
@@ -234,46 +235,64 @@ func (r *ReconfigureReconciler) updateConfigCMStatus(reqCtx intctrlutil.RequestC
234235}
235236
236237func (r * ReconfigureReconciler ) performUpgrade (rctx * ReconcileContext , reloadTasks []ReloadAction ) (ctrl.Result , error ) {
237- var err error
238- var returnedStatus returnedStatus
239- var reloadType string
240-
238+ var (
239+ err error
240+ status returnedStatus
241+ reloadType string
242+ )
241243 for _ , task := range reloadTasks {
242244 reloadType = task .ReloadType ()
243- returnedStatus , err = task .ExecReload ()
244- if err != nil || returnedStatus .Status != ESNone {
245- return r . status ( rctx , returnedStatus , reloadType , err )
245+ status , err = task .ExecReload ()
246+ if err != nil || status .Status != ESNone {
247+ break
246248 }
247249 }
248- return r .succeed (rctx , reloadType , returnedStatus )
250+ // submit changes to the cluster
251+ if err1 := r .submit (rctx ); err1 != nil {
252+ return intctrlutil .RequeueAfter (configReconcileInterval , rctx .Log , "failed to submit changes to the cluster" , "error" , err1 )
253+ }
254+ if err != nil || status .Status != ESNone {
255+ return r .status (rctx , reloadType , status , err )
256+ }
257+ return r .succeed (rctx , reloadType , status )
258+ }
259+
260+ func (r * ReconfigureReconciler ) submit (rctx * ReconcileContext ) error {
261+ if rctx .ClusterObj == nil || rctx .ClusterObjCopy == nil {
262+ return fmt .Errorf ("the cluster object is nil" )
263+ }
264+ if reflect .DeepEqual (rctx .ClusterObj .Spec , rctx .ClusterObjCopy .Spec ) {
265+ return nil
266+ }
267+ return rctx .Client .Update (rctx .RequestCtx .Ctx , rctx .ClusterObj )
249268}
250269
251- func (r * ReconfigureReconciler ) status (rctx * ReconcileContext , returnedStatus returnedStatus , policy string , err error ) (ctrl.Result , error ) {
270+ func (r * ReconfigureReconciler ) status (rctx * ReconcileContext , reloadType string , status returnedStatus , err error ) (ctrl.Result , error ) {
252271 updatePhase := func (phase parametersv1alpha1.ParameterPhase , options ... options ) (ctrl.Result , error ) {
253- return updateConfigPhaseWithResult (rctx .Client , rctx .RequestCtx , rctx .ConfigMap , reconciled (returnedStatus , policy , phase , options ... ))
272+ return updateConfigPhaseWithResult (rctx .Client , rctx .RequestCtx , rctx .ConfigMap , reconciled (status , reloadType , phase , options ... ))
254273 }
255274
256- switch returnedStatus .Status {
275+ switch status .Status {
257276 case ESFailedAndRetry :
258277 return updatePhase (parametersv1alpha1 .CFailedPhase , withFailed (err , true ))
259278 case ESRetry :
260279 return updatePhase (parametersv1alpha1 .CUpgradingPhase )
261280 case ESFailed :
262281 return updatePhase (parametersv1alpha1 .CFailedAndPausePhase , withFailed (err , false ))
263282 case ESNone :
264- return r .succeed (rctx , policy , returnedStatus )
283+ return r .succeed (rctx , reloadType , status )
265284 default :
266285 return updatePhase (parametersv1alpha1 .CFailedAndPausePhase , withFailed (cfgcore .MakeError ("unknown status" ), false ))
267286 }
268287}
269288
270- func (r * ReconfigureReconciler ) succeed (rctx * ReconcileContext , reloadType string , returnedStatus returnedStatus ) (ctrl.Result , error ) {
289+ func (r * ReconfigureReconciler ) succeed (rctx * ReconcileContext , reloadType string , status returnedStatus ) (ctrl.Result , error ) {
271290 rctx .Recorder .Eventf (rctx .ConfigMap ,
272291 corev1 .EventTypeNormal ,
273292 appsv1alpha1 .ReasonReconfigureSucceed ,
274293 "the reconfigure[%s] has been processed successfully" ,
275294 reloadType )
276295
277- result := reconciled (returnedStatus , reloadType , parametersv1alpha1 .CFinishedPhase )
296+ result := reconciled (status , reloadType , parametersv1alpha1 .CFinishedPhase )
278297 return r .updateConfigCMStatus (rctx .RequestCtx , rctx .ConfigMap , reloadType , & result )
279298}
0 commit comments